[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\ncustom: https://paypal.me/nstlaurent22\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\nReleaseBuild/\n"
  },
  {
    "path": "BindingListView/AggregateBindingListView.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Collections;\nusing System.Reflection;\nusing System.Diagnostics;\n\nnamespace Equin.ApplicationFramework\n{\n    public class AggregateBindingListView<T> : Component, IBindingListView, IList, IRaiseItemChangedEvents, ICancelAddNew, ITypedList, IEnumerable<T>\n    {\n        #region Constructors\n\n        public AggregateBindingListView()\n        {\n            _sourceLists = new BindingList<IList>();\n            (_sourceLists as IBindingList).ListChanged += new ListChangedEventHandler(SourceListsChanged);\n            _savedSourceLists = new List<IList>();\n            _sourceIndices = new MultiSourceIndexList<T>();\n            // Start with a filter that includes all items.\n            _filter = IncludeAllItemFilter<T>.Instance;\n            // Start with no sorts applied.\n            _sorts = new ListSortDescriptionCollection();\n            _objectViewCache = new Dictionary<T, ObjectView<T>>();\n        }\n\n        public AggregateBindingListView(IContainer container)\n            : this()\n        {\n            container.Add(this);\n\n            if (Site is ISynchronizeInvoke)\n            {\n                SynchronizingObject = Site as ISynchronizeInvoke;\n            }\n        }\n\n        #endregion\n\n        #region Private Member Fields\n\n        /// <summary>\n        /// The list of underlying list of items on which this view is based.\n        /// </summary>\n        private IList _sourceLists;\n        /// <summary>\n        /// The sorted, filtered list of item indices in _sourceList.\n        /// </summary>\n        private MultiSourceIndexList<T> _sourceIndices;\n        /// <summary>\n        /// The current filter applied to the view.\n        /// </summary>\n        private IItemFilter<T> _filter;\n        /// <summary>\n        /// The current sorts applied to the view.\n        /// </summary>\n        private ListSortDescriptionCollection _sorts;\n        /// <summary>\n        /// The <see cref=\"System.Collection.Generic.IComparer\">IComparer</see> used to compare items when sorting.\n        /// </summary>\n        private IComparer<KeyValuePair<ListItemPair<T>, int>> _comparer;\n        /// <summary>\n        /// The item in the process of being added to the view.\n        /// </summary>\n        private ObjectView<T> _newItem;\n        /// <summary>\n        /// The IList we will add new items to.\n        /// </summary>\n        private IList _newItemsList;\n        /// <summary>\n        /// The object used to marshal event-handler calls that are invoked on a non-UI thread.\n        /// </summary>\n        private ISynchronizeInvoke _synchronizingObject;\n        /// <summary>\n        /// A copy of the source lists so when a list is removed from SourceLists\n        /// we still have a reference to use for unhooking events, etc.\n        /// </summary>\n        private List<IList> _savedSourceLists;\n        /// <summary>\n        /// The property on a source list item that contains the actual list to view.\n        /// If null or empty then the source list item is used instead.\n        /// </summary>\n        private string _dataMember;\n        /// <summary>\n        /// ObjectView cache used to prevent re-creation of existing object wrappers when \n        /// in FilterAndSort().\n        /// </summary>\n        private Dictionary<T, ObjectView<T>> _objectViewCache;\n        /// <summary>\n        /// Controls whether or not the view is automatically re-filtered and re-sorted when\n        /// source lists change.\n        /// </summary>\n        private bool _autoFilterAndSortSuspended;\n\n        #endregion\n\n        /// <summary>\n        /// Gets or sets the list of source lists used by this view.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public IList SourceLists\n        {\n            get\n            {\n                return _sourceLists;\n            }\n            set\n            {\n                if (value == null)\n                {\n                    throw new ArgumentNullException(\"SourceLists\", Properties.Resources.SourceListsNull);\n                }\n\n                // Check that every item in each list is of type T.\n                foreach (object obj in value)\n                {\n                    if (obj == null)\n                    {\n                        throw new InvalidSourceListException();\n                    }\n\n                    IList list = null;\n                    if (!string.IsNullOrEmpty(DataMember))\n                    {\n                        foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(obj))\n                        {\n                            if (pd.Name == DataMember)\n                            {\n                                list = pd.GetValue(obj) as IList;\n                                break;\n                            }\n                        }\n                    }\n                    else if (obj is IListSource)\n                    {\n                        IListSource src = obj as IListSource;\n                        if (src.ContainsListCollection)\n                        {\n                            list = src.GetList()[0] as IList;\n                        }\n                        else\n                        {\n                            list = (obj as IListSource).GetList();\n                        }\n                    }\n                    else if (!(obj is ICollection<T>))\n                    {\n                        list = obj as IList;\n                    }\n                    else\n                    {\n                        // We have a typed collection, so can skip the item-by-item check.\n                        continue;\n                    }\n\n                    if (list == null)\n                    {\n                        throw new InvalidSourceListException();\n                    }\n\n                    foreach (object item in list)\n                    {\n                        if (!(item is T))\n                        {\n                            throw new InvalidSourceListException(string.Format(Properties.Resources.InvalidListItemType, typeof(T).FullName));\n                        }\n                    }\n                }\n\n                IBindingList bindingList = _sourceLists as IBindingList;\n\n                // Un-hook old list changed event.\n                if (bindingList != null && bindingList.SupportsChangeNotification)\n                {\n                    bindingList.ListChanged -= new ListChangedEventHandler(SourceListsChanged);\n                }\n\n                foreach (object list in _sourceLists)\n                {\n                    IBindingList bl = list as IBindingList;\n                    if (bl != null && bl.SupportsChangeNotification)\n                    {\n                        bl.ListChanged -= new ListChangedEventHandler(SourceListChanged);\n                    }\n                }\n\n                _sourceLists = value;\n\n                bindingList = _sourceLists as IBindingList;\n                // Hook new list changed event\n                if (bindingList != null && bindingList.SupportsChangeNotification)\n                {\n                    bindingList.ListChanged += new ListChangedEventHandler(SourceListsChanged);\n                }\n                foreach (object list in _sourceLists)\n                {\n                    IBindingList bl = list as IBindingList;\n                    if (bl != null && bl.SupportsChangeNotification)\n                    {\n                        bl.ListChanged += new ListChangedEventHandler(SourceListChanged);\n                    }\n                }\n\n                // save new lists\n                BuildSavedList();\n\n                FilterAndSort();\n                OnListChanged(ListChangedType.Reset, -1);\n            }\n        }\n\n        /// <summary>\n        /// Gets the ObjectView&lt;T&gt; of the item at the given index in the view.\n        /// </summary>\n        /// <param name=\"index\">The item index.</param>\n        /// <returns>The ObjectView&lt;T&gt; of the item.</returns>\n        public ObjectView<T> this[int index]\n        {\n            get\n            {\n                return _sourceIndices[index].Key.Item;\n            }\n        }\n\n        [Browsable(false)]\n        public string DataMember\n        {\n            get\n            {\n                return _dataMember;\n            }\n            set\n            {\n                _dataMember = value;\n                FilterAndSort();\n                OnListChanged(ListChangedType.Reset, -1);\n            }\n        }\n\n        private bool ShouldSerializeListMember()\n        {\n            return !string.IsNullOrEmpty(DataMember);\n        }\n\n        #region Adding New Items\n\n        /// <summary>\n        /// Occurs before an item is added to the list.\n        /// Assign the event argument's NewObject property to provide the object to add.\n        /// </summary>\n        public event AddingNewEventHandler AddingNew;\n\n        /// <summary>\n        /// Attempts to get a new <typeparamref name=\"T\"/> object to add to the list, first by raising the \n        /// AddingNew event and then (if no new object was assigned) by using the \n        /// default public constructor.\n        /// </summary>\n        /// <returns>The new object to add to the list.</returns>\n        /// <exception cref=\"System.InvalidOperationException\">No new object provided by the AddingNew event handler and <typeparamref name=\"T\"/> has no default public constructor.</exception>\n        protected virtual T OnAddingNew()\n        {\n            // We allow users of this class to provide the object to add\n            // by raising the AddingNew event.\n            if (AddingNew != null)\n            {\n                AddingNewEventArgs args = new AddingNewEventArgs();\n                AddingNew(this, args);\n                // Check if we were given an object (and it's the correct type)\n                if ((args.NewObject != null) && (args.NewObject is T))\n                {\n                    return (T)args.NewObject;\n                }\n            }\n            // Otherwise, try the default public constructor instead.\n            // Use reflection to find it. Note: We're not using the generic new() constraint since\n            // we do not want to force the need for a public default constructor when the user\n            // can simply handle the AddingNew event called above.\n            System.Reflection.ConstructorInfo ci = typeof(T).GetConstructor(System.Type.EmptyTypes);\n            if (ci != null)\n            {\n                // Invoke the constructor to create the object.\n                return (T)ci.Invoke(null);\n            }\n            else\n            {\n                throw new InvalidOperationException(Properties.Resources.CannotAddNewItem);\n            }\n        }\n\n        /// <summary>\n        /// Adds a new item to the view. Note that EndNew must be called to commit\n        /// the item to the to the source list.\n        /// </summary>\n        /// <returns>The new item, wrapped in an ObjectView<typeparamref name=\"T\"/>.</returns>\n        public ObjectView<T> AddNew()\n        {\n            // Are we currently adding another item?\n            if (_newItem != null)\n            {\n                // Need to commit previous new item before adding another.\n                EndNew(_sourceIndices.Count - 1);\n            }\n\n            // Get the new item to add.\n            T item = OnAddingNew();\n\n            // Create the ObjectView<T> wrapper for the item.\n            ObjectView<T> objectView = new ObjectView<T>(item, this);\n\n            _objectViewCache[item] = objectView;\n\n            HookPropertyChangedEvent(objectView);\n\n            // Set the _newItem reference so we know what to use when ending/cancelling this add operation.\n            _newItem = objectView;\n\n            // Add to indicies list, but index of -1 means it's not in the source list yet.\n            _sourceIndices.Add(_newItemsList, objectView, -1);\n            // Tell any data binders that we've added an item to the view.\n            // Put it at the end of the list.\n            OnListChanged(ListChangedType.ItemAdded, _sourceIndices.Count - 1);\n\n            return objectView;\n        }\n\n        /// <summary>\n        /// Cancels the pending addition of a new item to the source list\n        /// and remove the item from the view.\n        /// </summary>\n        /// <param name=\"itemIndex\">The index of the new item.</param>\n        public void CancelNew(int itemIndex)\n        {\n            // We must take special care that the item index does refer to the new item.\n            if (itemIndex > -1 && itemIndex < _sourceIndices.Count &&\n                _newItem != null && _sourceIndices[itemIndex].Key.Item == _newItem)\n            {\n                // We no longer need to listen to any events from the object.\n                UnHookPropertyChangedEvent(_newItem);\n                // Remove the item from the view.\n                _sourceIndices.RemoveAt(itemIndex);\n                // Data binders need to know the item has gone from the view.\n                OnListChanged(ListChangedType.ItemDeleted, itemIndex);\n                // Done with this adding operation, so clear the _newItem reference.\n                _newItem = null;\n            }\n        }\n\n        /// <summary>\n        /// Commits the pending addition of a new item to the source list.\n        /// </summary>\n        /// <param name=\"itemIndex\">The index of the new item.</param>\n        public void EndNew(int itemIndex)\n        {\n            // The binding infrastructure tends to call the method\n            // more times than needed and often with itemIndex not even pointing to the \n            // new object! So we have to take special care to check.\n            if (itemIndex > -1 && itemIndex < _sourceIndices.Count &&\n                _newItem != null && _sourceIndices[itemIndex].Key.Item == _newItem)\n            {\n                // In order to reuse the SourceListChanged code for adding a new item\n                // we have to first remove all knowledge of the item, then add it \n                // to the source list.\n\n                // We no longer need to listen to any events from the object.\n                UnHookPropertyChangedEvent(_newItem);\n                // Remove the item from the view.\n                _sourceIndices.RemoveAt(itemIndex);\n\n                // Add the actual data object to the source list.\n                // The SourceListChanged event handler will take care of correctly inserting this\n                // object into the view (if newItemsList is a IBindingList).\n                _newItemsList.Add(_newItem.Object);\n\n                // If it is not an IBindingList (or not SupportsChangeNotification) \n                // then we must force the update ourselves.\n                if (!(_newItemsList is IBindingList) || !(_newItemsList as IBindingList).SupportsChangeNotification)\n                {\n                    if (!_autoFilterAndSortSuspended)\n                    {\n                        FilterAndSort();\n                    }\n                    OnListChanged(ListChangedType.Reset, -1);\n                }\n\n                // Done with this adding operation, so clear the _newItem reference.\n                _newItem = null;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the source list to which new items are added.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public IList NewItemsList\n        {\n            get\n            {\n                return _newItemsList;\n            }\n            set\n            {\n                if (value != null && !_sourceLists.Contains(value))\n                {\n                    throw new ArgumentException(Properties.Resources.SourceListNotFound);\n                }\n                _newItemsList = value;\n            }\n        }\n\n        #endregion\n\n        /// <summary>\n        /// Re-applies any current filter and sorts to refresh the current view.\n        /// </summary>\n        public void Refresh()\n        {\n            FilterAndSort();\n            // Get any bound objects to refresh everything as well.\n            OnListChanged(ListChangedType.Reset, -1);\n        }\n\n        /// <summary>\n        /// Gets or sets the object used to marshal event-handler calls that are invoked on a non-UI thread.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public ISynchronizeInvoke SynchronizingObject\n        {\n            get\n            {\n                return _synchronizingObject;\n            }\n            set\n            {\n                _synchronizingObject = value;\n            }\n        }\n\n        public void SuspendAutoFilterAndSort()\n        {\n            _autoFilterAndSortSuspended = true;\n        }\n\n        public void ResumeAutoFilterAndSort()\n        {\n            _autoFilterAndSortSuspended = false;\n        }\n\n        /// <summary>\n        /// Updates the _sourceIndices list to contain the items that are current viewed\n        /// according to applied filter and sorts.\n        /// </summary>\n        protected void FilterAndSort()\n        {\n            // The view contains items from the source list\n            // and possibly a new items that are not yet committed.\n            // Therefore we can't just clear the list and start over\n            // as we would lose the new items. So we have to to insert\n            // filtered source list items into a new list first.\n            // New items can then be pulled out of the current view\n            // and appended to the new list.\n            MultiSourceIndexList<T> newList = new MultiSourceIndexList<T>();\n\n            // Get items from the source list that are included by the current filter.\n            foreach (IList sourceList in GetSourceLists())\n            {\n                for (int i = 0; i < sourceList.Count; i++)\n                {\n                    T item = (T)sourceList[i];\n                    ObjectView<T> editableObject;\n                    if (_filter.Include(item))\n                    {\n                        if (_objectViewCache.ContainsKey(item))\n                        {\n                            editableObject = _objectViewCache[item];\n                        }\n                        else\n                        {\n                            editableObject = new ObjectView<T>(item, this);\n                            _objectViewCache.Add(item, editableObject);\n                            // Listen to the editing notification and property changed events.\n                            HookEditableObjectEvents(editableObject);\n                            HookPropertyChangedEvent(editableObject);\n                        }\n\n                        // Add the editable object along with the index of the item in the source list.\n                        newList.Add(sourceList, editableObject, i);\n                    }\n                    else\n                    {\n                        if (_objectViewCache.ContainsKey(item))\n                        {\n                            editableObject = _objectViewCache[item];\n                            UnHookEditableObjectEvents(editableObject);\n                            UnHookPropertyChangedEvent(editableObject);\n                            _objectViewCache.Remove(item);\n                        }\n                    }\n                }\n            }\n\n            // If we have sorts to apply, do them now\n            if (_comparer != null)\n            {\n                newList.Sort(_comparer);\n            }\n\n            // Now we can append any new items to the end of the view.\n            foreach (KeyValuePair<ListItemPair<T>, int> kvp in _sourceIndices)\n            {\n                // New items have a source list index of -1 since they are not\n                // yet in the source list.\n                if (kvp.Value == -1)\n                {\n                    newList.Add(kvp);\n                }\n            }\n\n            // Set our view now\n            _sourceIndices = newList;\n\n            // Note: We do not raise the ListChanged event with ListChangeType.Reset\n            // since the view may not have changed that much. It is better to let\n            // the calling code decide what has happened and raise events accordingly.\n        }\n\n        #region Editing Items Event Handlers\n\n        /// <remarks>\n        /// Currently unused. Here in case we want to perform actions when\n        /// an item edit begins.\n        /// </remarks>\n        protected virtual void BegunItemEdit(object sender, EventArgs e)\n        {\n\n        }\n\n        /// <remarks>\n        /// Currently unused. Here in case we want to perform actions when\n        /// an item edit is cancelled.\n        /// </remarks>\n        protected virtual void CancelledItemEdit(object sender, EventArgs e)\n        {\n\n        }\n\n        /// <summary>\n        /// Handles the <see cref=\"ObjectView&lt;T&gt;\"/> EndedEdit event.\n        /// </summary>\n        /// <param name=\"sender\">The <see cref=\"ObjectView&lt;T&gt;\"/> that raised the event.</param>\n        protected virtual void EndedItemEdit(object sender, EventArgs e)\n        {\n            if (_autoFilterAndSortSuspended)\n            {\n                return;\n            }\n\n            ObjectView<T> editableObject = (ObjectView<T>)sender;\n\n            // Check if filtering removed the item from view\n            // by getting the index before and after\n            int oldIndex = _sourceIndices.IndexOfItem(editableObject.Object);\n            FilterAndSort();\n            int newIndex = _sourceIndices.IndexOfItem(editableObject.Object);\n            // if item was filtered out then the newIndex == -1\n            if (newIndex > -1)\n            {\n                if (oldIndex == newIndex)\n                {\n                    OnListChanged(ListChangedType.ItemChanged, newIndex);\n                }\n                else\n                {\n                    OnListChanged(ListChangedType.ItemMoved, newIndex, oldIndex);\n                }\n            }\n            else\n            {\n                OnListChanged(ListChangedType.ItemDeleted, oldIndex);\n            }\n        }\n\n        #endregion\n\n        /// <summary>\n        /// Event handler for when SourceLists is changed.\n        /// </summary>\n        protected virtual void SourceListsChanged(object sender, ListChangedEventArgs e)\n        {\n            if (e.ListChangedType == ListChangedType.ItemAdded)\n            {\n                IList list = SourceLists[e.NewIndex] as IList;\n                if (list == null)\n                {\n                    SourceLists.RemoveAt(e.NewIndex);\n                    throw new InvalidSourceListException();\n                }\n\n                if (list is IBindingList)\n                {\n                    // We need to know when the source list changes\n                    (list as IBindingList).ListChanged += new ListChangedEventHandler(SourceListChanged);\n                }\n                _savedSourceLists.Add(list);\n                if (!_autoFilterAndSortSuspended)\n                {\n                    FilterAndSort();\n                    OnListChanged(ListChangedType.Reset, -1);\n                }\n            }\n            else if (e.ListChangedType == ListChangedType.ItemDeleted)\n            {\n                IList list = _savedSourceLists[e.NewIndex] as IList;\n                if (list != null)\n                {\n                    if (list is IBindingList)\n                    {\n                        (list as IBindingList).ListChanged -= new ListChangedEventHandler(SourceListChanged);\n                    }\n                    _savedSourceLists.RemoveAt(e.NewIndex);\n                    if (!_autoFilterAndSortSuspended)\n                    {\n                        FilterAndSort();\n                        OnListChanged(ListChangedType.Reset, -1);\n                    }\n                }\n            }\n            else if (e.ListChangedType == ListChangedType.Reset)\n            {\n                BuildSavedList();\n                if (!_autoFilterAndSortSuspended)\n                {\n                    FilterAndSort();\n                    OnListChanged(ListChangedType.Reset, -1);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Event handler for when a source list changes.\n        /// </summary>\n        private void SourceListChanged(object sender, ListChangedEventArgs e)\n        {\n            if (_autoFilterAndSortSuspended)\n            {\n                return;\n            }\n\n            int oldIndex;\n            int newIndex;\n            IBindingList sourceList = sender as IBindingList;\n            switch (e.ListChangedType)\n            {\n                case ListChangedType.ItemAdded:\n                    FilterAndSort();\n                    // Get the index of the newly sorted item\n                    newIndex = _sourceIndices.IndexOfSourceIndex(sourceList, e.NewIndex);\n                    if (newIndex > -1)\n                    {\n                        OnListChanged(ListChangedType.ItemAdded, newIndex);\n                        // Other items have moved down the list\n                        for (int i = newIndex + 1; i < Count; i++)\n                        {\n                            OnListChanged(ListChangedType.ItemMoved, i - 1, i);\n                        }\n                    }\n                    else\n                    {\n                        // The item was excluded by the filter,\n                        // so to the viewer the item has been \"deleted\".\n                        // The new item will have been added at the end of the view\n                        OnListChanged(ListChangedType.ItemDeleted, Math.Max(Count - 1, 0));\n                    }\n                    break;\n\n                case ListChangedType.ItemChanged:\n                    // Check if filtering will remove the item from view\n                    // by getting the index before and after\n                    oldIndex = _sourceIndices.IndexOfSourceIndex(sourceList, e.NewIndex);\n\n                    // Is the object in our view?\n                    if (oldIndex < 0)\n                    {\n                        return;\n                    }\n\n                    FilterAndSort();\n                    newIndex = _sourceIndices.IndexOfSourceIndex(sourceList, e.NewIndex);\n                    // if item was filtered out then the newIndex == -1\n                    // otherwise we can say that the item was changed.\n                    if (newIndex > -1)\n                    {\n                        if (newIndex == oldIndex)\n                        {\n                            OnListChanged(ListChangedType.ItemChanged, newIndex);\n                        }\n                        else\n                        {\n                            // Two items will have changed places\n                            OnListChanged(ListChangedType.ItemMoved, newIndex, oldIndex);\n                        }\n                    }\n                    else\n                    {\n                        OnListChanged(ListChangedType.ItemDeleted, oldIndex);\n                    }\n                    break;\n\n                case ListChangedType.ItemDeleted:\n                    // Find the deleted index\n                    newIndex = _sourceIndices.IndexOfSourceIndex(sourceList, e.NewIndex);\n\n                    // Did we have the object in our view?\n                    if (newIndex < 0)\n                    {\n                        return;\n                    }\n\n                    // Stop listening to it's events\n                    UnHookEditableObjectEvents(_sourceIndices[newIndex].Key.Item);\n                    UnHookPropertyChangedEvent(_sourceIndices[newIndex].Key.Item);\n                    // Remove its index\n                    _sourceIndices.RemoveAt(newIndex);\n                    // Move up indices after removed item\n                    for (int i = 0; i < _sourceIndices.Count; i++)\n                    {\n                        if (_sourceIndices[i].Value > e.NewIndex)\n                        {\n                            _sourceIndices[i] = new KeyValuePair<ListItemPair<T>, int>(_sourceIndices[i].Key, _sourceIndices[i].Value - 1);\n                        }\n                    }\n                    // Inform listeners that an item has been deleted from this view\n                    OnListChanged(ListChangedType.ItemDeleted, newIndex);\n                    break;\n\n                case ListChangedType.ItemMoved:\n                    if (!IsSorted && (Filter is IncludeAllItemFilter<T>))\n                    {\n                        // We can move the item in the view\n                        // note indicies match those in _sourceList\n                        OnListChanged(ListChangedType.ItemMoved, e.NewIndex, e.OldIndex);\n                    }\n                    // Otherwise it makes no sense to move due to sort and/or filter\n                    break;\n\n                case ListChangedType.Reset:\n                    // Most of the source list has changed\n                    // so re-sort and filter\n                    FilterAndSort();\n                    // The view is most likely to have changed lots as well\n                    OnListChanged(ListChangedType.Reset, -1);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Event handler for when an item in the view changes.\n        /// </summary>\n        /// <param name=\"sender\">The item that changed.</param>\n        private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)\n        {\n            // The changed item may not actually be present in the view\n            int index = _sourceIndices.IndexOfItem((T)sender);\n            // Test the returned index, -1 => not in the view.\n            if (index > -1)\n            {\n                // Tell listeners that an item has changed.\n                // This is inline with the IRaiseItemChangedEvents implementation.\n                OnListChanged(ListChangedType.ItemChanged, index);\n            }\n        }\n\n        #region ListChanged Event\n\n        /// <summary>\n        /// Occurs when the list changes or an item in the list changes.\n        /// </summary>\n        public event ListChangedEventHandler ListChanged;\n\n        /// <summary>\n        /// Raises the ListChanged event with the given event arguments.\n        /// </summary>\n        /// <param name=\"e\">The ListChangedEventArgs to raise the event with.</param>\n        protected virtual void OnListChanged(ListChangedEventArgs e)\n        {\n            if (ListChanged != null)\n            {\n                // Check if we need to invoke on the UI thread or not\n                if (SynchronizingObject != null && SynchronizingObject.InvokeRequired)\n                {\n                    SynchronizingObject.Invoke(ListChanged, new object[] { this, e });\n                }\n                else\n                {\n                    ListChanged(this, e);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Helper method to build the ListChangedEventArgs needed for the ListChanged event.\n        /// </summary>\n        /// <param name=\"listChangedType\">The type of change that  occured.</param>\n        /// <param name=\"newIndex\">The index of the changed item.</param>\n        private void OnListChanged(ListChangedType listChangedType, int newIndex)\n        {\n            OnListChanged(new ListChangedEventArgs(listChangedType, newIndex));\n        }\n\n        /// <summary>\n        /// Helper method to build the ListChangedEventArgs needed for the ListChanged event.\n        /// </summary>\n        /// <param name=\"listChangedType\">The type of change that  occured.</param>\n        /// <param name=\"newIndex\">The index of the item after the change.</param>\n        /// <param name=\"oldIndex\">The index of the iem before the change.</param>\n        private void OnListChanged(ListChangedType listChangedType, int newIndex, int oldIndex)\n        {\n            OnListChanged(new ListChangedEventArgs(listChangedType, newIndex, oldIndex));\n        }\n\n        #endregion\n\n        #region Filtering\n\n        public void ApplyFilter(IItemFilter<T> filter)\n        {\n            Filter = filter;\n        }\n\n        public void ApplyFilter(Predicate<T> includeItem)\n        {\n            if (includeItem == null)\n            {\n                throw new ArgumentNullException(\"includeItem\", Properties.Resources.IncludeDelegateCannotBeNull);\n            }\n\n            Filter = AggregateBindingListView<T>.CreateItemFilter(includeItem);\n        }\n\n        /// <summary>\n        /// Gets if this view supports filtering of items. Always returns true.\n        /// </summary>\n        bool IBindingListView.SupportsFiltering\n        {\n            get { return true; }\n        }\n\n        /// <remarks>Explicitly implemented to expose the stronger Filter property instead.</remarks>\n        string IBindingListView.Filter\n        {\n            get\n            {\n                return Filter.ToString();\n            }\n            set\n            {\n                throw new NotSupportedException(\"Cannot set filter from string expression.\");\n                //TODO: Re-instate this line once we have an expression filter\n                //Filter = new ExpressionItemFilter<T>(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the filter currently applied to the view.\n        /// </summary>\n        public IItemFilter<T> Filter\n        {\n            get\n            {\n                return _filter;\n            }\n            set\n            {\n                // Do not allow a null filter. Instead, use the \"include all items\" filter.\n                if (value == null) value = IncludeAllItemFilter<T>.Instance;\n                if (_filter != value)\n                {\n                    _filter = value;\n                    FilterAndSort();\n                    // The list has probably changed a lot, so get bound controls to reset.\n                    OnListChanged(ListChangedType.Reset, -1);\n                }\n            }\n        }\n\n        private bool ShouldSerializeFilter()\n        {\n            return (Filter != IncludeAllItemFilter<T>.Instance);\n        }\n\n        public static IItemFilter<T> CreateItemFilter(Predicate<T> predicate)\n        {\n            if (predicate == null)\n            {\n                throw new ArgumentNullException(\"predicate\");\n            }\n            return new PredicateItemFilter<T>(predicate);\n        }\n\n        // Function for LINQ style filtering\n        // e.g. SetFilter(i => i.Items.Count < 42)\n        /*\n        public static void ApplyFilter(Func<T, bool> predicate)\n        {\n            if (predicate == null)\n            {\n                throw new ArgumentNullException(\"predicate\");\n            }\n            return new FuncItemFilter<T>(predicate);\n        }\n        \n        // Class to wrap a LINQ Func delegate and expose\n        // it as an IItemFilter.\n        private class FuncItemFilter<T> : IItemFilter<T>\n        {\n            private Func<T, bool> _func;\n\n            public FuncItemFilter(Func<T, bool> func)\n            {\n                _func = func;\n            }\n\n            public bool Include(T item)\n            {\n                return _func(item);\n            }\n        }\n        \n        */\n\n        /// <summary>\n        /// Removes any currently applied filter so that all items are displayed by the view.\n        /// </summary>\n        public void RemoveFilter()\n        {\n            // Set filter back to including all items.\n            Filter = IncludeAllItemFilter<T>.Instance;\n        }\n\n        #endregion\n\n        #region Sorting\n\n        /// <summary>\n        /// Used to signal that a sort on a property is to be descending, not ascending.\n        /// </summary>\n        public readonly string SortDescendingModifier = \"DESC\";\n        /// <summary>\n        /// The character used to seperate sorts by multiple properties.\n        /// </summary>\n        public readonly char SortDelimiter = ',';\n\n        /// <summary>\n        /// Gets if this view supports sorting. Always returns true.\n        /// </summary>\n        bool IBindingList.SupportsSorting\n        {\n            get { return true; }\n        }\n\n        /// <summary>\n        /// Gets if this view supports advanced sorting. Always returns true.\n        /// </summary>\n        bool IBindingListView.SupportsAdvancedSorting\n        {\n            get { return true; }\n        }\n\n        /// <summary>\n        /// Sorts the view by a single property in a given direction.\n        /// This will remove any existing sort.\n        /// </summary>\n        /// <param name=\"property\">A property of <typeparamref name=\"T\"/> to sort by.</param>\n        /// <param name=\"direction\">The direction to sort in.</param>\n        public void ApplySort(PropertyDescriptor property, ListSortDirection direction)\n        {\n            // Apply sort by setting the current sort descriptions\n            // to be a collection containing just one SortDescription.\n            SortDescriptions = new ListSortDescriptionCollection(\n                new ListSortDescription[] {\n                    new ListSortDescription(property, direction)});\n        }\n\n        /// <summary>\n        /// Sorts the view by the given collection of sort descriptions.\n        /// </summary>\n        /// <param name=\"sorts\">The sorts to apply.</param>\n        public void ApplySort(ListSortDescriptionCollection sorts)\n        {\n            SortDescriptions = sorts;\n        }\n\n        /// <summary>\n        /// Sorts the view according to the properties and directions given in the \n        /// SQL style sort parameter.\n        /// </summary>\n        /// <param name=\"sort\">\n        /// The SQL ORDER BY clause style sort.\n        /// A comma separated list of properties to sort by.\n        /// Use \"DESC\" after a property name to sort descending.\n        /// The default direction is ascending.\n        /// </param>\n        /// <example><code>view.ApplySort(\"Surname, FirstName, Age DESC\");</code></example>\n        public void ApplySort(string sort)\n        {\n            if (string.IsNullOrEmpty(sort))\n            {\n                RemoveSort();\n                return;\n            }\n\n            // Parse string for sort descriptions\n            string[] sorts = sort.Split(SortDelimiter);\n            ListSortDescription[] col = new ListSortDescription[sorts.Length];\n            for (int i = 0; i < sorts.Length; i++)\n            {\n                // Get the sort description.\n                // This will be a name optionally followed by a direction.\n                sort = sorts[i].Trim();\n                // A space will separate name from direction.\n                int pos = sort.IndexOf(' ');\n                string name;\n                ListSortDirection direction;\n                if (pos == -1)\n                {\n                    // No direction specified, default to ascending.\n                    name = sort;\n                    direction = ListSortDirection.Ascending;\n                }\n                else\n                {\n                    // Name is everything before the space.\n                    name = sort.Substring(0, pos);\n                    // direction is everything after the space.\n                    string dir = sort.Substring(pos + 1).Trim();\n                    // Check what kind of direction is specified.\n                    // (Ignoring case and culture.)\n                    if (string.Compare(dir, SortDescendingModifier, true, System.Globalization.CultureInfo.InvariantCulture) == 0)\n                    {\n                        direction = ListSortDirection.Descending;\n                    }\n                    else\n                    {\n                        // Default to ascending.\n                        direction = ListSortDirection.Ascending;\n                    }\n                }\n\n                // Put the sort description into the collection.\n                col[i] = CreateListSortDescription(name, direction);\n            }\n\n            ApplySort(new ListSortDescriptionCollection(col));\n        }\n\n        public void ApplySort(IComparer<T> comparer)\n        {\n            if (comparer == null)\n            {\n                throw new ArgumentNullException(\"comparer\");\n            }\n\n            // Clear any current sorts\n            _sorts = new ListSortDescriptionCollection();\n            // Sort with this new comparer\n            _comparer = new ExternalSortComparer<T>(comparer);\n            FilterAndSort();\n            OnListChanged(ListChangedType.Reset, -1);\n        }\n\n        public void ApplySort(Comparison<T> comparison)\n        {\n            if (comparison == null)\n            {\n                throw new ArgumentNullException(\"comparison\");\n            }\n\n            // Clear any current sorts\n            _sorts = new ListSortDescriptionCollection();\n            // Sort with this new comparer\n            _comparer = new ExternalSortComparison<T>(comparison);\n            FilterAndSort();\n            OnListChanged(ListChangedType.Reset, -1);\n        }\n\n        /// <summary>\n        /// Removes any sort currently applied to the view, restoring it to the order of the source list.\n        /// </summary>\n        public void RemoveSort()\n        {\n            // An empty collection of sorts will achieve what we need.\n            SortDescriptions = new ListSortDescriptionCollection();\n        }\n\n        /// <summary>\n        /// Gets if the view is currently sorted.\n        /// </summary>\n        [Browsable(false)]\n        public bool IsSorted\n        {\n            get\n            {\n                // To be sorted there must be some sorts applied.\n                return (SortDescriptions.Count > 0);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the string representation of the sort currently applied to the view.\n        /// </summary>\n        public string Sort\n        {\n            get\n            {\n                if (IsSorted)\n                {\n                    // Build a string of the properties being sorted by\n                    System.Text.StringBuilder sb = new System.Text.StringBuilder();\n                    foreach (ListSortDescription sort in SortDescriptions)\n                    {\n                        sb.Append(sort.PropertyDescriptor.Name);\n                        // Need to signal descending sorts\n                        if (sort.SortDirection == ListSortDirection.Descending)\n                        {\n                            sb.Append(' ').Append(SortDescendingModifier);\n                        }\n                        // Separate by SortDelimiter\n                        sb.Append(SortDelimiter);\n                    }\n                    // Remove trailing SortDelimiter\n                    sb.Remove(sb.Length - 1, 1);\n                    // Return the string\n                    return sb.ToString();\n                }\n                return string.Empty;\n            }\n            set\n            {\n                ApplySort(value);\n            }\n        }\n\n        private bool ShouldSerializeSort()\n        {\n            return !String.IsNullOrEmpty(Sort);\n        }\n\n        /// <summary>\n        /// Gets the direction in which the view is sorted.\n        /// If more than one sort is applied, the direction of the first is returned.\n        /// </summary>\n        [Browsable(false)]\n        public ListSortDirection SortDirection\n        {\n            get\n            {\n                if (IsSorted)\n                {\n                    return SortDescriptions[0].SortDirection;\n                }\n                else\n                {\n                    // We don't really want to throw exceptions.\n                    // Calling code should have checked IsSorted to know the true situation.\n                    return ListSortDirection.Ascending;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the property the view is currently sorted by.\n        /// If more than one sort is applied, the property of the first is returned.\n        /// </summary>\n        [Browsable(false)]\n        public PropertyDescriptor SortProperty\n        {\n            get\n            {\n                if (IsSorted)\n                {\n                    return SortDescriptions[0].PropertyDescriptor;\n                }\n                else\n                {\n                    // We don't really want to throw exceptions.\n                    // Calling code should have checked IsSorted to know the true situation.\n                    return null;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the sorts currently applied to the view.\n        /// </summary>\n        [Browsable(false)]\n        public ListSortDescriptionCollection SortDescriptions\n        {\n            get\n            {\n                return _sorts;\n            }\n            private set\n            {\n                _sorts = value;\n                _comparer = new SortComparer(value);\n                FilterAndSort();\n                // Most of the list will have probably changed, so get bound objects to reset.\n                OnListChanged(ListChangedType.Reset, -1);\n            }\n        }\n\n        /// <summary>\n        /// Used to compare items in the view when sorting the _sourceIndices list.\n        /// It supports mutliple sorts by different properties and directions.\n        /// </summary>\n        private class SortComparer : IComparer<KeyValuePair<ListItemPair<T>, int>>\n        {\n            private Dictionary<ListSortDescription, Comparison<T>> _comparisons;\n\n            /// <summary>\n            /// Creates a new SortComparer that will use the given sorts.\n            /// </summary>\n            /// <param name=\"sorts\">The sorts to apply to the view.</param>\n            public SortComparer(ListSortDescriptionCollection sorts)\n            {\n                _sorts = sorts;\n\n                // Build the delegates used to compare properties of objects\n                _comparisons = new Dictionary<ListSortDescription, Comparison<T>>();\n                foreach (ListSortDescription sort in sorts)\n                {\n                    _comparisons[sort] = BuildComparison(sort.PropertyDescriptor.Name, sort.SortDirection);\n                }\n            }\n\n            private ListSortDescriptionCollection _sorts;\n\n            /// <summary>\n            /// Compares two items according to the defined sorts.\n            /// </summary>\n            /// <remarks>\n            /// Use of light-weight code generation comparison delegates gives ~10x speed up\n            /// compared to the pure reflection based implementation.\n            /// </remarks>\n            /// <param name=\"x\">The first item to compare.</param>\n            /// <param name=\"y\">The second item to compare.</param>\n            /// <returns>-1 if x &lt; y, 0 if x = y and 1 if x &gt; y.</returns>\n            public int Compare(KeyValuePair<ListItemPair<T>, int> x, KeyValuePair<ListItemPair<T>, int> y)\n            {\n                foreach (ListSortDescription sort in _sorts)\n                {\n                    int result = _comparisons[sort](x.Key.Item.Object, y.Key.Item.Object);\n                    if (result != 0)\n                    {\n                        return result;\n                    }\n                }\n                return 0;\n            }\n\n            private static Comparison<T> BuildComparison(string propertyName, ListSortDirection direction)\n            {\n                PropertyInfo pi = typeof(T).GetProperty(propertyName);\n                Debug.Assert(pi != null, string.Format(\"Property '{0}' is not a member of type '{1}'\", propertyName, typeof(T).FullName));\n\n                Type pType = pi.PropertyType;\n                bool isNullable = pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>);\n\n                if (isNullable)\n                    pType = pi.PropertyType.GetGenericArguments()[0];\n\n                if (typeof(IComparable).IsAssignableFrom(pType))\n                {\n                    if (pType.IsValueType && !isNullable)\n                    {\n                        return delegate (T x, T y)\n                        {\n                            int result = (pi.GetValue(x, null) as IComparable).CompareTo(pi.GetValue(y, null));\n                            if (direction == ListSortDirection.Descending)\n                                result *= -1;\n                            return result;\n                        };\n                    }\n                    else\n                    {\n                        return delegate (T x, T y)\n                        {\n                            int result;\n                            object value1 = pi.GetValue(x, null);\n                            object value2 = pi.GetValue(y, null);\n                            if (value1 != null && value2 != null)\n                                result = (value1 as IComparable).CompareTo(value2);\n                            else if (value1 == null && value2 != null)\n                                result = -1;\n                            else if (value1 != null && value2 == null)\n                                result = 1;\n                            else\n                                result = 0;\n\n                            if (direction == ListSortDirection.Descending)\n                                result *= -1;\n                            return result;\n                        };\n                    }\n                }\n                else\n                {\n                    return delegate (T o1, T o2)\n                    {\n                        int result;\n                        if (o1.Equals(o2))\n                            result = 0;\n                        else\n                            result = o1.ToString().CompareTo(o2.ToString());\n\n                        if (direction == ListSortDirection.Descending)\n                            result *= -1;\n                        return result;\n                    };\n                }\n            }\n        }\n\n        private class ExternalSortComparer<U> : IComparer<KeyValuePair<ListItemPair<U>, int>>\n        {\n            public ExternalSortComparer(IComparer<U> comparer)\n            {\n                _comparer = comparer;\n            }\n\n            private IComparer<U> _comparer;\n\n            public int Compare(KeyValuePair<ListItemPair<U>, int> x, KeyValuePair<ListItemPair<U>, int> y)\n            {\n                return _comparer.Compare(x.Key.Item.Object, y.Key.Item.Object);\n            }\n        }\n\n        private class ExternalSortComparison<U> : IComparer<KeyValuePair<ListItemPair<U>, int>>\n        {\n            public ExternalSortComparison(Comparison<U> comparison)\n            {\n                _comparison = comparison;\n            }\n\n            private Comparison<U> _comparison;\n\n            public int Compare(KeyValuePair<ListItemPair<U>, int> x, KeyValuePair<ListItemPair<U>, int> y)\n            {\n                return _comparison(x.Key.Item.Object, y.Key.Item.Object);\n            }\n        }\n\n        #endregion\n\n        #region Searching\n\n        /// <summary>\n        /// Gets if this view supports searching using the Find method. Always returns true.\n        /// </summary>\n        bool IBindingList.SupportsSearching\n        {\n            get { return true; }\n        }\n\n        /// <summary>\n        /// Returns the index of the first item in the view who's property equals the given value.\n        /// -1 is returned if no item is found.\n        /// </summary>\n        /// <param name=\"property\">The property of each item to check.</param>\n        /// <param name=\"key\">The value being sought.</param>\n        /// <returns>The index of the item, or -1 if not found.</returns>\n        public int Find(PropertyDescriptor property, object key)\n        {\n            for (int i = 0; i < _sourceIndices.Count; i++)\n            {\n                if (property.GetValue(_sourceIndices[i].Key.Item.Object).Equals(key))\n                {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n        /// <summary>\n        /// Returns the index of the first item in the view who's property equals the given value.\n        /// -1 is returned if no item is found.\n        /// </summary>\n        /// <param name=\"property\">The property name of each item to check.</param>\n        /// <param name=\"key\">The value being sought.</param>\n        /// <returns>The index of the item, or -1 if not found.</returns>\n        /// <remarks>\n        /// It is easier for users of this class to enter a property name\n        /// and get the PropertyDescriptor ourselves.\n        /// </remarks>\n        public int Find(string propertyName, object key)\n        {\n            PropertyDescriptor pd = GetPropertyDescriptor(propertyName);\n            if (pd != null)\n            {\n                return Find(pd, key);\n            }\n            else\n            {\n                throw new ArgumentException(string.Format(Properties.Resources.PropertyNotFound, propertyName, typeof(T).FullName), \"propertyName\");\n            }\n        }\n\n        #endregion\n\n        #region IBindingList Members\n\n        /// <summary>\n        /// Gets if this view raises the ListChanged event. Always returns true.\n        /// </summary>\n        bool IBindingList.SupportsChangeNotification\n        {\n            get { return true; }\n        }\n\n        /// <remarks>Explicitly implemented so the type safe AddNew method is exposed instead.</remarks>\n        object IBindingList.AddNew()\n        {\n            return this.AddNew();\n        }\n\n        /// <summary>\n        /// Gets if this view allows items to be edited.\n        /// </summary>\n        /// <remarks>Delegates to the source list.</remarks>\n        bool IBindingList.AllowEdit\n        {\n            get\n            {\n                foreach (object list in SourceLists)\n                {\n                    if (list is IBindingList)\n                    {\n                        if (!(list as IBindingList).AllowEdit)\n                        {\n                            return false;\n                        }\n                    }\n                }\n                return true;\n            }\n        }\n\n        /// <summary>\n        /// Gets if this view allows new items to be added using AddNew().\n        /// </summary>\n        /// <remarks>Delegates to the source list.</remarks>\n        bool IBindingList.AllowNew\n        {\n            get\n            {\n                if (_newItemsList != null)\n                {\n                    if (_newItemsList is IBindingList)\n                    {\n                        // Respect what the binding list says.\n                        return (_newItemsList as IBindingList).AllowNew;\n                    }\n                    // _newItemsList is a IList, so we can call Add()\n                    // it may fail at runtime - but that is the callee's problem\n                    return true;\n                }\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Gets if this view allows items to be removed.\n        /// </summary>\n        /// <remarks>Delegates to the source list.</remarks>\n        bool IBindingList.AllowRemove\n        {\n            get\n            {\n                foreach (object list in SourceLists)\n                {\n                    if (list is IBindingList)\n                    {\n                        if (!(list as IBindingList).AllowRemove)\n                        {\n                            return false;\n                        }\n                    }\n                }\n                return true;\n            }\n        }\n\n        /// <summary>\n        /// Not implemented.\n        /// </summary>\n        /// <exception cref=\"System.NotImplementedException\">Method not implemented.</exception>\n        void IBindingList.AddIndex(PropertyDescriptor property)\n        {\n            throw new NotImplementedException();\n        }\n\n        /// <summary>\n        /// Not implemented.\n        /// </summary>\n        /// <exception cref=\"System.NotImplementedException\">Method not implemented.</exception>\n        void IBindingList.RemoveIndex(PropertyDescriptor property)\n        {\n            throw new NotImplementedException();\n        }\n\n        #endregion\n\n        #region IRaiseItemChangedEvents Members\n\n        /// <summary>\n        /// Gets if this view raises the ListChanged event when an item changes. Always returns true.\n        /// </summary>\n        [Browsable(false)]\n        public bool RaisesItemChangedEvents\n        {\n            get { return true; }\n        }\n\n        #endregion\n\n        #region IList Members\n\n        /// <exception cref=\"System.ArgumentException\">\n        /// value is of the wrong type.\n        /// </exception>\n        /// <exception cref=\"System.InvalidOperationException\">\n        /// <see cref=\"NewItemsList\"/> is null, so an item cannot be added.\n        /// </exception>\n        int IList.Add(object value)\n        {\n            if (value == null)\n            {\n                AddNew();\n                return Count - 1;\n            }\n\n            throw new NotSupportedException(Properties.Resources.CannotAddItem);\n        }\n\n        /// <summary>\n        /// Cannot clear this view.\n        /// </summary>\n        /// <exception cref=\"System.ArgumentException\">\n        /// Cannot clear this view.\n        /// </exception>\n        void IList.Clear()\n        {\n            throw new NotSupportedException(Properties.Resources.CannotClearView);\n        }\n\n        /// <summary>\n        /// Checks if this view contains the given item.\n        /// Note that items excluded by current filter are not searched.\n        /// </summary>\n        /// <param name=\"item\">The item to search for.</param>\n        /// <returns>True if the item is in the view, else false.</returns>\n        bool IList.Contains(object item)\n        {\n            // See if the source indices contain the item\n            if (item is ObjectView<T>)\n            {\n                return _sourceIndices.ContainsKey((ObjectView<T>)item);\n            }\n            else if (item is T)\n            {\n                return _sourceIndices.ContainsItem((T)item);\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Gets the index in the view of an item.\n        /// </summary>\n        /// <param name=\"item\">The item to search for</param>\n        /// <returns>The index of the item, or -1 if not found.</returns>\n        int IList.IndexOf(object item)\n        {\n            if (item is ObjectView<T>)\n            {\n                return _sourceIndices.IndexOfKey(item as ObjectView<T>);\n            }\n            else if (item is T)\n            {\n                return _sourceIndices.IndexOfItem((T)item);\n            }\n            return -1;\n        }\n\n        /// <summary>\n        /// Cannot insert an external item into this collection.\n        /// </summary>\n        /// <exception cref=\"System.ArgumentException\">\n        /// Cannot insert an external item into this collection.\n        /// </exception>\n        void IList.Insert(int index, object value)\n        {\n            throw new NotSupportedException(Properties.Resources.CannotInsertItem);\n        }\n\n        /// <summary>\n        /// Gets a value indicating if this view is read-only.\n        /// </summary>\n        /// <remarks>Delegates to the source list.</remarks>\n        bool IList.IsReadOnly\n        {\n            get\n            {\n                foreach (object list in SourceLists)\n                {\n                    if (list is IBindingList)\n                    {\n                        if (!(list as IBindingList).IsReadOnly)\n                        {\n                            return false;\n                        }\n                    }\n                    else\n                    {\n                        return false;\n                    }\n                }\n                return true;\n            }\n        }\n\n        /// <summary>\n        /// Always returns <code>false</code> because the view can change size when\n        /// source lists are added.\n        /// </summary>\n        bool IList.IsFixedSize\n        {\n            get\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Removes the given item from the view and underlying source list.\n        /// </summary>\n        /// <param name=\"value\">Either an ObjectView&lt;T&gt; or T to remove.</param>\n        void IList.Remove(object value)\n        {\n            int index = (this as IList).IndexOf(value);\n            (this as IList).RemoveAt(index);\n        }\n\n        /// <summary>\n        /// Removes the item from the view at the given index.\n        /// </summary>\n        /// <param name=\"index\">The index of the item to remove.</param>\n        void IList.RemoveAt(int index)\n        {\n            // Get the index in the source list.\n            int sourceIndex = _sourceIndices[index].Value;\n            IList sourceList = _sourceIndices[index].Key.List;\n            if (sourceIndex > -1)\n            {\n                sourceList.RemoveAt(sourceIndex);\n                if (!(sourceList is IBindingList) || !(sourceList as IBindingList).SupportsChangeNotification)\n                {\n                    FilterAndSort();\n                    OnListChanged(ListChangedType.Reset, -1);\n                }\n            }\n            else\n            {\n                // The item is not in the source list yet as it is new\n                // So cancel the new operation instead.\n                CancelNew(index);\n            }\n        }\n\n        /// <summary>\n        /// Gets the <see cref=\"ObjectView&lt;T&gt;\"/> at the given index.\n        /// </summary>\n        /// <param name=\"index\">The index of the item to retrieve.</param>\n        /// <returns>An <see cref=\"ObjectView&lt;T&gt;\"/> object.</returns>\n        /// <exception cref=\"System.NotSupportException\">\n        /// Cannot set an item in the view.\n        /// </exception>\n        object IList.this[int index]\n        {\n            get\n            {\n                return this[index];\n            }\n            set\n            {\n                // The interface requires we supply a setter\n                // But we don't want external code modifying the view\n                // in this manner.\n                throw new NotSupportedException(Properties.Resources.CannotSetItem);\n            }\n        }\n\n        #endregion\n\n        #region ICollection Members\n\n        /// <summary>\n        /// Copies the <see cref=\"ObjectView&lt;T&gt;\"/> objects of the view to an <see cref=\"System.Array\"/>, starting at a particular System.Array index.\n        /// </summary>\n        /// <param name=\"array\">The one-dimensional <see cref=\"System.Array\"/> that is the destination of the elements copied from view. The System.Array must have zero-based indexing.</param>\n        /// <param name=\"index\">The zero-based index in array at which copying begins. </param>\n        void ICollection.CopyTo(Array array, int index)\n        {\n            _sourceIndices.Keys.CopyTo(array, index);\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether access to the <see cref=\"System.Collections.ICollection\" /> is synchronized (thread safe).\n        /// </summary>\n        bool ICollection.IsSynchronized\n        {\n            get { return false; }\n        }\n\n        /// <summary>\n        /// Not supported.\n        /// </summary>\n        object ICollection.SyncRoot\n        {\n            get { throw new NotSupportedException(Properties.Resources.SyncAccessNotSupported); }\n        }\n\n        /// <summary>\n        /// Gets the number of items currently in the view. This does not include those items\n        /// excluded by the current filter.\n        /// </summary>\n        [Browsable(false)]\n        public int Count\n        {\n            get { return _sourceIndices.Count; }\n        }\n\n        #endregion\n\n        #region IEnumerable<T> Members\n\n        IEnumerator<T> IEnumerable<T>.GetEnumerator()\n        {\n            for (int i = 0; i < _sourceIndices.Count; i++)\n                yield return _sourceIndices[i].Key.Item.Object;\n\n        }\n\n        /// <summary>\n        /// Returns an enumerator that iterates through all the <see cref=\"ObjectView&lt;T&gt;\"/> items in the view.\n        /// This does not include those items excluded by the current filter.\n        /// </summary>\n        /// <returns>An IEnumerator to iterate with.</returns>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return _sourceIndices.GetKeyEnumerator();\n        }\n\n        #endregion\n\n        #region ITypedList Members\n\n        /// <summary>\n        /// Returns the <see cref=\"System.ComponentModel.PropertyDescriptorCollection\"/> that represents the properties on each item used to bind data.\n        /// </summary>\n        /// <param name=\"listAccessors\">Array of property descriptors to navigate object hirerachy to actual item object. It can be null.</param>\n        /// <returns>The System.ComponentModel.PropertyDescriptorCollection that represents the properties on each item used to bind data.</returns>\n        PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors)\n        {\n            PropertyDescriptorCollection originalProps;\n\n            IEnumerator<IList> lists = GetSourceLists().GetEnumerator();\n\n            if (lists.MoveNext() && lists.Current is ITypedList)\n            {\n                // Ask the source list for the properties.\n                originalProps = (lists.Current as ITypedList).GetItemProperties(listAccessors);\n            }\n            else\n            {\n                // Get the properties ourself.\n                originalProps = System.Windows.Forms.ListBindingHelper.GetListItemProperties(typeof(T), listAccessors);\n            }\n\n            if (listAccessors != null && listAccessors.Length > 0)\n            {\n                Type type = originalProps[0].ComponentType;\n                if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ObjectView<>))\n                {\n                    originalProps = originalProps[0].GetChildProperties();\n                }\n            }\n\n            List<PropertyDescriptor> newProps = new List<PropertyDescriptor>();\n            foreach (PropertyDescriptor pd in AddProvidedViews(originalProps))\n            {\n                newProps.Add(pd);\n            }\n\n            return new PropertyDescriptorCollection(newProps.ToArray());\n        }\n\n        protected internal bool ShouldProvideView(PropertyDescriptor property)\n        {\n            return ProvidedViewPropertyDescriptor.CanProvideViewOf(property);\n        }\n\n        protected internal string GetProvidedViewName(PropertyDescriptor sourceListProperty)\n        {\n            return sourceListProperty.Name + \"View\";\n        }\n\n        protected internal object CreateProvidedView(ObjectView<T> @object, PropertyDescriptor sourceListProperty)\n        {\n            object list = sourceListProperty.GetValue(@object);\n            Type viewType = GetProvidedViewType(sourceListProperty);\n            return Activator.CreateInstance(viewType, list);\n        }\n\n        private static Type GetProvidedViewType(PropertyDescriptor sourceListProperty)\n        {\n            // The source list property type implements IList<X>.\n            // We want to get the type of X.\n            Type typeParam = null;\n            foreach (Type interfaceType in sourceListProperty.PropertyType.GetInterfaces())\n            {\n                if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition().Equals(typeof(IList<>)))\n                {\n                    typeParam = interfaceType.GetGenericArguments()[0];\n                }\n            }\n            Debug.Assert(typeParam != null, \"Did not get the generic argument for type \" + sourceListProperty.PropertyType.FullName);\n\n            // Now build the BindingListView<X> type.\n            Type viewTypeDef = typeof(BindingListView<>);\n            Type viewType = viewTypeDef.MakeGenericType(typeParam);\n            return viewType;\n        }\n\n        internal IEnumerable<PropertyDescriptor> AddProvidedViews(PropertyDescriptorCollection properties)\n        {\n            if (properties.Count < 0)\n            {\n                yield break;\n            }\n            foreach (PropertyDescriptor prop in properties)\n            {\n                if (ShouldProvideView(prop))\n                {\n                    string name = GetProvidedViewName(prop);\n                    yield return new ProvidedViewPropertyDescriptor(name, GetProvidedViewType(prop));\n                }\n                yield return prop;\n            }\n        }\n\n        /// <summary>\n        /// Gets the name of the view.\n        /// </summary>\n        /// <param name=\"listAccessors\">Unused. Can be null.</param>\n        /// <returns>The name of the view.</returns>\n        string ITypedList.GetListName(PropertyDescriptor[] listAccessors)\n        {\n            return GetType().Name;\n        }\n\n        #endregion\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Creates a new <see cref=\"System.ComponentModel.ListSortDescription\"/> for given property name and sort direction.\n        /// </summary>\n        /// <param name=\"propertyName\">The name of the property to sort by.</param>\n        /// <param name=\"direction\">The direction in which to sort.</param>\n        /// <returns>A ListSortDescription.</returns>\n        /// <remarks>\n        /// Used by external code to simplify sorting the view.\n        /// </remarks>\n        public ListSortDescription CreateListSortDescription(string propertyName, ListSortDirection direction)\n        {\n            PropertyDescriptor pd = GetPropertyDescriptor(propertyName);\n            if (pd == null)\n            {\n                throw new ArgumentException(string.Format(Properties.Resources.PropertyNotFound, propertyName, typeof(T).FullName), \"propertyName\");\n            }\n            return new ListSortDescription(pd, direction);\n        }\n\n        /// <summary>\n        /// Gets the property descriptor for a given property name.\n        /// </summary>\n        /// <param name=\"propertyName\">The name of a property of <typeparamref name=\"T\"/>.</param>\n        /// <returns>The <see cref=\"System.ComponentModel.PropertyDescriptor\"/>.</returns>\n        private PropertyDescriptor GetPropertyDescriptor(string propertyName)\n        {\n            return TypeDescriptor.GetProperties(typeof(T)).Find(propertyName, false);\n        }\n\n        /// <summary>\n        /// Attaches event handlers to the given <see cref=\"ObjectView&lt;T&gt;\"/>'s \n        /// edit life cycle notification events.\n        /// </summary>\n        /// <param name=\"objectView\">The <see cref=\"ObjectView&lt;T&gt;\"/> to listen to.</param>\n        private void HookEditableObjectEvents(ObjectView<T> editableObject)\n        {\n            editableObject.EditBegun += new EventHandler(BegunItemEdit);\n            editableObject.EditCancelled += new EventHandler(CancelledItemEdit);\n            editableObject.EditEnded += new EventHandler(EndedItemEdit);\n        }\n\n        /// <summary>\n        /// Detaches event handlers from the given <see cref=\"ObjectView&lt;T&gt;\"/>'s \n        /// edit life cycle notification events.\n        /// </summary>\n        /// <param name=\"objectView\">The <see cref=\"ObjectView&lt;T&gt;\"/> to stop listening to.</param>\n        private void UnHookEditableObjectEvents(ObjectView<T> editableObject)\n        {\n            editableObject.EditBegun -= new EventHandler(BegunItemEdit);\n            editableObject.EditCancelled -= new EventHandler(CancelledItemEdit);\n            editableObject.EditEnded -= new EventHandler(EndedItemEdit);\n        }\n\n        /// <summary>\n        /// Attaches an event handler to the <see cref=\"ObjectView&lt;T&gt;\"/>'s PropertyChanged event.\n        /// </summary>\n        /// <param name=\"objectView\">The <see cref=\"ObjectView&lt;T&gt;\"/> to listen to.</param>\n        private void HookPropertyChangedEvent(ObjectView<T> editableObject)\n        {\n            editableObject.PropertyChanged += new PropertyChangedEventHandler(ItemPropertyChanged);\n        }\n\n        /// <summary>\n        /// Detaches the event handler from the <see cref=\"ObjectView&lt;T&gt;\"/>'s PropertyChanged event.\n        /// </summary>\n        /// <param name=\"objectView\">The <see cref=\"ObjectView&lt;T&gt;\"/> to stop listening to.</param>\n        private void UnHookPropertyChangedEvent(ObjectView<T> editableObject)\n        {\n            editableObject.PropertyChanged -= new PropertyChangedEventHandler(ItemPropertyChanged);\n        }\n\n        private void BuildSavedList()\n        {\n            _savedSourceLists.Clear();\n            foreach (object list in GetSourceLists())\n            {\n                _savedSourceLists.Add(list as IList);\n            }\n        }\n\n        protected IEnumerable<IList> GetSourceLists()\n        {\n            foreach (object obj in _sourceLists)\n            {\n                if (!string.IsNullOrEmpty(DataMember))\n                {\n                    bool found = false;\n                    foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(obj))\n                    {\n                        if (pd.Name == DataMember)\n                        {\n                            found = true;\n                            yield return pd.GetValue(obj) as IList;\n                            break;\n                        }\n                    }\n                    if (!found)\n                    {\n                        yield return null;\n                    }\n                }\n                else if (obj is IListSource)\n                {\n                    IListSource src = obj as IListSource;\n                    if (src.ContainsListCollection)\n                    {\n                        IList list = src.GetList() as IList;\n                        if (list != null && list.Count > 0)\n                        {\n                            list = list[0] as IList;\n                            yield return list;\n                        }\n                        else\n                        {\n                            yield return null;\n                        }\n                    }\n                    else\n                    {\n                        yield return src.GetList();\n                    }\n                }\n                else\n                {\n                    yield return obj as IList;\n                }\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "BindingListView/BindingListView.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace Equin.ApplicationFramework\n{\n    /// <summary>\n    /// A searchable, sortable, filterable, data bindable view of a list of objects.\n    /// </summary>\n    /// <typeparam name=\"T\">The type of object in the list.</typeparam>\n    public class BindingListView<T> : AggregateBindingListView<T>\n    {\n        /// <summary>\n        /// Creates a new <see cref=\"BindingListView&lt;T&gt;\"/> of a given IBindingList.\n        /// All items in the list must be of type <typeparamref name=\"T\"/>.\n        /// </summary>\n        /// <param name=\"list\">The list of objects to base the view on.</param>\n        public BindingListView(IList list)\n            : base()\n        {\n            DataSource = list;\n        }\n\n        public BindingListView(IContainer container)\n            : base(container)\n        {\n            DataSource = null;\n        }\n\n        [DefaultValue(null)]\n        [AttributeProvider(typeof(IListSource))]\n        public IList DataSource\n        {\n            get\n            {\n                IEnumerator<IList> e = GetSourceLists().GetEnumerator();\n                e.MoveNext();\n                return e.Current;\n            }\n            set\n            {\n                if (value == null)\n                {\n                    // Clear all current data\n                    SourceLists = new BindingList<IList<T>>();\n                    NewItemsList = null;\n                    FilterAndSort();\n                    OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));\n                    return;\n                }\n\n                if (!(value is ICollection<T>))\n                {\n                    // list is not a strongy-type collection.\n                    // Check that items in list are all of type T\n                    foreach (object item in value)\n                    {\n                        if (!(item is T))\n                        {\n                            throw new ArgumentException(string.Format(Properties.Resources.InvalidListItemType, typeof(T).FullName), \"DataSource\");\n                        }\n                    }\n                }\n\n                SourceLists = new object[] { value };\n                NewItemsList = value;\n            }\n        }\n\n        private bool ShouldSerializeDataSource()\n        {\n            return (SourceLists.Count > 0);\n        }\n\n        protected override void SourceListsChanged(object sender, ListChangedEventArgs e)\n        {\n            if ((SourceLists.Count > 1 && e.ListChangedType == ListChangedType.ItemAdded) || e.ListChangedType == ListChangedType.ItemDeleted)\n            {\n                throw new Exception(\"BindingListView allows strictly one source list.\");\n            }\n            else\n            {\n                base.SourceListsChanged(sender, e);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "BindingListView/BindingListView.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"12.0\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>8.0.50727</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{75AF36A8-7797-4023-B183-5B63D448420A}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Equin.ApplicationFramework</RootNamespace>\n    <AssemblyName>Equin.ApplicationFramework.BindingListView</AssemblyName>\n    <StartupObject>\n    </StartupObject>\n    <SccProjectName>\n    </SccProjectName>\n    <SccLocalPath>\n    </SccLocalPath>\n    <SccAuxPath>\n    </SccAuxPath>\n    <SccProvider>\n    </SccProvider>\n    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>\n    <TargetFrameworkProfile>\n    </TargetFrameworkProfile>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AggregateBindingListView.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"BindingListView.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"CompositeItemFilter.cs\" />\n    <Compile Include=\"ObjectView.cs\" />\n    <Compile Include=\"IItemFilter.cs\" />\n    <Compile Include=\"INotifyingEditableObject.cs\" />\n    <Compile Include=\"InvalidSourceListException.cs\" />\n    <Compile Include=\"MultiSourceIndexList.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n      <DesignTime>True</DesignTime>\n    </Compile>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <Compile Include=\"ProvidedViewPropertyDescriptor.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "BindingListView/BindingListView.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package >\n  <metadata>\n    <id>$id$</id>\n    <version>$version$</version>\n    <title>$title$</title>\n    <authors>$author$</authors>\n    <licenseUrl>https://github.com/waynebloss/BindingListView/blob/master/license.txt</licenseUrl>\n    <projectUrl>https://github.com/waynebloss/BindingListView</projectUrl>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n    <summary>$description$</summary>\n    <description>The BindingListView .NET library provides a type-safe, sortable, filterable, data-bindable view of one or more lists of objects. It is the business objects equivalent of using a DataView on a DataTable in ADO.NET. If you have a list of objects to display on a Windows Forms UI (e.g. in a DataGridView) and want to allow your user to sort and filter, then this is the library to use!</description>\n    <releaseNotes>Initial</releaseNotes>\n    <copyright>Copyright 2014</copyright>\n    <tags>.net IBindingListView winforms</tags>\n  </metadata>\n</package>"
  },
  {
    "path": "BindingListView/CompositeItemFilter.cs",
    "content": "using System;\nusing System.Collections.Generic;\n\nnamespace Equin.ApplicationFramework\n{\n    public class CompositeItemFilter<T> : IItemFilter<T>\n    {\n        private List<IItemFilter<T>> _filters;\n\n        public CompositeItemFilter()\n        {\n            _filters = new List<IItemFilter<T>>();\n        }\n\n        public void AddFilter(IItemFilter<T> filter)\n        {\n            _filters.Add(filter);\n        }\n\n        public void RemoveFilter(IItemFilter<T> filter)\n        {\n            _filters.Remove(filter);\n        }\n\n        public bool Include(T item)\n        {\n            foreach (IItemFilter<T> filter in _filters)\n            {\n                if (!filter.Include(item))\n                {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n    }\n}\n"
  },
  {
    "path": "BindingListView/IItemFilter.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Equin.ApplicationFramework\n{\n    /// <summary>\n    /// Defines a general method to test it an item should be included in a <see cref=\"BindingListView&lt;T&gt;\"/>.\n    /// </summary>\n    /// <typeparam name=\"T\">The type of item to be filtered.</typeparam>\n    public interface IItemFilter<T>\n    {\n        /// <summary>\n        /// Tests if the item should be included.\n        /// </summary>\n        /// <param name=\"item\">The item to test.</param>\n        /// <returns>True if the item should be included, otherwise false.</returns>\n        bool Include(T item);\n    }\n\n    /// <summary>\n    /// A dummy filter that is used when no filter is needed.\n    /// It simply includes any and all items tested.\n    /// </summary>\n    public class IncludeAllItemFilter<T> : IItemFilter<T>\n    {\n        public bool Include(T item)\n        {\n            // All items are to be included.\n            // So always return true.\n            return true;\n        }\n\n        public override string ToString()\n        {\n            return Properties.Resources.NoFilter;\n        }\n\n        #region Singleton Accessor\n\n        private static IncludeAllItemFilter<T> _instance;\n\n        /// <summary>\n        /// Gets the singleton instance of <see cref=\"IncludeAllItemFilter&lt;T&gt;\"/>.\n        /// </summary>\n        public static IncludeAllItemFilter<T> Instance\n        {\n            get\n            {\n                if (_instance == null)\n                {\n                    _instance = new IncludeAllItemFilter<T>();\n                }\n                return _instance;\n            }\n        }\n\n        #endregion\n    }\n\n    /// <summary>\n    /// A filter that uses a user-defined <see cref=\"Predicate&lt;T&gt;\"/> to test items for inclusion in <see cref=\"BindingListView&lt;T&gt;\"/>.\n    /// </summary>\n    public class PredicateItemFilter<T> : IItemFilter<T>\n    {\n        /// <summary>\n        /// Creates a new <see cref=\"PredicateItemFilter&lt;T&gt;\"/> that uses the specified <see cref=\"Predicate&lt;T&gt;\"/> and default name.\n        /// </summary>\n        /// <param name=\"includeDelegate\">The <see cref=\"Predicate&lt;T&gt;\"/> used to test items.</param>\n        public PredicateItemFilter(Predicate<T> includeDelegate)\n            : this(includeDelegate, null)\n        {\n            // The other constructor is called to do the work.\n        }\n\n        /// <summary>\n        /// Creates a new <see cref=\"PredicateItemFilter&lt;T&gt;\"/> that uses the specified <see cref=\"Predicate&lt;T&gt;\"/>.\n        /// </summary>\n        /// <param name=\"includeDelegate\">The <see cref=\"PredicateItemFilter&lt;T&gt;\"/> used to test items.</param>\n        /// <param name=\"name\">The name used for the ToString() return value.</param>\n        public PredicateItemFilter(Predicate<T> includeDelegate, string name)\n        {\n            // We don't allow a null string. Use the default instead.\n            _name = name ?? defaultName;\n            if (includeDelegate != null)\n            {\n                _includeDelegate = includeDelegate;\n            }\n            else\n            {\n                throw new ArgumentNullException(\"includeDelegate\", Properties.Resources.IncludeDelegateCannotBeNull);\n            }\n        }\n\n        private Predicate<T> _includeDelegate;\n        private string _name;\n        private readonly string defaultName = Properties.Resources.PredicateFilter;\n\n        public bool Include(T item)\n        {\n            return _includeDelegate(item);\n        }\n\n        public override string ToString()\n        {\n            return _name;\n        }\n    }\n\n    // TODO: Implement this class\n    /*\n    public class ExpressionItemFilter<T> : IItemFilter<T>\n    {\n        public ExpressionItemFilter(string expression)\n        {\n            // TODO: Parse expression into predicate\n        }\n\n        public bool Include(T item)\n        {\n            // TODO: use expression...\n            return true;\n        }\n    }\n    */\n\n    // TODO: Implement this class\n    /*\n    public class CSharpItemFilter<T> : IItemFilter<T>\n    {\n        public CSharpItemFilter(string filterSourceCode)\n        {\n            \n        }\n\n        public bool Include(T item)\n        {\n            // TODO: implement this method...\n            return true;\n        }\n    }\n    */\n}\n"
  },
  {
    "path": "BindingListView/INotifyingEditableObject.cs",
    "content": "using System;\nusing System.ComponentModel;\n\nnamespace Equin.ApplicationFramework\n{\n    /// <summary>\n    /// Extends <see cref=\"System.ComponentModel.IEditableObject\"/> by providing events to raise during edit state changes.\n    /// </summary>\n    internal interface INotifyingEditableObject : IEditableObject\n    {\n        /// <summary>\n        /// An edit has started on the object.\n        /// </summary>\n        /// <remarks>\n        /// This event should be raised from BeginEdit().\n        /// </remarks>\n        event EventHandler EditBegun;\n        /// <summary>\n        /// The editing of the object was cancelled.\n        /// </summary>\n        /// <remarks>\n        /// This event should be raised from CancelEdit().\n        /// </remarks>\n        event EventHandler EditCancelled;\n        /// <summary>\n        /// The editing of the object was ended.\n        /// </summary>\n        /// <remarks>\n        /// This event should be raised from EndEdit().\n        /// </remarks>\n        event EventHandler EditEnded;\n    }\n}\n"
  },
  {
    "path": "BindingListView/InvalidSourceListException.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Equin.ApplicationFramework\n{\n    [Serializable]\n    public class InvalidSourceListException : Exception\n    {\n        public InvalidSourceListException()\n            : base(Properties.Resources.InvalidSourceList)\n        {\n            \n        }\n\n        public InvalidSourceListException(string message)\n            : base(message)\n        {\n\n        }\n\n        public InvalidSourceListException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)\n            : base(info, context)\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "BindingListView/MultiSourceIndexList.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Collections;\n\nnamespace Equin.ApplicationFramework\n{\n    internal class MultiSourceIndexList<T> : List<KeyValuePair<ListItemPair<T>, int>>\n    {\n        public void Add(IList sourceList, ObjectView<T> item, int index)\n        {\n            Add(new KeyValuePair<ListItemPair<T>, int>(new ListItemPair<T>(sourceList, item), index));\n        }\n\n        /// <summary>\n        /// Searches for a given source index value, returning the list index of the value.\n        /// </summary>\n        /// <param name=\"sourceIndex\">The source index to find.</param>\n        /// <returns>Returns the index in this list of the source index, or -1 if not found.</returns>\n        public int IndexOfSourceIndex(IList sourceList, int sourceIndex)\n        {\n            for (int i = 0; i < Count; i++)\n            {\n                if (this[i].Key.List == sourceList && this[i].Value == sourceIndex)\n                {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n        /// <summary>\n        /// Searches for a given item, returning the index of the value in this list.\n        /// </summary>\n        /// <param name=\"item\">The <typeparamref name=\"T\"/> item to search for.</param>\n        /// <returns>Returns the index in this list of the item, or -1 if not found.</returns>\n        public int IndexOfItem(T item)\n        {\n            for (int i = 0; i < Count; i++)\n            {\n                if (this[i].Key.Item.Object.Equals(item) && this[i].Value > -1)\n                {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n        /// <summary>\n        /// Searches for a given item's <see cref=\"ObjectView&lt;T&gt;\"/> wrapper, returning the index of the value in this list.\n        /// </summary>\n        /// <param name=\"item\">The <see cref=\"ObjectView&lt;T&gt;\"/> to search for.</param>\n        /// <returns>Returns the index in this list of the item, or -1 if not found.</returns>\n        public int IndexOfKey(ObjectView<T> item)\n        {\n            for (int i = 0; i < Count; i++)\n            {\n                if (this[i].Key.Item.Equals(item) && this[i].Value > -1)\n                {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n        /// <summary>\n        /// Checks if the list contains a given item.\n        /// </summary>\n        /// <param name=\"item\">The <typeparamref name=\"T\"/> item to check for.</param>\n        /// <returns>True if the item is contained in the list, otherwise false.</returns>\n        public bool ContainsItem(T item)\n        {\n            return (IndexOfItem(item) != -1);\n        }\n\n        /// <summary>\n        /// Checks if the list contains a given <see cref=\"ObjectView&lt;T&gt;\"/> key.\n        /// </summary>\n        /// <param name=\"item\">The key to search for.</param>\n        /// <returns>True if the key is contained in the list, otherwise false.</returns>\n        public bool ContainsKey(ObjectView<T> key)\n        {\n            return (IndexOfKey(key) != -1);\n        }\n\n        /// <summary>\n        /// Returns an array of all the <see cref=\"ObjectView&lt;T&gt;\"/> keys in the list.\n        /// </summary>\n        public ObjectView<T>[] Keys\n        {\n            get\n            {\n                return ConvertAll<ObjectView<T>>(new Converter<KeyValuePair<ListItemPair<T>, int>, ObjectView<T>>(\n                    delegate(KeyValuePair<ListItemPair<T>, int> kvp)\n                    { return kvp.Key.Item; }\n                )).ToArray();\n            }\n        }\n\n        /// <summary>\n        /// Returns an <see cref=\"IEnumerator&lt;T&gt;\"/> to iterate over all the keys in this list.\n        /// </summary>\n        /// <returns>The <see cref=\"IEnumerator&lt;T&gt;\"/> to use.</returns>\n        public IEnumerator<ObjectView<T>> GetKeyEnumerator()\n        {\n            foreach (KeyValuePair<ListItemPair<T>, int> kvp in this)\n            {\n                yield return kvp.Key.Item;\n            }\n        }\n    }\n\n    internal class ListItemPair<T>\n    {\n        private IList _list;\n        private ObjectView<T> _item;\n\n        public ListItemPair(IList list, ObjectView<T> item)\n        {\n            _list = list;\n            _item = item;\n        }\n\n        public IList List\n        {\n            get\n            {\n                return _list;\n            }\n        }\n\n        public ObjectView<T> Item\n        {\n            get\n            {\n                return _item;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "BindingListView/ObjectView.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Reflection;\n\nnamespace Equin.ApplicationFramework\n{\n    /// <summary>\n    /// Serves a wrapper for items being viewed in a <see cref=\"BindingListView&lt;T&gt;\"/>.\n    /// This class implements <see cref=\"INotifyEditableObject\"/> so will raise the necessary events during \n    /// the item edit life-cycle.\n    /// </summary>\n    /// <remarks>\n    /// If <typeparamref name=\"T\"/> implements <see cref=\"System.ComponentModel.IEditableObject\"/> this class will call BeginEdit/CancelEdit/EndEdit on the <typeparamref name=\"T\"/> object as well.\n    /// If <typeparamref name=\"T\"/> implements <see cref=\"System.ComponentModel.IDataErrorInfo\"/> this class will use that implementation as its own.\n    /// </remarks>\n    /// <typeparam name=\"T\">The type of object being viewed.</typeparam>\n    [Serializable]\n    public class ObjectView<T> : INotifyingEditableObject, IDataErrorInfo, INotifyPropertyChanged, ICustomTypeDescriptor, IProvideViews\n    {\n        /// <summary>\n        /// Creates a new <see cref=\"ObjectView&ltT&gt;\"/> wrapper for a <typeparamref name=\"T\"/> object.\n        /// </summary>\n        /// <param name=\"object\">The <typeparamref name=\"T\"/> object being wrapped.</param>\n        public ObjectView(T @object, AggregateBindingListView<T> parent)\n        {\n            _parent = parent;\n\n            Object = @object;\n            if (Object is INotifyPropertyChanged)\n            {\n                ((INotifyPropertyChanged)Object).PropertyChanged += new PropertyChangedEventHandler(ObjectPropertyChanged);\n            }\n\n            if (typeof(ICustomTypeDescriptor).IsAssignableFrom(typeof(T)))\n            {\n                _isCustomTypeDescriptor = true;\n                _customTypeDescriptor = Object as ICustomTypeDescriptor;\n                Debug.Assert(_customTypeDescriptor != null);\n            }\n\n            _providedViews = new Dictionary<string, object>();\n            CreateProvidedViews();\n        }\n\n        /// <summary>\n        /// The view containing this ObjectView.\n        /// </summary>\n        private AggregateBindingListView<T> _parent;\n        /// <summary>\n        /// Flag that signals if we are currently editing the object.\n        /// </summary>\n        private bool _editing;\n        /// <summary>\n        /// The actual object being edited.\n        /// </summary>\n        private T _object;\n        /// <summary>\n        /// Flag set to true if type of T implements ICustomTypeDescriptor\n        /// </summary>\n        private bool _isCustomTypeDescriptor;\n        /// <summary>\n        /// Holds the Object pre-casted ICustomTypeDescriptor (if supported).\n        /// </summary>\n        private ICustomTypeDescriptor _customTypeDescriptor;\n        /// <summary>\n        /// A collection of BindingListView objects, indexed by name, for views auto-provided for any generic IList members.\n        /// </summary>\n        private Dictionary<string, object> _providedViews;\n\n        /// <summary>\n        /// Gets the object being edited.\n        /// </summary>\n        public T Object\n        {\n            get { return _object; }\n            private set\n            {\n                if (value == null)\n                {\n                    throw new ArgumentNullException(\"Object\", Properties.Resources.ObjectCannotBeNull);\n                }\n                _object = value;\n            }\n        }\n\n        public object GetProvidedView(string name)\n        {\n            return _providedViews[name];\n        }\n\n        /// <summary>\n        /// Casts an ObjectView&lt;T&gt; to a T by getting the wrapped T object.\n        /// </summary>\n        /// <param name=\"eo\">The ObjectView&lt;T&gt; to cast to a T</param>\n        /// <returns>The object that is wrapped.</returns>\n        public static explicit operator T(ObjectView<T> eo)\n        {\n            return eo.Object;\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (obj == null)\n            {\n                return false;\n            }\n\n            if (obj is T)\n            {\n                return Object.Equals(obj);\n            }\n            else if (obj is ObjectView<T>)\n            {\n                return Object.Equals((obj as ObjectView<T>).Object);\n            }\n            else\n            {\n                return Equals(obj);\n            }\n        }\n\n        public override int GetHashCode()\n        {\n            return Object.GetHashCode();\n        }\n\n        public override string ToString()\n        {\n            return Object.ToString();\n        }\n        \n        private void ObjectPropertyChanged(object sender, PropertyChangedEventArgs e)\n        {\n            // Raise our own event\n            OnPropertyChanged(sender, new PropertyChangedEventArgs(e.PropertyName));\n        }\n\n        private bool ShouldProvideViewOf(PropertyDescriptor listProp)\n        {\n            return _parent.ShouldProvideView(listProp);\n        }\n\n        private string GetProvidedViewName(PropertyDescriptor listProp)\n        {\n            return _parent.GetProvidedViewName(listProp);\n        }\n\n        private void CreateProvidedViews()\n        {\n            foreach (PropertyDescriptor prop in (this as ICustomTypeDescriptor).GetProperties())\n            {\n                if (ShouldProvideViewOf(prop))\n                {\n                    object view = _parent.CreateProvidedView(this, prop);\n                    string viewName = GetProvidedViewName(prop);\n                    _providedViews.Add(viewName, view);\n                }\n            }\n        }\n\n        #region INotifyEditableObject Members\n\n        /// <summary>\n        /// Indicates an edit has just begun.\n        /// </summary>\n        [field: NonSerialized]\n        public event EventHandler EditBegun;\n\n        /// <summary>\n        /// Indicates the edit was cancelled.\n        /// </summary>\n        [field: NonSerialized]\n        public event EventHandler EditCancelled;\n\n        /// <summary>\n        /// Indicated the edit was ended.\n        /// </summary>\n        [field: NonSerialized]\n        public event EventHandler EditEnded;\n\n        protected virtual void OnEditBegun()\n        {\n            if (EditBegun != null)\n            {\n                EditBegun(this, EventArgs.Empty);\n            }\n        }\n\n        protected virtual void OnEditCancelled()\n        {\n            if (EditCancelled != null)\n            {\n                EditCancelled(this, EventArgs.Empty);\n            }\n        }\n\n        protected virtual void OnEditEnded()\n        {\n            if (EditEnded != null)\n            {\n                EditEnded(this, EventArgs.Empty);\n            }\n        }\n\n        #endregion\n\n        #region IEditableObject Members\n\n        public void BeginEdit()\n        {\n            // As per documentation, this method may get called multiple times for a single edit.\n            // So we set a flag to only honor the first call.\n            if (!_editing)\n            {\n                _editing = true;\n\n                // If possible call the object's BeginEdit() method\n                // to let it do what ever it needs e.g. save state\n                if (Object is IEditableObject)\n                {\n                    ((IEditableObject)Object).BeginEdit();\n                }\n                // Raise the EditBegun event.                \n                OnEditBegun();\n            }\n        }\n\n        public void CancelEdit()\n        {\n            // We can only cancel if currently editing\n            if (_editing)\n            {\n                // If possible call the object's CancelEdit() method\n                // to let it do what ever it needs e.g. rollback state\n                if (Object is IEditableObject)\n                {\n                    ((IEditableObject)Object).CancelEdit();\n                }\n                // Raise the EditCancelled event.\n                OnEditCancelled();\n                // No longer editing now.\n                _editing = false;\n            }\n        }\n\n        public void EndEdit()\n        {\n            // We can only end if currently editing\n            if (_editing)\n            {\n                // If possible call the object's EndEdit() method\n                // to let it do what ever it needs e.g. commit state\n                if (Object is IEditableObject)\n                {\n                    ((IEditableObject)Object).EndEdit();\n                }\n                // Raise the EditEnded event.\n                OnEditEnded();\n                // No longer editing now.\n                _editing = false;\n            }\n        }\n\n        #endregion\n\n        #region IDataErrorInfo Members\n\n        // If the wrapped Object support IDataErrorInfo we forward calls to it.\n        // Otherwise, we just return empty strings that signal \"no error\".\n\n        string IDataErrorInfo.Error\n        {\n            get\n            {\n                if (Object is IDataErrorInfo)\n                {\n                    return ((IDataErrorInfo)Object).Error;\n                }\n                return string.Empty;\n            }\n        }\n\n        string IDataErrorInfo.this[string columnName]\n        {\n            get\n            {\n                if (Object is IDataErrorInfo)\n                {\n                    return ((IDataErrorInfo)Object)[columnName];\n                }\n                return string.Empty;\n            }\n        }\n\n        #endregion\n\n        #region INotifyPropertyChanged Members\n\n        [field: NonSerialized]\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs args)\n        {\n            if (PropertyChanged != null)\n            {\n                PropertyChanged(sender, args);\n            }\n        }\n\n        #endregion\n\n        #region ICustomTypeDescriptor Members\n\n        AttributeCollection ICustomTypeDescriptor.GetAttributes()\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetAttributes();\n            }\n            else\n            {\n                return TypeDescriptor.GetAttributes(Object);\n            }\n        }\n\n        string ICustomTypeDescriptor.GetClassName()\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetClassName();\n            }\n            else\n            {\n                return typeof(T).FullName;\n            }\n        }\n\n        string ICustomTypeDescriptor.GetComponentName()\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetComponentName();\n            }\n            else\n            {\n                return TypeDescriptor.GetFullComponentName(Object);\n            }\n        }\n\n        TypeConverter ICustomTypeDescriptor.GetConverter()\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetConverter();\n            }\n            else\n            {\n                return TypeDescriptor.GetConverter(Object);\n            }\n        }\n\n        EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetDefaultEvent();\n            }\n            else\n            {\n                return TypeDescriptor.GetDefaultEvent(Object);\n            }\n        }\n\n        PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetDefaultProperty();\n            }\n            else\n            {\n                return TypeDescriptor.GetDefaultProperty(Object);\n            }\n        }\n\n        object ICustomTypeDescriptor.GetEditor(Type editorBaseType)\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetEditor(editorBaseType);\n            }\n            else\n            {\n                return null;\n            }\n        }\n\n        EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetEvents();\n            }\n            else\n            {\n                return TypeDescriptor.GetEvents(Object, attributes);\n            }\n        }\n\n        EventDescriptorCollection ICustomTypeDescriptor.GetEvents()\n        {\n            return (this as ICustomTypeDescriptor).GetEvents(null);\n        }\n\n        PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)\n        {\n            List<PropertyDescriptor> props;\n            if (_isCustomTypeDescriptor)\n            {\n                props = new List<PropertyDescriptor>(_parent.AddProvidedViews(_customTypeDescriptor.GetProperties(attributes)));\n            }\n            else\n            {\n                props = new List<PropertyDescriptor>(_parent.AddProvidedViews(TypeDescriptor.GetProperties(Object, attributes)));\n            }\n            return new PropertyDescriptorCollection(props.ToArray());\n        }\n\n        PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()\n        {\n            return (this as ICustomTypeDescriptor).GetProperties(null);\n        }\n\n        object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)\n        {\n            if (_isCustomTypeDescriptor)\n            {\n                return _customTypeDescriptor.GetPropertyOwner(pd);\n            }\n            else\n            {\n                return Object;\n            }\n        }\n\n        #endregion\n    }\n\n    public interface IProvideViews\n    {\n        object GetProvidedView(string name);\n    }\n\n}\n"
  },
  {
    "path": "BindingListView/Properties/AssemblyInfo.cs",
    "content": "using System;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"BindingListView\")]\n[assembly: AssemblyDescription(\"Advanced, data bindable, object list view.\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Equin\")]\n[assembly: AssemblyProduct(\"BindingListView\")]\n[assembly: AssemblyCopyright(\"Copyright  Andrew Davey 2005\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM componenets.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"709a6d28-582d-423b-ae59-83e0945c4227\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.4.*\")]\n[assembly: AssemblyFileVersion(\"1.4.1.0\")]\n\n[assembly: CLSCompliant(true)]"
  },
  {
    "path": "BindingListView/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Equin.ApplicationFramework.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Equin.ApplicationFramework.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot add an external item to the view. Use AddNew() or add to source list instead..\n        /// </summary>\n        internal static string CannotAddItem {\n            get {\n                return ResourceManager.GetString(\"CannotAddItem\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot add a new item due to no object being provided in the AddingNew event and a lack of default public constructor..\n        /// </summary>\n        internal static string CannotAddNewItem {\n            get {\n                return ResourceManager.GetString(\"CannotAddNewItem\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot add a new item when NewItemsList is null..\n        /// </summary>\n        internal static string CannotAddWhenNewItemsListNull {\n            get {\n                return ResourceManager.GetString(\"CannotAddWhenNewItemsListNull\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot clear this view..\n        /// </summary>\n        internal static string CannotClearView {\n            get {\n                return ResourceManager.GetString(\"CannotClearView\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot insert an external item into this collection..\n        /// </summary>\n        internal static string CannotInsertItem {\n            get {\n                return ResourceManager.GetString(\"CannotInsertItem\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot set an item in the view..\n        /// </summary>\n        internal static string CannotSetItem {\n            get {\n                return ResourceManager.GetString(\"CannotSetItem\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to includeDelegate cannot be null..\n        /// </summary>\n        internal static string IncludeDelegateCannotBeNull {\n            get {\n                return ResourceManager.GetString(\"IncludeDelegateCannotBeNull\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Item in list is not of type {0}..\n        /// </summary>\n        internal static string InvalidListItemType {\n            get {\n                return ResourceManager.GetString(\"InvalidListItemType\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Source list does not implement IList..\n        /// </summary>\n        internal static string InvalidSourceList {\n            get {\n                return ResourceManager.GetString(\"InvalidSourceList\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Item was not of type {0}..\n        /// </summary>\n        internal static string ItemTypeIncorrect {\n            get {\n                return ResourceManager.GetString(\"ItemTypeIncorrect\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to (no filter).\n        /// </summary>\n        internal static string NoFilter {\n            get {\n                return ResourceManager.GetString(\"NoFilter\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Object cannot be null..\n        /// </summary>\n        internal static string ObjectCannotBeNull {\n            get {\n                return ResourceManager.GetString(\"ObjectCannotBeNull\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to (predicate filter).\n        /// </summary>\n        internal static string PredicateFilter {\n            get {\n                return ResourceManager.GetString(\"PredicateFilter\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Property {0} does not exist in type {1}..\n        /// </summary>\n        internal static string PropertyNotFound {\n            get {\n                return ResourceManager.GetString(\"PropertyNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Source list already added to the view..\n        /// </summary>\n        internal static string SourceListAlreadyAdded {\n            get {\n                return ResourceManager.GetString(\"SourceListAlreadyAdded\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Source list is not in the view..\n        /// </summary>\n        internal static string SourceListNotFound {\n            get {\n                return ResourceManager.GetString(\"SourceListNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to SourceLists cannot be null..\n        /// </summary>\n        internal static string SourceListsNull {\n            get {\n                return ResourceManager.GetString(\"SourceListsNull\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Synchronized access to the view is not supported..\n        /// </summary>\n        internal static string SyncAccessNotSupported {\n            get {\n                return ResourceManager.GetString(\"SyncAccessNotSupported\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "BindingListView/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"CannotAddItem\" xml:space=\"preserve\">\n    <value>Cannot add an external item to the view. Use AddNew() or add to source list instead.</value>\n  </data>\n  <data name=\"CannotAddNewItem\" xml:space=\"preserve\">\n    <value>Cannot add a new item due to no object being provided in the AddingNew event and a lack of default public constructor.</value>\n  </data>\n  <data name=\"CannotAddWhenNewItemsListNull\" xml:space=\"preserve\">\n    <value>Cannot add a new item when NewItemsList is null.</value>\n  </data>\n  <data name=\"CannotClearView\" xml:space=\"preserve\">\n    <value>Cannot clear this view.</value>\n  </data>\n  <data name=\"CannotInsertItem\" xml:space=\"preserve\">\n    <value>Cannot insert an external item into this collection.</value>\n  </data>\n  <data name=\"CannotSetItem\" xml:space=\"preserve\">\n    <value>Cannot set an item in the view.</value>\n  </data>\n  <data name=\"IncludeDelegateCannotBeNull\" xml:space=\"preserve\">\n    <value>includeDelegate cannot be null.</value>\n  </data>\n  <data name=\"InvalidListItemType\" xml:space=\"preserve\">\n    <value>Item in list is not of type {0}.</value>\n  </data>\n  <data name=\"InvalidSourceList\" xml:space=\"preserve\">\n    <value>Source list does not implement IList.</value>\n  </data>\n  <data name=\"ItemTypeIncorrect\" xml:space=\"preserve\">\n    <value>Item was not of type {0}.</value>\n  </data>\n  <data name=\"NoFilter\" xml:space=\"preserve\">\n    <value>(no filter)</value>\n  </data>\n  <data name=\"ObjectCannotBeNull\" xml:space=\"preserve\">\n    <value>Object cannot be null.</value>\n  </data>\n  <data name=\"PredicateFilter\" xml:space=\"preserve\">\n    <value>(predicate filter)</value>\n  </data>\n  <data name=\"PropertyNotFound\" xml:space=\"preserve\">\n    <value>Property {0} does not exist in type {1}.</value>\n  </data>\n  <data name=\"SourceListAlreadyAdded\" xml:space=\"preserve\">\n    <value>Source list already added to the view.</value>\n  </data>\n  <data name=\"SourceListNotFound\" xml:space=\"preserve\">\n    <value>Source list is not in the view.</value>\n  </data>\n  <data name=\"SourceListsNull\" xml:space=\"preserve\">\n    <value>SourceLists cannot be null.</value>\n  </data>\n  <data name=\"SyncAccessNotSupported\" xml:space=\"preserve\">\n    <value>Synchronized access to the view is not supported.</value>\n  </data>\n</root>"
  },
  {
    "path": "BindingListView/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Equin.ApplicationFramework.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"17.0.3.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "BindingListView/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>\n"
  },
  {
    "path": "BindingListView/ProvidedViewPropertyDescriptor.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace Equin.ApplicationFramework\n{\n    class ProvidedViewPropertyDescriptor : PropertyDescriptor\n    {\n        public ProvidedViewPropertyDescriptor(string name, Type propertyType)\n            : base(name, null)\n        {\n            _propertyType = propertyType;\n        }\n\n        private Type _propertyType;\n\n        public override bool CanResetValue(object component)\n        {\n            return false;\n        }\n\n        public override Type ComponentType\n        {\n            get { return typeof(IProvideViews); }\n        }\n\n        public override object GetValue(object component)\n        {\n            if (component is IProvideViews)\n            {\n                return (component as IProvideViews).GetProvidedView(Name);\n            }\n\n            throw new ArgumentException(\"Type of component is not valid.\", \"component\");\n        }\n\n        public override bool IsReadOnly\n        {\n            get { return true; }\n        }\n\n        public override Type PropertyType\n        {\n            get { return _propertyType; }\n        }\n\n        public override void ResetValue(object component)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override void SetValue(object component, object value)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override bool ShouldSerializeValue(object component)\n        {\n            return false;\n        }\n\n        /// <summary>\n        /// Gets if a BindingListView can be provided for given property. \n        /// The property type must implement IList&lt;&gt; i.e. some generic IList.\n        /// </summary>\n        public static bool CanProvideViewOf(PropertyDescriptor prop)\n        {\n            Type propType = prop.PropertyType;\n            foreach (Type interfaceType in propType.GetInterfaces())\n            {\n                if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition().Equals(typeof(IList<>)))\n                {\n                    return true;\n                }\n            }\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/CheckBoxComboBox.Designer.cs",
    "content": "﻿namespace PresentationControls\n{\n    partial class CheckBoxComboBox\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/CheckBoxComboBox.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Forms;\n\nnamespace PresentationControls\n{\n    /// <summary>\n    /// Martin Lottering : 2007-10-27\n    /// --------------------------------\n    /// This is a usefull control in Filters. Allows you to save space and can replace a Grouped Box of CheckBoxes.\n    /// Currently used on the TasksFilter for TaskStatusses, which means the user can select which Statusses to include\n    /// in the \"Search\".\n    /// This control does not implement a CheckBoxListBox, instead it adds a wrapper for the normal ComboBox and Items. \n    /// See the CheckBoxItems property.\n    /// ----------------\n    /// ALSO IMPORTANT: In Data Binding when setting the DataSource. The ValueMember must be a bool type property, because it will \n    /// be binded to the Checked property of the displayed CheckBox. Also see the DisplayMemberSingleItem for more information.\n    /// ----------------\n    /// Extends the CodeProject PopupComboBox \"Simple pop-up control\" \"http://www.codeproject.com/cs/miscctrl/simplepopup.asp\"\n    /// by Lukasz Swiatkowski.\n    /// </summary>\n    public partial class CheckBoxComboBox : PopupComboBox\n    {\n        #region CONSTRUCTOR\n\n        public CheckBoxComboBox()\n            : base()\n        {\n            InitializeComponent();\n            _CheckBoxProperties = new CheckBoxProperties();\n            _CheckBoxProperties.PropertyChanged += new EventHandler(_CheckBoxProperties_PropertyChanged);\n            // Dumps the ListControl in a(nother) Container to ensure the ScrollBar on the ListControl does not\n            // Paint over the Size grip. Setting the Padding or Margin on the Popup or host control does\n            // not work as I expected. I don't think it can work that way.\n            CheckBoxComboBoxListControlContainer ContainerControl = new CheckBoxComboBoxListControlContainer();\n            _CheckBoxComboBoxListControl = new CheckBoxComboBoxListControl(this);\n            _CheckBoxComboBoxListControl.Items.CheckBoxCheckedChanged += new EventHandler(Items_CheckBoxCheckedChanged);\n            ContainerControl.Controls.Add(_CheckBoxComboBoxListControl);\n            // This padding spaces neatly on the left-hand side and allows space for the size grip at the bottom.\n            ContainerControl.Padding = new Padding(4, 0, 0, 14);\n            // The ListControl FILLS the ListContainer.\n            _CheckBoxComboBoxListControl.Dock = DockStyle.Fill;\n            // The DropDownControl used by the base class. Will be wrapped in a popup by the base class.\n            DropDownControl = ContainerControl;\n            // Must be set after the DropDownControl is set, since the popup is recreated.\n            // NOTE: I made the dropDown protected so that it can be accessible here. It was private.\n            dropDown.Resizable = true;\n        }\n\n        #endregion\n\n        #region PRIVATE FIELDS\n\n        /// <summary>\n        /// The checkbox list control. The public CheckBoxItems property provides a direct reference to its Items.\n        /// </summary>\n        internal CheckBoxComboBoxListControl _CheckBoxComboBoxListControl;\n        /// <summary>\n        /// In DataBinding operations, this property will be used as the DisplayMember in the CheckBoxComboBoxListBox.\n        /// The normal/existing \"DisplayMember\" property is used by the TextBox of the ComboBox to display \n        /// a concatenated Text of the items selected. This concatenation and its formatting however is controlled \n        /// by the Binded object, since it owns that property.\n        /// </summary>\n        private string _DisplayMemberSingleItem = null;\n        internal bool _MustAddHiddenItem = false;\n\n        #endregion\n\n        #region PRIVATE OPERATIONS\n\n        /// <summary>\n        /// Builds a CSV string of the items selected.\n        /// </summary>\n        internal string GetCSVText(bool skipFirstItem)\n        {\n            var itemText = _CheckBoxComboBoxListControl.Items.Where(x => x.Checked).Select(x => x.Text);\n\n            if (DropDownStyle == ComboBoxStyle.DropDownList && DataSource == null && skipFirstItem)\n                return string.Join(\", \", itemText.Skip(1).ToArray());\n            else\n                return string.Join(\", \", itemText.ToArray());\n        }\n\n        #endregion\n\n        #region PUBLIC PROPERTIES\n\n        /// <summary>\n        /// A direct reference to the Items of CheckBoxComboBoxListControl.\n        /// You can use it to Get or Set the Checked status of items manually if you want.\n        /// But do not manipulate the List itself directly, e.g. Adding and Removing, \n        /// since the list is synchronised when shown with the ComboBox.Items. So for changing \n        /// the list contents, use Items instead.\n        /// </summary>\n        [Browsable(false)]\n        public CheckBoxComboBoxItemList CheckBoxItems\n        {\n            get \n            { \n                // Added to ensure the CheckBoxItems are ALWAYS\n                // available for modification via code.\n                if (_CheckBoxComboBoxListControl.Items.Count != Items.Count)\n                    _CheckBoxComboBoxListControl.SynchroniseControlsWithComboBoxItems();\n                return _CheckBoxComboBoxListControl.Items; \n            }\n        }\n        /// <summary>\n        /// The DataSource of the combobox. Refreshes the CheckBox wrappers when this is set.\n        /// </summary>\n        public new object DataSource\n        {\n            get { return base.DataSource; }\n            set\n            {\n                base.DataSource = value;\n                if (!string.IsNullOrEmpty(ValueMember))\n                    // This ensures that at least the checkboxitems are available to be initialised.\n                    _CheckBoxComboBoxListControl.SynchroniseControlsWithComboBoxItems();\n            }\n        }\n        /// <summary>\n        /// The ValueMember of the combobox. Refreshes the CheckBox wrappers when this is set.\n        /// </summary>\n        public new string ValueMember\n        {\n            get { return base.ValueMember; }\n            set\n            {\n                base.ValueMember = value;\n                if (!string.IsNullOrEmpty(ValueMember))\n                    // This ensures that at least the checkboxitems are available to be initialised.\n                    _CheckBoxComboBoxListControl.SynchroniseControlsWithComboBoxItems();\n            }\n        }\n        /// <summary>\n        /// In DataBinding operations, this property will be used as the DisplayMember in the CheckBoxComboBoxListBox.\n        /// The normal/existing \"DisplayMember\" property is used by the TextBox of the ComboBox to display \n        /// a concatenated Text of the items selected. This concatenation however is controlled by the Binded \n        /// object, since it owns that property.\n        /// </summary>\n        public string DisplayMemberSingleItem\n        {\n            get { if (string.IsNullOrEmpty(_DisplayMemberSingleItem)) return DisplayMember; else return _DisplayMemberSingleItem; }\n            set { _DisplayMemberSingleItem = value; }\n        }\n        /// <summary>\n        /// Made this property Browsable again, since the Base Popup hides it. This class uses it again.\n        /// Gets an object representing the collection of the items contained in this \n        /// System.Windows.Forms.ComboBox.\n        /// </summary>\n        /// <returns>A System.Windows.Forms.ComboBox.ObjectCollection representing the items in \n        /// the System.Windows.Forms.ComboBox.\n        /// </returns>\n        [Browsable(true)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public new ObjectCollection Items\n        {\n            get { return base.Items; }\n        }\n\n        #endregion\n\n        #region EVENTS & EVENT HANDLERS\n\n        public event EventHandler CheckBoxCheckedChanged;\n\n        private void Items_CheckBoxCheckedChanged(object sender, EventArgs e)\n        {\n            OnCheckBoxCheckedChanged(sender, e);\n        }\n\n        #endregion\n\n        #region EVENT CALLERS and OVERRIDES e.g. OnResize()\n\n        protected void OnCheckBoxCheckedChanged(object sender, EventArgs e)\n        {\n            string ListText = GetCSVText(true);\n            // The DropDownList style seems to require that the text\n            // part of the \"textbox\" should match a single item.\n            if (DropDownStyle != ComboBoxStyle.DropDownList)\n                Text = ListText;\n            // This refreshes the Text of the first item (which is not visible)\n            else if (DataSource == null)\n            {\n                Items[0] = ListText;\n                // Keep the hidden item and first checkbox item in \n                // sync in order to ensure the Synchronise process\n                // can match the items.\n                CheckBoxItems[0].ComboBoxItem = ListText;\n            }\n\n            EventHandler handler = CheckBoxCheckedChanged;\n            if (handler != null)\n                handler(sender, e);\n        }\n\n        /// <summary>\n        /// Will add an invisible item when the style is DropDownList,\n        /// to help maintain the correct text in main TextBox.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnDropDownStyleChanged(EventArgs e)\n        {\n            base.OnDropDownStyleChanged(e);\n\n            if (DropDownStyle == ComboBoxStyle.DropDownList\n                && DataSource == null\n                && !DesignMode)\n                _MustAddHiddenItem = true;\n        }\n\n        protected override void OnResize(EventArgs e)\n        {\n            // When the ComboBox is resized, the width of the dropdown \n            // is also resized to match the width of the ComboBox. I think it looks better.\n            Size Size = new Size(Width, DropDownControl.Height);\n            dropDown.Size = Size;\n            base.OnResize(e);\n        }\n\n        #endregion\n\n        #region PUBLIC OPERATIONS\n\n        /// <summary>\n        /// A function to clear/reset the list.\n        /// (Ubiklou : http://www.codeproject.com/KB/combobox/extending_combobox.aspx?msg=2526813#xx2526813xx)\n        /// </summary>\n        public void Clear()\n        {\n            this.Items.Clear();\n            if (DropDownStyle == ComboBoxStyle.DropDownList && DataSource == null)\n                _MustAddHiddenItem = true;                \n        }        /// <summary>\n        /// Uncheck all items.\n        /// </summary>\n        public void ClearSelection()\n        {\n            foreach (CheckBoxComboBoxItem Item in CheckBoxItems)\n                if (Item.Checked)\n                    Item.Checked = false;\n        }\n\n        #endregion\n\n        #region CHECKBOX PROPERTIES (DEFAULTS)\n\n        private CheckBoxProperties _CheckBoxProperties;\n\n        /// <summary>\n        /// The properties that will be assigned to the checkboxes as default values.\n        /// </summary>\n        [Description(\"The properties that will be assigned to the checkboxes as default values.\")]\n        [Browsable(true)]\n        public CheckBoxProperties CheckBoxProperties\n        {\n            get { return _CheckBoxProperties; }\n            set { _CheckBoxProperties = value; _CheckBoxProperties_PropertyChanged(this, EventArgs.Empty); }\n        }\n\n        private void _CheckBoxProperties_PropertyChanged(object sender, EventArgs e)\n        {\n            foreach (CheckBoxComboBoxItem Item in CheckBoxItems)\n                Item.ApplyProperties(CheckBoxProperties);\n        }\n\n        #endregion\n\n        protected override void WndProc(ref Message m)\n        {\n            // 323 : Item Added\n            // 331 : Clearing\n            if (m.Msg == 331\n                && DropDownStyle == ComboBoxStyle.DropDownList\n                && DataSource == null)\n            {\n                _MustAddHiddenItem = true;\n            }\n            \n            base.WndProc(ref m);\n        }\n    }\n\n    /// <summary>\n    /// A container control for the ListControl to ensure the ScrollBar on the ListControl does not\n    /// Paint over the Size grip. Setting the Padding or Margin on the Popup or host control does\n    /// not work as I expected.\n    /// </summary>\n    [ToolboxItem(false)]\n    public class CheckBoxComboBoxListControlContainer : UserControl\n    {\n        #region CONSTRUCTOR\n\n        public CheckBoxComboBoxListControlContainer()\n            : base()\n        {\n            BackColor = SystemColors.Window;\n            BorderStyle = BorderStyle.FixedSingle;\n            AutoScaleMode = AutoScaleMode.Inherit;\n            ResizeRedraw = true;\n            // If you don't set this, then resize operations cause an error in the base class.\n            MinimumSize = new Size(1, 1);\n            MaximumSize = new Size(500, 500);\n        }\n        #endregion\n\n        #region RESIZE OVERRIDE REQUIRED BY THE POPUP CONTROL\n\n        /// <summary>\n        /// Prescribed by the Popup class to ensure Resize operations work correctly.\n        /// </summary>\n        /// <param name=\"m\"></param>\n        protected override void WndProc(ref Message m)\n        {\n            if ((Parent as Popup).ProcessResizing(ref m))\n            {\n                return;\n            }\n            base.WndProc(ref m);\n        }\n        #endregion\n    }\n\n    /// <summary>\n    /// This ListControl that pops up to the User. It contains the CheckBoxComboBoxItems. \n    /// The items are docked DockStyle.Top in this control.\n    /// </summary>\n    [ToolboxItem(false)]\n    public class CheckBoxComboBoxListControl : ScrollableControl\n    {\n        #region CONSTRUCTOR\n\n        public CheckBoxComboBoxListControl(CheckBoxComboBox owner)\n            : base()\n        {\n            DoubleBuffered = true;\n            _CheckBoxComboBox = owner;\n            _Items = new CheckBoxComboBoxItemList(_CheckBoxComboBox);\n            BackColor = SystemColors.Window;\n            AutoScroll = true;\n            ResizeRedraw = true;\n            // if you don't set this, a Resize operation causes an error in the base class.\n            MinimumSize = new Size(1, 1);\n            MaximumSize = new Size(500, 500);\n        }\n\n        #endregion\n\n        #region PRIVATE PROPERTIES\n\n        /// <summary>\n        /// Simply a reference to the CheckBoxComboBox.\n        /// </summary>\n        private CheckBoxComboBox _CheckBoxComboBox;\n        /// <summary>\n        /// A Typed list of ComboBoxCheckBoxItems.\n        /// </summary>\n        private CheckBoxComboBoxItemList _Items;\n\n        #endregion\n\n        public CheckBoxComboBoxItemList Items { get { return _Items; } }\n\n        #region RESIZE OVERRIDE REQUIRED BY THE POPUP CONTROL\n\n        /// <summary>\n        /// Prescribed by the Popup control to enable Resize operations.\n        /// </summary>\n        /// <param name=\"m\"></param>\n        protected override void WndProc(ref Message m)\n        {\n            if ((Parent.Parent as Popup).ProcessResizing(ref m))\n            {\n                return;\n            }\n            base.WndProc(ref m);\n        }\n\n        #endregion\n\n        #region PROTECTED MEMBERS\n\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            // Synchronises the CheckBox list with the items in the ComboBox.\n            SynchroniseControlsWithComboBoxItems();\n            base.OnVisibleChanged(e);\n        }\n        /// <summary>\n        /// Maintains the controls displayed in the list by keeping them in sync with the actual \n        /// items in the combobox. (e.g. removing and adding as well as ordering)\n        /// </summary>\n        public void SynchroniseControlsWithComboBoxItems()\n        {\n            SuspendLayout();\n            if (_CheckBoxComboBox._MustAddHiddenItem)\n            {\n                _CheckBoxComboBox.Items.Insert(\n                    0, _CheckBoxComboBox.GetCSVText(false)); // INVISIBLE ITEM\n                _CheckBoxComboBox.SelectedIndex = 0;\n                _CheckBoxComboBox._MustAddHiddenItem = false;\n            }\n            Controls.Clear();\n            #region Disposes all items that are no longer in the combo box list\n\n            for (int Index = _Items.Count - 1; Index >= 0; Index--)\n            {\n                CheckBoxComboBoxItem Item = _Items[Index];\n                if (!_CheckBoxComboBox.Items.Contains(Item.ComboBoxItem))\n                {\n                    _Items.Remove(Item);\n                    Item.Dispose();\n                }\n            }\n\n            #endregion\n            #region Recreate the list in the same order of the combo box items\n\n            bool HasHiddenItem = \n                _CheckBoxComboBox.DropDownStyle == ComboBoxStyle.DropDownList\n                && _CheckBoxComboBox.DataSource == null\n                && !DesignMode;\n\n            CheckBoxComboBoxItemList NewList = new CheckBoxComboBoxItemList(_CheckBoxComboBox);\n            for(int Index0 = 0; Index0 <= _CheckBoxComboBox.Items.Count - 1; Index0 ++)\n            {\n                object Object = _CheckBoxComboBox.Items[Index0];\n                CheckBoxComboBoxItem Item = null;\n                // The hidden item could match any other item when only\n                // one other item was selected.\n                if (Index0 == 0 && HasHiddenItem && _Items.Count > 0)\n                    Item = _Items[0];\n                else\n                {\n                    int StartIndex = HasHiddenItem\n                        ? 1 // Skip the hidden item, it could match \n                        : 0;\n                    for (int Index1 = StartIndex; Index1 <= _Items.Count - 1; Index1++)\n                    {\n                        if (_Items[Index1].ComboBoxItem == Object)\n                        {\n                            Item = _Items[Index1];\n                            break;\n                        }\n                    }\n                }\n                if (Item == null)\n                {\n                    Item = new CheckBoxComboBoxItem(_CheckBoxComboBox, Object);\n                    Item.ApplyProperties(_CheckBoxComboBox.CheckBoxProperties);\n                }\n                NewList.Add(Item);\n                Item.Dock = DockStyle.Top;\n            }\n            _Items.Clear();\n            _Items.AddRange(NewList);\n\n            #endregion\n            #region Add the items to the controls in reversed order to maintain correct docking order\n\n            if (NewList.Count > 0)\n            {\n                // This reverse helps to maintain correct docking order.\n                NewList.Reverse();\n                // If you get an error here that \"Cannot convert to the desired \n                // type, it probably means the controls are not binding correctly.\n                // The Checked property is binded to the ValueMember property. \n                // It must be a bool for example.\n                Controls.AddRange(NewList.ToArray());\n            }\n\n            #endregion\n\n            // Keep the first item invisible\n            if (_CheckBoxComboBox.DropDownStyle == ComboBoxStyle.DropDownList\n                && _CheckBoxComboBox.DataSource == null\n                && !DesignMode)\n                _CheckBoxComboBox.CheckBoxItems[0].Visible = false; \n            \n            ResumeLayout();\n        }\n\n        #endregion\n    }\n\n    /// <summary>\n    /// The CheckBox items displayed in the Popup of the ComboBox.\n    /// </summary>\n    [ToolboxItem(false)]\n    public class CheckBoxComboBoxItem : CheckBox\n    {\n        #region CONSTRUCTOR\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"owner\">A reference to the CheckBoxComboBox.</param>\n        /// <param name=\"comboBoxItem\">A reference to the item in the ComboBox.Items that this object is extending.</param>\n        public CheckBoxComboBoxItem(CheckBoxComboBox owner, object comboBoxItem)\n            : base()\n        {\n            DoubleBuffered = true;\n            _CheckBoxComboBox = owner;\n            _ComboBoxItem = comboBoxItem;\n            if (_CheckBoxComboBox.DataSource != null)\n                AddBindings();\n            else\n                Text = comboBoxItem.ToString();\n        }\n        #endregion\n\n        #region PRIVATE PROPERTIES\n\n        /// <summary>\n        /// A reference to the CheckBoxComboBox.\n        /// </summary>\n        private CheckBoxComboBox _CheckBoxComboBox;\n        /// <summary>\n        /// A reference to the Item in ComboBox.Items that this object is extending.\n        /// </summary>\n        private object _ComboBoxItem;\n\n        #endregion\n\n        #region PUBLIC PROPERTIES\n\n        /// <summary>\n        /// A reference to the Item in ComboBox.Items that this object is extending.\n        /// </summary>\n        public object ComboBoxItem\n        {\n            get { return _ComboBoxItem; }\n            internal set { _ComboBoxItem = value; }\n        }\n\n        #endregion\n\n        #region BINDING HELPER\n\n        /// <summary>\n        /// When using Data Binding operations via the DataSource property of the ComboBox. This\n        /// adds the required Bindings for the CheckBoxes.\n        /// </summary>\n        public void AddBindings()\n        {\n            // Note, the text uses \"DisplayMemberSingleItem\", not \"DisplayMember\" (unless its not assigned)\n            DataBindings.Add(\n                \"Text\",\n                _ComboBoxItem,\n                _CheckBoxComboBox.DisplayMemberSingleItem\n                );\n            // The ValueMember must be a bool type property usable by the CheckBox.Checked.\n            DataBindings.Add(\n                \"Checked\",\n                _ComboBoxItem,\n                _CheckBoxComboBox.ValueMember,\n                false,\n                // This helps to maintain proper selection state in the Binded object,\n                // even when the controls are added and removed.\n                DataSourceUpdateMode.OnPropertyChanged,\n                false, null, null);\n            // Helps to maintain the Checked status of this\n            // checkbox before the control is visible\n            if (_ComboBoxItem is INotifyPropertyChanged)\n                ((INotifyPropertyChanged)_ComboBoxItem).PropertyChanged += \n                    new PropertyChangedEventHandler(\n                        CheckBoxComboBoxItem_PropertyChanged);\n        }\n\n        #endregion\n\n        #region PROTECTED MEMBERS\n\n        protected override void OnCheckedChanged(EventArgs e)\n        {\n            // Found that when this event is raised, the bool value of the binded item is not yet updated.\n            if (_CheckBoxComboBox.DataSource != null)\n            {\n                PropertyInfo PI = ComboBoxItem.GetType().GetProperty(_CheckBoxComboBox.ValueMember);\n                PI.SetValue(ComboBoxItem, Checked, null);\n            }\n            base.OnCheckedChanged(e);\n            // Forces a refresh of the Text displayed in the main TextBox of the ComboBox,\n            // since that Text will most probably represent a concatenation of selected values.\n            // Also see DisplayMemberSingleItem on the CheckBoxComboBox for more information.\n            if (_CheckBoxComboBox.DataSource != null)\n            {\n                string OldDisplayMember = _CheckBoxComboBox.DisplayMember;\n                _CheckBoxComboBox.DisplayMember = null;\n                _CheckBoxComboBox.DisplayMember = OldDisplayMember;\n            }\n        }\n\n        #endregion\n\n        #region HELPER MEMBERS\n\n        internal void ApplyProperties(CheckBoxProperties properties)\n        {\n            this.Appearance = properties.Appearance;\n            this.AutoCheck = properties.AutoCheck;\n            this.AutoEllipsis = properties.AutoEllipsis;\n            this.AutoSize = properties.AutoSize;\n            this.CheckAlign = properties.CheckAlign;\n            this.FlatAppearance.BorderColor = properties.FlatAppearanceBorderColor;\n            this.FlatAppearance.BorderSize = properties.FlatAppearanceBorderSize;\n            this.FlatAppearance.CheckedBackColor = properties.FlatAppearanceCheckedBackColor;\n            this.FlatAppearance.MouseDownBackColor = properties.FlatAppearanceMouseDownBackColor;\n            this.FlatAppearance.MouseOverBackColor = properties.FlatAppearanceMouseOverBackColor;\n            this.FlatStyle = properties.FlatStyle;\n            this.ForeColor = properties.ForeColor;\n            this.RightToLeft = properties.RightToLeft;\n            this.TextAlign = properties.TextAlign;\n            this.ThreeState = properties.ThreeState;\n        }\n\n        #endregion\n\n        #region EVENT HANDLERS - ComboBoxItem (DataSource)\n\n        /// <summary>\n        /// Added this handler because the control doesn't seem \n        /// to initialize correctly until shown for the first\n        /// time, which also means the summary text value\n        /// of the combo is out of sync initially.\n        /// </summary>\n        private void CheckBoxComboBoxItem_PropertyChanged(object sender, PropertyChangedEventArgs e)\n        {\n            if (e.PropertyName == _CheckBoxComboBox.ValueMember)\n                Checked = \n                    (bool)_ComboBoxItem\n                        .GetType()\n                        .GetProperty(_CheckBoxComboBox.ValueMember)\n                        .GetValue(_ComboBoxItem, null);\n        }\n\n        #endregion\n    }\n\n    /// <summary>\n    /// A Typed List of the CheckBox items.\n    /// Simply a wrapper for the CheckBoxComboBox.Items. A list of CheckBoxComboBoxItem objects.\n    /// This List is automatically synchronised with the Items of the ComboBox and extended to\n    /// handle the additional boolean value. That said, do not Add or Remove using this List, \n    /// it will be lost or regenerated from the ComboBox.Items.\n    /// </summary>\n    [ToolboxItem(false)]\n    public class CheckBoxComboBoxItemList : List<CheckBoxComboBoxItem>\n    {\n        #region CONSTRUCTORS\n\n        public CheckBoxComboBoxItemList(CheckBoxComboBox checkBoxComboBox)\n        {\n            _CheckBoxComboBox = checkBoxComboBox;\n        }\n\n        #endregion\n\n        #region PRIVATE FIELDS\n\n        private CheckBoxComboBox _CheckBoxComboBox;\n\n        #endregion\n\n        #region EVENTS, This could be moved to the list control if needed\n\n        public event EventHandler CheckBoxCheckedChanged;\n\n        protected void OnCheckBoxCheckedChanged(object sender, EventArgs e)\n        {\n            EventHandler handler = CheckBoxCheckedChanged;\n            if (handler != null)\n                handler(sender, e);\n        }\n        private void item_CheckedChanged(object sender, EventArgs e)\n        {\n            OnCheckBoxCheckedChanged(sender, e);\n        }\n\n        #endregion\n\n        #region LIST MEMBERS & OBSOLETE INDICATORS\n\n        [Obsolete(\"Do not add items to this list directly. Use the ComboBox items instead.\", false)]\n        public new void Add(CheckBoxComboBoxItem item)\n        {\n            item.CheckedChanged += new EventHandler(item_CheckedChanged);\n            base.Add(item);\n        }\n\n        public new void AddRange(IEnumerable<CheckBoxComboBoxItem> collection)\n        {\n            foreach (CheckBoxComboBoxItem Item in collection)\n                Item.CheckedChanged += new EventHandler(item_CheckedChanged);\n            base.AddRange(collection);\n        }\n\n        public new void Clear()\n        {\n            foreach (CheckBoxComboBoxItem Item in this)\n                Item.CheckedChanged -= item_CheckedChanged;\n            base.Clear();\n        }\n\n        [Obsolete(\"Do not remove items from this list directly. Use the ComboBox items instead.\", false)]\n        public new bool Remove(CheckBoxComboBoxItem item)\n        {\n            item.CheckedChanged -= item_CheckedChanged;\n            return base.Remove(item);\n        }\n\n        #endregion\n\n        #region DEFAULT PROPERTIES\n\n        /// <summary>\n        /// Returns the item with the specified displayName or Text.\n        /// </summary>\n        public CheckBoxComboBoxItem this[string displayName]\n        {\n            get\n            {\n                int StartIndex =\n                    // An invisible item exists in this scenario to help \n                    // with the Text displayed in the TextBox of the Combo\n                    _CheckBoxComboBox.DropDownStyle == ComboBoxStyle.DropDownList \n                    && _CheckBoxComboBox.DataSource == null\n                        ? 1 // Ubiklou : 2008-04-28 : Ignore first item. (http://www.codeproject.com/KB/combobox/extending_combobox.aspx?fid=476622&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2526813&fr=1#xx2526813xx)\n                        : 0;\n                for(int Index = StartIndex; Index <= Count - 1; Index ++)\n                {\n                    CheckBoxComboBoxItem Item = this[Index];\n\n                    string Text;\n                    // The binding might not be active yet\n                    if (string.IsNullOrEmpty(Item.Text)\n                        // Ubiklou : 2008-04-28 : No databinding\n                        && Item.DataBindings != null \n                        && Item.DataBindings[\"Text\"] != null\n                        )\n                    {\n                        PropertyInfo PropertyInfo\n                            = Item.ComboBoxItem.GetType().GetProperty(\n                                Item.DataBindings[\"Text\"].BindingMemberInfo.BindingMember);\n                        Text = (string)PropertyInfo.GetValue(Item.ComboBoxItem, null);\n                    }\n                    else\n                        Text = Item.Text;\n                    if (Text.CompareTo(displayName) == 0)\n                        return Item;\n                }\n                throw new ArgumentOutOfRangeException(String.Format(\"\\\"{0}\\\" does not exist in this combo box.\", displayName));\n            }\n        }\n        \n        #endregion\n    }\n\n    [TypeConverter(typeof(ExpandableObjectConverter))]\n    public class CheckBoxProperties\n    {\n        public CheckBoxProperties() { }\n\n        #region PRIVATE PROPERTIES\n\n        private Appearance _Appearance = Appearance.Normal;\n        private bool _AutoSize = false;\n        private bool _AutoCheck = true;\n        private bool _AutoEllipsis = false;\n        private ContentAlignment _CheckAlign = ContentAlignment.MiddleLeft;\n        private Color _FlatAppearanceBorderColor = Color.Empty;\n        private int _FlatAppearanceBorderSize = 1;\n        private Color _FlatAppearanceCheckedBackColor = Color.Empty;\n        private Color _FlatAppearanceMouseDownBackColor = Color.Empty;\n        private Color _FlatAppearanceMouseOverBackColor = Color.Empty;\n        private FlatStyle _FlatStyle = FlatStyle.Standard;\n        private Color _ForeColor = SystemColors.ControlText;\n        private RightToLeft _RightToLeft = RightToLeft.No;\n        private ContentAlignment _TextAlign = ContentAlignment.MiddleLeft;\n        private bool _ThreeState = false;\n\n        #endregion\n\n        #region PUBLIC PROPERTIES\n\n        [DefaultValue(Appearance.Normal)]\n        public Appearance Appearance\n        {\n            get { return _Appearance; }\n            set { _Appearance = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(true)]\n        public bool AutoCheck\n        {\n            get { return _AutoCheck; }\n            set { _AutoCheck = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(false)]\n        public bool AutoEllipsis\n        {\n            get { return _AutoEllipsis; }\n            set { _AutoEllipsis = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(false)]\n        public bool AutoSize\n        {\n            get { return _AutoSize; }\n            set { _AutoSize = true; OnPropertyChanged(); }\n        }\n        [DefaultValue(ContentAlignment.MiddleLeft)]\n        public ContentAlignment CheckAlign\n        {\n            get { return _CheckAlign; }\n            set { _CheckAlign = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(typeof(Color), \"\")]\n        public Color FlatAppearanceBorderColor\n        {\n            get { return _FlatAppearanceBorderColor; }\n            set { _FlatAppearanceBorderColor = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(1)]\n        public int FlatAppearanceBorderSize\n        {\n            get { return _FlatAppearanceBorderSize; }\n            set { _FlatAppearanceBorderSize = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(typeof(Color), \"\")]\n        public Color FlatAppearanceCheckedBackColor\n        {\n            get { return _FlatAppearanceCheckedBackColor; }\n            set { _FlatAppearanceCheckedBackColor = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(typeof(Color), \"\")]\n        public Color FlatAppearanceMouseDownBackColor\n        {\n            get { return _FlatAppearanceMouseDownBackColor; }\n            set { _FlatAppearanceMouseDownBackColor = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(typeof(Color), \"\")]\n        public Color FlatAppearanceMouseOverBackColor\n        {\n            get { return _FlatAppearanceMouseOverBackColor; }\n            set { _FlatAppearanceMouseOverBackColor = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(FlatStyle.Standard)]\n        public FlatStyle FlatStyle\n        {\n            get { return _FlatStyle; }\n            set { _FlatStyle = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(typeof(SystemColors), \"ControlText\")]\n        public Color ForeColor\n        {\n            get { return _ForeColor; }\n            set { _ForeColor = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(RightToLeft.No)]\n        public RightToLeft RightToLeft\n        {\n            get { return _RightToLeft; }\n            set { _RightToLeft = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(ContentAlignment.MiddleLeft)]\n        public ContentAlignment TextAlign\n        {\n            get { return _TextAlign; }\n            set { _TextAlign = value; OnPropertyChanged(); }\n        }\n        [DefaultValue(false)]\n        public bool ThreeState\n        {\n            get { return _ThreeState; }\n            set { _ThreeState = value; OnPropertyChanged(); }\n        }\n\n        #endregion\n\n        #region EVENTS AND EVENT CALLERS\n\n        /// <summary>\n        /// Called when any property changes.\n        /// </summary>\n        public event EventHandler PropertyChanged;\n\n        protected void OnPropertyChanged()\n        {\n            EventHandler handler = PropertyChanged;\n            if (handler != null)\n                handler(this, EventArgs.Empty);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/CheckBoxComboBox.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>9.0.20404</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>CheckBoxComboBox</RootNamespace>\n    <AssemblyName>CheckBoxComboBox</AssemblyName>\n    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <FileUpgradeFlags>\n    </FileUpgradeFlags>\n    <UpgradeBackupLocation>\n    </UpgradeBackupLocation>\n    <OldToolsVersion>3.5</OldToolsVersion>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml.Linq\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"CheckBoxComboBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"CheckBoxComboBox.Designer.cs\">\n      <DependentUpon>CheckBoxComboBox.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"GripBounds.cs\" />\n    <Compile Include=\"NativeMethods.cs\" />\n    <Compile Include=\"Selection Wrappers\\ListSelectionWrapper.cs\" />\n    <Compile Include=\"Selection Wrappers\\ObjectSelectionWrapper.cs\" />\n    <Compile Include=\"Popup.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Popup.Designer.cs\">\n      <DependentUpon>Popup.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"PopupComboBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"PopupComboBox.Designer.cs\">\n      <DependentUpon>PopupComboBox.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"PopupComboBox.resx\">\n      <DependentUpon>PopupComboBox.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "CheckBoxComboBox/GripBounds.cs",
    "content": "﻿using System.Drawing;\n\nnamespace PresentationControls\n{\n    /// <summary>\n    /// CodeProject.com \"Simple pop-up control\" \"http://www.codeproject.com/cs/miscctrl/simplepopup.asp\".\n    /// </summary>\n    internal struct GripBounds\n    {\n        private const int GripSize = 6;\n        private const int CornerGripSize = GripSize << 1;\n\n        public GripBounds(Rectangle clientRectangle)\n        {\n            this.clientRectangle = clientRectangle;\n        }\n\n        private Rectangle clientRectangle;\n        public Rectangle ClientRectangle\n        {\n            get { return clientRectangle; }\n            //set { clientRectangle = value; }\n        }\n\n        public Rectangle Bottom\n        {\n            get\n            {\n                Rectangle rect = ClientRectangle;\n                rect.Y = rect.Bottom - GripSize + 1;\n                rect.Height = GripSize;\n                return rect;\n            }\n        }\n\n        public Rectangle BottomRight\n        {\n            get\n            {\n                Rectangle rect = ClientRectangle;\n                rect.Y = rect.Bottom - CornerGripSize + 1;\n                rect.Height = CornerGripSize;\n                rect.X = rect.Width - CornerGripSize + 1;\n                rect.Width = CornerGripSize;\n                return rect;\n            }\n        }\n\n        public Rectangle Top\n        {\n            get\n            {\n                Rectangle rect = ClientRectangle;\n                rect.Height = GripSize;\n                return rect;\n            }\n        }\n\n        public Rectangle TopRight\n        {\n            get\n            {\n                Rectangle rect = ClientRectangle;\n                rect.Height = CornerGripSize;\n                rect.X = rect.Width - CornerGripSize + 1;\n                rect.Width = CornerGripSize;\n                return rect;\n            }\n        }\n\n        public Rectangle Left\n        {\n            get\n            {\n                Rectangle rect = ClientRectangle;\n                rect.Width = GripSize;\n                return rect;\n            }\n        }\n\n        public Rectangle BottomLeft\n        {\n            get\n            {\n                Rectangle rect = ClientRectangle;\n                rect.Width = CornerGripSize;\n                rect.Y = rect.Height - CornerGripSize + 1;\n                rect.Height = CornerGripSize;\n                return rect;\n            }\n        }\n\n        public Rectangle Right\n        {\n            get\n            {\n                Rectangle rect = ClientRectangle;\n                rect.X = rect.Right - GripSize + 1;\n                rect.Width = GripSize;\n                return rect;\n            }\n        }\n\n        public Rectangle TopLeft\n        {\n            get\n            {\n                Rectangle rect = ClientRectangle;\n                rect.Width = CornerGripSize;\n                rect.Height = CornerGripSize;\n                return rect;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/NativeMethods.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Runtime.InteropServices;\n\nnamespace PresentationControls\n{\n    /// <summary>\n    /// CodeProject.com \"Simple pop-up control\" \"http://www.codeproject.com/cs/miscctrl/simplepopup.asp\".\n    /// </summary>\n    internal static class NativeMethods\n    {\n        internal const int WM_NCHITTEST = 0x0084,\n                           WM_NCACTIVATE = 0x0086,\n                           WS_EX_NOACTIVATE = 0x08000000,\n                           HTTRANSPARENT = -1,\n                           HTLEFT = 10,\n                           HTRIGHT = 11,\n                           HTTOP = 12,\n                           HTTOPLEFT = 13,\n                           HTTOPRIGHT = 14,\n                           HTBOTTOM = 15,\n                           HTBOTTOMLEFT = 16,\n                           HTBOTTOMRIGHT = 17,\n                           WM_USER = 0x0400,\n                           WM_REFLECT = WM_USER + 0x1C00,\n                           WM_COMMAND = 0x0111,\n                           CBN_DROPDOWN = 7,\n                           WM_GETMINMAXINFO = 0x0024;\n\n        internal static int HIWORD(int n)\n        {\n            return (n >> 16) & 0xffff;\n        }\n\n        internal static int HIWORD(IntPtr n)\n        {\n            return HIWORD(unchecked((int)(long)n));\n        }\n\n        internal static int LOWORD(int n)\n        {\n            return n & 0xffff;\n        }\n\n        internal static int LOWORD(IntPtr n)\n        {\n            return LOWORD(unchecked((int)(long)n));\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        internal struct MINMAXINFO\n        {\n            public Point reserved;\n            public Size maxSize;\n            public Point maxPosition;\n            public Size minTrackSize;\n            public Size maxTrackSize;\n        }\n    }\n}"
  },
  {
    "path": "CheckBoxComboBox/Popup.Designer.cs",
    "content": "﻿namespace PresentationControls\n{\n    partial class Popup\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                if (components != null)\n                {\n                    components.Dispose();\n                }\n                if (content != null)\n                {\n                    System.Windows.Forms.Control _content = content;\n                    content = null;\n                    _content.Dispose();\n                }\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/Popup.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Runtime.InteropServices;\nusing System.Security.Permissions;\nusing System.Windows.Forms;\nusing VS = System.Windows.Forms.VisualStyles;\n\n/*\n<li>Base class for custom tooltips.</li>\n<li>Office-2007-like tooltip class.</li>\n*/\nnamespace PresentationControls\n{\n    /// <summary>\n    /// CodeProject.com \"Simple pop-up control\" \"http://www.codeproject.com/cs/miscctrl/simplepopup.asp\".\n    /// Represents a pop-up window.\n    /// </summary>\n    [CLSCompliant(true), ToolboxItem(false)]\n    public partial class Popup : ToolStripDropDown\n    {\n        #region \" Fields & Properties \"\n\n        private Control content;\n        /// <summary>\n        /// Gets the content of the pop-up.\n        /// </summary>\n        public Control Content\n        {\n            get { return content; }\n        }\n\n        private bool fade;\n        /// <summary>\n        /// Gets a value indicating whether the <see cref=\"PopupControl.Popup\"/> uses the fade effect.\n        /// </summary>\n        /// <value><c>true</c> if pop-up uses the fade effect; otherwise, <c>false</c>.</value>\n        /// <remarks>To use the fade effect, the FocusOnOpen property also has to be set to <c>true</c>.</remarks>\n        public bool UseFadeEffect\n        {\n            get { return fade; }\n            set\n            {\n                if (fade == value) return;\n                fade = value;\n            }\n        }\n\n        private bool focusOnOpen = true;\n        /// <summary>\n        /// Gets or sets a value indicating whether to focus the content after the pop-up has been opened.\n        /// </summary>\n        /// <value><c>true</c> if the content should be focused after the pop-up has been opened; otherwise, <c>false</c>.</value>\n        /// <remarks>If the FocusOnOpen property is set to <c>false</c>, then pop-up cannot use the fade effect.</remarks>\n        public bool FocusOnOpen\n        {\n            get { return focusOnOpen; }\n            set { focusOnOpen = value; }\n        }\n\n        private bool acceptAlt = true;\n        /// <summary>\n        /// Gets or sets a value indicating whether presing the alt key should close the pop-up.\n        /// </summary>\n        /// <value><c>true</c> if presing the alt key does not close the pop-up; otherwise, <c>false</c>.</value>\n        public bool AcceptAlt\n        {\n            get { return acceptAlt; }\n            set { acceptAlt = value; }\n        }\n\n        private Popup ownerPopup;\n        private Popup childPopup;\n\n        private bool _resizable;\n        private bool resizable;\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"PopupControl.Popup\" /> is resizable.\n        /// </summary>\n        /// <value><c>true</c> if resizable; otherwise, <c>false</c>.</value>\n        public bool Resizable\n        {\n            get { return resizable && _resizable; }\n            set { resizable = value; }\n        }\n\n        private ToolStripControlHost host;\n\n        private Size minSize;\n        /// <summary>\n        /// Gets or sets the size that is the lower limit that <see cref=\"M:System.Windows.Forms.Control.GetPreferredSize(System.Drawing.Size)\" /> can specify.\n        /// </summary>\n        /// <returns>An ordered pair of type <see cref=\"T:System.Drawing.Size\" /> representing the width and height of a rectangle.</returns>\n        public new Size MinimumSize\n        {\n            get { return minSize; }\n            set { minSize = value; }\n        }\n\n        private Size maxSize;\n        /// <summary>\n        /// Gets or sets the size that is the upper limit that <see cref=\"M:System.Windows.Forms.Control.GetPreferredSize(System.Drawing.Size)\" /> can specify.\n        /// </summary>\n        /// <returns>An ordered pair of type <see cref=\"T:System.Drawing.Size\" /> representing the width and height of a rectangle.</returns>\n        public new Size MaximumSize\n        {\n            get { return maxSize; }\n            set { maxSize = value; }\n        }\n\n        /// <summary>\n        /// Gets parameters of a new window.\n        /// </summary>\n        /// <returns>An object of type <see cref=\"T:System.Windows.Forms.CreateParams\" /> used when creating a new window.</returns>\n        protected override CreateParams CreateParams\n        {\n            [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\n            get\n            {\n                CreateParams cp = base.CreateParams;\n                cp.ExStyle |= NativeMethods.WS_EX_NOACTIVATE;\n                return cp;\n            }\n        }\n\n        #endregion\n\n        #region \" Constructors \"\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PopupControl.Popup\"/> class.\n        /// </summary>\n        /// <param name=\"content\">The content of the pop-up.</param>\n        /// <remarks>\n        /// Pop-up will be disposed immediately after disposion of the content control.\n        /// </remarks>\n        /// <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"content\" /> is <code>null</code>.</exception>\n        public Popup(Control content)\n        {\n            if (content == null)\n            {\n                throw new ArgumentNullException(\"content\");\n            }\n            this.content = content;\n            this.fade = SystemInformation.IsMenuAnimationEnabled && SystemInformation.IsMenuFadeEnabled;\n            this._resizable = true;\n            InitializeComponent();\n            AutoSize = false;\n            DoubleBuffered = true;\n            ResizeRedraw = true;\n            host = new ToolStripControlHost(content);\n            Padding = Margin = host.Padding = host.Margin = Padding.Empty;\n            MinimumSize = content.MinimumSize;\n            content.MinimumSize = content.Size;\n            MaximumSize = content.MaximumSize;\n            content.MaximumSize = content.Size;\n            Size = content.Size;\n            content.Location = Point.Empty;\n            Items.Add(host);\n            content.Disposed += delegate(object sender, EventArgs e)\n            {\n                content = null;\n                Dispose(true);\n            };\n            content.RegionChanged += delegate(object sender, EventArgs e)\n            {\n                UpdateRegion();\n            };\n            content.Paint += delegate(object sender, PaintEventArgs e)\n            {\n                PaintSizeGrip(e);\n            };\n            UpdateRegion();\n        }\n\n        #endregion\n\n        #region \" Methods \"\n\n        /// <summary>\n        /// Processes a dialog box key.\n        /// </summary>\n        /// <param name=\"keyData\">One of the <see cref=\"T:System.Windows.Forms.Keys\" /> values that represents the key to process.</param>\n        /// <returns>\n        /// true if the key was processed by the control; otherwise, false.\n        /// </returns>\n        protected override bool ProcessDialogKey(Keys keyData)\n        {\n            if (acceptAlt && ((keyData & Keys.Alt) == Keys.Alt)) return false;\n            return base.ProcessDialogKey(keyData);\n        }\n\n        /// <summary>\n        /// Updates the pop-up region.\n        /// </summary>\n        protected void UpdateRegion()\n        {\n            if (this.Region != null)\n            {\n                this.Region.Dispose();\n                this.Region = null;\n            }\n            if (content.Region != null)\n            {\n                this.Region = content.Region.Clone();\n            }\n        }\n\n        /// <summary>\n        /// Shows pop-up window below the specified control.\n        /// </summary>\n        /// <param name=\"control\">The control below which the pop-up will be shown.</param>\n        /// <remarks>\n        /// When there is no space below the specified control, the pop-up control is shown above it.\n        /// </remarks>\n        /// <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"control\"/> is <code>null</code>.</exception>\n        public void Show(Control control)\n        {\n            if (control == null)\n            {\n                throw new ArgumentNullException(\"control\");\n            }\n            SetOwnerItem(control);\n            Show(control, control.ClientRectangle);\n        }\n\n        /// <summary>\n        /// Shows pop-up window below the specified area of specified control.\n        /// </summary>\n        /// <param name=\"control\">The control used to compute screen location of specified area.</param>\n        /// <param name=\"area\">The area of control below which the pop-up will be shown.</param>\n        /// <remarks>\n        /// When there is no space below specified area, the pop-up control is shown above it.\n        /// </remarks>\n        /// <exception cref=\"T:System.ArgumentNullException\"><paramref name=\"control\"/> is <code>null</code>.</exception>\n        public void Show(Control control, Rectangle area)\n        {\n            if (control == null)\n            {\n                throw new ArgumentNullException(\"control\");\n            }\n            SetOwnerItem(control);\n            resizableTop = resizableRight = false;\n            Point location = control.PointToScreen(new Point(area.Left, area.Top + area.Height));\n            Rectangle screen = Screen.FromControl(control).WorkingArea;\n            if (location.X + Size.Width > (screen.Left + screen.Width))\n            {\n                resizableRight = true;\n                location.X = (screen.Left + screen.Width) - Size.Width;\n            }\n            if (location.Y + Size.Height > (screen.Top + screen.Height))\n            {\n                resizableTop = true;\n                location.Y -= Size.Height + area.Height;\n            }\n            location = control.PointToClient(location);\n            Show(control, location, ToolStripDropDownDirection.BelowRight);\n        }\n\n        private const int frames = 1;\n        private const int totalduration = 0; // ML : 2007-11-05 : was 100 but caused a flicker.\n        private const int frameduration = totalduration / frames;\n        /// <summary>\n        /// Adjusts the size of the owner <see cref=\"T:System.Windows.Forms.ToolStrip\" /> to accommodate the <see cref=\"T:System.Windows.Forms.ToolStripDropDown\" /> if the owner <see cref=\"T:System.Windows.Forms.ToolStrip\" /> is currently displayed, or clears and resets active <see cref=\"T:System.Windows.Forms.ToolStripDropDown\" /> child controls of the <see cref=\"T:System.Windows.Forms.ToolStrip\" /> if the <see cref=\"T:System.Windows.Forms.ToolStrip\" /> is not currently displayed.\n        /// </summary>\n        /// <param name=\"visible\">true if the owner <see cref=\"T:System.Windows.Forms.ToolStrip\" /> is currently displayed; otherwise, false.</param>\n        protected override void SetVisibleCore(bool visible)\n        {\n            double opacity = Opacity;\n            if (visible && fade && focusOnOpen) Opacity = 0;\n            base.SetVisibleCore(visible);\n            if (!visible || !fade || !focusOnOpen) return;\n            for (int i = 1; i <= frames; i++)\n            {\n                if (i > 1)\n                {\n                    System.Threading.Thread.Sleep(frameduration);\n                }\n                Opacity = opacity * (double)i / (double)frames;\n            }\n            Opacity = opacity;\n        }\n\n        private bool resizableTop;\n        private bool resizableRight;\n\n        private void SetOwnerItem(Control control)\n        {\n            if (control == null)\n            {\n                return;\n            }\n            if (control is Popup)\n            {\n                Popup popupControl = control as Popup;\n                ownerPopup = popupControl;\n                ownerPopup.childPopup = this;\n                OwnerItem = popupControl.Items[0];\n                return;\n            }\n            if (control.Parent != null)\n            {\n                SetOwnerItem(control.Parent);\n            }\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.SizeChanged\" /> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            content.MinimumSize = Size;\n            content.MaximumSize = Size;\n            content.Size = Size;\n            content.Location = Point.Empty;\n            base.OnSizeChanged(e);\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.ToolStripDropDown.Opening\" /> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.ComponentModel.CancelEventArgs\" /> that contains the event data.</param>\n        protected override void OnOpening(CancelEventArgs e)\n        {\n            if (content.IsDisposed || content.Disposing)\n            {\n                e.Cancel = true;\n                return;\n            }\n            UpdateRegion();\n            base.OnOpening(e);\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.ToolStripDropDown.Opened\" /> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n        protected override void OnOpened(EventArgs e)\n        {\n            if (ownerPopup != null)\n            {\n                ownerPopup._resizable = false;\n            }\n            if (focusOnOpen)\n            {\n                content.Focus();\n            }\n            base.OnOpened(e);\n        }\n\n        protected override void OnClosed(ToolStripDropDownClosedEventArgs e)\n        {\n            if (ownerPopup != null)\n            {\n                ownerPopup._resizable = true;\n            }\n            base.OnClosed(e);\n        }\n\n        public DateTime LastClosedTimeStamp = DateTime.Now;\n\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            if (Visible == false)\n                LastClosedTimeStamp = DateTime.Now;\n            base.OnVisibleChanged(e);\n        }\n\n        #endregion\n\n        #region \" Resizing Support \"\n\n        /// <summary>\n        /// Processes Windows messages.\n        /// </summary>\n        /// <param name=\"m\">The Windows <see cref=\"T:System.Windows.Forms.Message\" /> to process.</param>\n        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\n        protected override void WndProc(ref Message m)\n        {\n            if (InternalProcessResizing(ref m, false))\n            {\n                return;\n            }\n            base.WndProc(ref m);\n        }\n\n        /// <summary>\n        /// Processes the resizing messages.\n        /// </summary>\n        /// <param name=\"m\">The message.</param>\n        /// <returns>true, if the WndProc method from the base class shouldn't be invoked.</returns>\n        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\n        public bool ProcessResizing(ref Message m)\n        {\n            return InternalProcessResizing(ref m, true);\n        }\n\n        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\n        private bool InternalProcessResizing(ref Message m, bool contentControl)\n        {\n            if (m.Msg == NativeMethods.WM_NCACTIVATE && m.WParam != IntPtr.Zero && childPopup != null && childPopup.Visible)\n            {\n                childPopup.Hide();\n            }\n            if (!Resizable)\n            {\n                return false;\n            }\n            if (m.Msg == NativeMethods.WM_NCHITTEST)\n            {\n                return OnNcHitTest(ref m, contentControl);\n            }\n            else if (m.Msg == NativeMethods.WM_GETMINMAXINFO)\n            {\n                return OnGetMinMaxInfo(ref m);\n            }\n            return false;\n        }\n\n        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\n        private bool OnGetMinMaxInfo(ref Message m)\n        {\n            NativeMethods.MINMAXINFO minmax = (NativeMethods.MINMAXINFO)Marshal.PtrToStructure(m.LParam, typeof(NativeMethods.MINMAXINFO));\n            minmax.maxTrackSize = this.MaximumSize;\n            minmax.minTrackSize = this.MinimumSize;\n            Marshal.StructureToPtr(minmax, m.LParam, false);\n            return true;\n        }\n\n        private bool OnNcHitTest(ref Message m, bool contentControl)\n        {\n            int x = NativeMethods.LOWORD(m.LParam);\n            int y = NativeMethods.HIWORD(m.LParam);\n            Point clientLocation = PointToClient(new Point(x, y));\n\n            GripBounds gripBouns = new GripBounds(contentControl ? content.ClientRectangle : ClientRectangle);\n            IntPtr transparent = new IntPtr(NativeMethods.HTTRANSPARENT);\n\n            if (resizableTop)\n            {\n                if (resizableRight && gripBouns.TopLeft.Contains(clientLocation))\n                {\n                    m.Result = contentControl ? transparent : (IntPtr)NativeMethods.HTTOPLEFT;\n                    return true;\n                }\n                if (!resizableRight && gripBouns.TopRight.Contains(clientLocation))\n                {\n                    m.Result = contentControl ? transparent : (IntPtr)NativeMethods.HTTOPRIGHT;\n                    return true;\n                }\n                if (gripBouns.Top.Contains(clientLocation))\n                {\n                    m.Result = contentControl ? transparent : (IntPtr)NativeMethods.HTTOP;\n                    return true;\n                }\n            }\n            else\n            {\n                if (resizableRight && gripBouns.BottomLeft.Contains(clientLocation))\n                {\n                    m.Result = contentControl ? transparent : (IntPtr)NativeMethods.HTBOTTOMLEFT;\n                    return true;\n                }\n                if (!resizableRight && gripBouns.BottomRight.Contains(clientLocation))\n                {\n                    m.Result = contentControl ? transparent : (IntPtr)NativeMethods.HTBOTTOMRIGHT;\n                    return true;\n                }\n                if (gripBouns.Bottom.Contains(clientLocation))\n                {\n                    m.Result = contentControl ? transparent : (IntPtr)NativeMethods.HTBOTTOM;\n                    return true;\n                }\n            }\n            if (resizableRight && gripBouns.Left.Contains(clientLocation))\n            {\n                m.Result = contentControl ? transparent : (IntPtr)NativeMethods.HTLEFT;\n                return true;\n            }\n            if (!resizableRight && gripBouns.Right.Contains(clientLocation))\n            {\n                m.Result = contentControl ? transparent : (IntPtr)NativeMethods.HTRIGHT;\n                return true;\n            }\n            return false;\n        }\n\n        private VS.VisualStyleRenderer sizeGripRenderer;\n        /// <summary>\n        /// Paints the size grip.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\" /> instance containing the event data.</param>\n        public void PaintSizeGrip(PaintEventArgs e)\n        {\n            if (e == null || e.Graphics == null || !resizable)\n            {\n                return;\n            }\n            Size clientSize = content.ClientSize;\n            if (Application.RenderWithVisualStyles)\n            {\n                if (this.sizeGripRenderer == null)\n                {\n                    this.sizeGripRenderer = new VS.VisualStyleRenderer(VS.VisualStyleElement.Status.Gripper.Normal);\n                }\n                this.sizeGripRenderer.DrawBackground(e.Graphics, new Rectangle(clientSize.Width - 0x10, clientSize.Height - 0x10, 0x10, 0x10));\n            }\n            else\n            {\n                ControlPaint.DrawSizeGrip(e.Graphics, content.BackColor, clientSize.Width - 0x10, clientSize.Height - 0x10, 0x10, 0x10);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/PopupComboBox.Designer.cs",
    "content": "﻿namespace PresentationControls\n{\n    partial class PopupComboBox\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                if (components != null)\n                {\n                    components.Dispose();\n                }\n                if (dropDown != null)\n                {\n                    dropDown.Dispose();\n                }\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.SuspendLayout();\n            // \n            // PopupComboBox\n            // \n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/PopupComboBox.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Security.Permissions;\nusing System.Windows.Forms;\n\nnamespace PresentationControls\n{\n    /// <summary>\n    /// CodeProject.com \"Simple pop-up control\" \"http://www.codeproject.com/cs/miscctrl/simplepopup.asp\".\n    /// Represents a Windows combo box control with a custom popup control attached.\n    /// </summary>\n    [ToolboxBitmap(typeof(System.Windows.Forms.ComboBox)), ToolboxItem(true), ToolboxItemFilter(\"System.Windows.Forms\"), Description(\"Displays an editable text box with a drop-down list of permitted values.\")]\n    public partial class PopupComboBox : ComboBox\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PopupControl.PopupComboBox\" /> class.\n        /// </summary>\n        public PopupComboBox()\n        {\n            InitializeComponent();\n            base.DropDownHeight = base.DropDownWidth = 1;\n            base.IntegralHeight = false;\n        }\n\n        /// <summary>\n        /// The pop-up wrapper for the dropDownControl. \n        /// Made PROTECTED instead of PRIVATE so descendent classes can set its Resizable property.\n        /// Note however the pop-up properties must be set after the dropDownControl is assigned, since this \n        /// popup wrapper is recreated when the dropDownControl is assigned.\n        /// </summary>\n        protected Popup dropDown;\n\n        private Control dropDownControl;\n        /// <summary>\n        /// Gets or sets the drop down control.\n        /// </summary>\n        /// <value>The drop down control.</value>\n        public Control DropDownControl\n        {\n            get\n            {\n                return dropDownControl;\n            }\n            set\n            {\n                if (dropDownControl == value)\n                    return;\n                dropDownControl = value;\n                dropDown = new Popup(value);\n            }\n        }\n\n        /// <summary>\n        /// Shows the drop down.\n        /// </summary>\n        public void ShowDropDown()\n        {\n            if (dropDown != null)\n            {\n                dropDown.Show(this);\n            }\n        }\n\n        /// <summary>\n        /// Hides the drop down.\n        /// </summary>\n        public void HideDropDown()\n        {\n            if (dropDown != null)\n            {\n                dropDown.Hide();\n            }\n        }\n\n        /// <summary>\n        /// Processes Windows messages.\n        /// </summary>\n        /// <param name=\"m\">The Windows <see cref=\"T:System.Windows.Forms.Message\" /> to process.</param>\n        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]\n        protected override void WndProc(ref Message m)\n        {\n            if (m.Msg == (NativeMethods.WM_REFLECT + NativeMethods.WM_COMMAND))\n            {\n                if (NativeMethods.HIWORD(m.WParam) == NativeMethods.CBN_DROPDOWN)\n                {\n                    // Blocks a redisplay when the user closes the control by clicking \n                    // on the combobox.\n                    TimeSpan TimeSpan = DateTime.Now.Subtract(dropDown.LastClosedTimeStamp);\n                    if (TimeSpan.TotalMilliseconds > 500)\n                        ShowDropDown();\n                    return;\n                }\n            }\n            base.WndProc(ref m);\n        }\n\n        #region \" Unused Properties \"\n\n        /// <summary>This property is not relevant for this class.</summary>\n        /// <returns>This property is not relevant for this class.</returns>\n        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]\n        public new int DropDownWidth\n        {\n            get { return base.DropDownWidth; }\n            set { base.DropDownWidth = value; }\n        }\n\n        /// <summary>This property is not relevant for this class.</summary>\n        /// <returns>This property is not relevant for this class.</returns>\n        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]\n        public new int DropDownHeight\n        {\n            get { return base.DropDownHeight; }\n            set\n            {\n                dropDown.Height = value;\n                base.DropDownHeight = value;\n            }\n        }\n\n        /// <summary>This property is not relevant for this class.</summary>\n        /// <returns>This property is not relevant for this class.</returns>\n        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]\n        public new bool IntegralHeight\n        {\n            get { return base.IntegralHeight; }\n            set { base.IntegralHeight = value; }\n        }\n\n        /// <summary>This property is not relevant for this class.</summary>\n        /// <returns>This property is not relevant for this class.</returns>\n        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]\n        public new ObjectCollection Items\n        {\n            get { return base.Items; }\n        }\n\n        /// <summary>This property is not relevant for this class.</summary>\n        /// <returns>This property is not relevant for this class.</returns>\n        [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]\n        public new int ItemHeight\n        {\n            get { return base.ItemHeight; }\n            set { base.ItemHeight = value; }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/PopupComboBox.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"$this.TrayLargeIcon\" type=\"System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>False</value>\n  </metadata>\n</root>"
  },
  {
    "path": "CheckBoxComboBox/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"CheckBoxComboBox\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"IT\")]\n[assembly: AssemblyProduct(\"CheckBoxComboBox\")]\n[assembly: AssemblyCopyright(\"Copyright © IT 2007\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"0b11e2be-4211-4d2a-9102-6847a56d6fd8\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "CheckBoxComboBox/Selection Wrappers/ListSelectionWrapper.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Reflection;\n\nnamespace PresentationControls\n{\n    /// <summary>\n    /// Maintains an additional \"Selected\" & \"Count\" value for each item in a List.\n    /// Useful in the CheckBoxComboBox. It holds a reference to the List[Index] Item and \n    /// whether it is selected or not.\n    /// It also caters for a Count, if needed.\n    /// </summary>\n    /// <typeparam name=\"TSelectionWrapper\"></typeparam>\n    public class ListSelectionWrapper<T> : List<ObjectSelectionWrapper<T>>\n    {\n        #region CONSTRUCTOR\n\n        /// <summary>\n        /// No property on the object is specified for display purposes, so simple ToString() operation \n        /// will be performed. And no Counts will be displayed\n        /// </summary>\n        public ListSelectionWrapper(IEnumerable source) : this(source, false) { }\n        /// <summary>\n        /// No property on the object is specified for display purposes, so simple ToString() operation \n        /// will be performed.\n        /// </summary>\n        public ListSelectionWrapper(IEnumerable source, bool showCounts)\n            : base()\n        {\n            _Source = source;\n            _ShowCounts = showCounts;\n            if (_Source is IBindingList)\n                ((IBindingList)_Source).ListChanged += new ListChangedEventHandler(ListSelectionWrapper_ListChanged);\n            Populate();\n        }\n        /// <summary>\n        /// A Display \"Name\" property is specified. ToString() will not be performed on items.\n        /// This is specifically useful on DataTable implementations, or where PropertyDescriptors are used to read the values.\n        /// If a PropertyDescriptor is not found, a Property will be used.\n        /// </summary>\n        public ListSelectionWrapper(IEnumerable source, string usePropertyAsDisplayName) : this(source, false, usePropertyAsDisplayName) { }\n        /// <summary>\n        /// A Display \"Name\" property is specified. ToString() will not be performed on items.\n        /// This is specifically useful on DataTable implementations, or where PropertyDescriptors are used to read the values.\n        /// If a PropertyDescriptor is not found, a Property will be used.\n        /// </summary>\n        public ListSelectionWrapper(IEnumerable source, bool showCounts, string usePropertyAsDisplayName)\n            : this(source, showCounts)\n        {\n            _DisplayNameProperty = usePropertyAsDisplayName;\n        }\n\n        #endregion\n\n        #region PRIVATE PROPERTIES\n\n        /// <summary>\n        /// Is a Count indicator used.\n        /// </summary>\n        private bool _ShowCounts;\n        /// <summary>\n        /// The original List of values wrapped. A \"Selected\" and possibly \"Count\" functionality is added.\n        /// </summary>\n        private IEnumerable _Source;\n        /// <summary>\n        /// Used to indicate NOT to use ToString(), but read this property instead as a display value.\n        /// </summary>\n        private string _DisplayNameProperty = null;\n\n        #endregion\n\n        #region PUBLIC PROPERTIES\n\n        /// <summary>\n        /// When specified, indicates that ToString() should not be performed on the items. \n        /// This property will be read instead. \n        /// This is specifically useful on DataTable implementations, where PropertyDescriptors are used to read the values.\n        /// </summary>\n        public string DisplayNameProperty\n        {\n            get { return _DisplayNameProperty; }\n            set { _DisplayNameProperty = value; }\n        }\n        /// <summary>\n        /// Builds a concatenation list of selected items in the list.\n        /// </summary>\n        public string SelectedNames\n        {\n            get\n            {\n                string Text = \"\";\n                foreach (ObjectSelectionWrapper<T> Item in this)\n                    if (Item.Selected)\n                        Text += (\n                            string.IsNullOrEmpty(Text)\n                            ? String.Format(\"\\\"{0}\\\"\", Item.Name)\n                            : String.Format(\" & \\\"{0}\\\"\", Item.Name));\n                return Text;\n            }\n        }\n        /// <summary>\n        /// Indicates whether the Item display value (Name) should include a count.\n        /// </summary>\n        public bool ShowCounts\n        {\n            get { return _ShowCounts; }\n            set { _ShowCounts = value; }\n        }\n\n        #endregion\n\n        #region HELPER MEMBERS\n\n        /// <summary>\n        /// Reset all counts to zero.\n        /// </summary>\n        public void ClearCounts()\n        {\n            foreach (ObjectSelectionWrapper<T> Item in this)\n                Item.Count = 0;\n        }\n        /// <summary>\n        /// Creates a ObjectSelectionWrapper item.\n        /// Note that the constructor signature of sub classes classes are important.\n        /// </summary>\n        /// <param name=\"Object\"></param>\n        /// <returns></returns>\n        private ObjectSelectionWrapper<T> CreateSelectionWrapper(IEnumerator Object)\n        {\n            Type[] Types = new Type[] { typeof(T), this.GetType() };\n            ConstructorInfo CI = typeof(ObjectSelectionWrapper<T>).GetConstructor(Types);\n            if (CI == null)\n                throw new Exception(String.Format(\n                              \"The selection wrapper class {0} must have a constructor with ({1} Item, {2} Container) parameters.\",\n                              typeof(ObjectSelectionWrapper<T>),\n                              typeof(T),\n                              this.GetType()));\n            object[] parameters = new object[] { Object.Current, this };\n            object result = CI.Invoke(parameters);\n            return (ObjectSelectionWrapper<T>)result;\n        }\n\n        public ObjectSelectionWrapper<T> FindObjectWithItem(T Object)\n        {\n            return Find(new Predicate<ObjectSelectionWrapper<T>>(\n                            delegate(ObjectSelectionWrapper<T> target)\n                            {\n                                return target.Item.Equals(Object);\n                            }));\n        }\n\n        /*\n        public TSelectionWrapper FindObjectWithKey(object key)\n        {\n            return FindObjectWithKey(new object[] { key });\n        }\n\n        public TSelectionWrapper FindObjectWithKey(object[] keys)\n        {\n            return Find(new Predicate<TSelectionWrapper>(\n                            delegate(TSelectionWrapper target)\n                            {\n                                return\n                                    ReflectionHelper.CompareKeyValues(\n                                        ReflectionHelper.GetKeyValuesFromObject(target.Item, target.Item.TableInfo),\n                                        keys);\n                            }));\n        }\n\n        public object[] GetArrayOfSelectedKeys()\n        {\n            List<object> List = new List<object>();\n            foreach (TSelectionWrapper Item in this)\n                if (Item.Selected)\n                {\n                    if (Item.Item.TableInfo.KeyProperties.Length == 1)\n                        List.Add(ReflectionHelper.GetKeyValueFromObject(Item.Item, Item.Item.TableInfo));\n                    else\n                        List.Add(ReflectionHelper.GetKeyValuesFromObject(Item.Item, Item.Item.TableInfo));\n                }\n            return List.ToArray();\n        }\n\n        public T[] GetArrayOfSelectedKeys<T>()\n        {\n            List<T> List = new List<T>();\n            foreach (TSelectionWrapper Item in this)\n                if (Item.Selected)\n                {\n                    if (Item.Item.TableInfo.KeyProperties.Length == 1)\n                        List.Add((T)ReflectionHelper.GetKeyValueFromObject(Item.Item, Item.Item.TableInfo));\n                    else\n                        throw new LibraryException(\"This generator only supports single value keys.\");\n                    // List.Add((T)ReflectionHelper.GetKeyValuesFromObject(Item.Item, Item.Item.TableInfo));\n                }\n            return List.ToArray();\n        }\n        */\n        private void Populate()\n        {\n            Clear();\n            /*\n            for(int Index = 0; Index <= _Source.Count -1; Index++)\n                Add(CreateSelectionWrapper(_Source[Index]));\n             */\n            IEnumerator Enumerator = _Source.GetEnumerator();\n            if (Enumerator != null)\n                while (Enumerator.MoveNext())\n                    Add(CreateSelectionWrapper(Enumerator));\n        }\n\n        #endregion\n\n        #region EVENT HANDLERS\n\n        private void ListSelectionWrapper_ListChanged(object sender, ListChangedEventArgs e)\n        {\n            switch (e.ListChangedType)\n            {\n                case ListChangedType.ItemAdded:\n                    Add(CreateSelectionWrapper((IEnumerator)((IBindingList)_Source)[e.NewIndex]));\n                    break;\n                case ListChangedType.ItemDeleted:\n                    Remove(FindObjectWithItem((T)((IBindingList)_Source)[e.OldIndex]));\n                    break;\n                case ListChangedType.Reset:\n                    Populate();\n                    break;\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "CheckBoxComboBox/Selection Wrappers/ObjectSelectionWrapper.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Data;\nusing System.Reflection;\n\nnamespace PresentationControls\n{\n    /// <summary>\n    /// Used together with the ListSelectionWrapper in order to wrap data sources for a CheckBoxComboBox.\n    /// It helps to ensure you don't add an extra \"Selected\" property to a class that don't really need or want that information.\n    /// </summary>\n    public class ObjectSelectionWrapper<T> : INotifyPropertyChanged\n    {\n        public ObjectSelectionWrapper(T item, ListSelectionWrapper<T> container)\n            : base()\n        {\n            _Container = container;\n            _Item = item;\n        }\n\n\n        #region PRIVATE PROPERTIES\n\n        /// <summary>\n        /// Used as a count indicator for the item. Not necessarily displayed.\n        /// </summary>\n        private int _Count = 0;\n        /// <summary>\n        /// Is this item selected.\n        /// </summary>\n        private bool _Selected = false;\n        /// <summary>\n        /// A reference to the wrapped item.\n        /// </summary>\n        private T _Item;\n        /// <summary>\n        /// The containing list for these selections.\n        /// </summary>\n        private ListSelectionWrapper<T> _Container;\n\n        #endregion\n\n        #region PUBLIC PROPERTIES\n\n        /// <summary>\n        /// An indicator of how many items with the specified status is available for the current filter level.\n        /// Thaught this would make the app a bit more user-friendly and help not to miss items in Statusses\n        /// that are not often used.\n        /// </summary>\n        public int Count\n        {\n            get { return _Count; }\n            set { _Count = value; }\n        }\n        /// <summary>\n        /// A reference to the item wrapped.\n        /// </summary>\n        public T Item\n        {\n            get { return _Item; }\n            set { _Item = value; }\n        }\n        /// <summary>\n        /// The item display value. If ShowCount is true, it displays the \"Name [Count]\".\n        /// </summary>\n        public string Name\n        {\n            get \n            {\n                string Name = null;\n                if (string.IsNullOrEmpty(_Container.DisplayNameProperty))\n                    Name = Item.ToString();\n                else if (Item is DataRow) // A specific implementation for DataRow\n                    Name = ((DataRow)((Object)Item))[_Container.DisplayNameProperty].ToString();\n                else\n                {\n                    PropertyDescriptorCollection PDs = TypeDescriptor.GetProperties(Item);\n                    foreach (PropertyDescriptor PD in PDs)\n                        if (PD.Name.CompareTo(_Container.DisplayNameProperty) == 0)\n                        {\n                            Name = (string)PD.GetValue(Item).ToString();\n                            break;\n                        }\n                    if (string.IsNullOrEmpty(Name))\n                    {\n                        PropertyInfo PI = Item.GetType().GetProperty(_Container.DisplayNameProperty);\n                        if (PI == null)\n                            throw new Exception(String.Format(\n                                      \"Property {0} cannot be found on {1}.\",\n                                      _Container.DisplayNameProperty,\n                                      Item.GetType()));\n                        Name = PI.GetValue(Item, null).ToString();\n                    }\n                }\n                return _Container.ShowCounts ? String.Format(\"{0} [{1}]\", Name, Count) : Name;\n            }\n        }\n        /// <summary>\n        /// The textbox display value. The names concatenated.\n        /// </summary>\n        public string NameConcatenated\n        {\n            get { return _Container.SelectedNames; }\n        }\n        /// <summary>\n        /// Indicates whether the item is selected.\n        /// </summary>\n        public bool Selected\n        {\n            get { return _Selected; }\n            set \n            {\n                if (_Selected != value)\n                {\n                    _Selected = value;\n                    OnPropertyChanged(\"Selected\");\n                    OnPropertyChanged(\"NameConcatenated\");\n                }\n            }\n        }\n\n        #endregion\n\n        #region INotifyPropertyChanged\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected virtual void OnPropertyChanged(string propertyName)\n        {\n            PropertyChangedEventHandler handler = PropertyChanged;\n            if (handler != null)\n                handler(this, new PropertyChangedEventArgs(propertyName));\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/DataAccess.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Data.Common;\n\n#pragma warning disable CA2100 //sql injection warning, these all use db parameters anyway\n\nnamespace DoomLauncher\n{\n    public class DataAccess\n    {\n        public DataAccess(IDatabaseAdapter dbAdapter, string connectionString)\n        {\n            DbAdapter = dbAdapter;\n            ConnectionString = connectionString;\n        }\n\n        public DataSet ExecuteSelect(string sql)\n        {\n            DbConnection conn = DbAdapter.CreateConnection(ConnectionString);\n            conn.Open();\n\n            DbCommand cmd = conn.CreateCommand();\n            cmd.CommandText = sql;\n\n            DataSet ds = new DataSet();\n            DbDataAdapter adapter = DbAdapter.CreateAdapter();\n            adapter.SelectCommand = cmd;\n            adapter.Fill(ds);\n\n            conn.Close();\n\n            return ds;\n        }\n\n        public DataSet ExecuteSelect(string sql, IEnumerable<DbParameter> parameters)\n        {\n            DbConnection conn = DbAdapter.CreateConnection(ConnectionString);\n            conn.Open();\n\n            DbCommand cmd = conn.CreateCommand();\n            cmd.CommandText = sql;\n\n            foreach (DbParameter dbParam in parameters)\n            {\n                cmd.Parameters.Add(dbParam);\n            }\n\n            DataSet ds = new DataSet();\n            DbDataAdapter adapter = DbAdapter.CreateAdapter();\n            adapter.SelectCommand = cmd;\n            adapter.Fill(ds);\n\n            conn.Close();\n\n            return ds;\n        }\n\n        public void ExecuteNonQuery(string sql)\n        {\n            DbConnection conn = DbAdapter.CreateConnection(ConnectionString);\n            conn.Open();\n\n            DbCommand cmd = conn.CreateCommand();\n            cmd.CommandText = sql;\n\n            cmd.ExecuteNonQuery();\n\n            conn.Close();\n        }\n\n        public void ExecuteNonQuery(string sql, IEnumerable<DbParameter> parameters)\n        {\n            DbConnection conn = DbAdapter.CreateConnection(ConnectionString);\n            conn.Open();\n\n            DbCommand cmd = conn.CreateCommand();\n            cmd.CommandText = sql;\n            \n            foreach(DbParameter dbParam in parameters)\n            {\n                cmd.Parameters.Add(dbParam);\n            }\n\n            cmd.ExecuteNonQuery();\n\n            conn.Close();\n        }\n\n        public IDatabaseAdapter DbAdapter { get; private set; }\n        public string ConnectionString { get; private set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/DbDataSourceAdapter.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Data.Common;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace DoomLauncher\n{\n    public class DbDataSourceAdapter : IDataSourceAdapter\n    {\n        public static readonly string DatabaseFileName = \"DoomLauncher.sqlite\";\n        public static readonly string InitDatabaseFileName = \"DoomLauncher_.sqlite\";\n\n        private static string[] s_opLookup = new string[] { \"= \", \"<>\", \"<\", \">\", \"like\" };\n\n        public DbDataSourceAdapter(IDatabaseAdapter dbAdapter, string connectionString)\n            : this(dbAdapter, connectionString, false)\n        {\n\n        }\n\n        public DbDataSourceAdapter(IDatabaseAdapter dbAdapter, string connectionString, bool outOfDateDatabase)\n        {\n            m_outOfDateDatabase = outOfDateDatabase;\n            DataAccess = new DataAccess(dbAdapter, connectionString);\n        }\n\n        public static IDataSourceAdapter CreateAdapter() => CreateAdapter(false);\n\n        public static IDataSourceAdapter CreateAdapter(bool outOfDateDatabase)\n        {\n            string databaseFile = Path.Combine(LauncherPath.GetDataDirectory(), DatabaseFileName);      \n            return new DbDataSourceAdapter(new SqliteDatabaseAdapter(), CreateConnectionString(databaseFile), outOfDateDatabase);\n        }\n\n        public static string CreateConnectionString(string dataSource)\n        {\n            return string.Format(@\"Data Source={0}\", dataSource);\n        }\n\n        public int GetGameFilesCount()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select count(*) from GameFiles\").Tables[0];\n            return Convert.ToInt32(dt.Rows[0][0]);\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from GameFiles\").Tables[0];\n            return Util.TableToStructure(dt, typeof(GameFile)).Cast<IGameFile>();\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles(ITagData tag)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select GameFiles.* from GameFiles join TagMapping on TagMapping.FileID = GameFiles.GameFileID where TagID = {0}\", \n                tag.TagID)).Tables[0];\n            return Util.TableToStructure(dt, typeof(GameFile)).Cast<IGameFile>();\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles(IGameFileGetOptions options)\n        {\n            return GetGameFiles(options, null);\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles(IGameFileGetOptions options, ITagData tag)\n        {\n            DataTable dt;\n            string selectColumns = \"GameFiles.*\";\n            string join = string.Empty;\n            string where = string.Empty;\n\n            if (tag != null)\n            {\n                join = \"join TagMapping on TagMapping.FileID = GameFiles.GameFileID\";\n                where = string.Format(\"TagMapping.TagID = {0}\", tag.TagID);\n            }\n\n            if (options.SelectFields != null)\n                selectColumns = GetSelectFieldString(options.SelectFields);\n\n            if (options.SearchField != null)\n            {\n                string op = s_opLookup[(int)options.SearchField.SearchOp];\n\n                if (op == \"like\")\n                    options.SearchField.SearchText = string.Format(\"{0}{1}{0}\", \"%\", options.SearchField.SearchText);\n\n                string searchCol = options.SearchField.SearchFieldType.ToString(\"g\");\n                string searchParam = \"@search\";\n\n                if (DataAccess.DbAdapter is SqliteDatabaseAdapter && GameFileSearchField.IsDateTimeField(options.SearchField.SearchFieldType)) //sqlite datetime comparison hack\n                {\n                    searchParam = string.Format(\"Datetime('{0}')\", DateTime.Parse(options.SearchField.SearchText).ToString(\"yyyy-MM-dd\"));\n                }\n\n                if (where != string.Empty) \n                    where = string.Format(\"and {0}\", where);\n\n                string query = string.Format(\"select {2} from GameFiles {5} where {0} {1} {3} {4} {6}\",\n                        searchCol, op, selectColumns, searchParam, GetLimitOrderString(options), join, where);\n                dt = DataAccess.ExecuteSelect(query, new DbParameter[] { DataAccess.DbAdapter.CreateParameter(\"search\", options.SearchField.SearchText) }).Tables[0];\n            }\n            else\n            {\n                if (where != string.Empty)\n                    where = string.Format(\"where {0}\", where);\n\n                string query = string.Format(\"select {0} from GameFiles {2} {3} {1}\", selectColumns, GetLimitOrderString(options), join, where);\n                dt = DataAccess.ExecuteSelect(query).Tables[0];\n            }\n\n            return Util.TableToStructure(dt, typeof(GameFile)).Cast<IGameFile>();\n        }\n\n        public IEnumerable<IGameFile> GetUntaggedGameFiles()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select GameFiles.* from GameFiles left join TagMapping on GameFiles.GameFileID = TagMapping.FileID where FileID is null\").Tables[0];\n            return Util.TableToStructure(dt, typeof(GameFile)).Cast<IGameFile>();\n        }\n\n        private static string GetLimitOrderString(IGameFileGetOptions options)\n        {\n            string ret = string.Empty;\n\n            if (options.OrderBy.HasValue && options.OrderField.HasValue)\n                ret += string.Format(\"order by {0} {1}\", options.OrderField.Value.ToString(\"g\"), \n                    options.OrderBy.Value.ToString(\"g\"));\n\n            if (options.Limit.HasValue)\n                ret += string.Format(\" limit {0}\", options.Limit.Value);\n\n            return ret;\n        }\n\n        private string GetSelectFieldString(GameFileFieldType[] selectFields)\n        {\n            StringBuilder sb = new StringBuilder();\n\n            foreach (GameFileFieldType field in selectFields)\n            {\n                sb.Append(field.ToString(\"g\"));\n                sb.Append(',');\n            }\n\n            sb.Remove(sb.Length - 1, 1);\n\n            return sb.ToString();\n        }\n\n        public IEnumerable<string> GetGameFileNames()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select FileName from GameFiles\").Tables[0];\n            List<string> ret = new List<string>(dt.Rows.Count);\n\n            foreach (DataRow dr in dt.Rows)\n                ret.Add((string)dr[0]);\n\n            return ret;\n        }\n\n        public IGameFile GetGameFile(string fileName)\n        {\n            List<DbParameter> parameters = new List<DbParameter>\n            { \n                DataAccess.DbAdapter.CreateParameter(\"FileName\", fileName),\n                DataAccess.DbAdapter.CreateParameter(\"FileNamePath\", '%' + Path.DirectorySeparatorChar + fileName),\n            };\n\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from GameFiles where Filename = @FileName COLLATE NOCASE or Filename like @FileNamePath COLLATE NOCASE\", parameters).Tables[0];\n\n            if (dt.Rows.Count > 0)\n                return Util.TableToStructure(dt, typeof(GameFile)).Cast<GameFile>().ToList()[0];\n            else\n                return null;\n        }\n\n        public IEnumerable<IGameFile> GetGameFileIWads()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select GameFiles.* from GameFiles join IWads on IWads.GameFileID = GameFiles.GameFileID\").Tables[0];\n            return Util.TableToStructure(dt, typeof(GameFile)).Cast<GameFile>();\n        }\n\n        public void InsertGameFile(IGameFile gameFile)\n        {\n            string insert = InsertStatement(\"GameFiles\", gameFile, new string[] { \"GameFileID\", \"FileSizeBytes\", \"GameProfileID\", \"Name\", \"FullFileName\" }, out List<DbParameter> parameters);\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void UpdateGameFile(IGameFile gameFile)\n        {\n            UpdateGameFile(gameFile, null);\n        }\n\n        public void UpdateGameFile(IGameFile gameFile, GameFileFieldType[] updateFields)\n        {\n            StringBuilder query = new StringBuilder(\"update GameFiles set \");\n\n            if (updateFields != null && updateFields.Length > 0)\n            {\n                foreach(GameFileFieldType field in updateFields)\n                {\n                    if (field != GameFileFieldType.MD5 && field != GameFileFieldType.GameFileID)\n                    {\n                        query.Append(field.ToString());\n                        query.Append(\" = @\");\n                        query.Append(field.ToString());\n                        query.Append(\",\");\n                    }\n                }\n\n                query.Remove(query.Length - 1, 1);\n                query.Append(\" where GameFileID = @gameFileID\");\n            }\n            else\n            {\n                query = new StringBuilder(@\"update GameFiles set Title = @Title, Author = @Author, ReleaseDate = @ReleaseDate,\n                    Description = @Description, Map = @Map, SourcePortID = @SourcePortID,\n                    Thumbnail = @Thumbnail, Comments = @Comments, Rating = @Rating,\n                    IWadID = @IWadID, LastPlayed = @LastPlayed, Downloaded = @Downloaded, \n                    SettingsMap = @SettingsMap, SettingsSkill = @SettingsSkill, SettingsExtraParams = @SettingsExtraParams, SettingsFiles = @SettingsFiles,\n                    SettingsFilesSourcePort = @SettingsFilesSourcePort, SettingsFilesIWAD = @SettingsFilesIWAD,\n                    SettingsSpecificFiles = @SettingsSpecificFiles, SettingsStat = @SettingsStat, SettingsLoadLatestSave = @SettingsLoadLatestSave, \n                    FileName = @FileName, MapCount = @MapCount, \n                    MinutesPlayed = @MinutesPlayed, SettingsGameProfileID = @SettingsGameProfileID, SettingsSaved = @SettingsSaved,\n                    SettingsExtraParamsOnly = @SettingsExtraParamsOnly\n                    where GameFileID = @gameFileID\");\n            }\n\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"Title\", gameFile.Title ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"Author\", gameFile.Author ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"ReleaseDate\", gameFile.ReleaseDate ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"Description\", gameFile.Description ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"Map\", gameFile.Map ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SourcePortID\", gameFile.SourcePortID ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"Thumbnail\", gameFile.Thumbnail ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"Comments\", gameFile.Comments ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"Rating\", gameFile.Rating.HasValue ? gameFile.Rating : (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"IWadID\", gameFile.IWadID.HasValue ? gameFile.IWadID : (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"GameFileID\", gameFile.GameFileID.Value),\n                DataAccess.DbAdapter.CreateParameter(\"LastPlayed\", gameFile.LastPlayed.HasValue ? gameFile.LastPlayed : (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"Downloaded\", gameFile.Downloaded.HasValue ? gameFile.Downloaded : (object)DBNull.Value),\n\n                DataAccess.DbAdapter.CreateParameter(\"SettingsMap\", gameFile.SettingsMap ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsSkill\", gameFile.SettingsSkill ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsExtraParams\", gameFile.SettingsExtraParams ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsFiles\", gameFile.SettingsFiles ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsFilesSourcePort\", gameFile.SettingsFilesSourcePort ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsFilesIWAD\", gameFile.SettingsFilesIWAD ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsSpecificFiles\", gameFile.SettingsSpecificFiles ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsStat\", gameFile.SettingsStat),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsLoadLatestSave\", gameFile.SettingsLoadLatestSave),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsSaved\", gameFile.SettingsSaved),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsExtraParamsOnly\", gameFile.SettingsExtraParamsOnly),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsGameProfileID\", gameFile.SettingsGameProfileID ?? (object)DBNull.Value),\n\n                DataAccess.DbAdapter.CreateParameter(\"MapCount\", !gameFile.MapCount.HasValue ? (object)DBNull.Value : gameFile.MapCount),\n\n                DataAccess.DbAdapter.CreateParameter(\"MinutesPlayed\", gameFile.MinutesPlayed),\n\n                DataAccess.DbAdapter.CreateParameter(\"FileName\", gameFile.FileName)\n            };\n\n            if (m_outOfDateDatabase)\n            {\n                DataTable dt = GetTableColumns(\"GameFiles\");\n                query = RemoveUnknownColumnsFromQuery(dt, query);\n                parameters = RemoveUnknownColumnsFromParameters(dt, parameters);\n            }\n\n            DataAccess.ExecuteNonQuery(query.ToString(), parameters);\n        }\n\n        public void UpdateGameFiles(GameFileFieldType ftWhere, GameFileFieldType ftSet, object fWhere, object fSet)\n        {\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"set1\", fSet ?? DBNull.Value ),\n                DataAccess.DbAdapter.CreateParameter(\"where1\", fWhere ?? DBNull.Value )\n            };\n\n            DataAccess.ExecuteNonQuery(string.Format(@\"update GameFiles set {0} = @set1 where {1} = @where1\", ftSet.ToString(\"g\"), ftWhere.ToString(\"g\")), parameters);\n        }\n\n        public void DeleteGameFile(IGameFile gameFile)\n        {\n            if (gameFile.GameFileID.HasValue)\n            {\n                DataAccess.ExecuteNonQuery(string.Format(\"delete from GameFiles where GameFileID = {0}\", gameFile.GameFileID));\n            }\n        }\n\n        public IEnumerable<ISourcePortData> GetSourcePorts(bool loadArchived = false) =>\n            GetSourcePorts(SourcePortLaunchType.SourcePort, loadArchived);\n\n        public IEnumerable<ISourcePortData> GetUtilities(bool loadArchived = false) =>\n            GetSourcePorts(SourcePortLaunchType.Utility, loadArchived);\n\n        public IEnumerable<ISourcePortData> GetDoom64(bool loadArchived = false) => \n            GetSourcePorts(SourcePortLaunchType.Doom64, loadArchived);\n\n        private IEnumerable<ISourcePortData> GetSourcePorts(SourcePortLaunchType type, bool loadArchived)\n        {\n            int sqlArchive = loadArchived ? 1 : 0;\n            DataTable dt;\n\n            try\n            {\n                dt = DataAccess.ExecuteSelect($\"select * from SourcePorts where LaunchType = {(int)type} and Archived = {sqlArchive} order by Name collate nocase\").Tables[0];\n            }\n            catch\n            {\n                // This is for updates before Archived column existed...\n                dt = DataAccess.ExecuteSelect($\"select * from SourcePorts where LaunchType = {(int)type}\").Tables[0];\n            }\n\n            List<ISourcePortData> sourcePorts = new List<ISourcePortData>();\n\n            foreach (DataRow dr in dt.Rows)\n                sourcePorts.Add(CreateSourcePortDataSource(dt, dr));\n\n            return sourcePorts;\n        }\n\n        private static ISourcePortData CreateSourcePortDataSource(DataTable dt, DataRow dr)\n        {\n            SourcePortData sourcePort = new SourcePortData\n            {\n                Directory = new LauncherPath((string)dr[\"Directory\"]),\n                Executable = (string)dr[\"Executable\"],\n                Name = (string)dr[\"Name\"],\n                SourcePortID = Convert.ToInt32(dr[\"SourcePortID\"]),\n                SupportedExtensions = (string)CheckDBNull(dr[\"SupportedExtensions\"], string.Empty),\n                LaunchType = (SourcePortLaunchType)Convert.ToInt32(dr[\"LaunchType\"]),\n                FileOption = (string)CheckDBNull(dr[\"FileOption\"], string.Empty),\n                ExtraParameters = (string)CheckDBNull(dr[\"ExtraParameters\"], string.Empty),\n                AltSaveDirectory = new LauncherPath((string)CheckDBNull(dr[\"AltSaveDirectory\"], string.Empty)),\n            };\n\n            if (dt.Columns.Contains(\"SettingsFiles\"))\n                sourcePort.SettingsFiles = (string)CheckDBNull(dr[\"SettingsFiles\"], string.Empty);\n            if (dt.Columns.Contains(\"Archived\"))\n                sourcePort.Archived = Convert.ToInt32(dr[\"Archived\"]) != 0;\n\n            return sourcePort;\n        }\n\n        private static object CheckDBNull(object obj, object defaultValue)\n        {\n            if (obj == DBNull.Value)\n                return defaultValue;\n            else\n                return obj;\n        }\n\n        public ISourcePortData GetSourcePort(int sourcePortID)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select * from SourcePorts where SourcePortID = {0}\", sourcePortID)).Tables[0];\n\n            if (dt.Rows.Count > 0)\n                return CreateSourcePortDataSource(dt, dt.Rows[0]);\n\n            return null;\n        }\n\n        public void InsertSourcePort(ISourcePortData sourcePort)\n        {\n            string insert = @\"insert into SourcePorts (Name,Executable,SupportedExtensions,Directory,SettingsFiles,LaunchType,FileOption,ExtraParameters,AltSaveDirectory,Archived) \n                values(@Name,@Executable,@SupportedExtensions,@Directory,@SettingsFiles,@LaunchType,@FileOption,@ExtraParameters,@AltSaveDirectory,@Archived)\";\n\n            DataAccess.ExecuteNonQuery(insert, GetSourcePortParams(sourcePort));\n        }\n\n        public void UpdateSourcePort(ISourcePortData sourcePort)\n        {\n            string query = @\"update SourcePorts set \n            Name = @Name, Executable = @Executable, SupportedExtensions = @SupportedExtensions,\n            Directory = @Directory, SettingsFiles = @SettingsFiles, LaunchType = @LaunchType, FileOption = @FileOption, ExtraParameters = @ExtraParameters,\n            AltSaveDirectory = @AltSaveDirectory, Archived = @Archived\n            where SourcePortID = @sourcePortID\";\n\n            DataAccess.ExecuteNonQuery(query, GetSourcePortParams(sourcePort));\n        }\n\n        private List<DbParameter> GetSourcePortParams(ISourcePortData sourcePort)\n        {\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"Name\", sourcePort.Name ?? string.Empty),\n                DataAccess.DbAdapter.CreateParameter(\"Executable\", sourcePort.Executable ?? string.Empty),\n                DataAccess.DbAdapter.CreateParameter(\"SupportedExtensions\", sourcePort.SupportedExtensions ?? string.Empty),\n                DataAccess.DbAdapter.CreateParameter(\"Directory\", sourcePort.Directory == null ? string.Empty : sourcePort.Directory.GetPossiblyRelativePath()),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsFiles\", sourcePort.SettingsFiles ?? string.Empty),\n                DataAccess.DbAdapter.CreateParameter(\"SourcePortID\", sourcePort.SourcePortID),\n                DataAccess.DbAdapter.CreateParameter(\"LaunchType\", sourcePort.LaunchType),\n                DataAccess.DbAdapter.CreateParameter(\"FileOption\", sourcePort.FileOption ?? string.Empty),\n                DataAccess.DbAdapter.CreateParameter(\"ExtraParameters\", sourcePort.ExtraParameters ?? string.Empty),\n                DataAccess.DbAdapter.CreateParameter(\"AltSaveDirectory\", sourcePort.AltSaveDirectory == null ? string.Empty : sourcePort.AltSaveDirectory.GetPossiblyRelativePath()),\n                DataAccess.DbAdapter.CreateParameter(\"Archived\", sourcePort.Archived)\n            };\n\n            return parameters;\n        }\n\n        public void DeleteSourcePort(ISourcePortData sourcePort)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from SourcePorts where SourcePortID = {0}\", sourcePort.SourcePortID));\n        }\n\n        public IEnumerable<IIWadData> GetIWads()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from IWads order by Name collate nocase\").Tables[0];\n            return Util.TableToStructure(dt, typeof(IWadData)).Cast<IWadData>().ToList();\n        }\n\n        public IIWadData GetIWad(int gameFileID)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select * from IWads where GameFileID = {0} order by Name collate nocase\", gameFileID)).Tables[0];\n            return Util.TableToStructure(dt, typeof(IWadData)).Cast<IWadData>().FirstOrDefault();\n        }\n\n        public void InsertIWad(IIWadData iwad)\n        {\n            string insert = InsertStatement(\"IWads\", iwad, new string[] { \"IWadID\" }, out List<DbParameter> parameters);\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void UpdateIWad(IIWadData iwad)\n        {\n            string update = \"update IWads set FileName = @FileName, Name = @Name, GameFileID = @GameFileID where IWadID = @IWadID\";\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"IWadID\", iwad.IWadID),\n                DataAccess.DbAdapter.CreateParameter(\"FileName\", iwad.FileName),\n                DataAccess.DbAdapter.CreateParameter(\"Name\", iwad.Name),\n                DataAccess.DbAdapter.CreateParameter(\"GameFileID\", iwad.GameFileID.HasValue ? iwad.GameFileID : (object)DBNull.Value)\n            };\n\n            DataAccess.ExecuteNonQuery(update, parameters);\n        }\n\n        public void DeleteIWad(IIWadData iwad)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from IWads where IWadID = {0}\", iwad.IWadID));\n        }\n\n        public IEnumerable<IFileData> GetFiles()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from Files\").Tables[0];\n            return Util.TableToStructure(dt, typeof(FileData)).Cast<FileData>().ToList();\n        }\n\n        public IEnumerable<IFileData> GetFiles(IGameFile gameFile)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select * from Files where GameFileID = {0} order by FileOrder, FileID\", gameFile.GameFileID.Value)).Tables[0];\n            return Util.TableToStructure(dt, typeof(FileData)).Cast<FileData>().ToList();\n        }\n\n        public IEnumerable<IFileData> GetFiles(IGameFile gameFile, FileType fileTypeID)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select * from Files where GameFileID = {0} and FileTypeID = {1} order by FileOrder, FileID\", gameFile.GameFileID.Value, (int)fileTypeID)).Tables[0];\n            return Util.TableToStructure(dt, typeof(FileData)).Cast<FileData>().ToList();\n        }\n\n        public IEnumerable<IFileData> GetFiles(FileType fileTypeID)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select * from Files where FileTypeID = {0} order by GameFileID, FileOrder desc\", (int)fileTypeID)).Tables[0];\n            return Util.TableToStructure(dt, typeof(FileData)).Cast<FileData>().ToList();\n        }\n\n        public void UpdateFile(IFileData file)\n        {\n            string query = @\"update Files set \n            SourcePortID = @SourcePortID, Description = @Description, FileOrder = @FileOrder, DateCreated = @DateCreated,\n            UserTitle = @UserTitle, UserDescription = @UserDescription, Map = @Map\n            where FileID = @FileID\";\n\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"SourcePortID\", file.SourcePortID),\n                DataAccess.DbAdapter.CreateParameter(\"Description\", file.Description),\n                DataAccess.DbAdapter.CreateParameter(\"FileID\", file.FileID),\n                DataAccess.DbAdapter.CreateParameter(\"FileOrder\", file.FileOrder),\n                DataAccess.DbAdapter.CreateParameter(\"DateCreated\", file.DateCreated),\n                DataAccess.DbAdapter.CreateParameter(\"UserTitle\", file.UserTitle),\n                DataAccess.DbAdapter.CreateParameter(\"Map\", file.Map),\n                DataAccess.DbAdapter.CreateParameter(\"UserDescription\", file.UserDescription),\n            };\n\n            DataAccess.ExecuteNonQuery(query, parameters);\n        }\n\n        public void UpdateFiles(int sourcePortID_Where, int? sourcePortID_Set)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"update Files set SourcePortID = @id where SourcePortID = {0}\", sourcePortID_Where), \n                new DbParameter[] { DataAccess.DbAdapter.CreateParameter(\"id\", sourcePortID_Set ?? (object)DBNull.Value) });\n        }\n\n        public void InsertFile(IFileData file)\n        {\n            string insert = InsertStatement(\"Files\", file, new string[] { \"FileID\" }, out List<DbParameter> parameters);\n\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void DeleteFile(IFileData file)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from Files where FileID = {0}\", file.FileID));\n        }\n\n        public void DeleteFile(IGameFile file)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from Files where GameFileID = {0}\", file.GameFileID.Value));\n        }\n\n        public void DeleteFiles(ISourcePortData sourcePort, FileType fileTypeID)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from Files where SourcePortID = {0} and FileTypeID = {1}\", sourcePort.SourcePortID, (int)fileTypeID));\n        }\n\n        public IEnumerable<IConfigurationData> GetConfiguration()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from Configuration\").Tables[0];\n            return Util.TableToStructure(dt, typeof(ConfigurationData)).Cast<ConfigurationData>().ToList();\n        }\n\n        public void InsertConfiguration(IConfigurationData config)\n        {\n            string insert = InsertStatement(\"Configuration\", config, new string[] { \"ConfigID\" }, out List<DbParameter> parameters);\n\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void UpdateConfiguration(IConfigurationData config)\n        {\n            string query = @\"update Configuration set \n            Name = @Name, Value = @Value, AvailableValues = @AvailableValues\n            where ConfigID = @ConfigID\";\n\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"Name\", config.Name ?? string.Empty ),\n                DataAccess.DbAdapter.CreateParameter(\"Value\", config.Value ?? string.Empty ),\n                DataAccess.DbAdapter.CreateParameter(\"AvailableValues\", config.AvailableValues == null ? string.Empty : config.AvailableValues),\n                DataAccess.DbAdapter.CreateParameter(\"ConfigID\", config.ConfigID)\n            };\n\n            DataAccess.ExecuteNonQuery(query, parameters);\n        }\n\n        public IEnumerable<ITagData> GetTags()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from Tags\").Tables[0];\n            return Util.TableToStructure(dt, typeof(TagData)).Cast<TagData>().ToList();\n        }\n\n        public void InsertTag(ITagData tag)\n        {\n            string insert = InsertStatement(\"Tags\", tag, new string[] { \"TagID\" }, out List<DbParameter> parameters);\n\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void UpdateTag(ITagData tag)\n        {\n            string query = @\"update Tags set \n            Name = @Name, HasTab = @HasTab, HasColor = @HasColor, Color = @Color, ExcludeFromOtherTabs = @ExcludeFromOtherTabs, Favorite = @Favorite\n            where TagID = @TagID\";\n\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"Name\", tag.Name ?? string.Empty),\n                DataAccess.DbAdapter.CreateParameter(\"HasTab\", tag.HasTab),\n                DataAccess.DbAdapter.CreateParameter(\"HasColor\", tag.HasColor),\n                DataAccess.DbAdapter.CreateParameter(\"Color\", tag.Color.HasValue ? tag.Color : (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"TagID\", tag.TagID),\n                DataAccess.DbAdapter.CreateParameter(\"ExcludeFromOtherTabs\", tag.ExcludeFromOtherTabs),\n                DataAccess.DbAdapter.CreateParameter(\"Favorite\", tag.Favorite)\n            };\n\n            DataAccess.ExecuteNonQuery(query, parameters);\n        }\n\n        public void DeleteTag(ITagData tag)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from Tags where TagID = {0}\", tag.TagID));\n        }\n\n        public IEnumerable<ITagMapping> GetTagMappings()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from TagMapping\").Tables[0];\n            return Util.TableToStructure(dt, typeof(TagMapping)).Cast<TagMapping>().ToList();\n        }\n\n        public IEnumerable<ITagMapping> GetTagMappings(int gameFileID)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select * from TagMapping where FileID = {0}\", gameFileID)).Tables[0];\n            return Util.TableToStructure(dt, typeof(TagMapping)).Cast<TagMapping>().ToList();\n        }\n\n        public void InsertTagMapping(ITagMapping tag)\n        {\n            string insert = InsertStatement(\"TagMapping\", tag, out List<DbParameter> parameters);\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void DeleteTagMapping(ITagMapping tag)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from TagMapping where TagID = {0} and FileID = {1}\", tag.TagID, tag.FileID));\n        }\n\n        public void DeleteTagMapping(int tagID)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from TagMapping where TagID = {0}\", tagID));\n        }\n\n        public IEnumerable<IStatsData> GetStats()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from Stats\").Tables[0];\n            return Util.TableToStructure(dt, typeof(StatsData)).Cast<StatsData>().ToList();\n        }\n\n        public IEnumerable<IStatsData> GetStats(int gameFileID)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select * from Stats where GameFileID = {0}\", gameFileID)).Tables[0];\n            return Util.TableToStructure(dt, typeof(StatsData)).Cast<StatsData>().ToList();\n        }\n\n        public IEnumerable<IStatsData> GetStats(IEnumerable<IGameFile> gameFiles)\n        {\n            if (!gameFiles.Any())\n                return Array.Empty<IStatsData>();\n\n            var gameFileIds = gameFiles.Select(x => x.GameFileID);\n            DataTable dt = DataAccess.ExecuteSelect($\"select * from Stats where GameFileID in ({string.Join(\",\", gameFileIds)})\").Tables[0];\n            return Util.TableToStructure(dt, typeof(StatsData)).Cast<StatsData>().ToList();\n        }\n\n        public void InsertStats(IStatsData stats)\n        {\n            string insert = InsertStatement(\"Stats\", stats, new string[] { \"StatID\", \"SaveFile\" }, out List<DbParameter> parameters);\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void UpdateStats(IStatsData stats)\n        {\n            string query = @\"update Stats set SourcePortID = @SourcePortID where StatID = @StatID\";\n\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"SourcePortID\", stats.SourcePortID),\n                DataAccess.DbAdapter.CreateParameter(\"StatID\", stats.StatID)\n            };\n\n            DataAccess.ExecuteNonQuery(query, parameters);\n        }\n\n        public void DeleteStatsByFile(int gameFileID)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from Stats where GameFileID = {0}\", gameFileID));\n        }\n\n        public void DeleteStats(int statID)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from Stats where StatID = {0}\", statID));\n        }\n\n        public void DeleteStats(ISourcePortData sourcePort)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from Stats where SourcePortID = {0}\", sourcePort.SourcePortID));\n        }\n\n        public IEnumerable<IGameProfile> GetGameProfiles(int gameFileID)\n        {\n            DataTable dt = DataAccess.ExecuteSelect(string.Format(\"select * from GameProfiles where GameFileID = {0}\", gameFileID)).Tables[0];\n            return Util.TableToStructure(dt, typeof(GameProfile)).Cast<IGameProfile>();\n        }\n\n        public IEnumerable<IGameProfile> GetGlobalGameProfiles()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select * from GameProfiles where GameFileID = -1\").Tables[0];\n            return Util.TableToStructure(dt, typeof(GameProfile)).Cast<IGameProfile>();\n        }\n\n        public void InsertGameProfile(IGameProfile gameProfile)\n        {\n            string insert = InsertStatement(\"GameProfiles\", gameProfile, new string[] { \"GameProfileID\" }, out List <DbParameter> parameters);\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void UpdateGameProfile(IGameProfile gameProfile)\n        {\n            string query = @\"update GameProfiles set Name = @Name, SourcePortID = @SourcePortID, IWadID = @IWadID,\n                    SettingsMap = @SettingsMap, SettingsSkill = @SettingsSkill, SettingsExtraParams = @SettingsExtraParams, SettingsFiles = @SettingsFiles,\n                    SettingsFilesSourcePort = @SettingsFilesSourcePort, SettingsFilesIWAD = @SettingsFilesIWAD,\n                    SettingsSpecificFiles = @SettingsSpecificFiles, SettingsStat = @SettingsStat, SettingsLoadLatestSave =@SettingsLoadLatestSave, \n                    SettingsSaved = @SettingsSaved, SettingsExtraParamsOnly = @SettingsExtraParamsOnly\n                    where GameProfileID = @gameProfileID\";\n\n            List<DbParameter> parameters = new List<DbParameter>\n            {\n                DataAccess.DbAdapter.CreateParameter(\"Name\", gameProfile.Name ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SourcePortID\", gameProfile.SourcePortID ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"IWadID\", gameProfile.IWadID ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsMap\", gameProfile.SettingsMap ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsSkill\", gameProfile.SettingsSkill ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsExtraParams\", gameProfile.SettingsExtraParams ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsFiles\", gameProfile.SettingsFiles ?? (object)DBNull.Value ),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsFilesSourcePort\", gameProfile.SettingsFilesSourcePort ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsFilesIWAD\", gameProfile.SettingsFilesIWAD ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsSpecificFiles\", gameProfile.SettingsSpecificFiles ?? (object)DBNull.Value),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsLoadLatestSave\", gameProfile.SettingsLoadLatestSave),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsStat\", gameProfile.SettingsStat),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsSaved\", gameProfile.SettingsSaved),\n                DataAccess.DbAdapter.CreateParameter(\"SettingsExtraParamsOnly\", gameProfile.SettingsExtraParamsOnly),\n                DataAccess.DbAdapter.CreateParameter(\"GameProfileID\", gameProfile.GameProfileID),\n            };\n\n            DataAccess.ExecuteNonQuery(query, parameters);\n        }\n\n        public void DeleteGameProfile(int gameProfileID)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from GameProfiles where GameProfileID = {0}\", gameProfileID));\n        }\n\n        public IEnumerable<CleanupFile> GetCleanupFiles()\n        {\n            return Util.TableToStructure(DataAccess.ExecuteSelect(\"select * from CleanupFiles\").Tables[0], typeof(CleanupFile)).Cast<CleanupFile>();\n        }\n\n        public void InsertCleanupFile(CleanupFile file)\n        {\n            string insert = InsertStatement(\"CleanupFiles\", file, new string[] { \"CleanupFileID\" }, out List<DbParameter> parameters);\n            DataAccess.ExecuteNonQuery(insert, parameters);\n        }\n\n        public void DeleteCleanupFile(CleanupFile file)\n        {\n            DataAccess.ExecuteNonQuery(string.Format(\"delete from CleanupFiles where CleanupFileID = {0}\", file.CleanupFileID));\n        }\n\n        private string InsertStatement(string tableName, object obj, out List<DbParameter> parameters)\n        {\n            return InsertStatement(tableName, obj, new string[] { }, out parameters);\n        }\n\n        private string InsertStatement(string tableName, object obj, string[] exclude, out List<DbParameter> parameters)\n        {\n            StringBuilder sb = new StringBuilder(\"insert into \");\n            sb.Append(tableName);\n            sb.Append(\" (\");\n\n            parameters = new List<DbParameter>();\n            PropertyInfo[] properties = obj.GetType().GetProperties().Where(p => p.GetSetMethod() != null && p.GetGetMethod() != null &&\n                                             !exclude.Contains(p.Name)).ToArray();\n\n            foreach(PropertyInfo pi in properties)\n            {\n                sb.Append(pi.Name);\n                sb.Append(',');\n            }\n\n            sb.Remove(sb.Length - 1, 1);\n            sb.Append(\") values(\");\n\n            foreach(PropertyInfo pi in properties)\n            {\n                sb.Append(\"@\");\n                sb.Append(pi.Name);\n                sb.Append(',');\n\n                object value = pi.GetValue(obj);\n\n                if (value == null)\n                    value = DBNull.Value;\n\n                parameters.Add(DataAccess.DbAdapter.CreateParameter(pi.Name, value));\n            }\n\n            sb.Remove(sb.Length - 1, 1);\n            sb.Append(\")\");\n\n            return sb.ToString();\n        }\n\n        private static List<DbParameter> RemoveUnknownColumnsFromParameters(DataTable dt, List<DbParameter> parameters)\n        {\n            List<DbParameter> badParameters = new List<DbParameter>();\n\n            foreach (var parameter in parameters)\n            {\n                if (!ColumnExists(dt, parameter.ParameterName))\n                    badParameters.Add(parameter);\n            }\n\n            return parameters.Except(badParameters).ToList();\n        }\n\n        private static StringBuilder RemoveUnknownColumnsFromQuery(DataTable dt, StringBuilder query)\n        {\n            Regex regex = new Regex(@\"@\\S+\");\n            var matches = regex.Matches(query.ToString());\n\n            foreach (Match match in matches)\n            {\n                string columnName = match.Value.Replace(\"@\", string.Empty).Replace(\",\", string.Empty);\n                if (!ColumnExists(dt, columnName))\n                {\n                    string replace = $\"{columnName} = @{columnName}\";\n                    if (match.Value.EndsWith(\",\"))\n                        replace += \",\";\n                    query.Replace(replace, string.Empty);\n                }\n            }\n\n            Regex whereFix = new Regex(@\",\\s+where\");\n            var whereMatch = whereFix.Match(query.ToString());\n            if (whereMatch.Success)\n                query.Replace(whereMatch.Value, \" where\");\n\n            return query;\n        }\n\n        private static bool ColumnExists(DataTable dt, string columnName)\n        {\n            return dt.Select($\"name = '{columnName}'\").Any();\n        }\n\n        private DataTable GetTableColumns(string tableName)\n        {\n            return DataAccess.ExecuteSelect($\"pragma table_info({tableName});\").Tables[0];\n        }\n\n        public DataAccess DataAccess { get; private set; }\n\n        private readonly bool m_outOfDateDatabase;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/DirectoryDataSourceAdapter.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public class DirectoryDataSourceAdapter : IGameFileDataSourceAdapter, IIWadDataSourceAdapter\n    {\n        public DirectoryDataSourceAdapter(LauncherPath gameFileDirectory)\n        {\n            GameFileDirectory = gameFileDirectory;\n        }\n\n        public int GetGameFilesCount()\n        {\n            DirectoryInfo dir = new DirectoryInfo(GameFileDirectory.GetFullPath());\n            return dir.GetFiles().Length;\n        }\n\n        public IEnumerable<string> GetGameFileNames()\n        {\n            return Directory.GetFiles(GameFileDirectory.GetFullPath()).Select(x => Path.GetFileName(x));\n        }\n\n        public IGameFile GetGameFile(string fileName)\n        {\n            if (Util.IsDirectory(fileName))\n                return CreateGameFileFromDirectory(fileName);\n\n            FileInfo fi = new FileInfo(Path.Combine(GameFileDirectory.GetFullPath(), fileName));\n            if (fi.Exists)\n                return CreateGameFile(fi);\n\n            return null;\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles()\n        {\n            return GetGameFiles(null);\n        }\n\n        public IEnumerable<IGameFile> GetUntaggedGameFiles()\n        {\n            throw new NotSupportedException();\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles(IGameFileGetOptions options)\n        {\n            int limit = -1;\n\n            if (options != null && options.Limit.HasValue)\n                limit =  options.Limit.Value;\n\n            List<IGameFile> ret = new List<IGameFile>();\n            DirectoryInfo dir = new DirectoryInfo(GameFileDirectory.GetFullPath());\n            int counter = 0;\n\n            foreach (FileInfo fi in dir.GetFiles())\n            {\n                counter++;\n                ret.Add(CreateGameFile(fi));\n\n                if (limit > -1 && counter == limit)\n                    break;\n            }\n\n            return ret;\n        }\n\n        public IEnumerable<IGameFile> GetGameFileIWads()\n        {\n            throw new NotSupportedException();\n        }\n\n        public void DeleteGameFile(IGameFile gameFile)\n        {\n            HandleDelete(GameFileDirectory.GetFullPath(), gameFile.FileName);\n        }\n\n        private static void HandleDelete(string directory, string filename)\n        {\n            if (!string.IsNullOrEmpty(filename))\n            {\n                FileInfo fi = new FileInfo(Path.Combine(directory, filename));\n\n                if (fi.Exists)\n                {\n                    fi.Delete();\n                }\n            }\n        }\n\n        public IEnumerable<IIWadData> GetIWads()\n        {\n            throw new NotSupportedException();\n        }\n\n        public IIWadData GetIWad(int gameFileID)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void InsertIWad(IIWadData iwad)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void UpdateIWad(IIWadData iwad)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void DeleteIWad(IIWadData iwad)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void InsertGameFile(IGameFile gameFile)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void UpdateGameFile(IGameFile gameFile)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void UpdateGameFile(IGameFile gameFile, GameFileFieldType[] updateFields)\n        {\n            throw new NotSupportedException();\n        }\n\n        public LauncherPath GameFileDirectory\n        {\n            get;\n            set;\n        }\n\n        public string[] DateParseFormats\n        {\n            get;\n            set;\n        }\n\n        private IGameFile CreateGameFile(FileInfo fi)\n        {\n            return new GameFile()\n            {\n                FileName = fi.Name\n            };\n        }\n\n        private IGameFile CreateGameFileFromDirectory(string dir)\n        {\n            return new GameFile()\n            {\n                FileName = dir\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/GameLauncher.cs",
    "content": "﻿using DoomLauncher.Adapters.Launch;\nusing DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public class GameLauncher\n    {\n        public delegate void GameLaunchExitHandler(GameLaunchInfo info);\n\n        public event GameLaunchExitHandler ProcessExited;\n\n        private readonly List<ILaunchFeature> _features;\n\n        private readonly IDirectoriesConfiguration _directories;\n\n        public GameLauncher(IDirectoriesConfiguration directories, List<ILaunchFeature> features)\n        {\n            _features = AddGameFileFeatureIfMissing(features);\n            _directories = directories;\n        }\n\n        public GameLauncher(IDirectoriesConfiguration directories) : this(directories, new List<ILaunchFeature>())\n        {\n            \n        }\n\n        private static List<ILaunchFeature> AddGameFileFeatureIfMissing(List<ILaunchFeature> proposedFeatures)\n        {\n            var updatedFeatures = new List<ILaunchFeature>(proposedFeatures);\n            if (!updatedFeatures.Exists(f => f is GameFilesLaunchFeature))\n            {\n                var iWadIndex = updatedFeatures.FindIndex(f => f is IWadLaunchFeature);\n                var insertIndex = (iWadIndex == -1) ? 0 : iWadIndex + 1;\n                updatedFeatures.Insert(insertIndex, new GameFilesLaunchFeature(null, null));\n            }\n            return updatedFeatures;\n        }\n\n        public LaunchResult Launch(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad)\n        {\n            if (!Directory.Exists(sourcePort.Directory.GetFullPath()))\n            {\n                var errorMessage = string.Concat(\"The source port directory does not exist:\", Environment.NewLine, Environment.NewLine,\n                    sourcePort.Directory.GetPossiblyRelativePath());\n                return LaunchResult.Failure(errorMessage);\n            }\n\n            LaunchParameters launchParameters = GetLaunchParameters(gameFile, addFiles, sourcePort, isGameFileIwad);\n            if (launchParameters.Failed)\n            {\n                return LaunchResult.Failure($\"Failed to create launch parameters: {launchParameters.ErrorMessage}\");\n            }\n       \n            Directory.SetCurrentDirectory(sourcePort.Directory.GetFullPath());\n\n            var gameLaunchInfo = new GameLaunchInfo(this, gameFile, sourcePort, launchParameters.RecordedFileName);\n            try\n            {\n                Process proc = Process.Start(sourcePort.GetFullExecutablePath(), launchParameters.LaunchString);\n                proc.EnableRaisingEvents = true;\n                proc.Exited += gameLaunchInfo.proc_Exited;\n            }\n            catch\n            {\n                return LaunchResult.Failure(\"Failed to execute the source port process.\");\n            }\n\n            return LaunchResult.Success(gameLaunchInfo);            \n        }\n\n        public LaunchParameters GetLaunchParameters(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePortData, bool isGameFileIwad)\n        {\n            var paramList = _features.Select(f => f.CreateParameter(gameFile, addFiles, sourcePortData, isGameFileIwad, _directories));\n            var combinedParams = paramList.Aggregate(LaunchParameters.EMPTY, (a, b) => a.Combine(b));\n            return combinedParams.WithVariableReplacement(\"filename\", gameFile.FileNameNoPath);\n        }\n\n        public class GameLaunchInfo\n        {\n            public IGameFile GameFile { get; }\n            public ISourcePortData SourcePort { get; }\n            public string RecordedFileName { get; }\n\n            private readonly GameLauncher _adapter;\n\n            public GameLaunchInfo(GameLauncher adapter, IGameFile gameFile, ISourcePortData sourcePort, string recordedFileName)\n            {\n                _adapter = adapter;\n                GameFile = gameFile;\n                SourcePort = sourcePort;\n                RecordedFileName = recordedFileName;\n            }\n\n            public void proc_Exited(object sender, EventArgs e)\n            {\n                _adapter.ProcessExited.Invoke(this);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/IdGamesDataAdapater.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\n\nnamespace DoomLauncher\n{\n    public class IdGamesBadResponseException : Exception\n    {\n        public IdGamesBadResponseException() : base(\"Bad response from idgames\") { }\n    }\n\n    class IdGamesDataAdapater : IGameFileDataSourceAdapter\n    {\n        static string[] QueryLookup = { \n            \"action=search&type=filename&query={0}\", //Filename,\n            \"action=search&type=title&query={0}\", //Title,\n            \"action=search&type=author&query={0}\", //Author,\n            \"action=search&type=descrption&query={0}\", //Description,\n            string.Empty, //ReleaseDate,\n            \"action=get&id={0}\" }; //GameFileID,\n\n        public IdGamesDataAdapater(string url, string apiPage, string mirrorUrl)\n        {\n            Url = url;\n            ApiPage = apiPage;\n            MirrorUrl = mirrorUrl;\n        }\n\n        public int GetGameFilesCount()\n        {\n            return 0;\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles()\n        {\n            return GetGameFiles(null);\n        }\n\n        public IEnumerable<IGameFile> GetUntaggedGameFiles()\n        {\n            throw new NotSupportedException();\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles(IGameFileGetOptions options)\n        {\n            if (options == null)\n                return GetFiles(\"action=search&field=filename&query=zip&sort=date&dir=desc\", \"file\");\n\n            if ((int)options.SearchField.SearchFieldType >= QueryLookup.Length)\n                return Array.Empty<IGameFile>();\n\n            var query = QueryLookup[(int)options.SearchField.SearchFieldType];\n            if (string.IsNullOrEmpty(query))\n                return Array.Empty<IGameFile>();\n\n            const int minLength = 3;\n            var searchText = options.SearchField.SearchText;\n            var fieldType = options.SearchField.SearchFieldType;\n            if (fieldType != GameFileFieldType.Filename && fieldType != GameFileFieldType.GameFileID && searchText.Length < minLength)\n                return Array.Empty<IGameFile>();\n\n            if (fieldType == GameFileFieldType.Filename)\n            {\n                var fi = new FileInfo(searchText);\n                if (!string.IsNullOrEmpty(fi.Extension))\n                    searchText = searchText.Replace(fi.Extension, string.Empty);\n\n                if (searchText.Length < minLength)\n                    searchText += \".zip\";\n            }\n\n            return GetFiles(string.Format(query, Uri.EscapeDataString(searchText)),\n                options.SearchField.SearchFieldType == GameFileFieldType.GameFileID ? \"content\" : \"file\");\n        }\n\n        public IEnumerable<IGameFile> GetGameFileIWads()\n        {\n            throw new NotSupportedException();\n        }\n\n        public IEnumerable<string> GetGameFileNames()\n        {\n            throw new NotSupportedException();\n        }\n\n        public IGameFile GetGameFile(string fileName)\n        {\n            GameFileSearchField sf = new GameFileSearchField(GameFileFieldType.Filename, fileName);\n            return GetGameFiles(new GameFileGetOptions(sf)).FirstOrDefault();\n        }\n\n        public IEnumerable<IGameFile> GetGameFilesByName(string fileName)\n        {\n            GameFileSearchField sf = new GameFileSearchField(GameFileFieldType.Filename, fileName);\n            return GetGameFiles(new GameFileGetOptions(sf));\n        }\n\n        public void InsertGameFile(IGameFile gameFile)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void UpdateGameFile(IGameFile gameFile)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void UpdateGameFile(IGameFile gameFile, GameFileFieldType[] updateFields)\n        {\n            throw new NotSupportedException();\n        }\n\n        public void DeleteGameFile(IGameFile gameFile)\n        {\n            throw new NotSupportedException();\n        }\n\n        public string Url { get; set; }\n        public string ApiPage { get; set; }\n        public string MirrorUrl  { get; set; }\n\n        private IEnumerable<IGameFile> GetFiles(string query, string itemName)\n        {\n            WebRequest request = WebRequest.Create(string.Format(Url + ApiPage + \"?\" + query));\n            request.Credentials = CredentialCache.DefaultCredentials;\n            HttpWebResponse response = (HttpWebResponse)request.GetResponse();\n\n            StreamReader reader = new StreamReader(response.GetResponseStream());\n            string xmlResponse = reader.ReadToEnd();\n\n            reader.Close();\n            response.Close();\n\n            if (xmlResponse.Length == 0)\n                throw new IdGamesBadResponseException();\n\n            StringReader xmlReader = new StringReader(xmlResponse);\n            DataSet ds = new DataSet();\n            ds.ReadXml(xmlReader);\n            xmlReader.Dispose();\n\n            if (ds.Tables.Contains(\"warning\") && ds.Tables[\"warning\"].Rows[0][\"type\"].ToString() == \"No Results\")\n                return Array.Empty<IGameFile>();\n\n            IEnumerable<IdGamesGameFile> files = Util.TableToStructure(ds.Tables[itemName], typeof(IdGamesGameFile)).Cast<IdGamesGameFile>().ToList();\n            foreach (IdGamesGameFile file in files)\n                file.Description = file.Description.Replace(\"<br>\", \"\\n\");\n\n            return files;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/ExtraParametersLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class ExtraParametersLaunchFeature : ILaunchFeature\n    {\n        private readonly string _extraParameters; // Never null\n        private readonly bool _extraParametersOnly;\n\n        public ExtraParametersLaunchFeature(string extraParameters, bool extraParametersOnly)\n        {\n            _extraParameters = extraParameters ?? \"\";\n            _extraParametersOnly = extraParametersOnly;\n        }\n\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            if (_extraParametersOnly)\n                return LaunchParameters.ExclusiveParam(_extraParameters);\n            else\n                return LaunchParameters.Param(_extraParameters);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/GameFilesLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class GameFilesLaunchFeature : ILaunchFeature\n    {\n        private readonly List<IGameFile> m_gameFiles;\n        private readonly List<string> m_specificFiles;\n        private readonly bool m_extractFiles;\n\n        public GameFilesLaunchFeature(List<IGameFile> gameFiles, List<string> specificFiles, bool extractFiles = true)\n        {\n            m_gameFiles = (gameFiles != null) ? new List<IGameFile>(gameFiles) : new List<IGameFile>();\n            m_specificFiles = (specificFiles != null) ? new List<string>(specificFiles) : new List<string>();\n            m_extractFiles = extractFiles;\n        }\n\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            var filesToUse = new List<IGameFile>(m_gameFiles);\n\n            if (isGameFileIwad)\n                filesToUse.Remove(gameFile);\n            else if (!filesToUse.Contains(gameFile))\n                filesToUse.Add(gameFile);\n\n            List<string> launchFiles = new List<string>();\n            foreach (IGameFile file in filesToUse)\n            {\n                if (!file.ArchiveExists(directories.GameFileDirectory))\n                {\n                    return LaunchParameters.Failure($\"Couldn't find additional file at {new LauncherPath(file.FileName).GetFullPath()}\");\n                }\n                launchFiles.AddRange(GetExtractedFileNames(sourcePort, file, directories));\n            }\n\n            // Build launch string\n            // -file \"file1\", \"file2\",.. -deh \"deh1\", \"deh2\",.. \n\n            var launchString = BuildLaunchString(sourcePort.GetFlavor(), launchFiles);\n            return LaunchParameters.Param(launchString);\n        }\n\n        private string BuildLaunchString(ISourcePortFlavor sourcePort, List<string> files)\n        {\n            StringBuilder sb = new StringBuilder();\n            List<string> dehFiles = new List<string>();\n\n            if (files.Count > 0)\n            {\n                sb.Append(sourcePort.FileParameter(new SpData()));\n                var dehExtensions = Util.GetDehackedExtensions();\n\n                foreach (string str in files)\n                {\n                    FileInfo fi = new FileInfo(str);\n                    if (!dehExtensions.Contains(fi.Extension, StringComparer.OrdinalIgnoreCase))\n                        sb.Append(string.Format(\"\\\"{0}\\\" \", str));\n                    else\n                        dehFiles.Add(str);\n                }\n            }\n\n            if (dehFiles.Count > 0)\n            {\n                sb.Append(\" -deh \");\n\n                foreach (string str in dehFiles)\n                    sb.Append(string.Format(\"\\\"{0}\\\" \", str));\n            }\n            return sb.ToString();\n        }\n\n        public List<string> GetExtractedFileNames(ISourcePortData sourcePortData, IGameFile gameFile, IDirectoriesConfiguration directories)\n        {\n            List<string> launchFiles = new List<string>();\n            if (gameFile.IsDirectory())\n            {\n                launchFiles.Add(gameFile.FileName);\n                return launchFiles;\n            }\n\n            try\n            {\n                using (IArchiveReader reader = gameFile.OpenGameFile(directories.GameFileDirectory))\n                {\n                    IEnumerable<IArchiveEntry> relevantEntries = GetRelevantEntries(reader, sourcePortData, m_specificFiles);\n\n                    foreach (IArchiveEntry entry in relevantEntries)\n                    {\n                        if (entry.ExtractRequired)\n                        {\n                            string extractFile = Path.Combine(directories.TempDirectory.GetFullPath(), entry.Name);\n                            if (m_extractFiles)\n                                entry.ExtractToFileForceOverwrite(extractFile);\n                            launchFiles.Add(extractFile);\n                        }\n                        else\n                        {\n                            launchFiles.Add(entry.FullName);\n                        }\n                    }\n                }\n            }\n            catch (FileNotFoundException)\n            {\n                string.Format(\"The game file was not found: {0}\", gameFile.FileName);\n            }\n            catch (InvalidDataException)\n            {\n                string.Format(\"The game file does not appear to be a valid zip file: {0}\", gameFile.FileName);\n            }\n\n            return launchFiles;\n        }\n\n\n        public static IEnumerable<IArchiveEntry> GetRelevantEntries(IArchiveReader reader, ISourcePortData sourcePortData, IList<string> specificFiles)\n        {\n            // Go with the specific files if available, otherwise pick out the SourcePort's allowed extensions\n            if (specificFiles != null && specificFiles.Count > 0)\n            {\n                // This could be a relative unmanaged file which means the partial path must convert to a full path for comparison\n                if (reader is FileArchiveReader && reader.Entries.Any())\n                {\n                    var filePaths = specificFiles.Select(x => new LauncherPath(x)).ToArray();\n                    return reader.Entries.Where(entry => filePaths.Any(filePath => entry.FullName == filePath.GetFullPath()));\n                }\n\n                return reader.Entries.Where(entry => specificFiles.Contains(entry.FullName));\n            }\n            else\n            {\n                return reader.Entries.Where(x => EntryMatchesSourcePortExtensions(x, sourcePortData));\n            }\n        }\n\n        private static bool EntryMatchesSourcePortExtensions(IArchiveEntry entry, ISourcePortData sourcePortData)\n        {\n            string[] extensions = sourcePortData.SupportedExtensions.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);\n            return !string.IsNullOrEmpty(entry.Name) && entry.Name.Contains('.')\n                        && extensions.Any(y => y.Equals(Path.GetExtension(entry.Name), StringComparison.OrdinalIgnoreCase));\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/ILaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public interface ILaunchFeature\n    {\n        LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories); \n    }\n\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/IWadLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class IWadLaunchFeature : ILaunchFeature\n    {\n        private readonly IGameFile _iwad;\n        private readonly bool _extractFiles;\n\n        public IWadLaunchFeature(IGameFile iwad, bool extractFiles = true)\n        {\n            _iwad = iwad;\n            _extractFiles = extractFiles;\n        }\n\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            if (!gameFile.ArchiveExists(directories.GameFileDirectory))\n            {\n                return LaunchParameters.Failure($\"Couldn't find game file at {directories.GameFileDirectory.GetFullPath()}\");\n            }\n\n            string extractedFileName;\n            try\n            {\n                extractedFileName = GetExtractedFileName(sourcePort, directories);\n            }\n            catch (FileNotFoundException)\n            {\n                return LaunchParameters.Failure($\"File not found: {gameFile.FileName}\");\n            }\n            catch (IOException)\n            {\n                return LaunchParameters.Failure($\"File in use: {gameFile.FileName}\");\n            }\n            catch (Exception e)\n            {\n                return LaunchParameters.Failure($\"There was an issue with the IWad: {gameFile.FileName}.\" +\n                    $\"{Environment.NewLine}{Environment.NewLine}{e.Message}\");\n            }\n\n            if (extractedFileName == null)\n            {\n                return LaunchParameters.Failure(\"Failed to find any IWAD files in the select IWAD archive.\\n\" +\n                    \"View the IWAD and click 'Select Individual Files...' to ensure the IWAD file is selected.\");\n            }\n\n            var paramString = sourcePort.GetFlavor().IwadParameter(new SpData(extractedFileName, gameFile, addFiles));\n\n            return LaunchParameters.Param(paramString).WithVariableReplacement(\"iwad\", Path.GetFileNameWithoutExtension(_iwad.FileNameNoPath));\n        }\n\n        private string GetExtractedFileName(ISourcePortData sourcePortData, IDirectoriesConfiguration directories)\n        {\n            using (IArchiveReader reader = _iwad.OpenGameFile(directories.GameFileDirectory))\n            {\n                IArchiveEntry firstMatchingEntry = GetFirstIWadEntry(reader, sourcePortData);\n\n                if (firstMatchingEntry != null)\n                {\n                    if (firstMatchingEntry.ExtractRequired)\n                    { \n                        string extractFile = Path.Combine(directories.TempDirectory.GetFullPath(), firstMatchingEntry.Name);\n                        if (_extractFiles)\n                            firstMatchingEntry.ExtractToFileForceOverwrite(extractFile);\n                        return extractFile;\n                    }\n                    else\n                    {\n                        return firstMatchingEntry.FullName;\n                    }\n                }\n                else return null;\n            }\n        }\n\n        private IArchiveEntry GetFirstIWadEntry(IArchiveReader reader, ISourcePortData sourcePortData)\n        {\n            var specificFiles = _iwad.SettingsSpecificFiles;\n            return GameFilesLaunchFeature.GetRelevantEntries(reader, sourcePortData, Util.SplitString(specificFiles)).FirstOrDefault();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/LaunchParameters.cs",
    "content": "﻿\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class LaunchParameters\n    {\n        public string LaunchString { get => _launchString; } \n\n        private readonly string _launchString; // Never null\n\n        public string ErrorMessage { get; } // Null unless failure\n\n        public string RecordedFileName { get; } // Null unless supplied\n\n        public bool Failed { get => ErrorMessage != null; }\n\n        private readonly IDictionary<string, string> _variableReplacements; // Never null\n\n        private readonly bool _isExclusive; // false unless supplied\n\n        public static readonly LaunchParameters EMPTY = new LaunchParameters(\"\", null, null, false, null);\n\n        private LaunchParameters(string launchString, string recordedFileName, string errorMessage, bool isExclusive, \n            IDictionary<string, string> variableReplacements)\n        {\n            ErrorMessage = errorMessage;\n            RecordedFileName = recordedFileName;\n            _variableReplacements = variableReplacements ?? new Dictionary<string, string>();\n            _isExclusive = isExclusive;\n            _launchString = ReplaceVariables(launchString ?? \"\");\n        }\n\n        public LaunchParameters Combine(LaunchParameters other)\n        {\n            if (Failed || _isExclusive)\n            {\n                return this;\n            }\n            else if (other.Failed || other._isExclusive)\n            {\n                return other;\n            }\n            else\n            {\n                return new LaunchParameters(\n                    $\"{LaunchString.Trim()} {other.LaunchString.Trim()}\".Trim(), \n                    RecordedFileName ?? other.RecordedFileName, \n                    null, \n                    other._isExclusive,\n                    CombineDictionaries(_variableReplacements, other._variableReplacements));\n            }\n        }\n\n        public LaunchParameters WithRecordedFileName(string recordedFileName)\n        {\n            return Combine(new LaunchParameters(\"\", recordedFileName, null, false, null));\n        }\n\n        public LaunchParameters WithVariableReplacement(string variable, string value)\n        {\n            var dict = new Dictionary<string, string>\n            {\n                { variable, value }\n            };\n            return Combine(new LaunchParameters(\"\", null, null, false, dict));\n        }\n\n        private IDictionary<A, A> CombineDictionaries<A>(IDictionary<A, A> ourDict, IDictionary<A, A> otherDict)\n        {\n            var combinedDictionary = new Dictionary<A, A>(ourDict);\n            foreach (var key in otherDict.Keys)\n            {\n                if (!combinedDictionary.ContainsKey(key))\n                    combinedDictionary[key] = otherDict[key];\n            }\n            return combinedDictionary;\n        }\n\n        private string ReplaceVariables(string paramString)\n        {\n            var sb = new StringBuilder(paramString);\n            foreach (var key in _variableReplacements.Keys)\n            {\n                sb.Replace($\"${key}\", _variableReplacements[key]);\n            }\n            return sb.ToString();\n        }\n\n        public static LaunchParameters ExclusiveParam(string paramString)\n        {\n            return new LaunchParameters(paramString, null, null, true, null);\n        }\n\n        public static LaunchParameters Param(string paramString)\n        {\n            return new LaunchParameters(paramString, null, null, false, null);\n        }\n\n        public static LaunchParameters Failure(string errorMessage)\n        {\n            return new LaunchParameters(\"\", null, errorMessage, false, null);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/LaunchResult.cs",
    "content": "﻿\nusing static DoomLauncher.GameLauncher;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class LaunchResult\n    {\n        public GameLaunchInfo GameLaunchInfo { get; }\n\n        public string ErrorMessage { get; }\n\n        public bool Failed\n        {\n            get => !string.IsNullOrEmpty(ErrorMessage);\n        }\n\n        private LaunchResult(GameLaunchInfo gameLaunchInfo, string errorMessage)\n        {\n            GameLaunchInfo = gameLaunchInfo;\n            ErrorMessage = errorMessage;\n        }\n\n        public static LaunchResult Success(GameLaunchInfo gameLaunchInfo) =>\n            new LaunchResult(gameLaunchInfo, null);\n\n        public static LaunchResult Failure(string errorMessage) =>\n            new LaunchResult(null, errorMessage);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/LoadSaveLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class LoadSaveLaunchFeature : ILaunchFeature\n    {\n        private readonly string _loadSaveFile;\n\n        public LoadSaveLaunchFeature(string loadSaveFile)\n        {\n            _loadSaveFile = loadSaveFile;\n        }\n\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            if (!string.IsNullOrEmpty(_loadSaveFile) && sourcePort.GetFlavor().LoadSaveGameSupported())\n            {\n                var paramString = sourcePort.GetFlavor().LoadSaveParameter(new SpData(_loadSaveFile, gameFile, addFiles));\n                return LaunchParameters.Param(paramString);\n            }\n            else\n                return LaunchParameters.EMPTY;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/MapSkillLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class MapSkillLaunchFeature : ILaunchFeature\n    {\n\n        private readonly string _map;\n        private readonly string _skill;\n\n        public MapSkillLaunchFeature(string map, string skill)\n        {\n            _map = map;\n            _skill = skill;\n        }\n\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            LaunchParameters result = LaunchParameters.EMPTY;\n\n            if (_map != null)\n            {\n                var warpParam = LaunchParameters.Param(sourcePort.GetFlavor().WarpParameter(new SpData(_map, gameFile, addFiles)));\n                result = warpParam;\n\n                if (_skill != null)\n                {\n                    var skillParam = LaunchParameters.Param(sourcePort.GetFlavor().SkillParameter(new SpData(_skill, gameFile, addFiles)));\n                    result = warpParam.Combine(skillParam);\n                }\n            }\n\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/PlayDemoLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class PlayDemoLaunchFeature : ILaunchFeature\n    {\n        private readonly string _playDemoFile;\n\n        public PlayDemoLaunchFeature(string playDemoFile)\n        {\n            _playDemoFile = playDemoFile;\n        }\n\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            FileInfo fi = new FileInfo(_playDemoFile);\n\n            if (!fi.Exists)\n            {\n                return LaunchParameters.Failure($\"Failed to find demo file {_playDemoFile}\");\n            }\n            else\n            {\n                var paramString = sourcePort.GetFlavor().PlayDemoParameter(new SpData(_playDemoFile, gameFile, addFiles));\n                return LaunchParameters.Param(paramString);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/RecordLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class RecordLaunchFeature : ILaunchFeature\n    {\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            var recordedFileName = Path.Combine(directories.TempDirectory.GetFullPath(), Guid.NewGuid().ToString());\n            var paramString = sourcePort.GetFlavor().RecordParameter(new SpData(recordedFileName, gameFile, addFiles));\n\n            return LaunchParameters.Param(paramString).WithRecordedFileName(recordedFileName);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/SourcePortExtraParametersLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class SourcePortExtraParametersLaunchFeature : ILaunchFeature\n    {\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            return LaunchParameters.Param(sourcePort.ExtraParameters);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/StatisticsReaderLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class StatisticsReaderLaunchFeature : ILaunchFeature\n    {\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            IStatisticsReader statsReader = sourcePort.GetFlavor().CreateStatisticsReader(gameFile, Array.Empty<IStatsData>());\n            return LaunchParameters.Param(statsReader?.LaunchParameter);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/Launch/UtilityFilesLaunchFeature.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System;\nusing DoomLauncher.Config;\n\nnamespace DoomLauncher.Adapters.Launch\n{\n    public class UtilityFilesLaunchFeature : ILaunchFeature\n    {\n        private readonly List<SpecificFilesForm.SpecificFilePath> _pathFiles;\n\n        public UtilityFilesLaunchFeature(List<SpecificFilesForm.SpecificFilePath> pathFiles)\n        {\n            _pathFiles = new List<SpecificFilesForm.SpecificFilePath>(pathFiles);\n        }\n\n        public LaunchParameters CreateParameter(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool isGameFileIwad, IDirectoriesConfiguration directories)\n        {\n            ISourcePortFlavor sourcePortFlavor = new GenericSourcePortFlavor(sourcePort);\n            StringBuilder sb = new StringBuilder();\n\n            try\n            {\n                List<string> files = new List<string>();\n                foreach (var pathFile in _pathFiles)\n                {\n                    if (gameFile.IsUnmanaged())\n                    {\n                        files.Add(pathFile.ExtractedFile);\n                        continue;\n                    }\n\n                    if (!File.Exists(pathFile.ExtractedFile))\n                        continue;\n\n                    using (IArchiveReader reader = ArchiveReader.Create(pathFile.ExtractedFile))\n                    {\n                        var entry = reader.Entries.FirstOrDefault(x => x.FullName == pathFile.InternalFilePath);\n                        if (entry != null)\n                            files.Add(Util.ExtractTempFile(directories.TempDirectory.GetFullPath(), entry));\n                    }\n                }\n\n                var launchString = BuildLaunchString(sourcePortFlavor, files);\n                return LaunchParameters.Param(launchString);\n            }\n            catch (FileNotFoundException)\n            {\n                var errorMessage = string.Format(\"The game file was not found: {0}\", gameFile.FileName);\n                return LaunchParameters.Failure(errorMessage);\n            }\n            catch (InvalidDataException)\n            {\n                var errorMessage = string.Format(\"The game file does not appear to be a valid zip file: {0}\", gameFile.FileName);\n                return LaunchParameters.Failure(errorMessage);\n            }\n        }\n\n        private string BuildLaunchString(ISourcePortFlavor sourcePort, List<string> files)\n        {\n            var sb = new StringBuilder();\n            List<string> dehFiles = new List<string>();\n\n            if (files.Count > 0)\n            {\n                sb.Append(sourcePort.FileParameter(new SpData()));\n                var dehExtensions = Util.GetDehackedExtensions();\n\n                foreach (string str in files)\n                {\n                    FileInfo fi = new FileInfo(str);\n                    if (!dehExtensions.Contains(fi.Extension, StringComparer.OrdinalIgnoreCase))\n                        sb.Append(string.Format(\"\\\"{0}\\\" \", str));\n                    else\n                        dehFiles.Add(str);\n                }\n            }\n\n            if (dehFiles.Count > 0)\n            {\n                sb.Append(\" -deh \");\n\n                foreach (string str in dehFiles)\n                    sb.Append(string.Format(\"\\\"{0}\\\" \", str));\n            }\n            return sb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/MSSQLDataAdapter.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Data.Common;\nusing System.Data.SqlClient;\n\nnamespace DoomLauncher\n{\n    class MSSQLDataAdapter : IDatabaseAdapter\n    {\n        public DbConnection CreateConnection(string connectionString)\n        {\n            return new SqlConnection(connectionString);\n        }\n\n        public DbDataAdapter CreateAdapter()\n        {\n            return new SqlDataAdapter();\n        }\n\n        public DbParameter CreateParameter(string name, object value)\n        {\n            return new SqlParameter(name, value);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/PlaySession.cs",
    "content": "﻿using System;\nusing static DoomLauncher.GameLauncher;\n\nnamespace DoomLauncher.Adapters\n{\n    public class PlaySession\n    {\n        public PlaySession(GameLaunchInfo launchInfo, IStatisticsReader statisticsReader, DateTime start)\n        {\n            GameLaunchInfo = launchInfo;\n            StatisticsReader = statisticsReader;\n            Start = start;\n        }\n\n        public GameLaunchInfo GameLaunchInfo { get; }\n        public IStatisticsReader StatisticsReader { get; }\n        public DateTime Start { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/SqliteDatabaseAdapter.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Data.Common;\nusing System.Data.SQLite;\n\nnamespace DoomLauncher\n{\n    public class SqliteDatabaseAdapter : IDatabaseAdapter\n    {\n        public DbConnection CreateConnection(string connectionString)\n        {\n            return new SQLiteConnection(connectionString);\n        }\n\n        public DbDataAdapter CreateAdapter()\n        {\n            return new SQLiteDataAdapter();\n        }\n\n        public DbParameter CreateParameter(string name, object value)\n        {\n            return new SQLiteParameter(name, value);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Adapters/WadArchiveDataAdapter.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net;\nusing System.Security.Cryptography;\n\nnamespace DoomLauncher\n{\n    class WadArchiveDataAdapter : IGameFileDataSourceAdapter\n    {\n        private string m_urlMD5 = \"http://www.wad-archive.com/api/latest/\";\n        private string m_urlFilename = \"http://www.wad-archive.com/wadseeker/\";\n\n        public WadArchiveGameFile Test(string file)\n        {\n            return GetGameFileFromMD5(file);\n        }\n\n        private WadArchiveGameFile GetGameFileFromMD5(string filePath)\n        {\n            var md5 = MD5.Create();\n\n            byte[] hash = null;\n\n            using (var stream = File.OpenRead(filePath))\n            {\n                hash = md5.ComputeHash(stream);\n            }\n\n            string md5_string = BitConverter.ToString(hash).Replace(\"-\", string.Empty).ToLower();\n\n            return GetGameFileRequest(m_urlMD5 + md5_string);\n        }\n\n        private WadArchiveGameFile GetGameFileByName(string name)\n        {\n            return GetGameFileRequest(m_urlFilename + name);\n        }\n\n        private WadArchiveGameFile GetGameFileRequest(string url)\n        {\n            WebRequest request = WebRequest.Create(string.Format(url));\n            request.Credentials = CredentialCache.DefaultCredentials;\n            HttpWebResponse response = (HttpWebResponse)request.GetResponse();\n\n            StreamReader reader = new StreamReader(response.GetResponseStream());\n            string data = reader.ReadToEnd();\n\n            if (data != \"[]\")\n            {\n                if (data.EndsWith(\",\\\"screenshots\\\":[]}\"))\n                    data = data.Replace(\",\\\"screenshots\\\":[]\", string.Empty);\n                var settings = new JsonSerializerSettings\n                {\n                    NullValueHandling = NullValueHandling.Ignore,\n                    MissingMemberHandling = MissingMemberHandling.Ignore\n                };\n                return JsonConvert.DeserializeObject<WadArchiveGameFile>(data, settings);\n            }\n\n            return null;\n        }\n\n        public int GetGameFilesCount()\n        {\n            return 0;\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles()\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IGameFile> GetUntaggedGameFiles()\n        {\n            throw new NotSupportedException();\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles(IGameFileGetOptions options)\n        {\n            if (options.SearchField.SearchFieldType == GameFileFieldType.MD5)\n            {\n                return new WadArchiveGameFile[] { GetGameFileFromMD5(options.SearchField.SearchText) };\n            }\n            else\n            {\n                throw new NotSupportedException(\"Only GamefileFieldType.MD5 is supported.\");\n            }\n        }\n\n        public IEnumerable<IGameFile> GetGameFileIWads()\n        {\n            throw new NotSupportedException();\n        }\n\n        public IEnumerable<string> GetGameFileNames()\n        {\n            throw new NotImplementedException();\n        }\n\n        public IGameFile GetGameFile(string fileName)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void InsertGameFile(IGameFile gameFile)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateGameFile(IGameFile gameFile)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateGameFile(IGameFile gameFile, GameFileFieldType[] updateFields)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteGameFile(IGameFile gameFile)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateGameFiles(GameFileFieldType ftWhere, GameFileFieldType ftSet, object fWhere, object fSet)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<ISourcePortData> GetSourcePorts()\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<ISourcePortData> GetUtilities()\n        {\n            throw new NotImplementedException();\n        }\n\n\n        public ISourcePortData GetSourcePort(int sourcePortID)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void InsertSourcePort(ISourcePortData sourcePort)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateSourcePort(ISourcePortData sourcePort)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteSourcePort(ISourcePortData sourcePort)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IFileData> GetFiles()\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IFileData> GetFiles(IGameFile gameFile)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IFileData> GetFiles(IGameFile gameFile, FileType fileTypeID)\n        {\n            WadArchiveGameFile archiveGameFile = gameFile as WadArchiveGameFile;\n\n            if (archiveGameFile != null)\n            {\n                List<WadArchiveFile> ret = new List<WadArchiveFile>();\n\n                if (archiveGameFile.screenshots != null)\n                {\n                    foreach (var item in archiveGameFile.screenshots)\n                    {\n                        WadArchiveFile file = new WadArchiveFile();\n                        file.FileName = item.Value;\n                        ret.Add(file);\n                    }\n                }\n\n                return ret;\n            }\n            else\n            {\n                throw new ArgumentException(\"Parameter gameFile must be of type WadArchiveGameFile\");\n            }\n        }\n\n        public void UpdateFiles(int sourcePortID_Where, int? sourcePortID_Set)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void InsertFile(IFileData file)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateFile(IFileData file)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteFile(IFileData file)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteFile(IGameFile file)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteFiles(ISourcePortData sourcePort, FileType fileTypeID)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles(ITagData tag)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IGameFile> GetGameFiles(IGameFileGetOptions options, ITagData tag)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IIWadData> GetIWads()\n        {\n            throw new NotImplementedException();\n        }\n\n        public IIWadData GetIWad(int gameFileID)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void InsertIWad(IIWadData iwad)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteIWad(IIWadData iwad)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateIWad(IIWadData iwad)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IConfigurationData> GetConfiguration()\n        {\n            throw new NotImplementedException();\n        }\n\n        public void InsertConfiguration(IConfigurationData config)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateConfiguration(IConfigurationData config)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<ITagData> GetTags()\n        {\n            throw new NotImplementedException();\n        }\n\n        public void InsertTag(ITagData tag)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateTag(ITagData tag)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteTag(ITagData tag)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<ITagMapping> GetTagMappings()\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<ITagMapping> GetTagMappings(int gameFileID)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void InsertTagMapping(ITagMapping tag)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteTagMapping(ITagMapping tag)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteTagMapping(int tagID)\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IStatsData> GetStats()\n        {\n            throw new NotImplementedException();\n        }\n\n        public IEnumerable<IStatsData> GetStats(int gameFileID)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void InsertStats(IStatsData stats)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void UpdateStats(IStatsData stats)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteStatsByFile(int gameFileID)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteStats(int statID)\n        {\n            throw new NotImplementedException();\n        }\n\n        public void DeleteStats(ISourcePortData sourcePort)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n  </configSections>\n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.8\" />\n  </startup>\n  <appSettings>\n    <add key=\"ClientSettingsProvider.ServiceUri\" value=\"\" />\n  </appSettings>\n  <system.web>\n    <membership defaultProvider=\"ClientAuthenticationMembershipProvider\">\n      <providers>\n        <add name=\"ClientAuthenticationMembershipProvider\" type=\"System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" serviceUri=\"\" />\n      </providers>\n    </membership>\n    <roleManager defaultProvider=\"ClientRoleProvider\" enabled=\"true\">\n      <providers>\n        <add name=\"ClientRoleProvider\" type=\"System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" serviceUri=\"\" cacheTimeout=\"86400\" />\n      </providers>\n    </roleManager>\n  </system.web>\n  <entityFramework>\n    <providers>\n      <provider invariantName=\"System.Data.SqlClient\" type=\"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer\" />\n      <provider invariantName=\"System.Data.SQLite.EF6\" type=\"System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6\" />\n    </providers>\n  </entityFramework>\n  <system.data>\n    <DbProviderFactories>\n      <remove invariant=\"System.Data.SQLite.EF6\" />\n      <add name=\"SQLite Data Provider (Entity Framework 6)\" invariant=\"System.Data.SQLite.EF6\" description=\".NET Framework Data Provider for SQLite (Entity Framework 6)\" type=\"System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6\" />\n    <remove invariant=\"System.Data.SQLite\" /><add name=\"SQLite Data Provider\" invariant=\"System.Data.SQLite\" description=\".NET Framework Data Provider for SQLite\" type=\"System.Data.SQLite.SQLiteFactory, System.Data.SQLite\" /></DbProviderFactories>\n  </system.data>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.0.0.0\" newVersion=\"5.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "DoomLauncher/Archive/ArchiveReader.cs",
    "content": "﻿using DoomLauncher.Archive.Rar;\nusing DoomLauncher.Archive.SevenZip;\nusing System;\nusing System.IO;\n\nnamespace DoomLauncher\n{\n    public static class ArchiveReader\n    {\n        public static IArchiveReader EmptyArchiveReader = new EmptyArchiveReader();\n\n        public static string SevenZipInteropLibrary { get; private set; } = Path.Combine(Util.GetInteropDirectory(), \"7z.dll\");\n\n        public static void SetSevenZipInteropLibrary(string file) =>\n            SevenZipInteropLibrary = file;\n\n        public static IArchiveReader Create(string path)\n        {\n            if (!File.Exists(path) && !Directory.Exists(path))\n                return EmptyArchiveReader;\n\n            if (Util.IsDirectory(path))\n                return new DirectoryArchiveReader(path);\n\n            string ext = Path.GetExtension(path);\n            if (IsPk(ext))\n                return new ZipArchiveReader(path);\n            if (IsWad(ext))\n                return new WadArchiveReader(path);\n            if (IsSevenZip(ext))\n                return new SevenZipArchiveReader(path, SevenZipInteropLibrary);\n            if (IsRar(ext))\n                return new RarArchiveReader(path);\n            \n            return new FileArchiveReader(path);\n        }\n\n        private static bool IsRar(string ext) =>\n            ext.Equals(\".rar\", StringComparison.OrdinalIgnoreCase);\n\n        private static bool IsSevenZip(string ext) =>\n            ext.Equals(\".7z\", StringComparison.OrdinalIgnoreCase);\n\n        public static bool IsWad(string ext) =>\n            ext.Equals(\".wad\", StringComparison.OrdinalIgnoreCase);\n\n        public static bool IsPk(string fileExtension)\n        {\n            var extensions = Util.GetReadablePkExtensions();\n            foreach (string ext in extensions)\n            {\n                if (fileExtension.Equals(ext, StringComparison.OrdinalIgnoreCase))\n                    return true;\n            }\n\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/Directory/DirectoryArchiveEntry.cs",
    "content": "﻿using System.IO;\n\nnamespace DoomLauncher\n{\n    internal class DirectoryArchiveEntry : AbstractArchiveEntry\n    {\n        private readonly FileInfo m_file;\n\n        public DirectoryArchiveEntry(string file)\n        {\n            m_file = new FileInfo(file);\n        }\n\n        public override long Length => m_file.Length;\n\n        public override string Name => m_file.Name;\n\n        public override string FullName => m_file.FullName;\n\n        public override bool ExtractRequired => false;\n\n        public override bool IsDirectory => false;\n\n        public override void ExtractToFile(string file, bool overwrite = false)\n        {\n            m_file.CopyTo(file, overwrite);\n        }\n\n        public override void Read(byte[] buffer, int offset, int length)\n        {\n            using (var fs = m_file.OpenRead())\n                fs.Read(buffer, offset, length);\n        }\n\n        public override string GetNameWithoutExtension() => Name;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/Directory/DirectoryArchiveReader.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher\n{\n    public class DirectoryArchiveReader : IArchiveReader\n    {\n        private readonly string m_directory;\n        private readonly List<DirectoryArchiveEntry> m_entries = new List<DirectoryArchiveEntry>();\n\n        public IEnumerable<IArchiveEntry> Entries => m_entries;\n        public bool EntriesHaveExtensions => true;\n\n        public DirectoryArchiveReader(string directory)\n        {\n            m_directory = directory;\n            RecursivelyIterateDirectory(m_directory);\n        }\n\n        void RecursivelyIterateDirectory(string directory)\n        {\n            try\n            {\n                foreach (string dir in Directory.GetDirectories(directory))\n                {\n                    foreach (string file in Directory.GetFiles(dir))\n                        m_entries.Add(new DirectoryArchiveEntry(file));\n                    RecursivelyIterateDirectory(dir);\n                }\n            }\n            catch\n            {\n            }\n        }\n\n        public void Dispose()\n        {\n            \n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/EmptyArchiveReader.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher\n{\n    public class EmptyArchiveReader : IArchiveReader\n    {\n        public IEnumerable<IArchiveEntry> Entries => Array.Empty<IArchiveEntry>();\n\n        public bool EntriesHaveExtensions => false;\n\n        public void Dispose()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/FileArchiveReader.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher\n{\n    class FileArchiveReader : AbstractArchiveEntry, IArchiveReader\n    {\n        private readonly string m_file;\n        private readonly List<IArchiveEntry> m_entries = new List<IArchiveEntry>();\n\n        public bool EntriesHaveExtensions => true;\n\n        public FileArchiveReader(string file)\n        {\n            m_file = file;\n            m_entries.Add(this);\n        }\n\n        public override long Length => new FileInfo(m_file).Length;\n\n        public override void Read(byte[] buffer, int offset, int length)\n        {\n            using (var stream = File.OpenRead(m_file))\n                stream.Read(buffer, offset, length);\n        }\n\n        public IEnumerable<IArchiveEntry> Entries => m_entries;\n\n        public override string Name => Path.GetFileName(m_file);\n\n        public override string FullName => Path.GetFullPath(m_file);\n\n        public override bool ExtractRequired => false;\n\n        public override bool IsDirectory => false;\n\n        public override void ExtractToFile(string file, bool overwrite = false)\n        {\n            File.Copy(m_file, file, overwrite);\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            \n        }\n\n        public override bool Equals(object obj)\n        {\n            IArchiveEntry entry = obj as IArchiveEntry;\n            if (entry == null)\n                return false;\n\n            return entry.FullName == FullName;\n        }\n\n        public override int GetHashCode()\n        {\n            return FullName.GetHashCode();\n        }\n\n        public override string GetNameWithoutExtension() => Path.GetFileNameWithoutExtension(Name);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/IArchiveEntry.cs",
    "content": "﻿using SharpCompress.Common;\nusing System;\nusing System.IO;\n\nnamespace DoomLauncher\n{\n    public interface IArchiveEntry\n    {\n        long Length { get; }\n        void Read(byte[] buffer, int offset, int length);\n        string Name { get; }\n        string FullName { get; }\n        void ExtractToFile(string file, bool overwrite = false);\n\n        void ExtractToFileForceOverwrite(string file);\n\n        bool ExtractRequired { get; }\n        bool IsDirectory { get; }\n        string GetNameWithoutExtension();\n    }\n\n    public abstract class AbstractArchiveEntry : IArchiveEntry\n    {\n        public abstract long Length { get; }\n        public abstract string Name { get; }\n        public abstract string FullName { get; }\n        public abstract bool ExtractRequired { get; }\n        public abstract bool IsDirectory { get; }\n\n        public abstract void ExtractToFile(string file, bool overwrite = false);\n\n        public void ExtractToFileForceOverwrite(string file)\n        {\n            try\n            {\n                ExtractToFile(file, true);\n            }\n            catch (Exception ex)\n            {\n                try\n                {\n                    if (File.Exists(file))\n                    {\n                        // Sometimes the read only flag can be set and the file can't be overwritten. This is our temp directory anyway so turn it off.\n                        File.SetAttributes(file, File.GetAttributes(file) & ~FileAttributes.ReadOnly);\n                        ExtractToFile(file, true);\n                    }\n                }\n                catch\n                {\n                    throw ex;\n                }\n            }\n        }\n\n        public abstract string GetNameWithoutExtension();\n        public abstract void Read(byte[] buffer, int offset, int length);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/IArchiveReader.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher\n{\n    public interface IArchiveReader : IDisposable\n    {\n        IEnumerable<IArchiveEntry> Entries { get; }\n        bool EntriesHaveExtensions { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/Rar/RarArchiveEntry.cs",
    "content": "﻿using SharpCompress.Archives;\nusing System.IO;\n\nnamespace DoomLauncher.Archive.Rar\n{\n    public class RarArchiveEntry : AbstractArchiveEntry\n    {\n        private readonly SharpCompress.Archives.Rar.RarArchiveEntry m_entry;\n\n        public RarArchiveEntry(SharpCompress.Archives.Rar.RarArchiveEntry entry)\n        {\n            m_entry = entry;\n        }\n\n        public override long Length => m_entry.Size;\n\n        public override string Name => Path.GetFileName(m_entry.Key);\n\n        public override string FullName => m_entry.Key;\n\n        public override bool ExtractRequired => true;\n\n        public override bool IsDirectory => m_entry.IsDirectory;\n\n        public override void ExtractToFile(string file, bool overwrite = false)\n        {\n            if (!IsValid(m_entry))\n                return;\n\n            if (!overwrite && File.Exists(file))\n                return;\n\n            m_entry.WriteToFile(file);\n        }\n\n        public override void Read(byte[] buffer, int offset, int length)\n        {\n            using (MemoryStream ms = new MemoryStream(buffer, offset, length))\n                m_entry.WriteTo(ms);\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (!(obj is IArchiveEntry entry))\n                return false;\n\n            return entry.FullName == FullName;\n        }\n\n        public override int GetHashCode()\n        {\n            return FullName.GetHashCode();\n        }\n\n        public override string GetNameWithoutExtension() => Path.GetFileNameWithoutExtension(Name);\n\n        public static bool IsValid(SharpCompress.Archives.Rar.RarArchiveEntry entry)\n        {\n            // Addresses vulnerability https://github.com/nstlaurent/DoomLauncher/issues/369\n            return !entry.Key.Contains(\"../\") && !entry.Key.Contains(\"..\\\\\");\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/Rar/RarArchiveReader.cs",
    "content": "﻿using SharpCompress.Archives.Rar;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher.Archive.Rar\n{\n    public class RarArchiveReader : IArchiveReader\n    {\n        private readonly RarArchive m_archive;\n        private readonly RarArchiveEntry[] m_entries;\n\n        public RarArchiveReader(string file)\n        {\n            m_archive = RarArchive.Open(file);\n            m_entries = m_archive.Entries.Where(x => RarArchiveEntry.IsValid(x)).Select(x => new RarArchiveEntry(x)).ToArray();\n        }\n\n        public IEnumerable<IArchiveEntry> Entries => m_entries;\n\n        public bool EntriesHaveExtensions => true;\n\n        public void Dispose()\n        {\n            m_archive.Dispose();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/RecursiveArchiveReader.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Archive\n{\n    public class RecursiveArchiveReader : IArchiveReader\n    {\n        public IArchiveReader Root { get; }\n        private readonly Func<IArchiveEntry, IArchiveReader> m_getChildReader; // null return value means no children\n\n        private delegate void DisposeMethod();\n        private event DisposeMethod Disposing;\n\n        public RecursiveArchiveReader(IArchiveReader root, Func<IArchiveEntry, IArchiveReader> getChildReader) \n        {\n            Root = root;\n            m_getChildReader = getChildReader;\n        }\n\n        public IEnumerable<IArchiveEntry> Entries => \n            RecursiveSelect();\n\n        private IEnumerable<IArchiveEntry> RecursiveSelect()\n        {\n            // Recursive enumerable, adapted from https://stackoverflow.com/a/30441479\n            var stack = new Stack<IEnumerator<IArchiveEntry>>();\n            IEnumerator<IArchiveEntry> enumerator = Root.Entries.GetEnumerator();\n\n            try\n            {\n                while (true)\n                {\n                    if (enumerator.MoveNext())\n                    {\n                        IArchiveEntry entry = enumerator.Current;\n\n                        yield return entry;\n\n                        var possibleReader = m_getChildReader(entry);\n                        if (possibleReader != null)\n                        {\n                            var recursiveReader = new RecursiveArchiveReader(possibleReader, m_getChildReader);\n                            Disposing += recursiveReader.Dispose;\n\n                            stack.Push(enumerator);\n                            enumerator = recursiveReader.Entries.GetEnumerator();\n                        }\n                    }\n                    else if (stack.Count > 0)\n                    {\n                        enumerator.Dispose();\n                        enumerator = stack.Pop();\n                    }\n                    else\n                    {\n                        yield break;\n                    }\n                }\n            }\n            finally\n            {\n                enumerator.Dispose();\n\n                while (stack.Count > 0) // Clean up in case of an exception.\n                {\n                    enumerator = stack.Pop();\n                    enumerator.Dispose();\n                }\n            }\n        }\n\n        public bool EntriesHaveExtensions => Root.EntriesHaveExtensions;\n\n        public void Dispose()\n        {\n            Root.Dispose();\n            Disposing?.Invoke();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/SevenZip/SevenZipArchiveEntry.cs",
    "content": "﻿using SevenZip;\nusing System.IO;\n\nnamespace DoomLauncher.Archive.SevenZip\n{\n    public class SevenZipArchiveEntry : AbstractArchiveEntry\n    {\n        private readonly SevenZipExtractor m_extractor;\n        private readonly ArchiveFileInfo m_archiveFileInfo;\n        private readonly MemoryStreamManager m_streamManager;\n        private MemoryStream m_ms;\n\n        public SevenZipArchiveEntry(SevenZipExtractor extractor, ArchiveFileInfo archiveFileInfo, MemoryStreamManager streamManager)\n        {\n            m_extractor = extractor;\n            m_archiveFileInfo = archiveFileInfo;\n            m_streamManager = streamManager;\n        }\n\n        public override long Length => (long)m_archiveFileInfo.Size;\n\n        public override string Name => Path.GetFileName(m_archiveFileInfo.FileName);\n\n        public override string FullName => m_archiveFileInfo.FileName;\n\n        public override bool ExtractRequired => true;\n\n        public override bool IsDirectory => m_archiveFileInfo.IsDirectory;\n\n        public override void ExtractToFile(string file, bool overwrite = false)\n        {\n            if (!overwrite && File.Exists(file))\n                return;\n\n            using (FileStream fs = File.Create(file))\n                m_extractor.ExtractFile(m_archiveFileInfo.Index, fs);\n        }\n\n        public override void Read(byte[] buffer, int offset, int length)\n        {\n            if (m_ms == null)\n            {\n                m_ms = new MemoryStream();\n                m_streamManager.Streams.Add(m_ms);\n                m_extractor.ExtractFile(m_archiveFileInfo.Index, m_ms);\n            }\n\n            m_ms.Position = 0;\n            m_ms.Read(buffer, offset, length);\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (!(obj is IArchiveEntry entry))\n                return false;\n\n            return entry.FullName == FullName;\n        }\n\n        public override int GetHashCode()\n        {\n            return FullName.GetHashCode();\n        }\n\n        public override string GetNameWithoutExtension() => Path.GetFileNameWithoutExtension(Name);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/SevenZip/SevenZipArchiveReader.cs",
    "content": "﻿using SevenZip;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher.Archive.SevenZip\n{\n    public class SevenZipArchiveReader : IArchiveReader\n    {\n        private readonly SevenZipExtractor m_extractor;\n        private readonly MemoryStreamManager m_streamManager = new MemoryStreamManager();\n\n        public SevenZipArchiveReader(string file, string sevenZipInteropLibrary)\n        {\n            SevenZipBase.SetLibraryPath(sevenZipInteropLibrary);\n            m_extractor = new SevenZipExtractor(file);\n        }\n\n        public IEnumerable<IArchiveEntry> Entries\n        {\n            get\n            {\n                foreach (var entry in m_extractor.ArchiveFileData)\n                    yield return new SevenZipArchiveEntry(m_extractor, entry, m_streamManager);\n            }\n        }\n\n        public bool EntriesHaveExtensions => true;\n\n        public void Dispose()\n        {\n            m_extractor.Dispose();\n            foreach (var stream in m_streamManager.Streams)\n                stream.Dispose();\n        }\n    }\n\n    public class MemoryStreamManager\n    {\n        public List<MemoryStream> Streams = new List<MemoryStream>();\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/Wad/WadArchiveReader.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing WadReader;\n\nnamespace DoomLauncher\n{\n    internal class WadArchiveReader : IArchiveReader\n    {\n        private readonly FileStream m_fs;\n        private readonly List<WadEntry> m_entries = new List<WadEntry>();\n\n        public IEnumerable<IArchiveEntry> Entries => m_entries;\n        public bool EntriesHaveExtensions => false;\n        public readonly bool IsValid;\n        public readonly string Filename;\n\n        public WadArchiveReader(string file)\n        {\n            Filename = file;\n            m_fs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);\n            WadFileReader wadReader = new WadFileReader(m_fs);\n            IsValid = wadReader.IsValid;\n            var lumps = wadReader.ReadLumps();\n            foreach (var lump in lumps)\n                m_entries.Add(new WadEntry(m_fs, lump));\n        }\n\n        public void Dispose()\n        {\n            m_fs.Dispose();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/Wad/WadEntry.cs",
    "content": "﻿using System.IO;\nusing WadReader;\n\nnamespace DoomLauncher\n{\n    public class WadEntry : AbstractArchiveEntry\n    {\n        private readonly FileStream m_fs;\n        private readonly FileLump m_lump;\n\n        public override long Length => m_lump.Length;\n\n        public override string Name { get; }\n\n        public override string FullName => Name;\n\n        public override bool ExtractRequired => false;\n\n        public override bool IsDirectory => false;\n\n        public WadEntry(FileStream fs, FileLump lump)\n        {\n            m_fs = fs;\n            m_lump = lump;\n            Name = lump.Name;\n        }\n\n        public override void ExtractToFile(string file, bool overwrite = false)\n        {\n            File.WriteAllBytes(file, m_lump.ReadData(m_fs));\n        }\n\n        public override void Read(byte[] buffer, int offset, int length)\n        {\n            m_lump.ReadData(m_fs, buffer, offset, length);\n        }\n\n        public override string GetNameWithoutExtension() => Name;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/Zip/ZipArchiveReader.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.IO.Compression;\n\nnamespace DoomLauncher\n{\n    public class ZipArchiveReader : IArchiveReader\n    {\n        private readonly ZipArchive m_archive;\n\n        public bool EntriesHaveExtensions => true;\n\n        public ZipArchiveReader(string file)\n        {\n            var stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);\n            try\n            {                \n                m_archive = new ZipArchive(stream);\n            }\n            catch (Exception ex)\n            {\n                stream.Dispose();\n                throw ex;\n            }\n        }\n\n        public IEnumerable<IArchiveEntry> Entries\n        {\n            get\n            {\n                foreach (var entry in m_archive.Entries)\n                    yield return new ZipArchiveReaderEntry(entry);\n            }\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            m_archive.Dispose();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Archive/Zip/ZipArchiveReaderEntry.cs",
    "content": "﻿using System.IO;\nusing System.IO.Compression;\n\nnamespace DoomLauncher\n{\n    class ZipArchiveReaderEntry : AbstractArchiveEntry\n    {\n        private readonly ZipArchiveEntry m_entry;\n\n        public ZipArchiveReaderEntry(ZipArchiveEntry zipArchiveEntry)\n        {\n            m_entry = zipArchiveEntry;\n        }\n\n        public override long Length => m_entry.Length;\n\n        public override void Read(byte[] buffer, int offset, int length)\n        {\n            m_entry.Open().Read(buffer, offset, length);\n        }\n\n        public override string Name => m_entry.Name;\n        public override string FullName => m_entry.FullName;\n\n        public override bool ExtractRequired => true;\n\n        public override bool IsDirectory => m_entry.FullName.EndsWith(\"/\");\n\n        public override void ExtractToFile(string file, bool overwrite = false)\n        {\n            m_entry.ExtractToFile(file, overwrite);\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (!(obj is IArchiveEntry entry))\n                return false;\n\n            return entry.FullName == FullName;\n        }\n\n        public override int GetHashCode()\n        {\n            return FullName.GetHashCode();\n        }\n\n        public override string GetNameWithoutExtension() => Path.GetFileNameWithoutExtension(Name);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/AppConfiguration.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class AppConfiguration : IDirectoriesConfiguration\n    {\n        public static readonly CultureInfo Culture = new CultureInfo(\"en-US\");\n\n        public event EventHandler GameFileViewTypeChanged;\n        public event EventHandler VisibleViewsChanged;\n        public event EventHandler ColorThemeChanged;\n\n        public static string SplitTopBottomName => \"SplitTopBottom\";\n        public static string SplitLeftRightName => \"SplitLeftRight\";\n        public static string SplitTagSelectName => \"SplitTagSelect\";\n        public static string AppWidthName => \"AppWidth\";\n        public static string AppHeightName => \"AppHeight\";\n        public static string AppXName => \"AppX\";\n        public static string AppYName => \"AppY\";\n        public static string WindowStateName => \"WindowState\";\n        public static string ColumnConfigName => \"ColumnConfig\";\n        public static string ScreenshotPreviewSizeName => \"ScreenshotPreviewSize\";\n        public static string ItemsPerPageName => \"ItemsPerPage\";\n        public static string LastSelectedTabIndexName => \"LastSelectedTabIndex\";\n        public static string TagSelectPinnedName => \"TagSelectPinned\";\n        public static string ShowTabHeadersName => \"ShowTabHeaders\";\n        public static string CopySaveFilesName => \"CopySaveFiles\";\n        public static string AllowMultiplePlaySessionsName => \"AllowMultiplePlaySessions\";\n        public static string AutomaticallyPullTitlpicName => \"AutomaticallyPullTitlpic\";\n        public static string VisibleViewsName => \"VisibleViews\";\n        public static string ShowPlayDialogName => \"ShowPlayDialog\";\n        public static string ImportScreenshotsName => \"ImportScreenshots\";\n        public static string ShowTooltipName => \"ShowToolTip\";\n        public static string TileImageSizeName => \"TileImageSize\";\n\n        public AppConfiguration(IDataSourceAdapter adapter)\n        {\n            DataSourceAdapter = adapter;\n            Refresh(false);\n        }\n\n        public void Refresh()\n        {\n            Refresh(true);\n        }\n\n        public string GetConfigValue(ConfigType ct)\n        {\n            IConfigurationData config = DataSourceAdapter.GetConfiguration().FirstOrDefault(x => x.Name == ct.ToString(\"g\"));\n\n            if (config != null)\n                return config.Value;\n\n            return null;\n        }\n\n        public object GetTypedConfigValue(ConfigType ct, Type type)\n        {\n            return GetValueFromConfig(GetConfigValue(ct), type);\n        }\n\n        public LauncherPath PathForFileType(FileType type)\n        {\n            switch(type)\n            {\n                case FileType.Demo:\n                    return DemoDirectory;\n                case FileType.SaveGame:\n                    return SaveGameDirectory;\n                case FileType.Screenshot:\n                    return ScreenshotDirectory;\n                case FileType.Thumbnail:\n                    return ThumbnailDirectory;\n                default:\n                    throw new ArgumentException($\"Invalid FileType {type}\");\n            }\n        }\n\n        private static object GetValueFromConfig(string value, Type type)\n        {\n            if (type == typeof(string))\n            {\n                return value;\n            }\n            else if (type == typeof(int))\n            {\n                if (!int.TryParse(value, out int iValue))\n                    return -1;\n                return iValue;\n            }\n            else if (type == typeof(bool))\n            {\n                if (!bool.TryParse(value, out bool bValue))\n                    return false;\n                return bValue;\n            }\n            else\n            {\n                throw new NotSupportedException(string.Format(\"Type {0} not supported \", type.ToString()));\n            }\n        }\n\n        private void Refresh(bool throwErrors)\n        {\n            try\n            {\n                IEnumerable<IConfigurationData> config = DataSourceAdapter.GetConfiguration();\n\n                int oldTileImageSize = TileImageSize;\n\n                IdGamesUrl = GetValue(config, \"IdGamesUrl\", string.Empty);\n                ApiPage = GetValue(config, \"ApiPage\", string.Empty);\n                MirrorUrl = GetValue(config, \"MirrorUrl\", string.Empty);\n                CleanTemp = Convert.ToBoolean(GetValue(config, \"CleanTemp\", \"true\"));\n\n                SetChildDirectories(config);\n                SplitTopBottom = TryGetDouble(config, SplitTopBottomName, 475);\n                SplitLeftRight = TryGetDouble(config, SplitLeftRightName, 680);\n                SplitTagSelect = TryGetDouble(config, SplitTagSelectName, 300);\n                AppWidth = Convert.ToInt32(GetValue(config, AppWidthName, \"1024\"));\n                AppHeight = Convert.ToInt32(GetValue(config, AppHeightName, \"768\"));\n                AppX = Convert.ToInt32(GetValue(config, AppXName, \"0\"));\n                AppY = Convert.ToInt32(GetValue(config, AppYName, \"0\"));\n                WindowState = (FormWindowState)Enum.Parse(typeof(FormWindowState), GetValue(config, WindowStateName, FormWindowState.Normal.ToString(\"g\")));\n                ColumnConfig = GetValue(config, ColumnConfigName, string.Empty);\n                ScreenshotPreviewSize = Convert.ToInt32(GetValue(config, ScreenshotPreviewSizeName, \"0\"));\n                FileManagement = (FileManagement)Enum.Parse(typeof(FileManagement), GetValue(config, \"FileManagement\", FileManagement.Managed.ToString(\"g\")));\n                ItemsPerPage = Convert.ToInt32(GetValue(config, ItemsPerPageName, \"30\"));\n                DeleteScreenshotsAfterImport = Convert.ToBoolean(GetValue(config, \"DeleteScreenshotsAfterImport\", \"false\"));\n                LastSelectedTabIndex = Convert.ToInt32(GetValue(config, LastSelectedTabIndexName, \"0\"));\n                TagSelectPinned = Convert.ToBoolean(GetValue(config, TagSelectPinnedName, \"false\"));\n                ShowTabHeaders = Convert.ToBoolean(GetValue(config, ShowTabHeadersName, \"true\"));\n                CopySaveFiles = Convert.ToBoolean(GetValue(config, CopySaveFilesName, \"true\"));\n                AllowMultiplePlaySessions = Convert.ToBoolean(GetValue(config, AllowMultiplePlaySessionsName, \"false\"));\n                AutomaticallyPullTitlpic = Convert.ToBoolean(GetValue(config, AutomaticallyPullTitlpicName, \"true\"));\n                ShowPlayDialog = Convert.ToBoolean(GetValue(config, ShowPlayDialogName, \"true\"));\n                ImportScreenshots = Convert.ToBoolean(GetValue(config, ImportScreenshotsName, \"false\"));\n                ShowTooltip = Convert.ToBoolean(GetValue(config, ShowTooltipName, \"true\"));\n                TileImageSize = Convert.ToInt32(GetValue(config, TileImageSizeName, \"300\"));\n\n                List<EventHandler> events = new List<EventHandler>();\n                if (Enum.TryParse(GetValue(config, \"ColorThemeType\", \"Default\"), out ColorThemeType colorThemeType))\n                {\n                    if (colorThemeType != ConfigurationColorTheme)\n                        AddEvent(events, ColorThemeChanged);\n                    ConfigurationColorTheme = colorThemeType;\n                    if (ConfigurationColorTheme != ColorThemeType.System)\n                        ColorTheme = ConfigurationColorTheme;\n                }\n\n                var newType = (GameFileViewType)Enum.Parse(typeof(GameFileViewType), GetValue(config, \"GameFileViewType\", GameFileViewType.TileViewCondensed.ToString(\"g\")));\n                if (newType != GameFileViewType || oldTileImageSize != TileImageSize)\n                {\n                    GameFileViewType = newType;\n                    AddEvent(events, GameFileViewTypeChanged);\n                }\n\n                var newVisibleViews = Util.SplitString(GetValue(config, VisibleViewsName, \"Recent;Untagged;IWads;Id Games\"));\n                if (VisibleViews == null || (newVisibleViews.Length != VisibleViews.Count))\n                {\n                    VisibleViews = newVisibleViews.ToHashSet(StringComparer.OrdinalIgnoreCase);\n                    AddEvent(events, VisibleViewsChanged);\n                }\n\n                DateParseFormats = Util.SplitString(GetValue(config, \"DateParseFormats\", \"dd/M/yy;dd/MM/yyyy;dd MMMM yyyy;\"));\n                ScreenshotCaptureDirectories = Util.SplitString(GetValue(config, \"ScreenshotCaptureDirectories\", string.Empty));\n\n                foreach (var invokeEvent in events)\n                    invokeEvent?.Invoke(this, EventArgs.Empty);\n            }\n            catch\n            {\n                if (throwErrors)\n                    throw;\n            }\n\n            VerifyPaths(throwErrors);\n        }\n\n        private static double TryGetDouble(IEnumerable<IConfigurationData> config, string name, double defaultValue)\n        {\n            string value = GetValue(config, name, defaultValue.ToString(Culture));\n            if (double.TryParse(value, NumberStyles.AllowDecimalPoint, Culture, out var doubleValue))\n                return doubleValue;\n\n            return defaultValue;\n        }\n\n        private static void AddEvent(List<EventHandler> events, EventHandler eventAdd)\n        {\n            if (eventAdd != null)\n                events.Add(eventAdd);\n        }\n\n        private static string GetValue(IEnumerable<IConfigurationData> config, string name, string defaultValue)\n        {\n            var item = config.FirstOrDefault(x => x.Name == name);\n            if (item == null)\n                return defaultValue;\n            return item.Value;\n        }\n\n        private void SetChildDirectories(IEnumerable<IConfigurationData> config)\n        {\n            string gameFileDir = GetValue(config, \"GameFileDirectory\", \"GameFiles\");\n            GameFileDirectory = GetGameFileDir(gameFileDir);\n            gameFileDir = GameFileDirectory.GetFullPath();\n\n            ScreenshotDirectory = SetChildDirectory(gameFileDir, \"Screenshots\");\n            TempDirectory = SetChildDirectory(gameFileDir, \"Temp\");\n            DemoDirectory = SetChildDirectory(gameFileDir, \"Demos\");\n            SaveGameDirectory = SetChildDirectory(gameFileDir, \"SaveGames\");\n            ThumbnailDirectory = SetChildDirectory(gameFileDir, \"Thumbnails\");\n        }\n\n        private static LauncherPath GetGameFileDir(string gameFileDir)\n        {\n            if (gameFileDir == \"GameFiles\\\\\")\n            {\n                string dataDir = LauncherPath.GetDataDirectory();\n                if (!Directory.Exists(dataDir))\n                {\n                    Directory.CreateDirectory(dataDir);\n                    Directory.CreateDirectory(Path.Combine(dataDir, gameFileDir));\n                }\n\n                return new LauncherPath(Path.Combine(dataDir, gameFileDir));\n            }\n\n            return new LauncherPath(gameFileDir);\n        }\n\n        private LauncherPath SetChildDirectory(string gameFileDirectory, string childDirectory)\n        {\n            if (!childDirectory.EndsWith(Path.DirectorySeparatorChar.ToString())) //might be some older code that is still not using Path.Combine...\n                childDirectory = childDirectory + Path.DirectorySeparatorChar;\n\n            return new LauncherPath(Path.Combine(gameFileDirectory, childDirectory));\n        }\n\n        public void RefreshColumnConfig()\n        {\n            IEnumerable<IConfigurationData> config = DataSourceAdapter.GetConfiguration();\n            ColumnConfig = GetValue(config, ColumnConfigName, string.Empty);\n        }\n\n        public void EnableCopySaveFiles()\n        {\n            CopySaveFiles = true;\n            IConfigurationData config = DataSourceAdapter.GetConfiguration().FirstOrDefault(x => x.Name == CopySaveFilesName);\n            if (config != null)\n            {\n                config.Value = \"true\";\n                DataSourceAdapter.UpdateConfiguration(config);\n            }\n        }\n\n        private void VerifyPaths(bool throwErrors)\n        {\n            VerifyPath(GameFileDirectory, throwErrors);\n            VerifyPath(ScreenshotDirectory, throwErrors);\n            VerifyPath(TempDirectory, throwErrors);\n            VerifyPath(DemoDirectory, throwErrors);\n            VerifyPath(SaveGameDirectory, throwErrors);\n            VerifyPath(ThumbnailDirectory, throwErrors);\n        }\n\n        private void VerifyPath(LauncherPath path, bool throwErrors)\n        {\n            bool exists = Directory.Exists(path.GetFullPath());\n\n            if (throwErrors && !exists)\n                throw new DirectoryNotFoundException(path.GetPossiblyRelativePath());\n\n            if (!exists)\n                Directory.CreateDirectory(path.GetFullPath());\n        }\n\n        public IDataSourceAdapter DataSourceAdapter { get; set; }\n        public LauncherPath GameFileDirectory { get; private set; }\n        public LauncherPath ScreenshotDirectory { get; private set; }\n        public LauncherPath SaveGameDirectory { get; private set; }\n        public LauncherPath TempDirectory { get; private set; }\n        public LauncherPath DemoDirectory { get; private set; }\n        public LauncherPath ThumbnailDirectory { get; private set; }\n        public string IdGamesUrl { get; private set; }\n        public string ApiPage { get; private set; }\n        public string MirrorUrl { get; private set; }\n        public bool CleanTemp { get; private set; }\n        public double SplitTopBottom { get; private set; }\n        public double SplitLeftRight { get; private set; }\n        public double SplitTagSelect { get; set; }\n        public int AppWidth { get; private set; }\n        public int AppHeight { get; private set; }\n        public int AppX { get; private set; }\n        public int AppY { get; private set; }\n        public FormWindowState WindowState { get; private set; }\n        public string[] ScreenshotCaptureDirectories { get; private set; }\n        public string[] DateParseFormats { get; private set; }\n        public string ColumnConfig { get; private set; }\n        public int ScreenshotPreviewSize { get; private set; }\n        public FileManagement FileManagement { get; private set; }\n        public GameFileViewType GameFileViewType { get; private set; }\n        public int ItemsPerPage { get; set; }\n        public bool DeleteScreenshotsAfterImport { get; set; }\n        public int LastSelectedTabIndex { get; set; }\n        public bool TagSelectPinned { get; set; }\n        public bool ShowTabHeaders { get; set; } = true;\n        public bool CopySaveFiles { get; set; }\n        public bool AllowMultiplePlaySessions { get; set; }\n        public bool AutomaticallyPullTitlpic { get; set; }\n        public bool ShowPlayDialog { get; set; }\n        public bool ImportScreenshots { get; set; }\n        public bool ShowTooltip { get; set; }\n        public int TileImageSize { get; set; }\n        public HashSet<string> VisibleViews { get; set; } = new HashSet<string>();\n        // The theme for the application to use. Default or Dark.\n        public ColorThemeType ColorTheme { get; set; }\n        // The configuration setting. System will use the OS setting if found.\n        public ColorThemeType ConfigurationColorTheme { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/AppVersion.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum AppVersion\n    {\n        Unknown,\n        Version_1_0_0,\n        Version_1_1_0,\n        Version_1_2_0,\n        Version_2_1_0,\n        Version_2_2_0,\n        Version_2_2_1,\n        Version_2_3_0,\n        Version_2_4_0,\n        Version_2_4_1,\n        Version_2_6_0,\n        Version_2_6_3,\n        Version_2_6_3_1,\n        Version_2_6_3_2,\n        Version_2_6_4_1,\n        Version_2_6_4_1_Update1,\n        Version_2_7_0_0,\n        Version_2_8_0_0,\n        Version_2_8_0_0_1,\n        Version_3_1_0,\n        Version_3_2_0,\n        Version_3_2_0_Update1,\n        Version_3_2_0_Update2,\n        Version_3_2_0_Update3,\n        Version_3_3_0,\n        Version_3_3_1,\n        Version_3_3_2,\n        Version_3_4_0,\n        Version_3_4_0_Update1,\n        Version_3_5_2,\n        Version_3_5_2_Update1,\n        Version_3_5_2_Update2,\n        Version_3_5_3_Update1,\n        Version_3_5_3_Update2,\n        Version_3_5_3_Update3,\n        Version_3_7_0,\n        Version_3_7_0_Update1,\n        Version_3_7_4,\n        Version_3_7_7,\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/ColorTheme.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public static class ColorTheme\n    {\n        public static IThemeColors Current { get; set; } = new DefaultTheme();\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/ColorThemeType.cs",
    "content": "﻿namespace DoomLauncher.Config\n{\n    public enum ColorThemeType\n    {\n        Default,\n        Dark,\n        System\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/ColumnConfig.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n\n    public class ColumnConfig\n    {\n        public ColumnConfig() { }\n        public ColumnConfig(string parent, string column, int width, SortOrder sort)\n        {\n            Parent = parent;\n            Column = column;\n            Width = width;\n            Sort = sort;\n        }\n\n        public string Parent { get; set; }\n        public string Column { get; set; }\n        public int Width { get; set; }\n        public SortOrder Sort { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/ConfigType.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum ConfigType\n    {\n        DefaultSourcePort,\n        DefaultIWad,\n        DefaultSkill,\n        AutoSearch,\n        FileManagement,\n        GameFileViewType,\n        VisibleViews,\n        ColorThemeType\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/DataCache.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing WadReader;\n\nnamespace DoomLauncher\n{\n    public class DataCache\n    {\n        public static readonly DataCache Instance = new DataCache();\n\n        public event EventHandler TagsChanged;\n\n        public IDataSourceAdapter DataSourceAdapter { get; private set; }\n        public AppConfiguration AppConfiguration { get; private set; }\n        public ITagMapLookup TagMapLookup { get; private set; }\n        public ITagData[] Tags { get; private set; }\n        public ITagData[] PreviousTags { get; private set; }\n        public Image DefaultImage { get; private set; }\n        public Palette DefaultPalette { get; private set; }\n        public Palette HexenPalette { get; private set; }\n        public Palette HereticPalette { get; private set; }\n\n        public void Init(IDataSourceAdapter adapter)\n        {\n            DataSourceAdapter = adapter;\n            AppConfiguration = new AppConfiguration(adapter);\n            TagMapLookup = new TagMapLookup(adapter);\n            DefaultImage = ImageExtensions.FromFileOrDefault(Path.Combine(LauncherPath.GetDataDirectory(), \"TileImages\", \"DoomLauncherTile.png\"));\n            DefaultPalette = Palette.From(Properties.Resources.DoomPalette);\n            HexenPalette = Palette.From(Properties.Resources.HexenPalette);\n            HereticPalette = Palette.From(Properties.Resources.HereticPalette);\n            ThumbnailManager.SetIWads(DataSourceAdapter.GetGameFileIWads().ToList());\n\n            switch (AppConfiguration.ColorTheme)\n            {\n                case ColorThemeType.Dark:\n                    ColorTheme.Current = new DarkTheme();\n                    break;\n                default:\n                    ColorTheme.Current = new DefaultTheme();\n                    break;\n            }\n\n            UpdateTags();\n        }\n\n        public void UpdateTags()\n        {\n            if (Tags != null)\n                PreviousTags = Tags.ToArray();\n\n            Tags = SortTags(DataSourceAdapter.GetTags()).ToArray();\n            if (PreviousTags == null)\n                PreviousTags = Tags;\n\n            TagsChanged?.Invoke(this, EventArgs.Empty);\n        }\n\n        // Sorts tags by Favorite, then by Name\n        public IEnumerable<ITagData> SortTags(IEnumerable<ITagData> tags) => tags.OrderByDescending(x => x.Favorite).ThenBy(x => x.Name);\n\n        public void UpdateGameFileTags(IEnumerable<IGameFile> gameFiles, IEnumerable<ITagData> tags)\n        {\n            ITagData[] changedTagsAll = Array.Empty<ITagData>();\n\n            foreach (IGameFile gameFile in gameFiles)\n            {\n                ITagData[] existingTags = Instance.TagMapLookup.GetTags(gameFile);\n\n                var addTags = tags.Except(existingTags);\n                var removeTags = existingTags.Except(tags);\n                var updateFiles = new IGameFile[] { gameFile };\n\n                foreach (var tag in addTags)\n                    AddGameFileTag(updateFiles, tag, out _);\n\n                foreach (var tag in removeTags)\n                    RemoveGameFileTag(updateFiles, tag);\n\n                changedTagsAll = changedTagsAll.Union(addTags.Union(removeTags)).ToArray();\n            }\n\n            TagMapLookup.Refresh(changedTagsAll);\n        }\n\n        public void AddGameFileTag(IEnumerable<IGameFile> gameFiles, ITagData tag, out List<IGameFile> alreadyTagged)\n        {\n            alreadyTagged = new List<IGameFile>();\n\n            foreach (IGameFile gameFile in gameFiles)\n            {\n                TagMapping tagMapping = new TagMapping\n                {\n                    FileID = gameFile.GameFileID.Value,\n                    TagID = tag.TagID\n                };\n\n                if (!DataSourceAdapter.GetTagMappings(tagMapping.FileID).Contains(tagMapping))\n                    DataSourceAdapter.InsertTagMapping(tagMapping);\n                else\n                    alreadyTagged.Add(gameFile);\n            }\n        }\n\n        public void RemoveGameFileTag(IEnumerable<IGameFile> gameFiles, ITagData tag)\n        {\n            TagMapping tagMapping = new TagMapping();\n            foreach (IGameFile gameFile in gameFiles)\n            {\n                tagMapping.TagID = tag.TagID;\n                tagMapping.FileID = gameFile.GameFileID.Value;\n                DataSourceAdapter.DeleteTagMapping(tagMapping);\n            }\n        }\n\n        public ColumnConfig[] GetColumnConfig()\n        {\n            try\n            {\n                XmlSerializer xml = new XmlSerializer(typeof(ColumnConfig[]));\n                StringReader text = new StringReader(AppConfiguration.ColumnConfig);\n                ColumnConfig[] ret = xml.Deserialize(text) as ColumnConfig[];\n\n                // Previous revisions of Doom Launcher use filename, most recent version uses filenamenopath - fix it here\n                var columnsToFix = ret.Where(x => x.Column.Equals(\"filename\", StringComparison.OrdinalIgnoreCase));\n                foreach (var colFix in columnsToFix)\n                    colFix.Column = \"filenamenopath\";\n\n                var idGamesReleaseDate = ret.FirstOrDefault(x => x.Parent.Equals(TabKeys.IdGamesKey) && x.Column.Equals(\"releasedate\", StringComparison.OrdinalIgnoreCase));\n                if (idGamesReleaseDate == null)\n                    return InsertIdGamesReleaseDate(ret);\n\n                return ret;\n            }\n            catch\n            {\n                return Array.Empty<ColumnConfig>();\n            }\n        }\n\n        private static ColumnConfig[] InsertIdGamesReleaseDate(ColumnConfig[] ret)\n        {\n            var columnList = ret.ToList();\n            var idGamesFirstCol = columnList.FirstOrDefault(x => x.Parent.Equals(TabKeys.IdGamesKey));\n            if (idGamesFirstCol != null)\n            {\n                columnList.Insert(columnList.IndexOf(idGamesFirstCol) + 2, new ColumnConfig()\n                {\n                    Parent = TabKeys.IdGamesKey,\n                    Column = \"releasedate\",\n                    Width = 100\n                });\n            }\n\n            return columnList.ToArray();\n        }\n\n        public static string SerializeColumnConfig(List<ColumnConfig> config)\n        {\n            StringWriter text = new StringWriter();\n            XmlSerializer xml = new XmlSerializer(typeof(ColumnConfig[]));\n            xml.Serialize(text, config.ToArray());\n            return text.ToString();\n        }\n\n        public void UpdateConfig(IEnumerable<IConfigurationData> config, string name, string value)\n        {\n            IConfigurationData configFind = config.FirstOrDefault(x => x.Name == name);\n\n            if (configFind == null)\n            {\n                DataSourceAdapter.InsertConfiguration(new ConfigurationData\n                {\n                    Name = name,\n                    Value = value,\n                    UserCanModify = false\n                });\n            }\n            else\n            {\n                configFind.Value = value;\n                DataSourceAdapter.UpdateConfiguration(configFind);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/FileManagement.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum FileManagement\n    {\n        Managed,\n        Unmanaged,\n        Prompt,\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/GameFileListEventArgs.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher\n{\n    public class GameFileListEventArgs\n    {\n        public IEnumerable<IGameFile> GameFiles { get; set; }\n\n        public GameFileListEventArgs(IEnumerable<IGameFile> gameFiles)\n        {\n            GameFiles = gameFiles;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/IDirectoriesConfiguration.cs",
    "content": "﻿\nnamespace DoomLauncher.Config\n{\n    public interface IDirectoriesConfiguration\n    {\n        LauncherPath GameFileDirectory { get; }\n        LauncherPath ScreenshotDirectory { get; }\n        LauncherPath SaveGameDirectory { get; }\n        LauncherPath TempDirectory { get; }\n        LauncherPath DemoDirectory { get; }\n        LauncherPath ThumbnailDirectory { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/Icons.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\n\nnamespace DoomLauncher\n{\n    public enum IconImage\n    {\n        UpArrow,\n        DownArrow,\n        Bars,\n        Delete,\n        Download,\n        Edit,\n        Export,\n        ExportAll,\n        File,\n        FolderOpen,\n        Play,\n        Save,\n        Search,\n        StepBack,\n        Video,\n        Tags,\n        Pin\n    }\n\n    public static class Icons\n    {\n        private static readonly Dictionary<(IconImage, Color), Bitmap> IconLookup = new Dictionary<(IconImage, Color), Bitmap>();\n\n        public static DpiScale DpiScale { get; set; } = new DpiScale(2, 2);\n        public static Image ArrowUp => GetIcon(IconImage.UpArrow);\n        public static Image ArrowDown => GetIcon(IconImage.DownArrow);\n        public static Image Bars => GetIcon(IconImage.Bars);\n        public static Image Delete => GetIcon(IconImage.Delete);\n        public static Image Download => GetIcon(IconImage.Download);\n        public static Image Edit => GetIcon(IconImage.Edit);\n        public static Image Export => GetIcon(IconImage.Export);\n        public static Image ExportAll => GetIcon(IconImage.ExportAll);\n        public static Image File => GetIcon(IconImage.File);\n        public static Image FolderOpen => GetIcon(IconImage.FolderOpen);\n        public static Image Play => GetIcon(IconImage.Play);\n        public static Image Save => GetIcon(IconImage.Save);\n        public static Image Search => GetIcon(IconImage.Search);\n        public static Image StepBack => GetIcon(IconImage.StepBack);\n        public static Image Video => GetIcon(IconImage.Video);\n        public static Image Tags => GetIcon(IconImage.Tags);\n        public static Image Pin => GetIcon(IconImage.Pin);\n\n        public static Image GetIcon(IconImage iconImage, Color color) => ColorizeIcon(iconImage, color);\n\n        private static Bitmap GetBitmap(IconImage iconImage)\n        {\n            switch (iconImage)\n            {\n                case IconImage.UpArrow:\n                    return Properties.Resources.UpArrow;\n                case IconImage.DownArrow:\n                    return Properties.Resources.DownArrow;\n                case IconImage.Bars:\n                    return Properties.Resources.Bars;\n                case IconImage.Delete:\n                    return Properties.Resources.Delete;\n                case IconImage.Download:\n                    return Properties.Resources.th;\n                case IconImage.Edit:\n                    return Properties.Resources.Edit;\n                case IconImage.Export:\n                    return Properties.Resources.Export;\n                case IconImage.ExportAll:\n                    return Properties.Resources.ExportAll;\n                case IconImage.File:\n                    return Properties.Resources.File;\n                case IconImage.FolderOpen:\n                    return Properties.Resources.FolderOpen;\n                case IconImage.Play:\n                    return Properties.Resources.Play;\n                case IconImage.Save:\n                    return Properties.Resources.Save;\n                case IconImage.Search:\n                    return Properties.Resources.Search;\n                case IconImage.StepBack:\n                    return Properties.Resources.StepBack;\n                case IconImage.Video:\n                    return Properties.Resources.Video;\n                case IconImage.Tags:\n                    return Properties.Resources.Tags;\n                case IconImage.Pin:\n                    return Properties.Resources.Pin;\n                default:\n                    return new Bitmap(0, 0);\n            }\n        }\n\n        private static Image GetIcon(IconImage iconImage) =>\n            ColorizeIcon(iconImage, ColorTheme.Current.Text);\n        \n        private static Bitmap ColorizeIcon(IconImage iconImage, Color color)\n        {\n            if (IconLookup.TryGetValue((iconImage, color), out var bitmap))\n                return bitmap;\n\n            bitmap = GetBitmap(iconImage);\n            Bitmap copy;\n            if (DpiScale.DpiScaleX > 1 || DpiScale.DpiScaleY > 1)\n                copy = ResizeBitmap(bitmap, (int)DpiScale.ScaleFloatX(bitmap.Width * 0.8f), (int)DpiScale.ScaleFloatY(bitmap.Height * 0.8f));\n            else\n                copy = new Bitmap(bitmap, bitmap.Width, bitmap.Height);\n\n            for (int x = 0; x < copy.Width; x++)\n            {\n                for (int y = 0; y < copy.Height; y++)\n                {\n                    var pixel = copy.GetPixel(x, y);\n                    if (pixel.A != 0)\n                        copy.SetPixel(x, y, Color.FromArgb(pixel.A, color));\n                }\n            }\n\n            IconLookup[(iconImage, color)] = copy;\n            return copy;\n        }\n\n        public static Bitmap ResizeBitmap(Bitmap bitmap, int width, int height)\n        {\n            var destRect = new Rectangle(0, 0, width, height);\n            var destImage = new Bitmap(width, height);\n\n            destImage.SetResolution(bitmap.HorizontalResolution, bitmap.VerticalResolution);\n\n            using (var graphics = Graphics.FromImage(destImage))\n            {\n                graphics.CompositingMode = CompositingMode.SourceCopy;\n                graphics.CompositingQuality = CompositingQuality.HighQuality;\n                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;\n                graphics.SmoothingMode = SmoothingMode.HighQuality;\n                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;\n\n                using (var wrapMode = new ImageAttributes())\n                {\n                    wrapMode.SetWrapMode(WrapMode.TileFlipXY);\n                    graphics.DrawImage(bitmap, destRect, 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, wrapMode);\n                }\n            }\n\n            return destImage;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/LauncherPath.cs",
    "content": "﻿using DoomLauncher.Handlers;\nusing System;\nusing System.IO;\nusing System.Text;\n\nnamespace DoomLauncher\n{\n    public class LauncherPath\n    {\n        public static readonly LauncherPath NoPath = new LauncherPath(string.Empty);\n\n        private static readonly char[] PathSplit = new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };\n\n        private readonly string m_path, m_fullPath;\n\n        public LauncherPath(string path)\n        {\n            if (string.IsNullOrEmpty(path))\n            {\n                m_path = string.Empty;\n                m_fullPath = string.Empty;\n                return;\n            }\n\n            m_path = path;\n            m_fullPath = m_path;\n\n            if (PathExtensions.IsPartiallyQualified(m_fullPath))\n                m_fullPath = Path.Combine(Directory.GetCurrentDirectory(), m_fullPath);\n            else\n                m_path = GetRelativePath(m_fullPath);\n        }\n\n        public static string GetRelativePath(string path)\n        {\n            string current = GetDataDirectory();\n            if (!path.Contains(current))\n                return path;\n            \n            string[] filePath = path.Split(PathSplit, StringSplitOptions.RemoveEmptyEntries);\n            string[] currentPath = current.Split(PathSplit, StringSplitOptions.RemoveEmptyEntries);\n\n            StringBuilder sb = new StringBuilder(255);\n            for (int i = currentPath.Length; i < filePath.Length; i++)\n            {\n                sb.Append(filePath[i]);\n                sb.Append(Path.DirectorySeparatorChar);\n            }\n\n            if (sb.Length > 1)\n                sb.Remove(sb.Length - 1, 1);\n\n            return sb.ToString();\n        }\n\n        public static string GetDataDirectory()\n        {\n            if (IsInstalled())\n                return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"DoomLauncher\");\n\n            return Directory.GetCurrentDirectory();\n        }\n\n        public static bool IsInstalled() => !File.Exists(Path.Combine(Directory.GetCurrentDirectory(), DbDataSourceAdapter.DatabaseFileName)) && !File.Exists(Path.Combine(Directory.GetCurrentDirectory(), DbDataSourceAdapter.InitDatabaseFileName));\n\n        public string GetFullPath()\n        {\n            return m_fullPath;\n        }\n\n        public string GetPossiblyRelativePath()\n        {\n            return m_path;\n        } \n\n        public static implicit operator string(LauncherPath p)\n        {\n            Util.ThrowDebugException(\"implicit operator should not be assumed\");\n            return p.GetFullPath();\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (obj is LauncherPath path)\n                return GetFullPath() == path.GetFullPath();\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return GetFullPath().GetHashCode();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/ScreenFilter.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum ScreenFilterType\n    {\n        Ellipse,\n        Scanline\n    }\n\n    public class ScreenFilter\n    {\n        public ScreenFilterType Type { get; set; }\n        public float Opacity { get; set; }\n        public int LineThickness { get; set; }\n        public int BlockSize { get; set; }\n        public float SpacingX { get; set; }\n        public float SpacingY { get; set; }\n        public bool Stagger { get; set; }\n        public int ScanlineSpacing { get; set; }\n        public bool VerticalScanlines { get; set; }\n        public bool HorizontalScanlines { get; set; }\n        public bool Enabled { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Config/TagMapLookup.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public class TagMapLookup : ITagMapLookup\n    {\n        public event EventHandler<ITagData[]> TagMappingChanged;\n\n        private readonly IDataSourceAdapter m_adapter;\n\n        private Dictionary<int, ITagMapping[]> m_fileTagMapping; // GameFileID -> ITagMapping\n        private Dictionary<int, ITagData> m_tags; // TagID -> ITagData\n\n        public TagMapLookup(IDataSourceAdapter adapter)\n        {\n            m_adapter = adapter;\n\n            Refresh(Array.Empty<ITagData>());\n        }\n\n        private Dictionary<int, ITagMapping[]> BuildTagMappingDictionary(IEnumerable<ITagMapping> tagMapping)\n        {\n            Dictionary<int, ITagMapping[]> ret = new Dictionary<int, ITagMapping[]>();\n\n            int[] files = tagMapping.Select(x => x.FileID).Distinct().ToArray();\n            Array.ForEach(files, x => ret.Add(x, tagMapping.Where(y => y.FileID == x).ToArray()));\n\n            return ret;\n        }\n\n        public void Refresh(ITagData[] tags)\n        {\n            IEnumerable<ITagMapping> tagMapping = m_adapter.GetTagMappings().OrderBy(x => x.FileID);\n            m_fileTagMapping = BuildTagMappingDictionary(tagMapping);\n\n            m_tags = m_adapter.GetTags().ToDictionary(x => x.TagID, x => x);\n\n            TagMappingChanged?.Invoke(this, tags);\n        }\n\n        public void RemoveGameFile(IGameFile gameFile)\n        {\n            if (gameFile.GameFileID.HasValue)\n                m_fileTagMapping.Remove(gameFile.GameFileID.Value);\n        }\n\n        public ITagData[] GetTags(IGameFile gameFile)\n        {\n            if (gameFile != null && gameFile.GameFileID.HasValue && m_fileTagMapping.TryGetValue(gameFile.GameFileID.Value, out var tagMapping))\n            {\n                return tagMapping.Where(k => m_tags.ContainsKey(k.TagID))\n                     .Select(k => m_tags[k.TagID]).OrderBy(x => x.Name).ToArray();\n            }\n\n            return Array.Empty<ITagData>();\n        }\n\n        public IEnumerable<ITagData> GetEnumerableTags(IGameFile gameFile)\n        {\n            if (gameFile != null && gameFile.GameFileID.HasValue && m_fileTagMapping.TryGetValue(gameFile.GameFileID.Value, out var tagMapping))\n            {\n                return tagMapping.Where(k => m_tags.ContainsKey(k.TagID))\n                     .Select(k => m_tags[k.TagID]).OrderBy(x => x.Name);\n            }\n\n            return Array.Empty<ITagData>();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/BasicFileView.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.Stylize;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.Specialized;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public abstract class BasicFileView : UserControl, IFileAssociationView\n    {\n        protected ContextMenuStrip m_menu;\n        private IFileData[] m_files = Array.Empty<IFileData>();\n\n        public abstract void SetData(IGameFile gameFile);\n\n        protected void SetData(DataGridView dgvMain, IGameFile gameFile)\n        {\n            if (GameFile != null && GameFile.GameFileID.HasValue)\n            {\n                IEnumerable<IFileData> files = DataSourceAdapter.GetFiles(gameFile, FileType);\n                List<ISourcePortData> sourcePorts = Util.GetSourcePortsData(DataSourceAdapter);\n\n                var items = from file in files\n                            join sp in sourcePorts on file.SourcePortID equals sp.SourcePortID\n                            select new { file.OriginalFileName, file.Description, file.DateCreated, SourcePortName = sp.Name, FileData = file };\n\n                dgvMain.DataSource = items.ToList();\n                dgvMain.ContextMenuStrip = m_menu;\n\n                m_files = files.ToArray();\n            }\n            else\n            {\n                dgvMain.DataSource = null;\n                m_files = new IFileData[] { };\n            }\n        }\n\n        public abstract void ClearData();\n\n        public virtual bool Delete()\n        {\n            List<IFileData> selectedFiles = GetSelectedFiles();\n\n            if (selectedFiles.Count > 0 &&\n                StyledMessageBox.Show(this, \"Delete selected file(s)?\", \"Confirm\", MessageBoxButtons.OKCancel,\n                MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.OK)\n            {\n                foreach (IFileData file in selectedFiles)\n                {\n                    if (file.IsUrl)\n                    {\n                        //can't delete a remote file...\n                    }\n                    else\n                    {\n                        FileInfo fi = new FileInfo(Path.Combine(DataDirectory.GetFullPath(), file.FileName));\n                        DataSourceAdapter.DeleteFile(file);\n                        try\n                        {\n                            fi.Delete();\n                        }\n                        catch { }\n                    }\n                }\n\n                return true;\n            }\n\n            return false;\n        }\n\n        public IGameFile GameFile { get; set; }\n\n        public virtual bool New()\n        {\n            GameFile = DataSourceAdapter.GetGameFile(GameFile.FileName); //todo: refactor may have broke this, or no longer needed\n            return CreateFileAssociation(this, DataSourceAdapter, DataDirectory, FileType, GameFile, null, true).Count > 0;\n        }\n\n        public virtual bool ShowCreateNew(IWin32Window parent, IDataSourceAdapter adapter, ISourcePortData sourcePort, string filename, bool isMultiImport,\n            out NewFileData newFileData)\n        {\n            newFileData = null;\n            FileDetailsEditForm detailsForm = new FileDetailsEditForm();\n            detailsForm.Initialize(adapter);\n            detailsForm.StartPosition = FormStartPosition.CenterParent;\n            detailsForm.ShowDescription(!isMultiImport);\n            if (sourcePort != null)\n                detailsForm.SourcePort = sourcePort;\n            if (!isMultiImport)\n                detailsForm.Description = Path.GetFileName(filename);\n\n            if (detailsForm.ShowDialog(parent) == DialogResult.OK && detailsForm.SourcePort != null)\n            {\n                newFileData = new NewFileData()\n                {\n                    SourcePortID = detailsForm.SourcePort.SourcePortID,\n                    Description = detailsForm.Description,\n                };\n                return true;\n            }\n            else if (detailsForm.SourcePort == null)\n                StyledMessageBox.Show(parent, \"A source port must be selected.\", \"Error\", MessageBoxButtons.OK);\n\n            return false;\n        }\n\n        public List<IFileData> CreateFileAssociation(IWin32Window parent, IDataSourceAdapter adapter, LauncherPath directory, FileType type, IGameFile gameFile, \n            ISourcePortData sourcePort, bool multiSelect = false)\n        {\n            List<IFileData> fileDataList = new List<IFileData>();\n            OpenFileDialog dialog = new OpenFileDialog();\n            dialog.Multiselect = multiSelect;\n\n            if (dialog.ShowDialog(parent) != DialogResult.OK)\n                return fileDataList;\n\n            bool isMultiImport = dialog.FileNames.Length > 1;            \n\n            if (ShowCreateNew(parent, adapter, sourcePort, dialog.FileNames[0], isMultiImport, out var newFileData))\n            {\n                foreach (string file in dialog.FileNames)\n                {\n                    FileInfo fi = new FileInfo(file);\n                    IFileData fileData = CreateNewFileDataSource(newFileData, fi, type, gameFile);\n                    if (isMultiImport)\n                        fileData.Description = Path.GetFileName(file);\n\n                    fi.CopyTo(Path.Combine(directory.GetFullPath(), fileData.FileName));\n\n                    adapter.InsertFile(fileData);\n                    var fileSearch = adapter.GetFiles(gameFile, type).FirstOrDefault(x => x.FileName == fileData.FileName);\n                    if (fileSearch != null)\n                        fileData = fileSearch;\n                    fileDataList.Add(fileData);\n                }\n            }\n\n            return fileDataList;\n        }\n\n        private static FileData CreateNewFileDataSource(NewFileData newFileData, FileInfo fi, FileType type, IGameFile gameFile)\n        {\n            FileData fileData = new FileData\n            {\n                FileName = string.Concat(Guid.NewGuid(), fi.Extension),\n                FileTypeID = type,\n                GameFileID = gameFile.GameFileID.Value,\n                Description = newFileData.Description,\n                SourcePortID = newFileData.SourcePortID,\n                UserTitle = newFileData.UserTitle,\n                UserDescription = newFileData.UserDescription,\n                Map = newFileData.Map,\n            };\n            return fileData;\n        }\n\n        public virtual bool Edit()\n        {\n            List<IFileData> selectedFiles = GetSelectedFiles();\n\n            if (selectedFiles.Count > 0)\n            {\n                IFileData file = selectedFiles.First();\n                FileDetailsEditForm form = new FileDetailsEditForm();\n                form.Initialize(DataSourceAdapter, file);\n                form.StartPosition = FormStartPosition.CenterParent;\n\n                if (form.ShowDialog(this) == DialogResult.OK && form.SourcePort != null && !file.IsUrl)\n                {\n                    file.SourcePortID = form.SourcePort.SourcePortID;\n                    file.Description = form.Description;\n                    DataSourceAdapter.UpdateFile(file);\n                    return true;\n                }\n                else if (form.SourcePort == null)\n                {\n                    StyledMessageBox.Show(this, \"A source port must be selected.\", \"Error\", MessageBoxButtons.OK);\n                }\n            }\n\n            return false;\n        }\n\n        public void CopyToClipboard()\n        {\n            CopyFilesToClipboard(GetSelectedFiles());\n        }\n\n        public void CopyAllToClipboard()\n        {\n            CopyFilesToClipboard(Files);\n        }\n\n        private void CopyFilesToClipboard(IEnumerable<IFileData> files)\n        {\n            StringCollection paths = new StringCollection();\n\n            string tempDirectory = DataCache.Instance.AppConfiguration.TempDirectory.GetFullPath();\n            List<string> exportedFiles = ExportFilesTo(files, tempDirectory);\n            exportedFiles.ForEach(x => paths.Add(Path.Combine(tempDirectory, x)));\n\n            if (paths.Count > 0)\n                Clipboard.SetFileDropList(paths);\n        }\n\n        public bool Export()\n        {\n            List<IFileData> selectedFiles = GetSelectedFiles();\n            if (selectedFiles.Count == 0)\n                return false;\n\n            var sourcePorts = Util.GetSourcePortsData(DataSourceAdapter);\n            SaveFileDialog dialog = new SaveFileDialog();\n            dialog.FileName = GetNiceFileName(selectedFiles[0], sourcePorts);\n\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                CopyFile(selectedFiles[0], dialog.FileName);\n                return true;\n            }\n\n            return false;\n        }\n\n        public bool ExportAll()\n        {\n            if (Files.Length == 0)\n                return false;\n\n            FolderBrowserDialog dialog = new FolderBrowserDialog();\n\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                ExportFilesTo(Files, dialog.SelectedPath);\n                return true;\n            }\n\n            return false;\n        }\n\n        private List<string> ExportFilesTo(IEnumerable<IFileData> files, string directory)\n        {\n            var sourcePorts = Util.GetSourcePortsData(DataSourceAdapter);\n            HashSet<string> exportedNames = new HashSet<string>();\n            int collision = 2;\n\n            foreach (IFileData file in files)\n            {\n                if (!File.Exists(Path.Combine(DataDirectory.GetFullPath(), file.FileName)))\n                    continue;\n\n                string fileName = GetNiceFileName(file, sourcePorts);\n                while (exportedNames.Contains(fileName))\n                {\n                    fileName = $\"{Path.GetFileNameWithoutExtension(fileName)}_{collision}{Path.GetExtension(fileName)}\";\n                    collision++;\n                }\n\n                exportedNames.Add(fileName);\n                CopyFile(file, Path.Combine(directory, fileName));\n            }\n\n            return exportedNames.ToList();\n        }\n\n        private void CopyFile(IFileData file, string to)\n        {\n            FileInfo fi = new FileInfo(Path.Combine(DataDirectory.GetFullPath(), file.FileName));\n            if (fi.Exists)\n                fi.CopyTo(to, true);\n        }\n\n        private string GetNiceFileName(IFileData file, List<ISourcePortData> sourcePorts)\n        {\n            string prefix;\n            if (file.FileTypeID == FileType.Demo && file.Description.Length > 0)\n                prefix = file.Description;\n            else\n                prefix = Path.GetFileNameWithoutExtension(file.OriginalFileName);\n\n            if (string.IsNullOrEmpty(prefix))\n                prefix = file.FileTypeID.ToString().ToLower();\n\n            string sourcePortName = \"NA\";\n            var sourcePort = sourcePorts.FirstOrDefault(x => x.SourcePortID == file.SourcePortID);\n            if (sourcePort != null)\n                sourcePortName = sourcePort.Name;\n\n            string fileName = $\"{prefix}_{sourcePortName}_{Path.GetFileNameWithoutExtension(GameFile.FileNameNoPath)}{Path.GetExtension(file.FileName)}\";\n            Array.ForEach(Path.GetInvalidFileNameChars(), x => fileName = fileName.Replace(x, ' '));\n            return fileName;\n        }\n\n        public virtual void View()\n        {\n            List<IFileData> selectedFiles = GetSelectedFiles();\n\n            try\n            {\n                if (selectedFiles.Count > 0)\n                {\n                    IFileData file = selectedFiles.First();\n\n                    if (file.IsUrl)\n                    {\n                        Process.Start(file.FileName);\n                    }\n                    else\n                    {\n                        if (File.Exists(Path.Combine(DataDirectory.GetFullPath(), file.FileName)))\n                            Process.Start(Path.Combine(DataDirectory.GetFullPath(), file.FileName));\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                // This happens when windows doesn't recognize the file extension\n                StyledMessageBox.Show(this, ex.Message, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n\n        public virtual bool MoveFileOrderUp()\n        {\n            return SetFilePriority(true);\n        }\n\n        public virtual bool MoveFileOrderDown()\n        {\n            return SetFilePriority(false);\n        }\n\n        public virtual bool SetFileOrderFirst()\n        {\n            List<IFileData> selectedFiles = GetSelectedFiles();\n\n            if (selectedFiles.Count > 0)\n            {\n                IFileData file = selectedFiles.First();\n                if (!file.IsUrl)\n                {\n                    List<IFileData> files = Files.ToList();\n                    files.Remove(file);\n                    files.Insert(0, file);\n                    SetFilePriorities(files);\n\n                    foreach (IFileData fileUpdate in files)\n                        DataSourceAdapter.UpdateFile(fileUpdate);\n\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        private bool SetFilePriority(bool up) //todo fix for new file\n        {\n            List<IFileData> selectedFiles = GetSelectedFiles();\n\n            if (selectedFiles.Count > 0)\n            {\n                IFileData file = selectedFiles.First();\n\n                if (!file.IsUrl)\n                {\n                    List<IFileData> files = Files.ToList();\n                    SetFilePriorities(files);\n\n                    if (up && file.FileOrder > 0)\n                        file.FileOrder--;\n\n                    if (!up && file.FileOrder < files.Count - 1)\n                        file.FileOrder++;\n\n                    files.Remove(file);\n                    files.Insert(file.FileOrder, file);\n\n                    SetFilePriorities(files);\n\n                    foreach (IFileData fileUpdate in files)\n                        DataSourceAdapter.UpdateFile(fileUpdate);\n\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        private void SetFilePriorities(List<IFileData> files)\n        {\n            int priority = 0;\n\n            foreach (IFileData file in files)\n            {\n                file.FileOrder = priority++;\n            }\n        }\n\n        public IDataSourceAdapter DataSourceAdapter { get; set; }\n        public LauncherPath DataDirectory { get; set; }\n\n        protected virtual IFileData[] Files\n        {\n            get { return m_files; }\n        }\n\n        public void SetContextMenu(ContextMenuStrip menu)\n        {\n            m_menu = menu;\n            Stylizer.StylizeControl(m_menu, DesignMode);\n        }\n\n        protected abstract List<IFileData> GetSelectedFiles();\n\n        public FileType FileType { get; set; }\n        public virtual bool DeleteAllowed { get { return true; } }\n        public virtual bool CopyOrExportAllowed { get { return true; } }\n        public virtual bool NewAllowed { get { return true; } }\n        public virtual bool EditAllowed { get { return true; } }\n        public virtual bool ViewAllowed { get { return true; } }\n        public virtual bool ChangeOrderAllowed { get { return true; } }\n        public virtual IList<MenuOptions> MenuOptions { get { return Array.Empty<MenuOptions>(); } }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CCheckBox.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public enum DarkControlState\n    {\n        Normal,\n        Hover,\n        Pressed\n    }\n\n    public class CCheckBox : CheckBox\n    {\n        private DarkControlState _controlState = DarkControlState.Normal;\n        private bool _spacePressed;\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new Appearance Appearance\n        {\n            get { return base.Appearance; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new bool AutoEllipsis\n        {\n            get { return base.AutoEllipsis; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new Image BackgroundImage\n        {\n            get { return base.BackgroundImage; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new ImageLayout BackgroundImageLayout\n        {\n            get { return base.BackgroundImageLayout; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new bool FlatAppearance\n        {\n            get { return false; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new FlatStyle FlatStyle\n        {\n            get { return base.FlatStyle; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new Image Image\n        {\n            get { return base.Image; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new ContentAlignment ImageAlign\n        {\n            get { return base.ImageAlign; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new int ImageIndex\n        {\n            get { return base.ImageIndex; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new string ImageKey\n        {\n            get { return base.ImageKey; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new ImageList ImageList\n        {\n            get { return base.ImageList; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new ContentAlignment TextAlign\n        {\n            get { return base.TextAlign; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new TextImageRelation TextImageRelation\n        {\n            get { return base.TextImageRelation; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new bool ThreeState\n        {\n            get { return base.ThreeState; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new bool UseCompatibleTextRendering\n        {\n            get { return false; }\n        }\n\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public new bool UseVisualStyleBackColor\n        {\n            get { return false; }\n        }\n\n        public CCheckBox()\n        {\n            SetStyle(ControlStyles.SupportsTransparentBackColor |\n                     ControlStyles.OptimizedDoubleBuffer |\n                     ControlStyles.ResizeRedraw |\n                     ControlStyles.UserPaint, true);\n        }\n\n        private void SetControlState(DarkControlState controlState)\n        {\n            if (_controlState != controlState)\n            {\n                _controlState = controlState;\n                Invalidate();\n            }\n        }\n\n        protected override void OnMouseMove(MouseEventArgs e)\n        {\n            base.OnMouseMove(e);\n\n            if (_spacePressed)\n                return;\n\n            if (e.Button == MouseButtons.Left)\n            {\n                if (ClientRectangle.Contains(e.Location))\n                    SetControlState(DarkControlState.Pressed);\n                else\n                    SetControlState(DarkControlState.Hover);\n            }\n            else\n            {\n                SetControlState(DarkControlState.Hover);\n            }\n        }\n\n        protected override void OnMouseDown(MouseEventArgs e)\n        {\n            base.OnMouseDown(e);\n\n            if (!ClientRectangle.Contains(e.Location))\n                return;\n\n            SetControlState(DarkControlState.Pressed);\n        }\n\n        protected override void OnMouseUp(MouseEventArgs e)\n        {\n            base.OnMouseUp(e);\n\n            if (_spacePressed)\n                return;\n\n            SetControlState(DarkControlState.Normal);\n        }\n\n        protected override void OnMouseLeave(EventArgs e)\n        {\n            base.OnMouseLeave(e);\n\n            if (_spacePressed)\n                return;\n\n            SetControlState(DarkControlState.Normal);\n        }\n\n        protected override void OnMouseCaptureChanged(EventArgs e)\n        {\n            base.OnMouseCaptureChanged(e);\n\n            if (_spacePressed)\n                return;\n\n            var location = Cursor.Position;\n\n            if (!ClientRectangle.Contains(location))\n                SetControlState(DarkControlState.Normal);\n        }\n\n        protected override void OnGotFocus(EventArgs e)\n        {\n            base.OnGotFocus(e);\n\n            Invalidate();\n        }\n\n        protected override void OnLostFocus(EventArgs e)\n        {\n            base.OnLostFocus(e);\n\n            _spacePressed = false;\n\n            var location = Cursor.Position;\n\n            if (!ClientRectangle.Contains(location))\n                SetControlState(DarkControlState.Normal);\n            else\n                SetControlState(DarkControlState.Hover);\n        }\n\n        protected override void OnKeyDown(KeyEventArgs e)\n        {\n            base.OnKeyDown(e);\n\n            if (e.KeyCode == Keys.Space)\n            {\n                _spacePressed = true;\n                SetControlState(DarkControlState.Pressed);\n            }\n        }\n\n        protected override void OnKeyUp(KeyEventArgs e)\n        {\n            base.OnKeyUp(e);\n\n            if (e.KeyCode == Keys.Space)\n            {\n                _spacePressed = false;\n\n                var location = Cursor.Position;\n\n                if (!ClientRectangle.Contains(location))\n                    SetControlState(DarkControlState.Normal);\n                else\n                    SetControlState(DarkControlState.Hover);\n            }\n        }\n\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            var g = e.Graphics;\n            var rect = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height);\n\n            var textColor = ColorTheme.Current.Text;\n            var borderColor = ColorTheme.Current.Border;\n            var fillColor = ColorTheme.Current.Highlight;\n\n            if (Enabled)\n            {\n                if (_controlState == DarkControlState.Hover)\n                {\n                    borderColor = ColorTheme.Current.Highlight;\n                    fillColor = ColorTheme.Current.Highlight;\n                }\n                else if (_controlState == DarkControlState.Pressed)\n                {\n                    borderColor = ColorTheme.Current.Border;\n                    fillColor = ColorTheme.Current.Border;\n                }\n            }\n            else\n            {\n                textColor = ColorTheme.Current.DisabledText;\n                borderColor = ColorTheme.Current.Border;\n                fillColor = ColorTheme.Current.Window;\n            }\n\n            using (var b = new SolidBrush(ColorTheme.Current.Window))\n                g.FillRectangle(b, rect);\n\n            DpiScale dpiScale = new DpiScale(g);\n            var size = new Size(dpiScale.ScaleIntX(12), dpiScale.ScaleIntY(12));\n            var checkBoxRect = new Rectangle(0, 0, size.Width, size.Height);\n            using (var b = new SolidBrush(ColorTheme.Current.CheckBoxBackground))\n                g.FillRectangle(b, checkBoxRect);\n\n            using (var p = new Pen(borderColor))\n                g.DrawRectangle(p, checkBoxRect);\n\n            if (Checked)\n            {\n                using (var b = new SolidBrush(fillColor))\n                {\n                    var offsetX = dpiScale.ScaleFloatX(1.8f);\n                    var offsetY = dpiScale.ScaleFloatY(1.8f);\n                    var selectWidth = size.Width - offsetX * 2;\n                    var selectHeight = size.Height - offsetY * 2;\n                    var selectRect = new RectangleF(offsetX, offsetY,\n                        selectWidth, selectHeight);\n                    g.FillRectangle(b, selectRect);\n                }\n            }\n\n            using (var b = new SolidBrush(textColor))\n            {\n                var stringFormat = new StringFormat\n                {\n                    LineAlignment = StringAlignment.Center,\n                    Alignment = StringAlignment.Near\n                };\n\n                var modRect = new Rectangle(size.Width + dpiScale.ScaleIntX(4), dpiScale.ScaleIntY(1), rect.Width, checkBoxRect.Height);\n                g.DrawString(Text, Font, b, modRect, stringFormat);\n            }\n        }\n    }\n}"
  },
  {
    "path": "DoomLauncher/Controls/CComboBox.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Controls\n{\n    public class ComboBoxItemStyle\n    {\n        public string ValueMember { get; set; }\n        public string Text { get; set; }\n        public Font Font { get; set; }\n        public Color ForeColor { get; set; }\n        public DrawItemEventArgs DrawItem { get; set; }\n    }\n\n    public class CComboBox : ComboBox\n    {\n        private static readonly IThemeColors CurrentTheme = ColorTheme.Current;\n\n        public event EventHandler<ComboBoxItemStyle> StyleItem;\n\n        public CComboBox()\n        {   \n            DrawItem += ComboBoxDrawItemInternal;\n            DrawMode = DrawMode.OwnerDrawFixed;\n        }\n\n        public static void ComboBoxDrawItem(object sender, DrawItemEventArgs e)\n        {\n            ComboBoxDrawItem(sender, e, null);\n        }\n\n        private void ComboBoxDrawItemInternal(object sender, DrawItemEventArgs e)\n        {\n            ComboBoxDrawItem(sender, e, StyleItem);\n        }\n\n        private static void ComboBoxDrawItem(object sender, DrawItemEventArgs e, EventHandler<ComboBoxItemStyle> styleItem = null)\n        {\n            if (!(sender is ComboBox comboBox))\n                return;\n\n            bool selected = e.State.HasFlag(DrawItemState.Selected);\n            if (selected)\n                e.Graphics.FillRectangle(new SolidBrush(CurrentTheme.Highlight), e.Bounds);\n            else\n                e.Graphics.FillRectangle(new SolidBrush(CurrentTheme.DropDownBackground), e.Bounds);\n\n            if (e.Index < 0 || e.Index >= comboBox.Items.Count)\n                return;\n\n            var item = comboBox.Items[e.Index];\n            string text;\n            if (!string.IsNullOrEmpty(comboBox.DisplayMember))\n                text = GetPropertyString(item, comboBox.DisplayMember);\n            else if (item is string str)\n                text = str;\n            else\n                text = item.ToString();\n\n            Color color = selected ? CurrentTheme.HighlightText : CurrentTheme.Text;\n\n            if (styleItem != null)\n            {\n                string value = string.Empty;\n                if (!string.IsNullOrEmpty(comboBox.ValueMember))\n                    value = GetPropertyString(item, comboBox.ValueMember);\n\n                var style = new ComboBoxItemStyle()\n                {\n                    ValueMember = value,\n                    Text = text,\n                    Font = e.Font,\n                    ForeColor = color,\n                    DrawItem = e\n                };\n\n                styleItem.Invoke(sender, style);\n                e.Graphics.DrawString(style.Text, style.Font, new SolidBrush(style.ForeColor), new PointF(0, e.Bounds.Y));\n                return;\n            }\n\n            e.Graphics.DrawString(text, e.Font, new SolidBrush(color), new PointF(0, e.Bounds.Y));\n        }\n\n        private static string GetPropertyString(object item, string propertyName)\n        {\n            var pi = item.GetType().GetProperty(propertyName);\n            if (pi != null)\n                return pi.GetValue(item).ToString();\n            return string.Empty;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CDataGridView.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    class CDataGridView : DataGridView\n    {\n        public CDataGridView()\n        {\n            DoubleBuffered = true;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CProgressBar.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class CProgressBar : ProgressBar\n    {\n        private readonly Timer m_timer;\n        private int m_blend;\n        private bool m_direction = true;\n\n        public CProgressBar()\n        {\n            SetStyle(ControlStyles.UserPaint, true);\n            VisibleChanged += CProgressBar_VisibleChanged;\n            m_timer = new Timer();\n            m_timer.Interval = 5;\n            m_timer.Tick += Timer_Tick;\n        }\n\n        private void CProgressBar_VisibleChanged(object sender, System.EventArgs e)\n        {\n            if (Visible && !m_timer.Enabled)\n                m_timer.Start();\n\n            if (!Visible && !m_timer.Enabled)\n                m_timer.Stop();\n        }\n\n        private void Timer_Tick(object sender, System.EventArgs e)\n        {\n            if (!Visible)\n            {\n                m_timer.Stop();\n                return;\n            }\n\n            const int Amount = 4;\n            if (m_direction)\n                m_blend += Amount;\n            else\n                m_blend -= Amount;\n\n            if (m_blend <= 0 && !m_direction)\n            {\n                m_blend = 0;\n                m_direction = true;\n            }\n\n            if (m_blend >= 255 && m_direction)\n            {\n                m_blend = 255;\n                m_direction = false;\n            }\n\n            Invalidate();\n        }\n\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            int value = Value;\n            var brush = new SolidBrush(ColorTheme.Current.Highlight);\n            if (Style == ProgressBarStyle.Marquee)\n            {\n                Value = Maximum;\n                brush = new SolidBrush(Color.FromArgb(m_blend, ColorTheme.Current.Highlight));\n            }\n\n            Rectangle rect = e.ClipRectangle;\n            DpiScale dpiScale = new DpiScale(e.Graphics);\n            int padX = dpiScale.ScaleIntX(2);\n            int padY = dpiScale.ScaleIntY(2);\n\n            if (Maximum != 0)\n                rect.Width = (int)(rect.Width * ((double)value / Maximum));\n            rect.Width -= (padX * 2);\n\n            if (ProgressBarRenderer.IsSupported)\n                ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle);\n            rect.Height -= padY * 2;\n            e.Graphics.FillRectangle(brush, padX, padY, rect.Width, rect.Height);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CRichTextBox.Designer.cs",
    "content": "﻿namespace DoomLauncher.Controls\n{\n    partial class CRichTextBox\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CRichTextBox.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Controls\n{\n    public partial class CRichTextBox : RichTextBox\n    {\n        public CRichTextBox()\n        {\n            InitializeComponent();\n            WarnLinkClick = true;\n            LinkClicked += CRichTextBox_LinkClicked;\n        }\n\n        public bool WarnLinkClick { get; set; }\n\n        private void CRichTextBox_LinkClicked(object sender, LinkClickedEventArgs e)\n        {\n            if (ShouldNavigate(e))\n                Process.Start(e.LinkText);\n        }\n\n        private bool ShouldNavigate(LinkClickedEventArgs e)\n        {\n            if (WarnLinkClick)\n            {\n                return MessageBox.Show(this, string.Format(\"You are about to navigate to:{1}{0} {1}{1}Continue?\", e.LinkText, Environment.NewLine),\n                    \"Navigate\", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK;\n            }\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CTabControl.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class CTabControl : TabControl\n    {\n        private const int TabMargin = 3;\n\n        private readonly Dictionary<int, List<int>> m_tabRowLookup = new Dictionary<int, List<int>>();\n        private readonly List<int> m_tabRows = new List<int>();\n        private bool m_setting;\n        private bool m_showHeaders = true;\n        private int m_lastTabCount;\n        private float m_spaceWidth = -1;\n        private Size m_originalItemSize = new Size(0, 0);   \n\n        public CTabControl()\n        {\n            if (!DesignMode)\n                Multiline = true;\n\n            DrawMode = TabDrawMode.OwnerDrawFixed;\n            SizeMode = TabSizeMode.Normal;\n            SetStyle(ControlStyles.UserPaint, true);\n        }\n\n        public void SetShowHeaders(bool set)\n        {\n            m_showHeaders = set;\n            if (set)\n            {\n                Appearance = TabAppearance.Normal;\n                SizeMode = TabSizeMode.Normal;\n                ItemSize = m_originalItemSize;\n            }\n            else\n            {\n                Appearance = TabAppearance.FlatButtons;\n                SizeMode = TabSizeMode.Fixed;\n                ItemSize = new Size(0, 1);\n            }\n        }\n\n        protected override void OnCreateControl()\n        {\n            int width = 0;\n            if (SizeMode == TabSizeMode.Fixed)\n                width = ItemSize.Width;\n\n            var dpiScale = new DpiScale(CreateGraphics());\n            ItemSize = new Size(width, dpiScale.ScaleIntY(18));\n            m_originalItemSize = ItemSize;\n        }\n\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            if (m_setting)\n                return;\n\n            if (m_lastTabCount != TabCount && SizeMode != TabSizeMode.Fixed)\n            {\n                m_setting = true;\n                var dpiScale = new DpiScale(e.Graphics);\n\n                for (int i = 0; i < TabPages.Count; i++)\n                {\n                    string text = TabPages[i].Text;\n                    var stringSize = e.Graphics.MeasureString(text, Font);\n                    int originalWidth = GetTabRect(i).Width;\n                    int width = (int)Math.Ceiling(stringSize.Width) + dpiScale.ScaleIntX(16);\n                    // Can't guarantee the dpi is working. Have to measure by injecting a space in the tab text.\n                    if (m_spaceWidth < 0)\n                    {\n                        TabPages[i].Text += \" \";\n                        m_spaceWidth = GetTabRect(i).Width - originalWidth;\n                    }\n\n                    int spaces = (int)Math.Ceiling((width - GetTabRect(i).Width) / m_spaceWidth) + 2;\n                    for (int j = 0; j < spaces; j++)\n                        text += \" \";\n                    TabPages[i].Text = text;\n                }\n\n                m_setting = false;\n                m_lastTabCount = TabCount;\n            }\n\n            Rectangle fillRect = new Rectangle(0, 0, Width, Height);\n            using (Brush controlBrush = new SolidBrush(ColorTheme.Current.Window))\n                e.Graphics.FillRectangle(controlBrush, fillRect);\n\n            if (!m_showHeaders)\n                return;\n\n            var renderOrder = GetTabPageRenderOrder();\n            if (renderOrder.Count == 0)\n                return;\n\n            int selectedRow = SelectedIndex == -1 || SelectedIndex >= m_tabRows.Count ? 0 : m_tabRows[SelectedIndex];\n            foreach (int tabIndex in renderOrder)\n                DrawTab(tabIndex, e, m_tabRows[tabIndex] == selectedRow);\n\n            base.OnPaint(e);\n        }\n\n        private List<int> GetTabPageRenderOrder()\n        {\n            m_tabRowLookup.Clear();\n            m_tabRows.Clear();\n            for (int i = 0; i < TabPages.Count; i++)\n            {\n                Rectangle tabRect = GetTabRect(i);\n                if (!m_tabRowLookup.TryGetValue(tabRect.Y, out var list))\n                {\n                    list = new List<int>();\n                    m_tabRowLookup[tabRect.Y] = list;\n                }\n\n                list.Add(i);\n            }\n\n            var keys = m_tabRowLookup.Keys.ToList();\n            keys.Sort();\n\n            m_tabRows.Clear();\n            foreach (var key in keys)\n                m_tabRows.AddRange(m_tabRowLookup[key]);\n            return m_tabRows;\n        }\n\n        private void DrawTab(int index, PaintEventArgs e, bool selectedRow)\n        {\n            Rectangle tabRect = GetTabRect(index);\n            if (tabRect.Width == 0)\n                return;\n\n            tabRect.X += 2;\n            if (selectedRow)\n                tabRect.Height += 8;\n            tabRect.Width -= 4;\n\n            bool selected = SelectedIndex == index;\n            if (selected)\n                tabRect.Y -= 2;\n            else\n                tabRect.Height += 2;\n\n            Brush controlBrush = new SolidBrush(ColorTheme.Current.WindowLight);\n            Brush textBrush = new SolidBrush(ColorTheme.Current.Text);\n            Pen borderPen = new Pen(ColorTheme.Current.Border);\n\n            e.Graphics.FillRectangle(controlBrush, tabRect);\n            RectangleF layoutRect = new RectangleF(tabRect.Left, tabRect.Y + TabMargin,\n                tabRect.Width, tabRect.Height - 2 * TabMargin);\n\n            using (StringFormat format = new StringFormat())\n            {\n                using (Font tabFont = new Font(Font, selected ? FontStyle.Bold : FontStyle.Regular))\n                {\n                    format.Alignment = StringAlignment.Center;\n                    format.LineAlignment = StringAlignment.Center;\n                    e.Graphics.DrawString(TabPages[index].Text, tabFont, textBrush, layoutRect, format);\n                }\n            }\n\n            if (selected)\n            {\n                Rectangle selectRect = tabRect;\n                selectRect.Height = 4;\n                using (Brush selectBrush = new SolidBrush(ColorTheme.Current.Highlight))\n                    e.Graphics.FillRectangle(selectBrush, selectRect);\n            }\n\n            e.Graphics.DrawLine(borderPen, new Point(tabRect.Left, tabRect.Top), new Point(tabRect.Right, tabRect.Top));\n            e.Graphics.DrawLine(borderPen, new Point(tabRect.Left, tabRect.Top), new Point(tabRect.Left, tabRect.Bottom));\n            e.Graphics.DrawLine(borderPen, new Point(tabRect.Right, tabRect.Top), new Point(tabRect.Right, tabRect.Bottom));\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CheckBoxList.Designer.cs",
    "content": "﻿namespace DoomLauncher.Controls\n{\n    partial class CheckBoxList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0, 4, 0, 4);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 1;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(120, 120);\n            this.tblMain.TabIndex = 0;\n            // \n            // CheckBoxList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Name = \"CheckBoxList\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblMain;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CheckBoxList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Controls\n{\n    public class CheckListBoxEventArgs\n    {\n        public readonly bool Checked;\n        public readonly string Text;\n\n        public CheckListBoxEventArgs(bool check, string text)\n        {\n            Checked = check;\n            Text = text;\n        }\n    }\n\n    public partial class CheckBoxList : UserControl\n    {\n        public event EventHandler<CheckListBoxEventArgs> ItemCheck;\n\n        public List<string> Items { get; private set; } = new List<string>();\n        private List<CCheckBox> m_checkBoxes = new List<CCheckBox>();\n\n        public CheckBoxList()\n        {\n            InitializeComponent();\n        }\n\n        public void SetItems(IEnumerable<string> items)\n        {\n            tblMain.RowStyles.Clear();\n            Items = items.ToList();\n\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            int rowHeight = dpiScale.ScaleIntY(20);\n            int padding = dpiScale.ScaleIntX(4);\n            int row = 0;\n            foreach (var item in items)\n            {\n                var checkBox = new CCheckBox()\n                {\n                    Dock = DockStyle.Fill,\n                    Text = item,\n                    Margin = new Padding(padding, padding, 0, 0)\n                    \n                };\n                checkBox.CheckedChanged += CheckBox_CheckedChanged;\n                m_checkBoxes.Add(checkBox);\n\n                tblMain.RowStyles.Add(new RowStyle(SizeType.Absolute, rowHeight));\n                tblMain.Controls.Add(checkBox, 0, row);\n                row++;\n            }\n        }\n\n        private void CheckBox_CheckedChanged(object sender, EventArgs e)\n        {\n            var checkBox = (CCheckBox)sender;\n            ItemCheck?.Invoke(this, new CheckListBoxEventArgs(checkBox.Checked, checkBox.Text));\n        }\n\n        public string[] GetCheckedItems()\n        {\n            List<string> checkedItems = new List<string>();\n            foreach (var checkBox in m_checkBoxes)\n            {\n                if (checkBox.Checked)\n                    checkedItems.Add(checkBox.Text);\n            }\n            return checkedItems.ToArray();\n        }\n\n        public bool IsChecked(string text)\n        {\n            foreach (var checkBox in m_checkBoxes)\n            {\n                if (checkBox.Text == text)\n                    return checkBox.Checked;\n            }\n            return false;\n        }\n\n        public void SetChecked(string text, bool check)\n        {\n            foreach (var checkBox in m_checkBoxes)\n            {\n                if (checkBox.Text == text)\n                {\n                    checkBox.Checked = check;\n                    break;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/CheckBoxList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/ColumnField.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public class ColumnField\n    {\n        public ColumnField(string datakey, string title)\n        {\n            DataKey = datakey;\n            Title = title;\n        }\n\n        public string DataKey { get; set; }\n        public string Title { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/DownloadView.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class DownloadView\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.menuOptions = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.removeFromHistoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.cancelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.playToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.menuOptions.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblMain.Size = new System.Drawing.Size(150, 150);\n            this.tblMain.TabIndex = 0;\n            // \n            // menuOptions\n            // \n            this.menuOptions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.removeFromHistoryToolStripMenuItem,\n            this.cancelToolStripMenuItem,\n            this.playToolStripMenuItem});\n            this.menuOptions.Name = \"contextMenuStrip1\";\n            this.menuOptions.Size = new System.Drawing.Size(188, 92);\n            // \n            // removeFromHistoryToolStripMenuItem\n            // \n            this.removeFromHistoryToolStripMenuItem.Name = \"removeFromHistoryToolStripMenuItem\";\n            this.removeFromHistoryToolStripMenuItem.Size = new System.Drawing.Size(187, 22);\n            this.removeFromHistoryToolStripMenuItem.Text = \"Remove from History\";\n            this.removeFromHistoryToolStripMenuItem.Click += new System.EventHandler(this.removeFromHistoryToolStripMenuItem_Click);\n            // \n            // cancelToolStripMenuItem\n            // \n            this.cancelToolStripMenuItem.Name = \"cancelToolStripMenuItem\";\n            this.cancelToolStripMenuItem.Size = new System.Drawing.Size(187, 22);\n            this.cancelToolStripMenuItem.Text = \"Cancel\";\n            this.cancelToolStripMenuItem.Click += new System.EventHandler(this.cancelToolStripMenuItem_Click);\n            // \n            // playToolStripMenuItem\n            // \n            this.playToolStripMenuItem.Name = \"playToolStripMenuItem\";\n            this.playToolStripMenuItem.Size = new System.Drawing.Size(187, 22);\n            this.playToolStripMenuItem.Text = \"Play\";\n            this.playToolStripMenuItem.Click += new System.EventHandler(this.playToolStripMenuItem_Click);\n            // \n            // DownloadView\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Name = \"DownloadView\";\n            this.menuOptions.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.ContextMenuStrip menuOptions;\n        private System.Windows.Forms.ToolStripMenuItem removeFromHistoryToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem cancelToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem playToolStripMenuItem;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/DownloadView.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class DownloadView : UserControl\n    {\n        public event EventHandler DownloadCancelled;\n        public event EventHandler UserPlay;\n\n        private readonly Dictionary<object, DownloadViewItem> m_downloadLookup = new Dictionary<object, DownloadViewItem>();\n        private readonly HashSet<object> m_cancelledDownloads = new HashSet<object>();\n\n        static readonly int s_rowHeight = 64;\n\n        public DownloadView()\n        {\n            InitializeComponent();\n\n            tblMain.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;\n            tblMain.RowStyles.Clear();\n            tblMain.RowStyles.Add(new RowStyle(SizeType.Percent, 100));\n\n            UpdateSize();\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public new int Height { get; set; }\n\n        public void AddDownload(object key, string text)\n        {\n            if (m_cancelledDownloads.Contains(key))\n                m_cancelledDownloads.Remove(key);\n\n            if (!m_downloadLookup.ContainsKey(key))\n            {\n                DpiScale dpiScale = new DpiScale(CreateGraphics());\n                DownloadViewItem item = CreateDownloadViewItem(text);\n                m_downloadLookup.Add(key, item);\n\n                tblMain.RowCount++;\n                tblMain.RowStyles.Add(new RowStyle(SizeType.Percent, 100));\n                tblMain.RowStyles[tblMain.RowStyles.Count - 2].SizeType = SizeType.Absolute;\n                tblMain.RowStyles[tblMain.RowStyles.Count - 2].Height = dpiScale.ScaleIntY(s_rowHeight);\n                tblMain.Controls.Add(item, 0, tblMain.RowStyles.Count - 2);\n\n                UpdateSize();\n            }\n            else\n            {\n                DownloadViewItem itemOld = m_downloadLookup[key];\n                DownloadViewItem item = CreateDownloadViewItem(text);\n\n                TableLayoutPanelCellPosition pos = tblMain.GetPositionFromControl(itemOld);\n                tblMain.Controls.Remove(itemOld);\n                tblMain.Controls.Add(item, pos.Column, pos.Row);\n\n                m_downloadLookup.Remove(key);\n                m_downloadLookup.Add(key, item);\n            }\n        }\n\n        private DownloadViewItem CreateDownloadViewItem(string text)\n        {\n            DownloadViewItem item = new DownloadViewItem();\n            item.Dock = DockStyle.Fill;\n            item.Key = text;\n            item.DisplayText = text;\n            item.Cancelled += item_Cancelled;\n\n            item.ContextMenuStrip = menuOptions;\n\n            return item;\n        }\n\n        private void UpdateSize()\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            Height = tblMain.RowStyles.Count * dpiScale.ScaleIntY(s_rowHeight);\n        }\n\n        void item_Cancelled(object sender, EventArgs e)\n        {\n            DownloadViewItem item = sender as DownloadViewItem;\n            if (item != null)\n                HandleItemCancel(item);\n        }\n\n        private void HandleItemCancel(DownloadViewItem item)\n        {\n            if (item.ProgressValue != 100)\n                item.ProgressValue = 0;\n\n            if (DownloadCancelled != null)\n            {\n                object key = GetKey(item);\n\n                if (key != null)\n                {\n                    m_cancelledDownloads.Add(key);\n                    DownloadCancelled(this, new EventArgs());\n                }\n            }\n        }\n\n        private object GetKey(DownloadViewItem item)\n        {\n            foreach(KeyValuePair<object, DownloadViewItem> kvp in m_downloadLookup)\n            {\n                if (kvp.Value == item)\n                    return kvp.Key;\n            }\n\n            return null;\n        }\n\n        private void RemoveDownloadRow(DownloadViewItem item)\n        {\n            int row = tblMain.GetRow(item);\n            if (row > -1)\n            {\n                tblMain.Controls.Remove(item);\n                tblMain.RowStyles.RemoveAt(row);\n\n                for(int i = row + 1; i < tblMain.RowCount; i++) //have to shift the controls up (TableLayoutPanel is dumb)\n                {\n                    DownloadViewItem itemMove = GetItem(i);\n\n                    if (itemMove != null)\n                    {\n                        tblMain.Controls.Remove(itemMove);\n                        tblMain.Controls.Add(itemMove, 0, i - 1);\n                    }\n                }\n            }\n        }\n\n        public void RemoveDownload(object key)\n        {\n            if (m_downloadLookup.ContainsKey(key))\n            {\n                DownloadViewItem item = m_downloadLookup[key];\n                m_downloadLookup.Remove(key);\n\n                RemoveDownloadRow(item);\n                UpdateSize();\n            }\n        }\n\n        public void UpdateDownload(object key, int percent)\n        {\n            if (m_downloadLookup.ContainsKey(key))\n            {\n                DownloadViewItem item = m_downloadLookup[key];\n                item.ProgressValue = percent;\n\n                if (percent == 100)\n                    item.CancelVisible = false;\n            }\n        }\n\n        public void UpdateDownload(object key, string text)\n        {\n            if (m_downloadLookup.ContainsKey(key))\n            {\n                DownloadViewItem item = m_downloadLookup[key];\n                item.DisplayText = text;\n            }\n        }\n\n        public object[] GetCancelledDownloads()\n        {\n            return m_cancelledDownloads.ToArray();\n        }\n\n        public DownloadViewItem SelectedItem\n        {\n            get;\n            private set;\n        }\n\n        private DownloadViewItem GetItem(int row)\n        {\n            return tblMain.GetControlFromPosition(0, row) as DownloadViewItem;\n        }\n\n        private void removeFromHistoryToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            DownloadViewItem item = menuOptions.SourceControl as DownloadViewItem;\n            if (item != null)\n            {\n                RemoveDownloadRow(item);\n                object key = GetKey(item);\n\n                if (key != null)\n                    m_downloadLookup.Remove(key);\n            }\n        }\n\n        private void cancelToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            DownloadViewItem item = menuOptions.SourceControl as DownloadViewItem;\n            SelectedItem = item;\n\n            if (item != null)\n                HandleItemCancel(item);\n        }\n\n        private void playToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            DownloadViewItem item = menuOptions.SourceControl as DownloadViewItem;\n            SelectedItem = item;\n\n            if (item != null && UserPlay != null && item.ProgressValue == 100)\n                UserPlay(this, new EventArgs());\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/DownloadView.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"menuOptions.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/DownloadViewItem.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class DownloadViewItem\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.progressBar = new DoomLauncher.CProgressBar();\n            this.flp = new DoomLauncher.FlowLayoutPanelDB();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.lblText = new System.Windows.Forms.Label();\n            this.tblMain.SuspendLayout();\n            this.flp.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.progressBar, 0, 1);\n            this.tblMain.Controls.Add(this.flp, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(309, 116);\n            this.tblMain.TabIndex = 0;\n            // \n            // progressBar\n            // \n            this.progressBar.Dock = System.Windows.Forms.DockStyle.Top;\n            this.progressBar.Location = new System.Drawing.Point(3, 35);\n            this.progressBar.Name = \"progressBar\";\n            this.progressBar.Size = new System.Drawing.Size(303, 23);\n            this.progressBar.TabIndex = 2;\n            // \n            // flp\n            // \n            this.flp.Controls.Add(this.btnCancel);\n            this.flp.Controls.Add(this.lblText);\n            this.flp.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flp.Location = new System.Drawing.Point(0, 0);\n            this.flp.Margin = new System.Windows.Forms.Padding(0);\n            this.flp.Name = \"flp\";\n            this.flp.Size = new System.Drawing.Size(309, 32);\n            this.flp.TabIndex = 3;\n            // \n            // btnCancel\n            // \n            this.btnCancel.Location = new System.Drawing.Point(3, 3);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 3;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // lblText\n            // \n            this.lblText.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblText.AutoSize = true;\n            this.lblText.Location = new System.Drawing.Point(84, 8);\n            this.lblText.Name = \"lblText\";\n            this.lblText.Size = new System.Drawing.Size(28, 13);\n            this.lblText.TabIndex = 2;\n            this.lblText.Text = \"Text\";\n            // \n            // DownloadViewItem\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Name = \"DownloadViewItem\";\n            this.Size = new System.Drawing.Size(309, 116);\n            this.tblMain.ResumeLayout(false);\n            this.flp.ResumeLayout(false);\n            this.flp.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.ProgressBar progressBar;\n        private System.Windows.Forms.FlowLayoutPanel flp;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Label lblText;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/DownloadViewItem.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class DownloadViewItem : UserControl\n    {\n        public event EventHandler Cancelled;\n\n        public DownloadViewItem()\n        {\n            InitializeComponent();\n\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public object Key\n        {\n            get;\n            set;\n        }\n\n        public string DisplayText\n        {\n            get { return lblText.Text; }\n            set { lblText.Text = value; }\n        }\n\n        public int ProgressValue\n        {\n            get { return progressBar.Value; }\n            set { progressBar.Value = value; }\n        }\n\n        public bool CancelVisible\n        {\n            get { return btnCancel.Visible; }\n            set { btnCancel.Visible = value; }\n        }\n\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            Cancelled?.Invoke(this, new EventArgs());\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/DownloadViewItem.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/FileType.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum FileType\n    {\n        Unknown = 0,\n        Screenshot = 1,\n        Demo = 2,\n        SaveGame = 3,\n        Thumbnail = 4,\n        TileImage = 5,\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/FilesCtrl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class FilesCtrl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.dgvAdditionalFiles = new System.Windows.Forms.DataGridView();\n            this.FileName = new System.Windows.Forms.DataGridViewTextBoxColumn();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnAdd = new DoomLauncher.FormButton();\n            this.btnDelete = new DoomLauncher.FormButton();\n            this.btnMoveUp = new DoomLauncher.FormButton();\n            this.btnMoveDown = new DoomLauncher.FormButton();\n            this.tblMain.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.dgvAdditionalFiles)).BeginInit();\n            this.flpButtons.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.dgvAdditionalFiles, 0, 1);\n            this.tblMain.Controls.Add(this.flpButtons, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Size = new System.Drawing.Size(370, 482);\n            this.tblMain.TabIndex = 23;\n            // \n            // dgvAdditionalFiles\n            // \n            this.dgvAdditionalFiles.AllowUserToAddRows = false;\n            this.dgvAdditionalFiles.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;\n            this.dgvAdditionalFiles.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\n            this.dgvAdditionalFiles.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\n            this.FileName});\n            this.dgvAdditionalFiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dgvAdditionalFiles.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;\n            this.dgvAdditionalFiles.Location = new System.Drawing.Point(4, 45);\n            this.dgvAdditionalFiles.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.dgvAdditionalFiles.Name = \"dgvAdditionalFiles\";\n            this.dgvAdditionalFiles.RowHeadersWidth = 62;\n            this.dgvAdditionalFiles.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\n            this.dgvAdditionalFiles.Size = new System.Drawing.Size(362, 432);\n            this.dgvAdditionalFiles.TabIndex = 2;\n            this.dgvAdditionalFiles.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dgvAdditionalFiles_KeyDown);\n            // \n            // FileName\n            // \n            this.FileName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;\n            this.FileName.DataPropertyName = \"FileName\";\n            this.FileName.HeaderText = \"File\";\n            this.FileName.MinimumWidth = 8;\n            this.FileName.Name = \"FileName\";\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnAdd);\n            this.flpButtons.Controls.Add(this.btnDelete);\n            this.flpButtons.Controls.Add(this.btnMoveUp);\n            this.flpButtons.Controls.Add(this.btnMoveDown);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.Location = new System.Drawing.Point(0, 0);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(370, 40);\n            this.flpButtons.TabIndex = 4;\n            // \n            // btnAdd\n            // \n            this.btnAdd.Image = global::DoomLauncher.Properties.Resources.File;\n            this.btnAdd.Location = new System.Drawing.Point(0, 0);\n            this.btnAdd.Margin = new System.Windows.Forms.Padding(0);\n            this.btnAdd.Name = \"btnAdd\";\n            this.btnAdd.Size = new System.Drawing.Size(40, 37);\n            this.btnAdd.TabIndex = 0;\n            this.btnAdd.UseVisualStyleBackColor = true;\n            this.btnAdd.Click += new System.EventHandler(this.btnAddFile_Click);\n            // \n            // btnDelete\n            // \n            this.btnDelete.Image = global::DoomLauncher.Properties.Resources.Delete;\n            this.btnDelete.Location = new System.Drawing.Point(40, 0);\n            this.btnDelete.Margin = new System.Windows.Forms.Padding(0);\n            this.btnDelete.Name = \"btnDelete\";\n            this.btnDelete.Size = new System.Drawing.Size(40, 37);\n            this.btnDelete.TabIndex = 1;\n            this.btnDelete.UseVisualStyleBackColor = true;\n            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);\n            // \n            // btnMoveUp\n            // \n            this.btnMoveUp.Image = global::DoomLauncher.Properties.Resources.UpArrow;\n            this.btnMoveUp.Location = new System.Drawing.Point(80, 0);\n            this.btnMoveUp.Margin = new System.Windows.Forms.Padding(0);\n            this.btnMoveUp.Name = \"btnMoveUp\";\n            this.btnMoveUp.Size = new System.Drawing.Size(40, 37);\n            this.btnMoveUp.TabIndex = 2;\n            this.btnMoveUp.UseVisualStyleBackColor = true;\n            this.btnMoveUp.Click += new System.EventHandler(this.btnMoveUp_Click);\n            // \n            // btnMoveDown\n            // \n            this.btnMoveDown.Image = global::DoomLauncher.Properties.Resources.DownArrow;\n            this.btnMoveDown.Location = new System.Drawing.Point(120, 0);\n            this.btnMoveDown.Margin = new System.Windows.Forms.Padding(0);\n            this.btnMoveDown.Name = \"btnMoveDown\";\n            this.btnMoveDown.Size = new System.Drawing.Size(40, 37);\n            this.btnMoveDown.TabIndex = 3;\n            this.btnMoveDown.UseVisualStyleBackColor = true;\n            this.btnMoveDown.Click += new System.EventHandler(this.btnMoveDown_Click);\n            // \n            // FilesCtrl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"FilesCtrl\";\n            this.Size = new System.Drawing.Size(370, 482);\n            this.tblMain.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.dgvAdditionalFiles)).EndInit();\n            this.flpButtons.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.DataGridView dgvAdditionalFiles;\n        private System.Windows.Forms.DataGridViewTextBoxColumn FileName;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private FormButton btnDelete;\n        private FormButton btnMoveUp;\n        private FormButton btnMoveDown;\n        private FormButton btnAdd;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/FilesCtrl.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Windows.Forms;\nusing DoomLauncher.Handlers;\n\nnamespace DoomLauncher\n{\n    public partial class FilesCtrl : UserControl\n    {\n        public event AdditionalFilesEventHanlder CellFormatting;\n        public event AdditionalFilesEventHanlder NewItemNeeded;\n        public event AdditionalFilesEventHanlder ItemAdded;\n        public event AdditionalFilesEventHanlder ItemRemoved;\n        public event AdditionalFilesEventHanlder ItemPriorityUp;\n        public event AdditionalFilesEventHanlder ItemPriorityDown;\n        public event AdditionalFilesEventHanlder ItemRemoving;\n\n        private readonly ToolTipGroup m_toolTipGroup = new ToolTipGroup();\n        private List<object> m_files = new List<object>();\n        private string m_keyProperty, m_dataProperty;\n\n        public FilesCtrl()\n        {\n            InitializeComponent();\n            dgvAdditionalFiles.BackgroundColor = SystemColors.Window;\n            dgvAdditionalFiles.AutoGenerateColumns = false;\n            dgvAdditionalFiles.RowHeadersVisible = false;\n            dgvAdditionalFiles.MultiSelect = false;\n            dgvAdditionalFiles.CellFormatting += dgvAdditionalFiles_CellFormatting;\n\n            Icons.DpiScale = new DpiScale(CreateGraphics());\n            btnAdd.Image = Icons.File;\n            btnDelete.Image = Icons.Delete;\n            btnMoveUp.Image = Icons.ArrowUp;\n            btnMoveDown.Image = Icons.ArrowDown;\n\n            m_toolTipGroup.SetToolTip(btnAdd, \"Add File\");\n            m_toolTipGroup.SetToolTip(btnDelete, \"Remove File\");\n            m_toolTipGroup.SetToolTip(btnMoveUp, \"Move Up\");\n            m_toolTipGroup.SetToolTip(btnMoveDown, \"Move Down\");\n\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public void Initialize(string keyProperty, string dataProperty)\n        {\n            dgvAdditionalFiles.Columns[0].DataPropertyName = dataProperty;\n            dgvAdditionalFiles.Columns[0].Name = dataProperty;\n\n            m_keyProperty = keyProperty;\n            m_dataProperty = dataProperty;\n        }\n\n        public List<object> GetFiles()\n        {\n            return m_files.ToList();\n        }\n\n        public void SetDataSource(object dataSource)\n        {\n            dgvAdditionalFiles.DataSource = null;\n            dgvAdditionalFiles.DataSource = dataSource;\n\n            m_files.Clear();\n            foreach (DataGridViewRow dgvr in dgvAdditionalFiles.Rows)\n                m_files.Add(dgvr.DataBoundItem);\n        }\n\n        public string GetAdditionalFilesString()\n        {\n            StringBuilder sb = new StringBuilder();\n\n            foreach (object file in m_files)\n            {\n                PropertyInfo pi = file.GetType().GetProperty(m_dataProperty);\n                sb.Append(pi.GetValue(file).ToString());\n                sb.Append(';');\n            }\n\n            return sb.ToString();\n        }\n\n        private void dgvAdditionalFiles_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)\n        {\n            if (CellFormatting != null)\n            {\n                object item = dgvAdditionalFiles.Rows[e.RowIndex].DataBoundItem;\n                AdditionalFilesEventArgs args = new AdditionalFilesEventArgs(item, (string)e.Value);\n                CellFormatting(this, args);\n                e.Value = args.DisplayText;\n            }\n        }\n\n        private object SelectedItem\n        {\n            get\n            {\n                if (dgvAdditionalFiles.SelectedRows.Count > 0)\n                    return dgvAdditionalFiles.SelectedRows[0].DataBoundItem;\n\n                return null;\n            }\n        }\n\n        private void btnAddFile_Click(object sender, EventArgs e)\n        {\n            AdditionalFilesEventArgs args = new AdditionalFilesEventArgs(null);\n            NewItemNeeded?.Invoke(this, args);\n\n            if (args.NewItems != null)\n            {\n                m_files.AddRange(args.NewItems);\n                Rebind();\n                if (dgvAdditionalFiles.Rows.Count > 0)\n                    dgvAdditionalFiles.Rows[dgvAdditionalFiles.Rows.Count - 1].Selected = true;\n\n                ItemAdded?.Invoke(this, args);\n            }\n        }\n\n        private void btnDelete_Click(object sender, EventArgs e)\n        {\n            HandleDelete();\n        }\n\n        private void dgvAdditionalFiles_KeyDown(object sender, KeyEventArgs e)\n        {\n            if (e.KeyCode == Keys.Delete)\n                HandleDelete();\n        }\n\n        private void btnMoveUp_Click(object sender, EventArgs e)\n        {\n            MoveFile(true);\n            object item = SelectedItem;\n            if (item != null && ItemPriorityUp != null)\n                ItemPriorityUp(this, new AdditionalFilesEventArgs(item));\n        }\n\n        private void btnMoveDown_Click(object sender, EventArgs e)\n        {\n            MoveFile(false);\n            object item = SelectedItem;\n            if (item != null && ItemPriorityDown != null)\n                ItemPriorityDown(this, new AdditionalFilesEventArgs(item));\n        }\n\n        private void MoveFile(bool up)\n        {\n            if (dgvAdditionalFiles.SelectedRows.Count > 0)\n            {\n                object file = dgvAdditionalFiles.SelectedRows[0].DataBoundItem;\n                int priority = GetFilePriority(file);\n\n                if (up && priority > 0)\n                    priority--;\n\n                if (!up && priority < m_files.Count - 1)\n                    priority++;\n\n                m_files.Remove(file);\n                m_files.Insert(priority, file);\n\n                Rebind();\n\n                dgvAdditionalFiles.ClearSelection();\n                dgvAdditionalFiles.Rows[priority].Selected = true;\n            }\n        }\n\n        private void Rebind()\n        {\n            m_files = m_files.Distinct().ToList();\n            SetDataSource(m_files.ToList());\n        }\n\n        private int GetFilePriority(object file)\n        {\n            int count = 0;\n            PropertyInfo pi = file.GetType().GetProperty(m_keyProperty);\n\n            foreach (object fileCheck in m_files)\n            {\n                if (pi.GetValue(fileCheck).Equals(pi.GetValue(file)))\n                    break;\n\n                count++;\n            }\n\n            return count;\n        }\n\n        private void HandleDelete()\n        {\n            object item = SelectedItem;\n            if (item != null)\n            {\n                int index = dgvAdditionalFiles.SelectedRows[0].Index;\n                AdditionalFilesEventArgs cancelEvent = new AdditionalFilesEventArgs(item);\n                ItemRemoving?.Invoke(this, cancelEvent);\n\n                if (!cancelEvent.Cancel)\n                {\n                    m_files.Remove(item);\n                    Rebind();\n\n                    if (dgvAdditionalFiles.Rows.Count > 0)\n                    {\n                        if (index >= dgvAdditionalFiles.Rows.Count)\n                            index = dgvAdditionalFiles.Rows.Count - 1;\n                        dgvAdditionalFiles.Rows[index].Selected = true;\n                    }\n\n                    ItemRemoved?.Invoke(this, new AdditionalFilesEventArgs(item));\n                }\n            }\n        }\n    }\n\n    public delegate void AdditionalFilesEventHanlder(object sender, AdditionalFilesEventArgs e);\n    public class AdditionalFilesEventArgs : EventArgs\n    {\n        public AdditionalFilesEventArgs(object item)\n        {\n            Item = item;\n            Cancel = false;\n        }\n\n        public AdditionalFilesEventArgs(object item, string displayText)\n        {\n            Item = item;\n            DisplayText = displayText;\n            Cancel = false;\n        }\n\n        public object Item { get; set; }\n        public string DisplayText { get; set; }\n        public List<object> NewItems { get; set; }\n        public bool Cancel { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/FilesCtrl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/FlowLayoutPanelDB.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class FlowLayoutPanelDB\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n            //this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/FlowLayoutPanelDB.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class FlowLayoutPanelDB : FlowLayoutPanel\n    {\n        public bool CaptureArrowKeys { get; set; } = false; \n\n        public FlowLayoutPanelDB()\n        {\n            SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);\n        }\n\n        protected override bool IsInputKey(Keys keyData)\n        {\n            if (CaptureArrowKeys)\n            {\n                switch (keyData)\n                {\n                    case Keys.Up:\n                    case Keys.Down:\n                    case Keys.Left:\n                    case Keys.Right:\n                        return true;\n                    case Keys.Shift | Keys.Up:\n                    case Keys.Shift | Keys.Down:\n                    case Keys.Shift | Keys.Left:\n                    case Keys.Shift | Keys.Right:\n                        return true;\n                }\n            }\n\n            return base.IsInputKey(keyData);\n        }\n\n        protected override CreateParams CreateParams\n        {\n            get\n            {\n                CreateParams cp = base.CreateParams;\n                cp.ExStyle |= 0x02000000; // WS_CLIPCHILDREN\n                return cp;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/FormButton.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class FormButton : Button\n    {\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileAssociationView.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GameFileAssociationView\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.Windows.Forms.TabPage tabPageScreenshots;\n            this.ctrlScreenshotView = new DoomLauncher.ScreenshotView();\n            this.mnuOptions = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.copyFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.copyAllFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\n            this.addFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.openFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\n            this.editDetailsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\n            this.moveUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.moveDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.setFirstToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.tabControl = new DoomLauncher.CTabControl();\n            this.tabPageDemos = new System.Windows.Forms.TabPage();\n            this.ctrlDemoView = new DoomLauncher.GenericFileView();\n            this.tabPageSaveGames = new System.Windows.Forms.TabPage();\n            this.ctrlSaveGameView = new DoomLauncher.GenericFileView();\n            this.tabPageStatistics = new System.Windows.Forms.TabPage();\n            this.ctrlViewStats = new DoomLauncher.StatisticsView();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCopy = new DoomLauncher.FormButton();\n            this.btnCopyAll = new DoomLauncher.FormButton();\n            this.btnDelete = new DoomLauncher.FormButton();\n            this.btnAddFile = new DoomLauncher.FormButton();\n            this.btnOpenFile = new DoomLauncher.FormButton();\n            this.btnEdit = new DoomLauncher.FormButton();\n            this.btnMoveUp = new DoomLauncher.FormButton();\n            this.btnMoveDown = new DoomLauncher.FormButton();\n            this.btnSetFirst = new DoomLauncher.FormButton();\n            tabPageScreenshots = new System.Windows.Forms.TabPage();\n            tabPageScreenshots.SuspendLayout();\n            this.mnuOptions.SuspendLayout();\n            this.tblMain.SuspendLayout();\n            this.tabControl.SuspendLayout();\n            this.tabPageDemos.SuspendLayout();\n            this.tabPageSaveGames.SuspendLayout();\n            this.tabPageStatistics.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tabPageScreenshots\n            // \n            tabPageScreenshots.Controls.Add(this.ctrlScreenshotView);\n            tabPageScreenshots.Location = new System.Drawing.Point(4, 29);\n            tabPageScreenshots.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            tabPageScreenshots.Name = \"tabPageScreenshots\";\n            tabPageScreenshots.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            tabPageScreenshots.Size = new System.Drawing.Size(1028, 320);\n            tabPageScreenshots.TabIndex = 0;\n            tabPageScreenshots.Text = \"Screenshots\";\n            tabPageScreenshots.UseVisualStyleBackColor = true;\n            // \n            // ctrlScreenshotView\n            // \n            this.ctrlScreenshotView.DataDirectory = null;\n            this.ctrlScreenshotView.DataSourceAdapter = null;\n            this.ctrlScreenshotView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlScreenshotView.FileType = DoomLauncher.FileType.Unknown;\n            this.ctrlScreenshotView.GameFile = null;\n            this.ctrlScreenshotView.Location = new System.Drawing.Point(4, 5);\n            this.ctrlScreenshotView.Margin = new System.Windows.Forms.Padding(6, 8, 6, 8);\n            this.ctrlScreenshotView.Name = \"ctrlScreenshotView\";\n            this.ctrlScreenshotView.Size = new System.Drawing.Size(1020, 310);\n            this.ctrlScreenshotView.TabIndex = 0;\n            // \n            // mnuOptions\n            // \n            this.mnuOptions.ImageScalingSize = new System.Drawing.Size(24, 24);\n            this.mnuOptions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.copyFileToolStripMenuItem,\n            this.copyAllFilesToolStripMenuItem,\n            this.deleteToolStripMenuItem,\n            this.toolStripSeparator1,\n            this.addFileToolStripMenuItem,\n            this.openFileToolStripMenuItem,\n            this.toolStripSeparator2,\n            this.editDetailsToolStripMenuItem,\n            this.toolStripSeparator3,\n            this.moveUpToolStripMenuItem,\n            this.moveDownToolStripMenuItem,\n            this.setFirstToolStripMenuItem});\n            this.mnuOptions.Name = \"mnuOptions\";\n            this.mnuOptions.Size = new System.Drawing.Size(191, 310);\n            // \n            // copyFileToolStripMenuItem\n            // \n            this.copyFileToolStripMenuItem.Name = \"copyFileToolStripMenuItem\";\n            this.copyFileToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.copyFileToolStripMenuItem.Text = \"Copy File\";\n            this.copyFileToolStripMenuItem.Click += new System.EventHandler(this.copyFileToolStripMenuItem_Click);\n            // \n            // copyAllFilesToolStripMenuItem\n            // \n            this.copyAllFilesToolStripMenuItem.Name = \"copyAllFilesToolStripMenuItem\";\n            this.copyAllFilesToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.copyAllFilesToolStripMenuItem.Text = \"Copy All Files\";\n            this.copyAllFilesToolStripMenuItem.Click += new System.EventHandler(this.copyAllFilesToolStripMenuItem_Click);\n            // \n            // deleteToolStripMenuItem\n            // \n            this.deleteToolStripMenuItem.Name = \"deleteToolStripMenuItem\";\n            this.deleteToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.deleteToolStripMenuItem.Text = \"Delete\";\n            this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click);\n            // \n            // toolStripSeparator1\n            // \n            this.toolStripSeparator1.Name = \"toolStripSeparator1\";\n            this.toolStripSeparator1.Size = new System.Drawing.Size(187, 6);\n            // \n            // addFileToolStripMenuItem\n            // \n            this.addFileToolStripMenuItem.Name = \"addFileToolStripMenuItem\";\n            this.addFileToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.addFileToolStripMenuItem.Text = \"Add File...\";\n            this.addFileToolStripMenuItem.Click += new System.EventHandler(this.addFileToolStripMenuItem_Click);\n            // \n            // openFileToolStripMenuItem\n            // \n            this.openFileToolStripMenuItem.Name = \"openFileToolStripMenuItem\";\n            this.openFileToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.openFileToolStripMenuItem.Text = \"Open File...\";\n            this.openFileToolStripMenuItem.Click += new System.EventHandler(this.openFileToolStripMenuItem_Click);\n            // \n            // toolStripSeparator2\n            // \n            this.toolStripSeparator2.Name = \"toolStripSeparator2\";\n            this.toolStripSeparator2.Size = new System.Drawing.Size(187, 6);\n            // \n            // editDetailsToolStripMenuItem\n            // \n            this.editDetailsToolStripMenuItem.Name = \"editDetailsToolStripMenuItem\";\n            this.editDetailsToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.editDetailsToolStripMenuItem.Text = \"Edit Details...\";\n            this.editDetailsToolStripMenuItem.Click += new System.EventHandler(this.editDetailsToolStripMenuItem_Click);\n            // \n            // toolStripSeparator3\n            // \n            this.toolStripSeparator3.Name = \"toolStripSeparator3\";\n            this.toolStripSeparator3.Size = new System.Drawing.Size(187, 6);\n            // \n            // moveUpToolStripMenuItem\n            // \n            this.moveUpToolStripMenuItem.Name = \"moveUpToolStripMenuItem\";\n            this.moveUpToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.moveUpToolStripMenuItem.Text = \"Move Up\";\n            this.moveUpToolStripMenuItem.Click += new System.EventHandler(this.moveUpToolStripMenuItem_Click);\n            // \n            // moveDownToolStripMenuItem\n            // \n            this.moveDownToolStripMenuItem.Name = \"moveDownToolStripMenuItem\";\n            this.moveDownToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.moveDownToolStripMenuItem.Text = \"Move Down\";\n            this.moveDownToolStripMenuItem.Click += new System.EventHandler(this.moveDownToolStripMenuItem_Click);\n            // \n            // setFirstToolStripMenuItem\n            // \n            this.setFirstToolStripMenuItem.Name = \"setFirstToolStripMenuItem\";\n            this.setFirstToolStripMenuItem.Size = new System.Drawing.Size(190, 32);\n            this.setFirstToolStripMenuItem.Text = \"Set First\";\n            this.setFirstToolStripMenuItem.Click += new System.EventHandler(this.setFirstToolStripMenuItem_Click);\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.tabControl, 0, 1);\n            this.tblMain.Controls.Add(this.flpButtons, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Size = new System.Drawing.Size(1044, 403);\n            this.tblMain.TabIndex = 1;\n            // \n            // tabControl\n            // \n            this.tabControl.Controls.Add(tabPageScreenshots);\n            this.tabControl.Controls.Add(this.tabPageDemos);\n            this.tabControl.Controls.Add(this.tabPageSaveGames);\n            this.tabControl.Controls.Add(this.tabPageStatistics);\n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;\n            this.tabControl.Location = new System.Drawing.Point(4, 45);\n            this.tabControl.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabControl.Multiline = true;\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(1036, 353);\n            this.tabControl.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;\n            this.tabControl.TabIndex = 0;\n            // \n            // tabPageDemos\n            // \n            this.tabPageDemos.Controls.Add(this.ctrlDemoView);\n            this.tabPageDemos.Location = new System.Drawing.Point(4, 29);\n            this.tabPageDemos.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPageDemos.Name = \"tabPageDemos\";\n            this.tabPageDemos.Size = new System.Drawing.Size(1027, 324);\n            this.tabPageDemos.TabIndex = 1;\n            this.tabPageDemos.Text = \"Demos\";\n            this.tabPageDemos.UseVisualStyleBackColor = true;\n            // \n            // ctrlDemoView\n            // \n            this.ctrlDemoView.DataDirectory = null;\n            this.ctrlDemoView.DataSourceAdapter = null;\n            this.ctrlDemoView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlDemoView.FileType = DoomLauncher.FileType.Unknown;\n            this.ctrlDemoView.GameFile = null;\n            this.ctrlDemoView.Location = new System.Drawing.Point(0, 0);\n            this.ctrlDemoView.Margin = new System.Windows.Forms.Padding(6, 8, 6, 8);\n            this.ctrlDemoView.Name = \"ctrlDemoView\";\n            this.ctrlDemoView.Size = new System.Drawing.Size(1027, 324);\n            this.ctrlDemoView.TabIndex = 0;\n            // \n            // tabPageSaveGames\n            // \n            this.tabPageSaveGames.Controls.Add(this.ctrlSaveGameView);\n            this.tabPageSaveGames.Location = new System.Drawing.Point(4, 29);\n            this.tabPageSaveGames.Margin = new System.Windows.Forms.Padding(0);\n            this.tabPageSaveGames.Name = \"tabPageSaveGames\";\n            this.tabPageSaveGames.Size = new System.Drawing.Size(1027, 324);\n            this.tabPageSaveGames.TabIndex = 2;\n            this.tabPageSaveGames.Text = \"Save Games\";\n            this.tabPageSaveGames.UseVisualStyleBackColor = true;\n            // \n            // ctrlSaveGameView\n            // \n            this.ctrlSaveGameView.DataDirectory = null;\n            this.ctrlSaveGameView.DataSourceAdapter = null;\n            this.ctrlSaveGameView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlSaveGameView.FileType = DoomLauncher.FileType.Unknown;\n            this.ctrlSaveGameView.GameFile = null;\n            this.ctrlSaveGameView.Location = new System.Drawing.Point(0, 0);\n            this.ctrlSaveGameView.Margin = new System.Windows.Forms.Padding(6, 8, 6, 8);\n            this.ctrlSaveGameView.Name = \"ctrlSaveGameView\";\n            this.ctrlSaveGameView.Size = new System.Drawing.Size(1027, 324);\n            this.ctrlSaveGameView.TabIndex = 1;\n            // \n            // tabPageStatistics\n            // \n            this.tabPageStatistics.Controls.Add(this.ctrlViewStats);\n            this.tabPageStatistics.Location = new System.Drawing.Point(4, 29);\n            this.tabPageStatistics.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPageStatistics.Name = \"tabPageStatistics\";\n            this.tabPageStatistics.Size = new System.Drawing.Size(1027, 324);\n            this.tabPageStatistics.TabIndex = 3;\n            this.tabPageStatistics.Text = \"Statistics\";\n            this.tabPageStatistics.UseVisualStyleBackColor = true;\n            // \n            // ctrlViewStats\n            // \n            this.ctrlViewStats.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.ctrlViewStats.DataSourceAdapter = null;\n            this.ctrlViewStats.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlViewStats.ForeColor = System.Drawing.Color.White;\n            this.ctrlViewStats.GameFile = null;\n            this.ctrlViewStats.Location = new System.Drawing.Point(0, 0);\n            this.ctrlViewStats.Margin = new System.Windows.Forms.Padding(6, 8, 6, 8);\n            this.ctrlViewStats.Name = \"ctrlViewStats\";\n            this.ctrlViewStats.Size = new System.Drawing.Size(1027, 324);\n            this.ctrlViewStats.TabIndex = 0;\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnCopy);\n            this.flpButtons.Controls.Add(this.btnCopyAll);\n            this.flpButtons.Controls.Add(this.btnDelete);\n            this.flpButtons.Controls.Add(this.btnAddFile);\n            this.flpButtons.Controls.Add(this.btnOpenFile);\n            this.flpButtons.Controls.Add(this.btnEdit);\n            this.flpButtons.Controls.Add(this.btnMoveUp);\n            this.flpButtons.Controls.Add(this.btnMoveDown);\n            this.flpButtons.Controls.Add(this.btnSetFirst);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.Location = new System.Drawing.Point(0, 0);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(1044, 40);\n            this.flpButtons.TabIndex = 2;\n            // \n            // btnCopy\n            // \n            this.btnCopy.Image = global::DoomLauncher.Properties.Resources.Export;\n            this.btnCopy.Location = new System.Drawing.Point(0, 0);\n            this.btnCopy.Margin = new System.Windows.Forms.Padding(0);\n            this.btnCopy.Name = \"btnCopy\";\n            this.btnCopy.Size = new System.Drawing.Size(40, 40);\n            this.btnCopy.TabIndex = 0;\n            this.btnCopy.UseVisualStyleBackColor = true;\n            this.btnCopy.Click += new System.EventHandler(this.btnCopy_Click);\n            // \n            // btnCopyAll\n            // \n            this.btnCopyAll.Image = global::DoomLauncher.Properties.Resources.ExportAll;\n            this.btnCopyAll.Location = new System.Drawing.Point(40, 0);\n            this.btnCopyAll.Margin = new System.Windows.Forms.Padding(0);\n            this.btnCopyAll.Name = \"btnCopyAll\";\n            this.btnCopyAll.Size = new System.Drawing.Size(40, 40);\n            this.btnCopyAll.TabIndex = 1;\n            this.btnCopyAll.UseVisualStyleBackColor = true;\n            this.btnCopyAll.Click += new System.EventHandler(this.btnCopyAll_Click);\n            // \n            // btnDelete\n            // \n            this.btnDelete.Image = global::DoomLauncher.Properties.Resources.Delete;\n            this.btnDelete.Location = new System.Drawing.Point(80, 0);\n            this.btnDelete.Margin = new System.Windows.Forms.Padding(0);\n            this.btnDelete.Name = \"btnDelete\";\n            this.btnDelete.Size = new System.Drawing.Size(40, 40);\n            this.btnDelete.TabIndex = 2;\n            this.btnDelete.UseVisualStyleBackColor = true;\n            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);\n            // \n            // btnAddFile\n            // \n            this.btnAddFile.Image = global::DoomLauncher.Properties.Resources.File;\n            this.btnAddFile.Location = new System.Drawing.Point(120, 0);\n            this.btnAddFile.Margin = new System.Windows.Forms.Padding(0);\n            this.btnAddFile.Name = \"btnAddFile\";\n            this.btnAddFile.Size = new System.Drawing.Size(40, 40);\n            this.btnAddFile.TabIndex = 3;\n            this.btnAddFile.UseVisualStyleBackColor = true;\n            this.btnAddFile.Click += new System.EventHandler(this.btnAddFile_Click);\n            // \n            // btnOpenFile\n            // \n            this.btnOpenFile.Image = global::DoomLauncher.Properties.Resources.FolderOpen;\n            this.btnOpenFile.Location = new System.Drawing.Point(160, 0);\n            this.btnOpenFile.Margin = new System.Windows.Forms.Padding(0);\n            this.btnOpenFile.Name = \"btnOpenFile\";\n            this.btnOpenFile.Size = new System.Drawing.Size(40, 40);\n            this.btnOpenFile.TabIndex = 4;\n            this.btnOpenFile.UseVisualStyleBackColor = true;\n            this.btnOpenFile.Click += new System.EventHandler(this.btnOpenFile_Click);\n            // \n            // btnEdit\n            // \n            this.btnEdit.Image = global::DoomLauncher.Properties.Resources.Edit;\n            this.btnEdit.Location = new System.Drawing.Point(200, 0);\n            this.btnEdit.Margin = new System.Windows.Forms.Padding(0);\n            this.btnEdit.Name = \"btnEdit\";\n            this.btnEdit.Size = new System.Drawing.Size(40, 40);\n            this.btnEdit.TabIndex = 5;\n            this.btnEdit.UseVisualStyleBackColor = true;\n            this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);\n            // \n            // btnMoveUp\n            // \n            this.btnMoveUp.Image = global::DoomLauncher.Properties.Resources.UpArrow;\n            this.btnMoveUp.Location = new System.Drawing.Point(240, 0);\n            this.btnMoveUp.Margin = new System.Windows.Forms.Padding(0);\n            this.btnMoveUp.Name = \"btnMoveUp\";\n            this.btnMoveUp.Size = new System.Drawing.Size(40, 40);\n            this.btnMoveUp.TabIndex = 6;\n            this.btnMoveUp.UseVisualStyleBackColor = true;\n            this.btnMoveUp.Click += new System.EventHandler(this.btnMoveUp_Click);\n            // \n            // btnMoveDown\n            // \n            this.btnMoveDown.Image = global::DoomLauncher.Properties.Resources.DownArrow;\n            this.btnMoveDown.Location = new System.Drawing.Point(280, 0);\n            this.btnMoveDown.Margin = new System.Windows.Forms.Padding(0);\n            this.btnMoveDown.Name = \"btnMoveDown\";\n            this.btnMoveDown.Size = new System.Drawing.Size(40, 40);\n            this.btnMoveDown.TabIndex = 7;\n            this.btnMoveDown.UseVisualStyleBackColor = true;\n            this.btnMoveDown.Click += new System.EventHandler(this.btnMoveDown_Click);\n            // \n            // btnSetFirst\n            // \n            this.btnSetFirst.Image = global::DoomLauncher.Properties.Resources.StepBack;\n            this.btnSetFirst.Location = new System.Drawing.Point(320, 0);\n            this.btnSetFirst.Margin = new System.Windows.Forms.Padding(0);\n            this.btnSetFirst.Name = \"btnSetFirst\";\n            this.btnSetFirst.Size = new System.Drawing.Size(40, 40);\n            this.btnSetFirst.TabIndex = 8;\n            this.btnSetFirst.UseVisualStyleBackColor = true;\n            this.btnSetFirst.Click += new System.EventHandler(this.btnSetFirst_Click);\n            // \n            // GameFileAssociationView\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"GameFileAssociationView\";\n            this.Size = new System.Drawing.Size(1044, 403);\n            tabPageScreenshots.ResumeLayout(false);\n            this.mnuOptions.ResumeLayout(false);\n            this.tblMain.ResumeLayout(false);\n            this.tabControl.ResumeLayout(false);\n            this.tabPageDemos.ResumeLayout(false);\n            this.tabPageSaveGames.ResumeLayout(false);\n            this.tabPageStatistics.ResumeLayout(false);\n            this.flpButtons.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CTabControl tabControl;\n        private ScreenshotView ctrlScreenshotView;\n        private System.Windows.Forms.TabPage tabPageDemos;\n        private GenericFileView ctrlDemoView;\n        private System.Windows.Forms.ContextMenuStrip mnuOptions;\n        private System.Windows.Forms.ToolStripMenuItem copyFileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem copyAllFilesToolStripMenuItem;\n        private System.Windows.Forms.TabPage tabPageSaveGames;\n        private GenericFileView ctrlSaveGameView;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\n        private System.Windows.Forms.ToolStripMenuItem addFileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;\n        private System.Windows.Forms.ToolStripMenuItem editDetailsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;\n        private System.Windows.Forms.ToolStripMenuItem moveUpToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem moveDownToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem setFirstToolStripMenuItem;\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.ToolStripMenuItem openFileToolStripMenuItem;\n        private System.Windows.Forms.TabPage tabPageStatistics;\n        private StatisticsView ctrlViewStats;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private FormButton btnCopy;\n        private FormButton btnCopyAll;\n        private FormButton btnDelete;\n        private FormButton btnAddFile;\n        private FormButton btnOpenFile;\n        private FormButton btnEdit;\n        private FormButton btnMoveUp;\n        private FormButton btnMoveDown;\n        private FormButton btnSetFirst;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileAssociationView.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\nusing DoomLauncher.Handlers;\n\nnamespace DoomLauncher\n{\n    public partial class GameFileAssociationView : UserControl\n    {\n        public event EventHandler FileAdded;\n        public event EventHandler FileDeleted;\n        public event EventHandler FileOrderChanged;\n        public event EventHandler FileDetailsChanged;\n        public event EventHandler<RequestScreenshotsEventArgs> RequestScreenshots;\n\n        private readonly ToolTipGroup m_toolTipGroup = new ToolTipGroup();\n        private IGameFile m_gameFile;\n\n        public GameFileAssociationView()\n        {\n            InitializeComponent();\n\n            tabControl.SelectedIndexChanged += tabControl_SelectedIndexChanged;\n\n            ctrlScreenshotView.FileType = FileType.Screenshot;\n            ctrlSaveGameView.FileType = FileType.SaveGame;\n            ctrlDemoView.FileType = FileType.Demo;\n\n            ctrlScreenshotView.RequestScreenshots += CtrlScreenshotView_RequestScreenshots;\n            SetButtonsAllButtonsEnabled(false);\n\n            Icons.DpiScale = new DpiScale(CreateGraphics());\n            btnDelete.Image = Icons.Delete;\n            btnAddFile.Image = Icons.File;\n            btnCopy.Image = Icons.Export;\n            btnCopyAll.Image = Icons.ExportAll;\n            btnEdit.Image = Icons.Edit;\n            btnMoveUp.Image = Icons.ArrowUp;\n            btnMoveDown.Image = Icons.ArrowDown;\n            btnSetFirst.Image = Icons.StepBack;\n            btnOpenFile.Image = Icons.FolderOpen;\n\n            m_toolTipGroup.SetToolTip(btnDelete, \"Delete\");\n            m_toolTipGroup.SetToolTip(btnAddFile, \"Add File\");\n            m_toolTipGroup.SetToolTip(btnCopy, \"Export\");\n            m_toolTipGroup.SetToolTip(btnCopyAll, \"Export All\");\n            m_toolTipGroup.SetToolTip(btnEdit, \"Edit\");\n            m_toolTipGroup.SetToolTip(btnMoveUp, \"Move Up\");\n            m_toolTipGroup.SetToolTip(btnMoveDown, \"Move Down\");\n            m_toolTipGroup.SetToolTip(btnSetFirst, \"Set First\");\n            m_toolTipGroup.SetToolTip(btnOpenFile, \"Open File\");\n\n            Stylizer.StylizeControl(this, DesignMode);\n            Stylizer.StylizeControl(mnuOptions, DesignMode);\n        }\n\n        private void CtrlScreenshotView_RequestScreenshots(object sender, RequestScreenshotsEventArgs e)\n        {\n            RequestScreenshots?.Invoke(this, e);\n        }\n\n        public void SetScreenshots(List<IFileData> screenshots)\n        {\n            ctrlScreenshotView.SetScreenshots(screenshots);\n        }\n\n        public void Initialize(IDataSourceAdapter adapter, AppConfiguration config)\n        {\n            DataSourceAdapter = adapter;\n            ScreenshotDirectory = config.ScreenshotDirectory;\n            SaveGameDirectory = config.SaveGameDirectory;\n\n            ctrlScreenshotView.DataSourceAdapter = DataSourceAdapter;\n            ctrlScreenshotView.DataDirectory = ScreenshotDirectory;\n            ctrlScreenshotView.FileType = FileType.Screenshot;\n            ctrlScreenshotView.SetContextMenu(BuildContextMenuStrip(ctrlScreenshotView));\n            ctrlScreenshotView.SetPictureWidth(config.ScreenshotPreviewSize);\n\n            ctrlSaveGameView.DataSourceAdapter = DataSourceAdapter;\n            ctrlSaveGameView.DataDirectory = SaveGameDirectory;\n            ctrlSaveGameView.FileType = FileType.SaveGame;\n            ctrlSaveGameView.SetContextMenu(BuildContextMenuStrip(ctrlSaveGameView));\n\n            ctrlDemoView.DataSourceAdapter = DataSourceAdapter;\n            ctrlDemoView.DataDirectory = config.DemoDirectory;\n            ctrlDemoView.FileType = FileType.Demo;\n            ctrlDemoView.SetContextMenu(BuildContextMenuStrip(ctrlDemoView));\n\n            ctrlViewStats.DataSourceAdapter = DataSourceAdapter;\n            ctrlViewStats.SetContextMenu(BuildContextMenuStrip(ctrlViewStats));\n\n            SetButtonsEnabled(CurrentView);\n        }\n\n        private IFileAssociationView[] GetViews()\n        {\n            return new IFileAssociationView[] { ctrlScreenshotView, ctrlDemoView, ctrlSaveGameView, ctrlViewStats };\n        }\n\n        public void SetData(IGameFile gameFile)\n        {\n            m_gameFile = gameFile;\n            Array.ForEach(GetViews(), x => SetViewData(x, gameFile));\n            SetButtonsEnabled(CurrentView);\n        }\n\n        private void SetViewData(IFileAssociationView view, IGameFile gameFile)\n        {\n            view.GameFile = gameFile;\n            view.SetData(gameFile);\n        }\n\n        public void ClearData()\n        {\n            m_gameFile = null;\n            Array.ForEach(GetViews(), x => x.ClearData());\n            SetButtonsAllButtonsEnabled(false);\n        }\n\n        public IDataSourceAdapter DataSourceAdapter { get; set; }\n        public LauncherPath ScreenshotDirectory { get; set; }\n        public LauncherPath SaveGameDirectory { get; set; }\n\n        private void tabControl_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (CurrentView != null && m_gameFile != null)\n                SetButtonsEnabled(CurrentView);\n        }\n\n        private void SetButtonsEnabled(IFileAssociationView view)\n        {\n            SetIconButtonEnabled(btnAddFile, IconImage.File, view.NewAllowed);\n            SetIconButtonEnabled(btnCopy, IconImage.Export, view.CopyOrExportAllowed);\n            SetIconButtonEnabled(btnCopyAll, IconImage.ExportAll, view.CopyOrExportAllowed);\n            SetIconButtonEnabled(btnDelete, IconImage.Delete, view.DeleteAllowed);\n            SetIconButtonEnabled(btnEdit, IconImage.Edit, view.EditAllowed);\n            SetIconButtonEnabled(btnMoveDown, IconImage.DownArrow, view.EditAllowed);\n            SetIconButtonEnabled(btnMoveUp, IconImage.UpArrow, view.EditAllowed);\n            SetIconButtonEnabled(btnSetFirst, IconImage.StepBack, view.EditAllowed);\n            SetIconButtonEnabled(btnOpenFile, IconImage.FolderOpen, view.ViewAllowed);\n        }\n\n        public void SetButtonsAllButtonsEnabled(bool enabled)\n        {\n            SetIconButtonEnabled(btnAddFile, IconImage.File, enabled);\n            SetIconButtonEnabled(btnCopy, IconImage.Export, enabled);\n            SetIconButtonEnabled(btnCopyAll, IconImage.ExportAll, enabled);\n            SetIconButtonEnabled(btnDelete, IconImage.Delete, enabled);\n            SetIconButtonEnabled(btnEdit, IconImage.Edit, enabled);\n            SetIconButtonEnabled(btnMoveDown, IconImage.DownArrow, enabled);\n            SetIconButtonEnabled(btnMoveUp, IconImage.UpArrow, enabled);\n            SetIconButtonEnabled(btnSetFirst, IconImage.StepBack, enabled);\n            SetIconButtonEnabled(btnOpenFile, IconImage.FolderOpen, enabled);\n        }\n\n        private void SetIconButtonEnabled(FormButton button, IconImage iconImage, bool enabled)\n        {\n            button.Enabled = enabled;\n            button.Image = Icons.GetIcon(iconImage, enabled ?  ColorTheme.Current.Text : ColorTheme.Current.DisabledText);\n        }\n\n        private IFileAssociationView CurrentView =>\n            tabControl.SelectedTab.Controls[0] as IFileAssociationView;\n        \n        private void copyFileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleCopy();\n        }\n\n        private void HandleCopy()\n        {\n            if (CurrentView != null && CurrentView.CopyOrExportAllowed)\n                CurrentView.CopyToClipboard();\n        }\n\n        private void copyAllFilesToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleCopyAll();\n        }\n\n        private void HandleCopyAll()\n        {\n            if (CurrentView != null && CurrentView.CopyOrExportAllowed)\n                CurrentView.CopyAllToClipboard();\n        }\n\n        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleDelete();\n        }\n\n        private void HandleDelete()\n        {\n            if (CurrentView != null && CurrentView.DeleteAllowed && CurrentView.Delete())\n                FileDeleted?.Invoke(this, EventArgs.Empty);\n        }\n\n        private void addFileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleAdd();\n        }\n\n        private void HandleAdd()\n        {\n            if (CurrentView != null && CurrentView.NewAllowed && CurrentView.New())\n            {\n                FileAdded?.Invoke(this, EventArgs.Empty);\n                SetData(m_gameFile);\n            }\n        }\n\n        private void exportToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleExport();\n        }\n\n        private void exportAllToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleExportAll();\n        }\n\n        private void HandleExport()\n        {\n            if (CurrentView != null && CurrentView.CopyOrExportAllowed)\n                CurrentView.Export();\n        }\n\n        private void HandleExportAll()\n        {\n            if (CurrentView != null && CurrentView.CopyOrExportAllowed)\n                CurrentView.ExportAll();\n        }\n\n        private void editDetailsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleEdit();\n        }\n\n        private void HandleEdit()\n        {\n            if (CurrentView != null && CurrentView.EditAllowed && CurrentView.Edit())\n            {\n                SetData(m_gameFile);\n                FileDetailsChanged?.Invoke(this, EventArgs.Empty);\n            }\n        }\n\n        private void moveUpToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            SetFilePriority(true);\n        }\n\n        private void moveDownToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            SetFilePriority(false);\n        }\n\n        private void setFirstToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleSetFirst();\n        }\n\n        private void HandleSetFirst()\n        {\n            if (CurrentView != null && CurrentView.ChangeOrderAllowed && \n                CurrentView.SetFileOrderFirst())\n            {\n                SetData(m_gameFile);\n                FileOrderChanged?.Invoke(this, EventArgs.Empty);\n            }\n        }\n\n        private void SetFilePriority(bool up)\n        {\n            bool success = false;\n\n            if (CurrentView != null && CurrentView.ChangeOrderAllowed)\n            {\n                if (up)\n                    success = CurrentView.MoveFileOrderUp();\n                else\n                    success = CurrentView.MoveFileOrderDown();\n            }\n\n            if (success)\n            {\n                SetData(m_gameFile);\n                FileOrderChanged?.Invoke(this, EventArgs.Empty);\n            }\n        }\n\n        private void btnCopy_Click(object sender, EventArgs e)\n        {\n            HandleExport();\n        }\n\n        private void btnCopyAll_Click(object sender, EventArgs e)\n        {\n            HandleExportAll();\n        }\n\n        private void btnDelete_Click(object sender, EventArgs e)\n        {\n            HandleDelete();\n        }\n\n        private void btnAddFile_Click(object sender, EventArgs e)\n        {\n            HandleAdd();\n        }\n\n        private void btnEdit_Click(object sender, EventArgs e)\n        {\n            HandleEdit();\n        }\n\n        private void btnMoveUp_Click(object sender, EventArgs e)\n        {\n            SetFilePriority(true);\n        }\n\n        private void btnMoveDown_Click(object sender, EventArgs e)\n        {\n            SetFilePriority(false);\n        }\n\n        private void btnSetFirst_Click(object sender, EventArgs e)\n        {\n            HandleSetFirst();\n        }\n\n        private void btnOpenFile_Click(object sender, EventArgs e)\n        {\n            HandleView();\n        }\n\n        private void HandleView()\n        {\n            if (CurrentView != null && CurrentView.ViewAllowed)\n            {\n                CurrentView.View();\n            }\n        }\n\n        private void openFileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleView();\n        }\n\n        private ContextMenuStrip BuildContextMenuStrip(IFileAssociationView view)\n        {\n            ContextMenuStrip menu = new ContextMenuStrip();\n\n            if (view.CopyOrExportAllowed)\n            {\n                CreateMenuItem(menu, \"Export...\", exportToolStripMenuItem_Click);\n                CreateMenuItem(menu, \"Export All...\", exportAllToolStripMenuItem_Click);\n                AddSeperator(menu);\n                CreateMenuItem(menu, \"Copy\", copyFileToolStripMenuItem_Click);\n                CreateMenuItem(menu, \"Copy All\", copyAllFilesToolStripMenuItem_Click);\n            }\n\n            if (view.DeleteAllowed)\n                CreateMenuItem(menu, \"Delete\", deleteToolStripMenuItem_Click);\n\n            AddSeperator(menu);\n\n            if (view.NewAllowed)\n                CreateMenuItem(menu, \"Add File...\", addFileToolStripMenuItem_Click);\n            if (view.ViewAllowed)\n                CreateMenuItem(menu, \"Open File...\", openFileToolStripMenuItem_Click);\n\n            AddSeperator(menu);\n\n            if (view.EditAllowed)\n                CreateMenuItem(menu, \"Edit Details...\", editDetailsToolStripMenuItem_Click);\n\n            AddSeperator(menu);\n\n            if (view.ChangeOrderAllowed)\n            {\n                CreateMenuItem(menu, \"Move Up\", moveUpToolStripMenuItem_Click);\n                CreateMenuItem(menu, \"Move Down\", moveDownToolStripMenuItem_Click);\n                CreateMenuItem(menu, \"Set First\", setFirstToolStripMenuItem_Click);\n            }\n\n            var customMenuOptions = view.MenuOptions;\n            if (customMenuOptions.Count > 0)\n            {\n                AddSeperator(menu);\n                foreach (var option in customMenuOptions)\n                {\n                    CreateMenuItem(menu, option.Title, (sender, eventArgs) =>\n                    {\n                        if (!option.Action())\n                            return;\n                        // Update data and assume the file order changed\n                        SetData(m_gameFile);\n                        FileOrderChanged?.Invoke(this, EventArgs.Empty);\n                    });\n                }\n            }\n\n            FinalizeMenu(menu);\n\n            return menu;\n        }\n\n        private void FinalizeMenu(System.Windows.Forms.ContextMenuStrip menu)\n        {\n            if (menu.Items.Count > 0 && menu.Items[menu.Items.Count - 1] is ToolStripSeparator)\n                menu.Items.Remove(menu.Items[menu.Items.Count - 1]);\n        }\n\n        private static void AddSeperator(ContextMenuStrip menu)\n        {\n            if (menu.Items.Count > 0 && !(menu.Items[menu.Items.Count - 1] is ToolStripSeparator))\n                menu.Items.Add(new ToolStripSeparator());\n        }\n\n        private static void CreateMenuItem(ContextMenuStrip menu, string text, EventHandler handler)\n        {\n            ToolStripMenuItem item = new ToolStripMenuItem(text);\n            item.Click += handler;\n            menu.Items.Add(item);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileAssociationView.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"tabPageScreenshots.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>False</value>\n  </metadata>\n  <metadata name=\"mnuOptions.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/GameFileEdit.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GameFileEdit\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.label9 = new System.Windows.Forms.Label();\n            this.lblTags = new System.Windows.Forms.LinkLabel();\n            this.txtAuthor = new System.Windows.Forms.TextBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label4 = new System.Windows.Forms.Label();\n            this.label5 = new System.Windows.Forms.Label();\n            this.label6 = new System.Windows.Forms.Label();\n            this.txtTitle = new System.Windows.Forms.TextBox();\n            this.dtRelease = new System.Windows.Forms.DateTimePicker();\n            this.ctrlStarRating = new DoomLauncher.RatingControl();\n            this.label7 = new System.Windows.Forms.Label();\n            this.chkTitle = new DoomLauncher.CCheckBox();\n            this.chkAuthor = new DoomLauncher.CCheckBox();\n            this.chkReleaseDate = new DoomLauncher.CCheckBox();\n            this.chkRating = new DoomLauncher.CCheckBox();\n            this.chkDescription = new DoomLauncher.CCheckBox();\n            this.chkComments = new DoomLauncher.CCheckBox();\n            this.txtDescription = new DoomLauncher.Controls.CRichTextBox();\n            this.txtComments = new DoomLauncher.Controls.CRichTextBox();\n            this.chkTags = new DoomLauncher.CCheckBox();\n            this.label8 = new System.Windows.Forms.Label();\n            this.lblFile = new DoomLauncher.GrowLabel();\n            this.chkMaps = new DoomLauncher.CCheckBox();\n            this.lnkMapsEdit = new System.Windows.Forms.LinkLabel();\n            this.flpRating = new System.Windows.Forms.FlowLayoutPanel();\n            this.lnkClearRating = new System.Windows.Forms.LinkLabel();\n            this.tblMain.SuspendLayout();\n            this.flpRating.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 3;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.label9, 0, 8);\n            this.tblMain.Controls.Add(this.lblTags, 2, 5);\n            this.tblMain.Controls.Add(this.txtAuthor, 2, 2);\n            this.tblMain.Controls.Add(this.label1, 0, 1);\n            this.tblMain.Controls.Add(this.label2, 0, 2);\n            this.tblMain.Controls.Add(this.label3, 0, 3);\n            this.tblMain.Controls.Add(this.label4, 0, 4);\n            this.tblMain.Controls.Add(this.label5, 0, 6);\n            this.tblMain.Controls.Add(this.label6, 0, 7);\n            this.tblMain.Controls.Add(this.txtTitle, 2, 1);\n            this.tblMain.Controls.Add(this.dtRelease, 2, 3);\n            this.tblMain.Controls.Add(this.label7, 0, 5);\n            this.tblMain.Controls.Add(this.chkTitle, 1, 1);\n            this.tblMain.Controls.Add(this.chkAuthor, 1, 2);\n            this.tblMain.Controls.Add(this.chkReleaseDate, 1, 3);\n            this.tblMain.Controls.Add(this.chkRating, 1, 4);\n            this.tblMain.Controls.Add(this.chkDescription, 1, 6);\n            this.tblMain.Controls.Add(this.chkComments, 1, 7);\n            this.tblMain.Controls.Add(this.txtDescription, 2, 6);\n            this.tblMain.Controls.Add(this.txtComments, 2, 7);\n            this.tblMain.Controls.Add(this.chkTags, 1, 5);\n            this.tblMain.Controls.Add(this.label8, 0, 0);\n            this.tblMain.Controls.Add(this.lblFile, 2, 0);\n            this.tblMain.Controls.Add(this.chkMaps, 1, 8);\n            this.tblMain.Controls.Add(this.lnkMapsEdit, 2, 8);\n            this.tblMain.Controls.Add(this.flpRating, 2, 4);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 10;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 36F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 160F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 160F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));\n            this.tblMain.Size = new System.Drawing.Size(349, 553);\n            this.tblMain.TabIndex = 0;\n            // \n            // label9\n            // \n            this.label9.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label9.AutoSize = true;\n            this.label9.Location = new System.Drawing.Point(3, 497);\n            this.label9.Name = \"label9\";\n            this.label9.Size = new System.Drawing.Size(33, 13);\n            this.label9.TabIndex = 25;\n            this.label9.Text = \"Maps\";\n            // \n            // lblTags\n            // \n            this.lblTags.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblTags.AutoSize = true;\n            this.lblTags.Location = new System.Drawing.Point(103, 153);\n            this.lblTags.Name = \"lblTags\";\n            this.lblTags.Size = new System.Drawing.Size(31, 13);\n            this.lblTags.TabIndex = 13;\n            this.lblTags.TabStop = true;\n            this.lblTags.Text = \"Tags\";\n            this.lblTags.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lblTags_LinkClicked);\n            // \n            // txtAuthor\n            // \n            this.txtAuthor.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtAuthor.Location = new System.Drawing.Point(103, 67);\n            this.txtAuthor.Name = \"txtAuthor\";\n            this.txtAuthor.Size = new System.Drawing.Size(243, 20);\n            this.txtAuthor.TabIndex = 7;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(3, 45);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(27, 13);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Title\";\n            // \n            // label2\n            // \n            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(3, 69);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(38, 13);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"Author\";\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(3, 93);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(72, 13);\n            this.label3.TabIndex = 2;\n            this.label3.Text = \"Release Date\";\n            // \n            // label4\n            // \n            this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(3, 123);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(38, 13);\n            this.label4.TabIndex = 3;\n            this.label4.Text = \"Rating\";\n            // \n            // label5\n            // \n            this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(3, 245);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(60, 13);\n            this.label5.TabIndex = 4;\n            this.label5.Text = \"Description\";\n            // \n            // label6\n            // \n            this.label6.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label6.AutoSize = true;\n            this.label6.Location = new System.Drawing.Point(3, 405);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(56, 13);\n            this.label6.TabIndex = 5;\n            this.label6.Text = \"Comments\";\n            // \n            // txtTitle\n            // \n            this.txtTitle.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtTitle.Location = new System.Drawing.Point(103, 43);\n            this.txtTitle.Name = \"txtTitle\";\n            this.txtTitle.Size = new System.Drawing.Size(243, 20);\n            this.txtTitle.TabIndex = 6;\n            // \n            // dtRelease\n            // \n            this.dtRelease.Format = System.Windows.Forms.DateTimePickerFormat.Custom;\n            this.dtRelease.Location = new System.Drawing.Point(103, 91);\n            this.dtRelease.Name = \"dtRelease\";\n            this.dtRelease.ShowCheckBox = true;\n            this.dtRelease.Size = new System.Drawing.Size(200, 20);\n            this.dtRelease.TabIndex = 8;\n            // \n            // label7\n            // \n            this.label7.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label7.AutoSize = true;\n            this.label7.Location = new System.Drawing.Point(3, 153);\n            this.label7.Name = \"label7\";\n            this.label7.Size = new System.Drawing.Size(31, 13);\n            this.label7.TabIndex = 12;\n            this.label7.Text = \"Tags\";\n            // \n            // chkTitle\n            // \n            this.chkTitle.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.chkTitle.AutoSize = true;\n            this.chkTitle.Checked = true;\n            this.chkTitle.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkTitle.Location = new System.Drawing.Point(83, 46);\n            this.chkTitle.Margin = new System.Windows.Forms.Padding(3, 6, 3, 3);\n            this.chkTitle.Name = \"chkTitle\";\n            this.chkTitle.Size = new System.Drawing.Size(14, 15);\n            this.chkTitle.TabIndex = 14;\n            this.chkTitle.Text = \"checkBox1\";\n            this.chkTitle.UseVisualStyleBackColor = true;\n            // \n            // chkAuthor\n            // \n            this.chkAuthor.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.chkAuthor.AutoSize = true;\n            this.chkAuthor.Checked = true;\n            this.chkAuthor.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkAuthor.Location = new System.Drawing.Point(83, 70);\n            this.chkAuthor.Margin = new System.Windows.Forms.Padding(3, 6, 3, 3);\n            this.chkAuthor.Name = \"chkAuthor\";\n            this.chkAuthor.Size = new System.Drawing.Size(14, 15);\n            this.chkAuthor.TabIndex = 15;\n            this.chkAuthor.Text = \"checkBox2\";\n            this.chkAuthor.UseVisualStyleBackColor = true;\n            // \n            // chkReleaseDate\n            // \n            this.chkReleaseDate.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.chkReleaseDate.AutoSize = true;\n            this.chkReleaseDate.Checked = true;\n            this.chkReleaseDate.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkReleaseDate.Location = new System.Drawing.Point(83, 94);\n            this.chkReleaseDate.Margin = new System.Windows.Forms.Padding(3, 6, 3, 3);\n            this.chkReleaseDate.Name = \"chkReleaseDate\";\n            this.chkReleaseDate.Size = new System.Drawing.Size(14, 15);\n            this.chkReleaseDate.TabIndex = 16;\n            this.chkReleaseDate.Text = \"checkBox3\";\n            this.chkReleaseDate.UseVisualStyleBackColor = true;\n            // \n            // chkRating\n            // \n            this.chkRating.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.chkRating.AutoSize = true;\n            this.chkRating.Checked = true;\n            this.chkRating.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkRating.Location = new System.Drawing.Point(83, 118);\n            this.chkRating.Margin = new System.Windows.Forms.Padding(3, 6, 3, 3);\n            this.chkRating.Name = \"chkRating\";\n            this.chkRating.Size = new System.Drawing.Size(14, 17);\n            this.chkRating.TabIndex = 17;\n            this.chkRating.Text = \"checkBox4\";\n            this.chkRating.UseVisualStyleBackColor = true;\n            // \n            // chkDescription\n            // \n            this.chkDescription.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.chkDescription.AutoSize = true;\n            this.chkDescription.Checked = true;\n            this.chkDescription.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkDescription.Location = new System.Drawing.Point(83, 178);\n            this.chkDescription.Margin = new System.Windows.Forms.Padding(3, 6, 3, 3);\n            this.chkDescription.Name = \"chkDescription\";\n            this.chkDescription.Size = new System.Drawing.Size(14, 17);\n            this.chkDescription.TabIndex = 18;\n            this.chkDescription.Text = \"checkBox5\";\n            this.chkDescription.UseVisualStyleBackColor = true;\n            // \n            // chkComments\n            // \n            this.chkComments.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.chkComments.AutoSize = true;\n            this.chkComments.Checked = true;\n            this.chkComments.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkComments.Location = new System.Drawing.Point(83, 338);\n            this.chkComments.Margin = new System.Windows.Forms.Padding(3, 6, 3, 3);\n            this.chkComments.Name = \"chkComments\";\n            this.chkComments.Size = new System.Drawing.Size(14, 17);\n            this.chkComments.TabIndex = 19;\n            this.chkComments.Text = \"chkComments\";\n            this.chkComments.UseVisualStyleBackColor = true;\n            // \n            // txtDescription\n            // \n            this.txtDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtDescription.Location = new System.Drawing.Point(103, 175);\n            this.txtDescription.Name = \"txtDescription\";\n            this.txtDescription.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\n            this.txtDescription.Size = new System.Drawing.Size(243, 154);\n            this.txtDescription.TabIndex = 20;\n            this.txtDescription.Text = \"\";\n            this.txtDescription.WarnLinkClick = true;\n            // \n            // txtComments\n            // \n            this.txtComments.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtComments.Location = new System.Drawing.Point(103, 335);\n            this.txtComments.Name = \"txtComments\";\n            this.txtComments.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\n            this.txtComments.Size = new System.Drawing.Size(243, 154);\n            this.txtComments.TabIndex = 21;\n            this.txtComments.Text = \"\";\n            this.txtComments.WarnLinkClick = true;\n            // \n            // chkTags\n            // \n            this.chkTags.AutoSize = true;\n            this.chkTags.Checked = true;\n            this.chkTags.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkTags.Location = new System.Drawing.Point(83, 151);\n            this.chkTags.Name = \"chkTags\";\n            this.chkTags.Size = new System.Drawing.Size(14, 14);\n            this.chkTags.TabIndex = 22;\n            this.chkTags.UseVisualStyleBackColor = true;\n            // \n            // label8\n            // \n            this.label8.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label8.AutoSize = true;\n            this.label8.Location = new System.Drawing.Point(3, 13);\n            this.label8.Name = \"label8\";\n            this.label8.Size = new System.Drawing.Size(23, 13);\n            this.label8.TabIndex = 23;\n            this.label8.Text = \"File\";\n            // \n            // lblFile\n            // \n            this.lblFile.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblFile.AutoSize = true;\n            this.lblFile.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F);\n            this.lblFile.IsPath = false;\n            this.lblFile.Location = new System.Drawing.Point(103, 13);\n            this.lblFile.Name = \"lblFile\";\n            this.lblFile.Size = new System.Drawing.Size(23, 13);\n            this.lblFile.TabIndex = 24;\n            this.lblFile.Text = \"File\";\n            // \n            // chkMaps\n            // \n            this.chkMaps.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.chkMaps.AutoSize = true;\n            this.chkMaps.Checked = true;\n            this.chkMaps.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkMaps.Location = new System.Drawing.Point(83, 498);\n            this.chkMaps.Margin = new System.Windows.Forms.Padding(3, 6, 3, 3);\n            this.chkMaps.Name = \"chkMaps\";\n            this.chkMaps.Size = new System.Drawing.Size(14, 14);\n            this.chkMaps.TabIndex = 27;\n            this.chkMaps.UseVisualStyleBackColor = true;\n            // \n            // lnkMapsEdit\n            // \n            this.lnkMapsEdit.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lnkMapsEdit.AutoSize = true;\n            this.lnkMapsEdit.Location = new System.Drawing.Point(103, 497);\n            this.lnkMapsEdit.Name = \"lnkMapsEdit\";\n            this.lnkMapsEdit.Size = new System.Drawing.Size(34, 13);\n            this.lnkMapsEdit.TabIndex = 26;\n            this.lnkMapsEdit.TabStop = true;\n            this.lnkMapsEdit.Text = \"Edit...\";\n            this.lnkMapsEdit.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkMapsEdit_LinkClicked);\n            // \n            // flpRating\n            // \n            this.flpRating.Controls.Add(this.ctrlStarRating);\n            this.flpRating.Controls.Add(this.lnkClearRating);\n            this.flpRating.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpRating.Location = new System.Drawing.Point(150, 173);\n            this.flpRating.Margin = new System.Windows.Forms.Padding(0);\n            this.flpRating.Name = \"flpRating\";\n            this.flpRating.Size = new System.Drawing.Size(374, 55);\n            this.flpRating.TabIndex = 28;\n            // \n            // ctrlStarRating\n            // \n            this.ctrlStarRating.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.ctrlStarRating.Location = new System.Drawing.Point(0, 13);\n            this.ctrlStarRating.Name = \"ctrlStarRating\";\n            this.ctrlStarRating.SelectedRating = 0;\n            this.ctrlStarRating.Size = new System.Drawing.Size(105, 20);\n            this.ctrlStarRating.TabIndex = 11;\n            // \n            // lnkClearRating\n            // \n            this.lnkClearRating.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lnkClearRating.AutoSize = true;\n            this.lnkClearRating.Location = new System.Drawing.Point(110, 16);\n            this.lnkClearRating.Name = \"lnkClearRating\";\n            this.lnkClearRating.Size = new System.Drawing.Size(46, 20);\n            this.lnkClearRating.TabIndex = 12;\n            this.lnkClearRating.TabStop = true;\n            this.lnkClearRating.Text = \"Clear\";\n            this.lnkClearRating.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkClearRating_LinkClicked);\n            // \n            // GameFileEdit\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Name = \"GameFileEdit\";\n            this.Size = new System.Drawing.Size(349, 553);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.TextBox txtAuthor;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.TextBox txtTitle;\n        private System.Windows.Forms.DateTimePicker dtRelease;\n        private RatingControl ctrlStarRating;\n        private System.Windows.Forms.LinkLabel lblTags;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.CheckBox chkTitle;\n        private System.Windows.Forms.CheckBox chkAuthor;\n        private System.Windows.Forms.CheckBox chkReleaseDate;\n        private System.Windows.Forms.CheckBox chkRating;\n        private System.Windows.Forms.CheckBox chkDescription;\n        private System.Windows.Forms.CheckBox chkComments;\n        private Controls.CRichTextBox txtDescription;\n        private Controls.CRichTextBox txtComments;\n        private System.Windows.Forms.CheckBox chkTags;\n        private System.Windows.Forms.Label label8;\n        private GrowLabel lblFile;\n        private System.Windows.Forms.Label label9;\n        private System.Windows.Forms.LinkLabel lnkMapsEdit;\n        private System.Windows.Forms.CheckBox chkMaps;\n        private System.Windows.Forms.FlowLayoutPanel flpRating;\n        private System.Windows.Forms.LinkLabel lnkClearRating;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileEdit.cs",
    "content": "﻿using DoomLauncher.Controls;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GameFileEdit : UserControl\n    {\n        public IGameFile DataSource { get; private set; }\n        public ITagData[] TagData { get; private set; }\n        public bool TagsChanged { get; private set; }\n\n        private bool m_showCheckBoxes;\n        private bool m_mapsEdited;\n        private string m_maps;\n\n        public GameFileEdit()\n        {\n            InitializeComponent();\n            chkTags.Visible = false;\n            txtComments.WarnLinkClick = false;\n            lblFile.IsPath = true;\n\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public void SetShowCheckBoxes(bool set)\n        {\n            chkAuthor.Visible = chkDescription.Visible = chkRating.Visible =\n                chkReleaseDate.Visible = chkTitle.Visible = chkComments.Visible = \n                chkMaps.Visible = set;\n            m_showCheckBoxes = set;\n        }\n\n        public void SetShowTagCheckBox(bool set)\n        {\n            chkTags.Visible = set;\n        }\n\n        public void SetShowMaps(bool set)\n        {\n            lnkMapsEdit.Visible = set;\n            chkMaps.Visible = set;\n        }\n\n        public void SetCheckBoxesChecked(bool set)\n        {\n            chkAuthor.Checked = chkDescription.Checked = chkRating.Checked =\n                chkReleaseDate.Checked = chkTitle.Checked = chkComments.Checked = \n                chkMaps.Checked = set;\n        }\n\n        public bool AuthorChecked\n        {\n            get { return chkAuthor.Checked; }\n            set { chkAuthor.Checked = value; }\n        }\n\n        public bool DescriptionChecked\n        {\n            get { return chkDescription.Checked; }\n            set { chkDescription.Checked = value; }\n        }\n\n        public bool RatingChecked\n        {\n            get { return chkRating.Checked; }\n            set { chkRating.Checked = value; }\n        }\n\n        public bool ReleaseDateChecked\n        {\n            get { return chkReleaseDate.Checked; }\n            set { chkReleaseDate.Checked = value; }\n        }\n\n        public bool TitleChecked\n        {\n            get { return chkTitle.Checked; }\n            set { chkTitle.Checked = value; }\n        }\n\n        public bool CommentsChecked\n        {\n            get { return chkComments.Checked; }\n            set { chkComments.Checked = value; }\n        }\n\n        public bool TagsChecked\n        {\n            get { return chkTags.Checked; }\n            set { chkTags.Checked = value; }\n        }\n\n        public bool MapsChecked\n        {\n            get { return chkMaps.Checked; }\n            set { chkMaps.Checked = value; }\n        }\n\n        public void SetDataSource(IGameFile gameFile, IEnumerable<ITagData> tags)\n        {\n            DataSource = gameFile;\n            TagData = tags.ToArray();\n\n            lblFile.Text = gameFile.FileName;\n\n            if (!string.IsNullOrEmpty(gameFile.Title)) txtTitle.Text = gameFile.Title;\n            else txtTitle.Text = string.Empty;\n            if (!string.IsNullOrEmpty(gameFile.Author)) txtAuthor.Text = gameFile.Author;\n            else txtAuthor.Text = string.Empty;\n            if (!string.IsNullOrEmpty(gameFile.Description)) txtDescription.Text = Util.CleanDescription(gameFile.Description);\n            else txtDescription.Text = string.Empty;\n            if (!string.IsNullOrEmpty(gameFile.Comments)) txtComments.Text = gameFile.Comments;\n            else txtComments.Text = string.Empty;\n            if (gameFile.ReleaseDate.HasValue) dtRelease.Value = gameFile.ReleaseDate.Value;\n            else dtRelease.Value = DateTime.Now;\n            if (gameFile.Rating.HasValue) ctrlStarRating.SelectedRating = Convert.ToInt32(gameFile.Rating.Value);\n            else ctrlStarRating.SelectedRating = 0;\n\n            dtRelease.Checked = gameFile.ReleaseDate.HasValue;\n            SetTagsLabel();\n            m_maps = DataSource.Map;\n        }\n\n        private void SetTagsLabel()\n        {\n            if (TagData.Length > 0)\n                lblTags.Text = string.Join(\", \", TagData.Select(x => x.Name).ToArray());\n            else\n                lblTags.Text = \"Select...\";\n        }\n\n        public List<GameFileFieldType> UpdateDataSource(IGameFile gameFile)\n        {\n            List<GameFileFieldType> fields = new List<GameFileFieldType>();\n\n            if (AssertSet(chkTitle, fields, GameFileFieldType.Title)) gameFile.Title = txtTitle.Text;\n            if (AssertSet(chkAuthor, fields, GameFileFieldType.Author)) gameFile.Author = txtAuthor.Text;\n            if (AssertSet(chkDescription, fields, GameFileFieldType.Description)) gameFile.Description = txtDescription.Text;\n            if (AssertSet(chkComments, fields, GameFileFieldType.Comments)) gameFile.Comments = txtComments.Text;\n            if (AssertSet(chkReleaseDate, fields, GameFileFieldType.ReleaseDate))\n            {\n                if (dtRelease.Checked) gameFile.ReleaseDate = new DateTime(dtRelease.Value.Year, dtRelease.Value.Month, dtRelease.Value.Day);\n                else gameFile.ReleaseDate = null;\n            }\n            if (AssertSet(chkRating, fields, GameFileFieldType.Rating))\n            {\n                if (ctrlStarRating.SelectedRating == 0)\n                    gameFile.Rating = null;\n                else\n                    gameFile.Rating = ctrlStarRating.SelectedRating;\n            }\n            if (m_mapsEdited && AssertSet(chkMaps, fields, GameFileFieldType.Map))\n            {\n                fields.Add(GameFileFieldType.MapCount);\n                gameFile.Map = m_maps;\n                gameFile.MapCount = DataSources.GameFile.GetMaps(gameFile).Length;\n            }\n\n            return fields;\n        }\n\n        private bool AssertSet(CheckBox chk, List<GameFileFieldType> fields, GameFileFieldType field)\n        {\n            if ((m_showCheckBoxes && chk.Checked) || !m_showCheckBoxes)\n            {\n                fields.Add(field);\n                return true;\n            }\n\n            return false;\n        }\n\n        private void lnkMapsEdit_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            TextBoxForm textBoxForm = new TextBoxForm(true, MessageBoxButtons.OKCancel)\n            {\n                Title = \"Maps\",\n                HeaderText = \"Enter map names, separated by commas.\",\n                DisplayText = m_maps,\n                StartPosition = FormStartPosition.CenterScreen\n            };\n\n            if (textBoxForm.ShowDialog(this) == DialogResult.OK)\n            {\n                m_mapsEdited = true;\n                m_maps = textBoxForm.DisplayText;\n            }\n        }\n\n        private void lblTags_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            TagSelectForm form = new TagSelectForm();\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.TagSelectControl.Init(new TagSelectOptions() { ShowCheckBoxes = true });\n            form.TagSelectControl.SetCheckedTags(TagData);\n\n            if (form.ShowDialog() == DialogResult.OK)\n            {\n                TagsChanged = true;\n                TagData = form.TagSelectControl.GetCheckedTags().ToArray();\n                SetTagsLabel();\n            }\n        }\n\n        private void lnkClearRating_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            ctrlStarRating.SelectedRating = 0;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileEdit.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/GameFileSummary.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GameFileSummary\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.tblTags = new DoomLauncher.TableLayoutPanelDB();\n            this.lblTagsText = new DoomLauncher.GrowLabel();\n            this.lblTags = new System.Windows.Forms.Label();\n            this.tblLastMap = new DoomLauncher.TableLayoutPanelDB();\n            this.lblLastMap = new System.Windows.Forms.Label();\n            this.lblLastMapText = new System.Windows.Forms.Label();\n            this.lblTitle = new DoomLauncher.GrowLabel();\n            this.ctrlStats = new DoomLauncher.StatsControl();\n            this.txtDescription = new DoomLauncher.Controls.CRichTextBox();\n            this.txtComments = new DoomLauncher.Controls.CRichTextBox();\n            this.tblTimePlayed = new DoomLauncher.TableLayoutPanelDB();\n            this.lblTimePlayed = new System.Windows.Forms.Label();\n            this.lblTimePlayedText = new System.Windows.Forms.Label();\n            this.tblMain.SuspendLayout();\n            this.tblTags.SuspendLayout();\n            this.tblLastMap.SuspendLayout();\n            this.tblTimePlayed.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single;\n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.tblTags, 0, 4);\n            this.tblMain.Controls.Add(this.tblLastMap, 0, 3);\n            this.tblMain.Controls.Add(this.lblTitle, 0, 0);\n            this.tblMain.Controls.Add(this.ctrlStats, 0, 5);\n            this.tblMain.Controls.Add(this.txtDescription, 0, 6);\n            this.tblMain.Controls.Add(this.txtComments, 0, 7);\n            this.tblMain.Controls.Add(this.tblTimePlayed, 0, 2);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 8;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 62F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 308F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 120F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 80F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));\n            this.tblMain.Size = new System.Drawing.Size(306, 1006);\n            this.tblMain.TabIndex = 0;\n            // \n            // tblTags\n            // \n            this.tblTags.ColumnCount = 3;\n            this.tblTags.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 12F));\n            this.tblTags.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 135F));\n            this.tblTags.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblTags.Controls.Add(this.lblTagsText, 1, 0);\n            this.tblTags.Controls.Add(this.lblTags, 2, 0);\n            this.tblTags.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblTags.Location = new System.Drawing.Point(1, 437);\n            this.tblTags.Margin = new System.Windows.Forms.Padding(0);\n            this.tblTags.Name = \"tblTags\";\n            this.tblTags.RowCount = 1;\n            this.tblTags.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblTags.Size = new System.Drawing.Size(304, 31);\n            this.tblTags.TabIndex = 15;\n            // \n            // lblTagsText\n            // \n            this.lblTagsText.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblTagsText.AutoSize = true;\n            this.lblTagsText.IsPath = false;\n            this.lblTagsText.Location = new System.Drawing.Point(16, 5);\n            this.lblTagsText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblTagsText.Name = \"lblTagsText\";\n            this.lblTagsText.Size = new System.Drawing.Size(48, 20);\n            this.lblTagsText.TabIndex = 5;\n            this.lblTagsText.Text = \"Tags:\";\n            // \n            // lblTags\n            // \n            this.lblTags.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblTags.AutoSize = true;\n            this.lblTags.Location = new System.Drawing.Point(151, 5);\n            this.lblTags.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblTags.Name = \"lblTags\";\n            this.lblTags.Size = new System.Drawing.Size(40, 20);\n            this.lblTags.TabIndex = 13;\n            this.lblTags.Text = \"tags\";\n            // \n            // tblLastMap\n            // \n            this.tblLastMap.ColumnCount = 3;\n            this.tblLastMap.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 12F));\n            this.tblLastMap.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 135F));\n            this.tblLastMap.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblLastMap.Controls.Add(this.lblLastMap, 2, 0);\n            this.tblLastMap.Controls.Add(this.lblLastMapText, 1, 0);\n            this.tblLastMap.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblLastMap.Location = new System.Drawing.Point(1, 405);\n            this.tblLastMap.Margin = new System.Windows.Forms.Padding(0);\n            this.tblLastMap.Name = \"tblLastMap\";\n            this.tblLastMap.RowCount = 1;\n            this.tblLastMap.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblLastMap.Size = new System.Drawing.Size(304, 31);\n            this.tblLastMap.TabIndex = 14;\n            // \n            // lblLastMap\n            // \n            this.lblLastMap.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblLastMap.AutoSize = true;\n            this.lblLastMap.Location = new System.Drawing.Point(151, 5);\n            this.lblLastMap.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblLastMap.Name = \"lblLastMap\";\n            this.lblLastMap.Size = new System.Drawing.Size(69, 20);\n            this.lblLastMap.TabIndex = 12;\n            this.lblLastMap.Text = \"last map\";\n            // \n            // lblLastMapText\n            // \n            this.lblLastMapText.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblLastMapText.AutoSize = true;\n            this.lblLastMapText.Location = new System.Drawing.Point(16, 5);\n            this.lblLastMapText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblLastMapText.Name = \"lblLastMapText\";\n            this.lblLastMapText.Size = new System.Drawing.Size(79, 20);\n            this.lblLastMapText.TabIndex = 11;\n            this.lblLastMapText.Text = \"Last Map:\";\n            // \n            // lblTitle\n            // \n            this.lblTitle.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.lblTitle.AutoSize = true;\n            this.lblTitle.Font = new System.Drawing.Font(\"Arial\", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lblTitle.IsPath = false;\n            this.lblTitle.Location = new System.Drawing.Point(121, 17);\n            this.lblTitle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblTitle.Name = \"lblTitle\";\n            this.lblTitle.Size = new System.Drawing.Size(63, 29);\n            this.lblTitle.TabIndex = 4;\n            this.lblTitle.Text = \"Title\";\n            this.lblTitle.UseMnemonic = false;\n            // \n            // ctrlStats\n            // \n            this.ctrlStats.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlStats.Location = new System.Drawing.Point(1, 469);\n            this.ctrlStats.Margin = new System.Windows.Forms.Padding(0);\n            this.ctrlStats.Name = \"ctrlStats\";\n            this.ctrlStats.Size = new System.Drawing.Size(304, 120);\n            this.ctrlStats.TabIndex = 8;\n            // \n            // txtDescription\n            // \n            this.txtDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtDescription.Location = new System.Drawing.Point(5, 595);\n            this.txtDescription.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtDescription.Name = \"txtDescription\";\n            this.txtDescription.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\n            this.txtDescription.Size = new System.Drawing.Size(296, 321);\n            this.txtDescription.TabIndex = 9;\n            this.txtDescription.Text = \"\";\n            this.txtDescription.WarnLinkClick = true;\n            // \n            // txtComments\n            // \n            this.txtComments.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtComments.Location = new System.Drawing.Point(5, 927);\n            this.txtComments.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtComments.Name = \"txtComments\";\n            this.txtComments.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\n            this.txtComments.Size = new System.Drawing.Size(296, 73);\n            this.txtComments.TabIndex = 10;\n            this.txtComments.Text = \"\";\n            this.txtComments.WarnLinkClick = true;\n            // \n            // tblTimePlayed\n            // \n            this.tblTimePlayed.ColumnCount = 3;\n            this.tblTimePlayed.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 12F));\n            this.tblTimePlayed.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 135F));\n            this.tblTimePlayed.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblTimePlayed.Controls.Add(this.lblTimePlayed, 2, 0);\n            this.tblTimePlayed.Controls.Add(this.lblTimePlayedText, 1, 0);\n            this.tblTimePlayed.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblTimePlayed.Location = new System.Drawing.Point(1, 373);\n            this.tblTimePlayed.Margin = new System.Windows.Forms.Padding(0);\n            this.tblTimePlayed.Name = \"tblTimePlayed\";\n            this.tblTimePlayed.RowCount = 1;\n            this.tblTimePlayed.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblTimePlayed.Size = new System.Drawing.Size(304, 31);\n            this.tblTimePlayed.TabIndex = 13;\n            // \n            // lblTimePlayed\n            // \n            this.lblTimePlayed.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblTimePlayed.AutoSize = true;\n            this.lblTimePlayed.Location = new System.Drawing.Point(151, 5);\n            this.lblTimePlayed.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblTimePlayed.Name = \"lblTimePlayed\";\n            this.lblTimePlayed.Size = new System.Drawing.Size(89, 20);\n            this.lblTimePlayed.TabIndex = 8;\n            this.lblTimePlayed.Text = \"time played\";\n            // \n            // lblTimePlayedText\n            // \n            this.lblTimePlayedText.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblTimePlayedText.AutoSize = true;\n            this.lblTimePlayedText.Location = new System.Drawing.Point(16, 5);\n            this.lblTimePlayedText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblTimePlayedText.Name = \"lblTimePlayedText\";\n            this.lblTimePlayedText.Size = new System.Drawing.Size(98, 20);\n            this.lblTimePlayedText.TabIndex = 9;\n            this.lblTimePlayedText.Text = \"Time Played:\";\n            // \n            // GameFileSummary\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"GameFileSummary\";\n            this.Size = new System.Drawing.Size(306, 1006);\n            this.ClientSizeChanged += new System.EventHandler(this.GameFileSummary_ClientSizeChanged);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.tblTags.ResumeLayout(false);\n            this.tblTags.PerformLayout();\n            this.tblLastMap.ResumeLayout(false);\n            this.tblLastMap.PerformLayout();\n            this.tblTimePlayed.ResumeLayout(false);\n            this.tblTimePlayed.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private DoomLauncher.TableLayoutPanelDB tblMain;\n        private GrowLabel lblTitle;\n        private GrowLabel lblTagsText;\n        private StatsControl ctrlStats;\n        private Controls.CRichTextBox txtDescription;\n        private Controls.CRichTextBox txtComments;\n        private System.Windows.Forms.Label lblLastMapText;\n        private System.Windows.Forms.Label lblLastMap;\n        private System.Windows.Forms.Label lblTimePlayed;\n        private System.Windows.Forms.Label lblTimePlayedText;\n        private System.Windows.Forms.Label lblTags;\n        private TableLayoutPanelDB tblTimePlayed;\n        private TableLayoutPanelDB tblTags;\n        private TableLayoutPanelDB tblLastMap;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileSummary.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GameFileSummary : UserControl\n    {\n        private readonly float m_labelHeight;\n        private float m_imageHeight;\n        private readonly SlideShowPictureBox pbImage = new SlideShowPictureBox();\n        private List<PreviewImage> m_previewImages = new List<PreviewImage>();\n\n        public GameFileSummary()\n        {\n            InitializeComponent();\n\n            tblMain.Controls.Add(pbImage, 0, 1);\n            pbImage.Dock = DockStyle.Fill;\n            pbImage.ImagePaint += PbImage_Paint;\n\n            m_labelHeight = GetRowStyle(lblTitle).Height;\n            m_imageHeight = GetRowStyle(pbImage).Height;\n            ShowCommentsSection(false);\n\n            txtComments.WarnLinkClick = false;\n            tblMain.CellBorderStyle = TableLayoutPanelCellBorderStyle.None;\n            tblMain.CellPaint += TblMain_CellPaint;\n            tblLastMap.Margin = new Padding(1);\n            tblTimePlayed.Margin = new Padding(1);\n            tblTags.Margin = new Padding(1);\n            ctrlStats.Margin = new Padding(1);\n\n            txtDescription.BorderStyle = BorderStyle.None;\n            txtComments.BorderStyle = BorderStyle.None;\n\n            txtDescription.ReadOnly = true;\n            txtComments.ReadOnly = true;\n\n            SetStatistics(null, Array.Empty<IStatsData>());\n        }\n\n        private void TblMain_CellPaint(object sender, TableLayoutCellPaintEventArgs e)\n        {\n            Point pt = e.CellBounds.Location;\n            Pen pen = new Pen(ColorTheme.Current.GridBorder);\n            if (e.Row == 0)\n            {\n                Rectangle rect = new Rectangle(e.CellBounds.Location, new Size(e.CellBounds.Width - 1, e.CellBounds.Height - 1));\n                e.Graphics.DrawRectangle(pen, rect);\n                return;\n            }\n\n            if (e.Row == 1)\n            {\n                Rectangle rect = new Rectangle(e.CellBounds.Location, new Size(e.CellBounds.Width - 1, e.CellBounds.Height - 1));\n                e.Graphics.FillRectangle(new SolidBrush(ColorTheme.Current.ImageBackground), rect);\n            }\n\n            e.Graphics.DrawLine(pen, pt.X, pt.Y, pt.X, pt.Y + e.CellBounds.Height);\n            e.Graphics.DrawLine(pen, pt.X + e.CellBounds.Width - 1, pt.Y, e.CellBounds.Width - 1, pt.Y + e.CellBounds.Height);\n            e.Graphics.DrawLine(pen, new Point(pt.X, pt.Y + e.CellBounds.Height - 1), new Point(pt.X + e.CellBounds.Width, pt.Y + e.CellBounds.Height - 1));\n        }\n\n        private void PbImage_Paint(object sender, PaintEventArgs e)\n        {\n            if (pbImage.ImageIndex < 0 || pbImage.ImageIndex >= m_previewImages.Count)\n                return;\n\n            int alpha = (int)(pbImage.ImageAlpha * 255);\n            Brush brush = new SolidBrush(Color.FromArgb(alpha, Color.White));\n\n            string title = m_previewImages[pbImage.ImageIndex].Title;\n            Util.DrawImageTitleBar(title, pbImage.ClientRectangle, e, brush, Font);\n        }\n\n        public void SetTitle(string text)\n        {\n            if (lblTitle.Text == text)\n                return;\n\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            lblTitle.Text = text;\n\n            float height = lblTitle.Height + dpiScale.ScaleFloatY(6);\n            if (height < m_labelHeight)\n                height = m_labelHeight;\n\n            GetRowStyle(lblTitle).Height = height;\n        }\n\n        public void SetDescription(string text)\n        {\n            txtDescription.Clear();\n            txtDescription.Visible = false;\n\n            txtDescription.Text = Util.CleanDescription(text);\n\n            txtDescription.Visible = true;\n        }\n\n        public void PauseSlideshow()\n        {\n            pbImage.Stop();\n        }\n\n        public void ResumeSlideshow()\n        {\n            pbImage.Resume();\n        }\n\n        public bool SetPreviewImages(List<PreviewImage> imagePaths)\n        {\n            m_previewImages = imagePaths;\n            bool success = pbImage.SetImages(imagePaths.Select(x => x.Path).ToList());\n            ShowImageSection(true);\n            return success;\n        }\n\n        public void SetPreviewImage(Image image)\n        {\n            m_previewImages.Clear();\n            pbImage.SetImage(image);\n            ShowImageSection(true);\n        }\n\n        public void SetComments(string comments)\n        {\n            ShowCommentsSection(true);\n            txtComments.Text = comments;\n        }\n\n        public void ClearPreviewImage()\n        {\n            pbImage.ClearImage();\n            ShowImageSection(false);\n        }\n\n        public void ClearComments()\n        {\n            txtComments.Text = string.Empty;\n            ShowCommentsSection(false);\n        }\n\n        private RowStyle GetRowStyle(Control ctrl)\n        {\n            return tblMain.RowStyles[tblMain.GetRow(ctrl)];\n        }\n\n        private void ShowImageSection(bool bShow)\n        {\n            if (bShow)\n                GetRowStyle(pbImage).Height = m_imageHeight;\n            else\n                GetRowStyle(pbImage).Height = 0;\n        }\n\n        private void ShowCommentsSection(bool bShow)\n        {\n            if (bShow)\n            {\n                DpiScale dpiScale = new DpiScale(CreateGraphics());\n                GetRowStyle(txtComments).Height = dpiScale.ScaleFloatY(20);\n            }\n            else\n            {\n                GetRowStyle(txtComments).Height = 0;\n            }\n        }\n\n        public string TagText\n        {\n            get { return lblTags.Text; }\n            set\n            {\n                lblTags.Text = value;\n            }\n        }\n\n        public void SetTimePlayed(int minutes)\n        {\n            lblTimePlayed.Text = Util.GetTimePlayedString(minutes);\n        }\n\n        public void SetStatistics(IGameFile gameFile, IEnumerable<IStatsData> stats)\n        {\n            if (gameFile != null && stats.Any())\n            {\n                DpiScale dpiScale = new DpiScale(CreateGraphics());\n                ctrlStats.Visible = true;\n                GetRowStyle(ctrlStats).Height = dpiScale.ScaleFloatY(120);\n\n                ctrlStats.SetStatistics(gameFile, stats);\n\n                // Many maps can be saved at the same time, ordering by record time is not guaranteed to preserve the original order\n                // Order by StatID to ensure the latest one is used\n                lblLastMap.Text = stats.OrderByDescending(x => x.RecordTime).ThenByDescending(x => x.StatID).First().MapName;\n            }\n            else\n            {\n                ctrlStats.Visible = false;\n                GetRowStyle(ctrlStats).Height = 0;\n                lblLastMap.Text = \"N/A\";\n            }\n        }\n\n        private double m_aspectWidth = 16, m_aspectHeight = 9;\n\n        private void GameFileSummary_ClientSizeChanged(object sender, EventArgs e)\n        {\n            int width = Width;\n            double height = width / (m_aspectWidth / m_aspectHeight);\n            m_imageHeight = Convert.ToSingle(height);\n\n            if (pbImage.ImageCount > 0)\n                ShowImageSection(true);\n        }\n    }\n}"
  },
  {
    "path": "DoomLauncher/Controls/GameFileSummary.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTile.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GameFileTile\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.pb = new System.Windows.Forms.PictureBox();\n            ((System.ComponentModel.ISupportInitialize)(this.pb)).BeginInit();\n            this.SuspendLayout();\n            // \n            // pb\n            // \n            this.pb.Location = new System.Drawing.Point(0, 0);\n            this.pb.Name = \"pb\";\n            this.pb.Size = new System.Drawing.Size(100, 50);\n            this.pb.TabIndex = 2;\n            this.pb.TabStop = false;\n            // \n            // GameFileTile\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.pb);\n            this.Name = \"GameFileTile\";\n            ((System.ComponentModel.ISupportInitialize)(this.pb)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n        private System.Windows.Forms.PictureBox pb;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTile.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GameFileTile : GameFileTileBase\n    {\n        private static readonly int LabelHeight = 32;\n        private static readonly string NewString = \"New!\";\n        private static readonly int NewPadX = 6;\n        private static readonly int NewPadY = 4;\n        private static readonly Font DisplayFont = new Font(\"Arial\", 10, FontStyle.Bold);\n        private static readonly Pen SeparatorPen = new Pen(Color.LightGray, 1.0f);\n\n        public override event MouseEventHandler TileClick;\n        public override event EventHandler TileDoubleClick;\n\n        public override int ImageWidth { get; protected set; }\n        public readonly int ImageHeight;\n        public bool DrawBorder { get; set; } = true;\n        public override IGameFile GameFile { get; protected set; }\n        public override bool Selected { get; protected set; }\n\n        private Color m_titleColor = ColorTheme.Current.Text;\n        private bool m_new;\n        private bool m_loadingImage;\n        private Image m_setImage;\n\n        public GameFileTile()\n        {\n            InitializeComponent();\n\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n\n            ImageWidth = dpiScale.ScaleIntX(Math.Max(DataCache.Instance.AppConfiguration.TileImageSize, 100));\n            ImageHeight = GetImageHeight(ImageWidth);\n            int labelHeight = dpiScale.ScaleIntY(LabelHeight);\n\n            Width = ImageWidth;\n            Height = GetStandardHeight(dpiScale);\n\n            pb.Width = Width;\n            pb.Height = Height - labelHeight;\n            pb.BackColor = Color.Black;\n            pb.SizeMode = PictureBoxSizeMode.Zoom;\n            pb.WaitOnLoad = false;\n            pb.LoadCompleted += Pb_LoadCompleted;\n\n            MouseClick += CtrlMouseClick;\n            pb.MouseClick += CtrlMouseClick;\n\n            DoubleClick += CtrlDoubleClick;\n            pb.DoubleClick += CtrlDoubleClick;\n\n            pb.Paint += Screenshot_Paint;\n            Paint += GameFileTile_Paint;\n        }\n\n        public static int GetImageHeight(int imageWidth) => (int)(imageWidth / (16.0 / 9.0));\n\n        public int GetStandardHeight(DpiScale dpiScale)\n        {\n            return ImageHeight + dpiScale.ScaleIntY(LabelHeight);\n        }\n\n        private void Pb_LoadCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)\n        {\n            m_loadingImage = false;\n            if (m_setImage != null)\n            {\n                pb.Image = m_setImage;\n                m_setImage = null;\n            }\n        }\n\n        private void GameFileTile_Paint(object sender, PaintEventArgs e)\n        {\n            if (GameFile == null)\n                return;\n\n            DpiScale dpiScale = new DpiScale(e.Graphics);\n            int labelHeight = dpiScale.ScaleIntY(LabelHeight);\n            int pad = dpiScale.ScaleIntX(1);\n\n            SizeF layout = new SizeF(Width, 16);\n            string text;\n            if (!string.IsNullOrEmpty(GameFile.Title))\n                text = Util.GetClippedEllipsesText(e.Graphics, DisplayFont, GameFile.Title, layout);\n            else\n                text = GameFile.FileNameNoPath;\n\n            SizeF size = e.Graphics.MeasureDisplayString(text, DisplayFont);\n            float x = Width - size.Width - (Width - size.Width) / 2;\n            float y = Height - size.Height - (labelHeight - size.Height) / 2;\n            if (Selected)\n                e.Graphics.DrawString(text, DisplayFont, new SolidBrush(ColorTheme.Current.HighlightText), x, y);\n            else\n                e.Graphics.DrawString(text, DisplayFont, new SolidBrush(m_titleColor), x, y);\n\n            SeparatorPen.Color = ColorTheme.Current.Border;\n            if (DrawBorder && !Selected)\n                e.Graphics.DrawRectangle(SeparatorPen, 0, 0, Width - pad, Height - pad);\n        }\n\n        private void Screenshot_Paint(object sender, PaintEventArgs e)\n        {\n            if (m_new)\n            {\n                DpiScale dpiScale = new DpiScale(e.Graphics);\n                int newPadX = dpiScale.ScaleIntX(NewPadX);\n                int newPadY = dpiScale.ScaleIntY(NewPadY);\n                int pad1 = dpiScale.ScaleIntX(1);\n                SizeF size = e.Graphics.MeasureString(NewString, DisplayFont);\n                RectangleF rect = new RectangleF(pb.ClientRectangle.Right - size.Width - newPadX - pad1, pb.ClientRectangle.Height - size.Height - newPadY - pad1, \n                    size.Width + newPadX, size.Height + newPadY);\n                e.Graphics.FillRectangle(Brushes.Red, rect);\n                e.Graphics.DrawRectangle(Pens.Gray, rect.Left, rect.Top, rect.Width, rect.Height);\n                e.Graphics.DrawString(NewString, DisplayFont, Brushes.White, new PointF(rect.Left + newPadX / 2 + pad1 + pad1, rect.Top + newPadY / 2 + pad1));\n            }\n        }\n\n        public override void SetSelected(bool set)\n        {\n            Selected = set;\n\n            if (set)\n            {\n                BorderStyle = BorderStyle.FixedSingle;\n                BackColor = ColorTheme.Current.Highlight;\n            }\n            else\n            {\n                BorderStyle = BorderStyle.None;\n                BackColor = ColorTheme.Current.WindowDark;\n            }\n        }\n\n        public override void SetData(IGameFile gameFile, IEnumerable<ITagData> tags)\n        {\n            m_new = gameFile.Downloaded.HasValue && (DateTime.Now - gameFile.Downloaded.Value).TotalHours < 24;\n\n            var colorTag = tags.FirstOrDefault(x => x.HasColor);\n            if (colorTag != null && colorTag.Color != null)\n                m_titleColor = Color.FromArgb(colorTag.Color.Value);\n            else\n                m_titleColor = ColorTheme.Current.Text;\n\n            GameFile = gameFile;\n            Invalidate();\n        }\n\n        public override void ClearData()\n        {\n            GameFile = null;\n            ClearImage();\n        }\n\n        private void ClearImage()\n        {\n            m_setImage = null;\n\n            pb.CancelAsync();\n\n            if (pb.Image != null)\n                pb.Image = null;\n\n            if (!string.IsNullOrEmpty(pb.ImageLocation))\n                pb.ImageLocation = string.Empty;\n        }\n\n        public override void SetImageLocation(string file)\n        {\n            if (file.Equals(pb.ImageLocation))\n                return;\n\n            ClearImage();\n\n            if (!string.IsNullOrEmpty(file))\n            {\n                m_loadingImage = true;\n                pb.LoadAsync(file);\n            }\n        }\n\n        public override void SetImage(Image image)\n        {\n            ClearImage();\n\n            // CancelAsync doesn't really work, to get around this set m_setImage set to pb.Image when Pb_LoadCompleted fires \n            if (m_loadingImage)\n                m_setImage = image;\n\n            m_loadingImage = true;\n            pb.Image = image;\n        }\n\n        private void CtrlDoubleClick(object sender, EventArgs e)\n        {\n            TileDoubleClick?.Invoke(this, e);\n        }\n\n        private void CtrlMouseClick(object sender, MouseEventArgs e)\n        {\n            TileClick?.Invoke(this, e);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTile.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTileBase.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public abstract class GameFileTileBase : UserControl, IGameFileTile\n    {\n        public abstract event MouseEventHandler TileClick;\n        public abstract event EventHandler TileDoubleClick;\n\n        public abstract int ImageWidth { get; protected set; }\n        public abstract IGameFile GameFile { get; protected set; }\n        public abstract bool Selected { get; protected set; }\n\n        public abstract void ClearData();\n        public abstract void SetData(IGameFile gameFile, IEnumerable<ITagData> tags);\n        public abstract void SetImageLocation(string file);\n        public abstract void SetImage(Image image);\n        public abstract void SetSelected(bool set);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTileExpanded.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GameFileTileExpanded\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.gameTile = new DoomLauncher.GameFileTile();\n            this.flpMain = new DoomLauncher.FlowLayoutPanelDB();\n            this.pnlData = new System.Windows.Forms.Panel();\n            this.flpMain.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // gameTile\n            // \n            this.gameTile.DrawBorder = true;\n            this.gameTile.Location = new System.Drawing.Point(0, 0);\n            this.gameTile.Margin = new System.Windows.Forms.Padding(0);\n            this.gameTile.Name = \"gameTile\";\n            this.gameTile.Size = new System.Drawing.Size(300, 200);\n            this.gameTile.TabIndex = 0;\n            // \n            // flpMain\n            // \n            this.flpMain.Controls.Add(this.gameTile);\n            this.flpMain.Controls.Add(this.pnlData);\n            this.flpMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpMain.Location = new System.Drawing.Point(0, 0);\n            this.flpMain.Margin = new System.Windows.Forms.Padding(0);\n            this.flpMain.Name = \"flpMain\";\n            this.flpMain.Size = new System.Drawing.Size(660, 204);\n            this.flpMain.TabIndex = 1;\n            // \n            // pnlData\n            // \n            this.pnlData.Location = new System.Drawing.Point(302, 2);\n            this.pnlData.Margin = new System.Windows.Forms.Padding(2, 2, 0, 0);\n            this.pnlData.Name = \"pnlData\";\n            this.pnlData.Size = new System.Drawing.Size(352, 182);\n            this.pnlData.TabIndex = 1;\n            // \n            // GameFileTileExpanded\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.flpMain);\n            this.Name = \"GameFileTileExpanded\";\n            this.Size = new System.Drawing.Size(660, 204);\n            this.flpMain.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private GameFileTile gameTile;\n        private FlowLayoutPanelDB flpMain;\n        private System.Windows.Forms.Panel pnlData;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTileExpanded.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Globalization;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GameFileTileExpanded : GameFileTileBase\n    {\n        public override event MouseEventHandler TileClick;\n        public override event EventHandler TileDoubleClick;\n\n        public override IGameFile GameFile { get { return gameTile.GameFile; } protected set { } }\n        public override bool Selected { get { return gameTile.Selected; } protected set { } }\n        public override int ImageWidth { get { return gameTile.ImageWidth; } protected set { } }\n\n        private static readonly Font DisplayFont = new Font(\"Microsof Sans Serif\", 10);\n        private static readonly Font DisplayBoldFont = new Font(\"Microsof Sans Serif\", 10, FontStyle.Bold);\n        private static readonly Pen SeparatorPen = new Pen(Color.LightGray, 1.0f);\n        private static readonly Pen HighlightPen = new Pen(ColorTheme.Current.Highlight, 1.0f);\n        private static readonly Brush TextBrush = new SolidBrush(ColorTheme.Current.Text);\n\n        private string m_tags;\n        private string m_maps;\n        private string m_release;\n        private string m_played;\n\n        public GameFileTileExpanded()\n        {\n            InitializeComponent();\n\n            BackColor = ColorTheme.Current.WindowDark;\n\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            gameTile.Width = dpiScale.ScaleIntX(DataCache.Instance.AppConfiguration.TileImageSize);\n\n            // Something in the designer is messing up the height, forcing it here\n            gameTile.Height = gameTile.GetStandardHeight(dpiScale);\n            Height = gameTile.Height + dpiScale.ScaleIntX(2);\n            int pad = dpiScale.ScaleIntX(1);\n            gameTile.DrawBorder = false;\n            gameTile.Margin = new Padding(pad, pad, 0, 0);\n            gameTile.TileClick += GameTile_TileClick;\n            gameTile.TileDoubleClick += GameTile_TileDoubleClick;\n            pnlData.Paint += PnlData_Paint;\n            flpMain.Paint += FlpMain_Paint;\n            pnlData.MouseClick += PnlData_Click;\n            pnlData.DoubleClick += PnlData_DoubleClick;\n            flpMain.MouseClick += FlpMain_MouseClick;\n            flpMain.DoubleClick += FlpMain_DoubleClick;\n        }\n\n        private void FlpMain_DoubleClick(object sender, EventArgs e)\n        {\n            TileDoubleClick?.Invoke(this, e);\n        }\n\n        private void FlpMain_MouseClick(object sender, MouseEventArgs e)\n        {\n            TileClick?.Invoke(this, e);\n        }\n\n        private void PnlData_DoubleClick(object sender, EventArgs e)\n        {\n            TileDoubleClick?.Invoke(this, e);\n        }\n\n        private void PnlData_Click(object sender, MouseEventArgs e)\n        {\n            TileClick?.Invoke(this, new MouseEventArgs(e.Button, e.Clicks, e.X + gameTile.Width, e.Y, e.Delta));\n        }\n\n        private void FlpMain_Paint(object sender, PaintEventArgs e)\n        {\n            if (gameTile.Selected)\n                e.Graphics.DrawRectangle(HighlightPen, 0, 0, Width - 1, Height - 1);\n            else\n                e.Graphics.DrawRectangle(SeparatorPen, 0, 0, Width - 1, Height - 1);\n        }\n\n        private int m_selectPad = 1;\n\n        private void PnlData_Paint(object sender, PaintEventArgs e)\n        {\n            if (GameFile == null)\n                return;\n\n            DpiScale dpiScale = new DpiScale(e.Graphics);\n            m_selectPad = (int)Math.Ceiling(dpiScale.ScaleFloatY(1));\n\n            float xPos = gameTile.Location.X + dpiScale.ScaleIntX(4);\n            int yPos = dpiScale.ScaleIntY(8);\n            int offset = dpiScale.ScaleIntY(22);\n\n            var graphics = e.Graphics;\n\n            SafeDrawString(graphics, \"Filename\", DisplayBoldFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, \"Title\", DisplayBoldFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, \"Author\", DisplayBoldFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, \"Release\", DisplayBoldFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, \"Played\", DisplayBoldFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, \"Maps\", DisplayBoldFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, \"Tags\", DisplayBoldFont, TextBrush, xPos, yPos, offset);\n\n            xPos = gameTile.Location.X + dpiScale.ScaleFloatX(82);\n            yPos = dpiScale.ScaleIntY(8);\n\n            SizeF maxLabelSize = new SizeF(pnlData.ClientRectangle.Width - xPos + dpiScale.ScaleIntX(8), 16);\n\n            SafeDrawString(graphics, GameFile.FileNameNoPath, DisplayFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, Util.GetClippedEllipsesText(e.Graphics, DisplayFont, GameFile.Title, maxLabelSize), DisplayFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, Util.GetClippedEllipsesText(e.Graphics, DisplayFont, GameFile.Author, maxLabelSize), DisplayFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, m_release, DisplayFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, m_played, DisplayFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, m_maps, DisplayFont, TextBrush, xPos, yPos, offset);\n            yPos += offset;\n            SafeDrawString(graphics, m_tags, DisplayFont, TextBrush, xPos, yPos, offset);\n        }\n\n        private void SafeDrawString(Graphics g, string s, Font font, Brush brush, float x, float y, int sizeY)\n        {\n            if (y + sizeY >= Height - m_selectPad)\n                return;\n            g.DrawString(s, font, brush, x, y);\n        }\n\n        private void GameTile_TileDoubleClick(object sender, EventArgs e)\n        {\n            TileDoubleClick?.Invoke(this, e);\n        }\n\n        private void GameTile_TileClick(object sender, MouseEventArgs e)\n        {\n            TileClick?.Invoke(this, e);\n        }\n\n        public override void ClearData()\n        {\n            gameTile.ClearData();\n        }\n\n        public override void SetData(IGameFile gameFile, IEnumerable<ITagData> tags)\n        {\n            gameTile.SetData(gameFile, tags);\n\n            m_tags = string.Join(\", \", tags.Select(x => x.Name));\n            if (gameFile.MapCount.HasValue)\n                m_maps = gameFile.MapCount.ToString();\n            else\n                m_maps = \"0\";\n\n            if (gameFile.ReleaseDate.HasValue)\n                m_release = gameFile.ReleaseDate.Value.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\n            else\n                m_release = string.Empty;\n\n            if (gameFile.LastPlayed.HasValue)\n                m_played = gameFile.LastPlayed.Value.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\n            else\n                m_played = string.Empty;\n\n            pnlData.Invalidate();\n        }\n\n        public override void SetImageLocation(string file)\n        {\n            gameTile.SetImageLocation(file);\n        }\n\n        public override void SetImage(Image image)\n        {\n            gameTile.SetImage(image);\n        }\n\n        public override void SetSelected(bool set)\n        {\n            gameTile.SetSelected(set);\n            flpMain.Invalidate();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTileExpanded.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTileViewControl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GameFileTileViewControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.flpPaging = new System.Windows.Forms.FlowLayoutPanel();\n            this.pagingControl = new DoomLauncher.PagingControl();\n            this.label1 = new System.Windows.Forms.Label();\n            this.cmbMaxItemsPerPage = new System.Windows.Forms.ComboBox();\n            this.tblMain.SuspendLayout();\n            this.flpPaging.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flpPaging, 0, 1);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));\n            this.tblMain.Size = new System.Drawing.Size(717, 482);\n            this.tblMain.TabIndex = 1;\n            // \n            // flpPaging\n            // \n            this.flpPaging.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.flpPaging.AutoSize = true;\n            this.flpPaging.Controls.Add(this.pagingControl);\n            this.flpPaging.Controls.Add(this.label1);\n            this.flpPaging.Controls.Add(this.cmbMaxItemsPerPage);\n            this.flpPaging.Location = new System.Drawing.Point(83, 436);\n            this.flpPaging.Margin = new System.Windows.Forms.Padding(0);\n            this.flpPaging.Name = \"flpPaging\";\n            this.flpPaging.Size = new System.Drawing.Size(550, 46);\n            this.flpPaging.TabIndex = 1;\n            this.flpPaging.WrapContents = false;\n            // \n            // pagingControl\n            // \n            this.pagingControl.BackColor = System.Drawing.SystemColors.Control;\n            this.pagingControl.ForeColor = System.Drawing.SystemColors.WindowText;\n            this.pagingControl.Location = new System.Drawing.Point(6, 8);\n            this.pagingControl.Margin = new System.Windows.Forms.Padding(6, 8, 6, 8);\n            this.pagingControl.Name = \"pagingControl\";\n            this.pagingControl.Size = new System.Drawing.Size(334, 32);\n            this.pagingControl.TabIndex = 2;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(350, 14);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(118, 20);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Items Per Page\";\n            // \n            // cmbMaxItemsPerPage\n            // \n            this.cmbMaxItemsPerPage.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.cmbMaxItemsPerPage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbMaxItemsPerPage.FormattingEnabled = true;\n            this.cmbMaxItemsPerPage.Items.AddRange(new object[] {\n            \"30\",\n            \"60\",\n            \"120\",\n            \"240\",\n            \"500\",\n            \"1000\"});\n            this.cmbMaxItemsPerPage.Location = new System.Drawing.Point(476, 10);\n            this.cmbMaxItemsPerPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbMaxItemsPerPage.Name = \"cmbMaxItemsPerPage\";\n            this.cmbMaxItemsPerPage.Size = new System.Drawing.Size(70, 28);\n            this.cmbMaxItemsPerPage.TabIndex = 1;\n            // \n            // GameFileTileViewControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"GameFileTileViewControl\";\n            this.Size = new System.Drawing.Size(717, 482);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.flpPaging.ResumeLayout(false);\n            this.flpPaging.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ToolTip toolTip1;\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.ComboBox cmbMaxItemsPerPage;\n        private System.Windows.Forms.FlowLayoutPanel flpPaging;\n        private PagingControl pagingControl;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTileViewControl.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GameFileTileViewControl : UserControl, IGameFileView, IGameFileSortableView\n    {\n        public event EventHandler ItemClick;\n        public event EventHandler ItemDoubleClick;\n        public event EventHandler SelectionChange;\n        public event KeyPressEventHandler ViewKeyPress;\n        public event KeyEventHandler ViewKeyDown;\n        public event GameFileEventHandler GameFileEnter;\n        public event GameFileEventHandler GameFileLeave;\n\n        private readonly int LayoutRow = 0;\n\n        private List<IGameFile> m_gameFiles = new List<IGameFile>();\n        private readonly List<GameFileTileBase> m_selectedTiles = new List<GameFileTileBase>();\n        private readonly Label m_label = new Label();\n\n        private ContextMenuStrip m_menu;\n        private bool m_visible;\n        private bool m_menuShowing;\n        private bool m_tilesRecreated;\n\n        private readonly System.Timers.Timer m_mouseTimer;\n        private int m_lastScrollPos;\n        private GameFileTileBase m_lastHover;\n\n        private string m_sortedColumn;\n        private SortOrder m_sortedColumnOrder;\n\n        private FlowLayoutPanelDB flpMain = new FlowLayoutPanelDB();\n\n        public GameFileTileViewControl()\n        {\n            InitializeComponent();\n\n            SetItemsPerPage(GameFileTileManager.Instance.MaxItems);\n            pagingControl.PageIndexChanged += M_pagingControl_PageIndexChanged;\n\n            m_mouseTimer = new System.Timers.Timer();\n            m_mouseTimer.Interval = 100;\n            m_mouseTimer.Elapsed += MouseTimer_Elapsed;\n            m_mouseTimer.Start();\n\n            m_label.Visible = false;\n            GameFileViewControl.StyleDisplayLabel(m_label);\n\n            cmbMaxItemsPerPage.KeyDown += CmbMaxItemsPerPage_KeyDown;\n\n            GameFileTileManager.Instance.TilesRecreated += Instance_TilesRecreated;\n            InitTiles();\n\n            Stylizer.StylizeControl(this, DesignMode);\n            BackColor = ColorTheme.Current.WindowLight;\n        }\n\n        private void SetItemsPerPage(int maxItems)\n        {\n            cmbMaxItemsPerPage.SelectedIndexChanged -= CmbMaxItemsPerPage_SelectedIndexChanged;\n            cmbMaxItemsPerPage.SelectedItem = maxItems.ToString();\n            if (cmbMaxItemsPerPage.SelectedIndex == -1)\n                cmbMaxItemsPerPage.SelectedIndex = 0;\n            cmbMaxItemsPerPage.SelectedIndexChanged += CmbMaxItemsPerPage_SelectedIndexChanged;\n        }\n\n        public IEnumerable<IGameFile> DataSource\n        {\n            get => m_gameFiles;\n            set => SetData(value);\n        }\n\n        public IGameFile SelectedItem\n        {\n            get\n            {\n                if (m_selectedTiles.Count > 0)\n                    return m_selectedTiles[0].GameFile;\n                return null;\n            }\n            set\n            {\n                SelectGameFile(value);\n            }\n        }\n\n        public IGameFile[] SelectedItems => m_selectedTiles.Select(x => x.GameFile).ToArray();\n\n        public bool MultiSelect { get; set; }\n        public object DoomLauncherParent { get; set; }\n\n        public void SetVisible(bool set)\n        {\n            m_visible = set;\n\n            if (set)\n            {\n                flpMain = GameFileTileManager.Instance.TileLayout;\n                flpMain.TabIndex = 1;\n                flpMain.Anchor = AnchorStyles.Top | AnchorStyles.Left;\n                flpMain.Dock = DockStyle.Fill;\n\n                if (m_label.Visible)\n                {\n                    // Data in the view has changed since last displayed\n                    if (m_gameFiles.Count > 0)\n                        ClearDisplayLabel();\n                }\n                else\n                {\n                    tblMain.Controls.Add(flpMain, 0, LayoutRow);\n                }\n\n                flpMain.BackColor = ColorTheme.Current.WindowLight;\n                flpMain.KeyPress += GameFileTileViewControl_KeyPress;\n                flpMain.KeyDown += GameFileTileViewControl_KeyDown;\n\n                SetPageData(pagingControl.PageIndex, false);\n                SetSavedScrollValue();\n                flpMain.PerformLayout();\n\n                SetDefaultSelection();\n            }\n            else\n            {\n                flpMain.KeyPress -= GameFileTileViewControl_KeyPress;\n                flpMain.KeyDown -= GameFileTileViewControl_KeyDown;\n\n                m_selectedTiles.ForEach(x => x.SetSelected(false));\n                m_lastScrollPos = flpMain.VerticalScroll.Value;\n                Controls.Remove(flpMain);\n            }\n        }\n\n        private void SetSavedScrollValue()\n        {\n            if (m_lastScrollPos < flpMain.VerticalScroll.Minimum)\n                flpMain.VerticalScroll.Value = flpMain.VerticalScroll.Minimum;\n            else if (m_lastScrollPos > flpMain.VerticalScroll.Maximum)\n                flpMain.VerticalScroll.Value = flpMain.VerticalScroll.Maximum;\n            else\n                flpMain.VerticalScroll.Value = m_lastScrollPos;\n        }\n\n        public string GetSortedColumnKey()\n        {\n            return m_sortedColumn;\n        }\n\n        public SortOrder GetColumnSort(string key)\n        {\n            if (m_sortedColumn == key)\n                return m_sortedColumnOrder;\n\n            return SortOrder.None;\n        }\n\n        public void SetSortedColumn(string key, SortOrder sort)\n        {\n            m_sortedColumn = key;\n            m_sortedColumnOrder = sort;\n        }\n\n        private void SetDefaultSelection()\n        {\n            if (SelectedItem == null && m_gameFiles.Count > 0)\n            {\n                int index = pagingControl.PageIndex * GameFileTileManager.Instance.MaxItems;\n                if (index < m_gameFiles.Count)\n                {\n                    SelectGameFile(m_gameFiles[index]);\n                    return;\n                }\n            }\n\n            SelectionChange?.Invoke(this, EventArgs.Empty);\n        }\n\n        private void InitTiles()\n        {\n            m_lastScrollPos = 0;\n\n            foreach (var tile in GameFileTileManager.Instance.OldTiles)\n            {\n                tile.TileClick -= Tile_TileClick;\n                tile.TileDoubleClick -= Tile_TileDoubleClick;\n            }\n\n            foreach (var tile in GameFileTileManager.Instance.Tiles)\n            {\n                tile.TileClick += Tile_TileClick;\n                tile.TileDoubleClick += Tile_TileDoubleClick;\n            }\n        }\n\n        private void CmbMaxItemsPerPage_KeyDown(object sender, KeyEventArgs e)\n        {\n            e.Handled = true;\n        }\n\n        private void Instance_TilesRecreated(object sender, EventArgs e)\n        {\n            m_tilesRecreated = true;\n            pagingControl.Init(m_gameFiles.Count, GameFileTileManager.Instance.MaxItems, 0);\n\n            SetItemsPerPage(GameFileTileManager.Instance.MaxItems);\n\n            InitTiles();\n            RefreshData();\n            SetDefaultSelection();\n        }\n\n        private void M_pagingControl_PageIndexChanged(object sender, EventArgs e)\n        {\n            SetPageData(pagingControl.PageIndex, true);\n            SetDefaultSelection();\n        }\n\n        private void MouseTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)\n        {\n            try\n            {\n                if (!IsDisposed && InvokeRequired)\n                    Invoke(new Action(MouseMoveTimer));\n            }\n            catch (ObjectDisposedException)\n            {\n                m_mouseTimer.Stop();\n            }\n        }\n\n        private void MouseMoveTimer()\n        {\n            if (!m_visible || m_menuShowing)\n                return;\n\n            // PointToClient will return null if the view is obscured at the current position\n            Point pt = Cursor.Position;\n            Control test = tblMain.GetChildAtPoint(tblMain.PointToClient(pt));\n            if (test != null && test == flpMain)\n            {\n                flpMain.Focus();\n\n                foreach (var tile in GameFileTileManager.Instance.Tiles)\n                {\n                    if (!tile.Visible)\n                        continue;\n\n                    var rect = tile.RectangleToScreen(tile.DisplayRectangle);\n                    if (rect.Contains(pt))\n                    {\n                        if (m_lastHover != tile && tile.IsVisibleAtPoint(pt))\n                        {\n                            m_lastHover = tile;\n                            GameFileEnter?.Invoke(this, new GameFileEventArgs(tile.GameFile));\n                        }\n                        return;\n                    }\n                }\n            }\n\n            ClearHover();\n        }\n\n        private void GameFileTileViewControl_KeyDown(object sender, KeyEventArgs e)\n        {\n            if (m_selectedTiles.Count > 0 && (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right))\n            {\n                int baseIndex = pagingControl.PageIndex * GameFileTileManager.Instance.MaxItems;\n                int originalIndex = GameFileTileIndex(m_selectedTiles[0]) + baseIndex;\n                int newIndex = GetNextGameFileIndex(originalIndex, e.KeyCode);\n                if (newIndex == originalIndex)\n                    return;\n                   \n                if (newIndex > 0 && newIndex < m_gameFiles.Count)\n                {\n                    ClearSelection();\n                    SelectGameFile(m_gameFiles[newIndex]);\n                }\n            }\n\n            ViewKeyDown?.Invoke(this, e);\n        }\n\n        private int GetNextGameFileIndex(int gameFileIndex, Keys keycode)\n        {\n            if (gameFileIndex < 0 || gameFileIndex >= m_gameFiles.Count)\n                return gameFileIndex;\n\n            try\n            {\n                GameFileTileBase tile = GameFileTileManager.Instance.Tiles[gameFileIndex % GameFileTileManager.Instance.MaxItems];\n                int baseIndex = pagingControl.PageIndex * GameFileTileManager.Instance.MaxItems;\n\n                int startIndex;\n                int endIndex;\n\n                if (keycode == Keys.Down || keycode == Keys.Right)\n                {\n                    startIndex = gameFileIndex;\n                    endIndex = baseIndex + GameFileTileManager.Instance.MaxItems;\n                }\n                else if (keycode == Keys.Up || keycode == Keys.Left)\n                {\n                    startIndex = gameFileIndex;\n                    endIndex = baseIndex - 1;\n                }\n                else\n                {\n                    return gameFileIndex;\n                }\n\n                while (startIndex != endIndex)\n                {\n                    GameFileTileBase nextTile = GameFileTileManager.Instance.Tiles[startIndex % GameFileTileManager.Instance.MaxItems];\n\n                    if (keycode == Keys.Down && nextTile.Location.Y > tile.Location.Y && nextTile.Location.X == tile.Location.X)\n                        return startIndex;\n                    else if (keycode == Keys.Up && nextTile.Location.Y < tile.Location.Y && nextTile.Location.X == tile.Location.X)\n                        return startIndex;\n                    else if (keycode == Keys.Right && nextTile.Location.X > tile.Location.X)\n                        return startIndex;\n                    else if (keycode == Keys.Left && nextTile.Location.X < tile.Location.X)\n                        return startIndex;\n\n                    if (keycode == Keys.Down || keycode == Keys.Right)\n                        startIndex++;\n                    else\n                        startIndex--;\n                }\n\n                if (keycode == Keys.Left && gameFileIndex - 1 > startIndex)\n                    return gameFileIndex - 1;\n                else if (keycode == Keys.Right && gameFileIndex + 1 < endIndex)\n                    return gameFileIndex + 1;\n\n                return gameFileIndex;\n            }\n            catch\n            {\n                return gameFileIndex;\n            }\n        }\n\n        private void GameFileTileViewControl_KeyPress(object sender, KeyPressEventArgs e)\n        {\n            ViewKeyPress?.Invoke(this, e);\n        }\n\n        public IGameFile GameFileForIndex(int index)\n        {\n            if (index >= m_gameFiles.Count)\n                return null;\n\n            return m_gameFiles[index];\n        }\n\n        public void UpdateGameFile(IGameFile gameFile)\n        {\n            foreach (var tile in GameFileTileManager.Instance.Tiles)\n            {\n                if (ShouldSkipTile(tile))\n                    break;\n\n                if (tile.GameFile.Equals(gameFile))\n                {\n                    var screenshots = DataCache.Instance.DataSourceAdapter.GetFiles(FileType.Screenshot);\n                    var thumbnails = DataCache.Instance.DataSourceAdapter.GetFiles(FileType.Thumbnail);\n                    SetTileData(tile, gameFile, screenshots, thumbnails, DataCache.Instance.TagMapLookup.GetTags(tile.GameFile), true);\n                }\n            }\n        }\n\n        public void RefreshData()\n        {\n            if (!m_visible)\n                return;\n\n            if (m_tilesRecreated)\n            {\n                m_tilesRecreated = false;\n                SetPageData(pagingControl.PageIndex, true);\n                return;\n            }\n\n            var screenshots = DataCache.Instance.DataSourceAdapter.GetFiles(FileType.Screenshot);\n            var thumbnails = DataCache.Instance.DataSourceAdapter.GetFiles(FileType.Thumbnail);\n\n            foreach (var tile in GameFileTileManager.Instance.Tiles)\n            {\n                if (ShouldSkipTile(tile))\n                    break;\n\n                SetTileData(tile, tile.GameFile, screenshots, thumbnails, DataCache.Instance.TagMapLookup.GetTags(tile.GameFile), false);\n            }\n        }\n\n        private static bool ShouldSkipTile(GameFileTileBase tile) => !tile.Visible || tile.GameFile == null;\n\n        public void SetContextMenuStrip(ContextMenuStrip menu)\n        {\n            m_menu = menu;\n            m_menu.Opened += M_menu_Opened;\n            m_menu.Closed += M_menu_Closed;\n        }\n\n        public void SetDisplayText(string text)\n        {\n            tblMain.Controls.Remove(flpMain);\n            tblMain.Controls.Add(m_label, 0, LayoutRow);\n            m_label.Text = text;\n            m_label.Visible = true;\n        }\n\n        private void SetData(IEnumerable<IGameFile> gameFiles)\n        {\n            ClearHover();\n            ClearDisplayLabel();\n\n            int saveIndex = pagingControl.PageIndex;\n\n            if (gameFiles == null)\n            {\n                m_gameFiles.Clear();\n            }\n            else\n            {\n                m_gameFiles = gameFiles.ToList();\n            }\n\n            pagingControl.Init(m_gameFiles.Count, GameFileTileManager.Instance.MaxItems, saveIndex);\n\n            if (!m_visible)\n                return;\n\n            SetPageData(saveIndex, false);\n            SetDefaultSelection();\n        }\n\n        private void ClearDisplayLabel()\n        {\n            if (m_label.Visible)\n            {\n                m_label.Visible = false;\n                tblMain.Controls.Remove(m_label);\n                tblMain.Controls.Add(GameFileTileManager.Instance.TileLayout, 0, LayoutRow);\n            }\n        }\n\n        private void ClearHover()\n        {\n            if (m_lastHover != null)\n                GameFileLeave?.Invoke(this, new GameFileEventArgs(m_lastHover.GameFile));\n\n            m_lastHover = null;\n        }\n\n        private void SetPageData(int pageIndex, bool dataChange)\n        {\n            GameFileTileManager.Instance.Tiles.ForEach(x => x.SetSelected(false));\n\n            var screenshots = DataCache.Instance.DataSourceAdapter.GetFiles(FileType.Screenshot);\n            var thumbnails = DataCache.Instance.DataSourceAdapter.GetFiles(FileType.Thumbnail);\n\n            var gameFiles = m_gameFiles.Skip(pageIndex * GameFileTileManager.Instance.MaxItems).Take(GameFileTileManager.Instance.MaxItems).ToList();\n            SetLayout(gameFiles, screenshots, thumbnails);\n\n            if (dataChange)\n            {\n                ClearSelection(false);\n                flpMain.VerticalScroll.Value = flpMain.VerticalScroll.Minimum;\n                flpMain.PerformLayout();\n            }\n            else\n            {\n                m_selectedTiles.ForEach(x => x.SetSelected(true));\n            }\n        }\n\n        private void SetLayout(List<IGameFile> gameFiles, IEnumerable<IFileData> screenshots, IEnumerable<IFileData> thumbnails)\n        {\n            flpMain.SuspendLayout();\n            int tileIndex = 0;\n\n            foreach (var gameFile in gameFiles)\n            {\n                SetTileData(GameFileTileManager.Instance.Tiles[tileIndex], gameFile, screenshots, thumbnails, DataCache.Instance.TagMapLookup.GetEnumerableTags(gameFile), false);\n                GameFileTileManager.Instance.Tiles[tileIndex].Visible = true;\n                tileIndex++;\n            }\n\n            for (int i = gameFiles.Count; i < GameFileTileManager.Instance.Tiles.Count; i++)\n            {\n                GameFileTileManager.Instance.Tiles[i].ClearData();\n                GameFileTileManager.Instance.Tiles[i].Visible = false;\n            }\n\n            flpMain.ResumeLayout();\n        }\n\n        private static void SetTileData(GameFileTileBase tile, IGameFile gameFile, IEnumerable<IFileData> screenshots, IEnumerable<IFileData> thumbnails, IEnumerable<ITagData> tags, bool forceRefresh)\n        {\n            if (gameFile == null || (!forceRefresh && gameFile.Equals(tile.GameFile)))\n                return;\n\n            tile.SetData(gameFile, tags);\n\n            if (!gameFile.GameFileID.HasValue)\n            {\n                tile.SetImage(DataCache.Instance.DefaultImage);\n                return;\n            }\n\n            IFileData thumbnail = ThumbnailManager.GetOrCreateThumbnail(gameFile, screenshots, thumbnails);\n            if (thumbnail != null)\n            {\n                if (thumbnail.FileTypeID == FileType.TileImage)\n                    tile.SetImageLocation(thumbnail.FileName);\n                else\n                    tile.SetImageLocation(Path.Combine(DataCache.Instance.AppConfiguration.ThumbnailDirectory.GetFullPath(), thumbnail.FileName));\n                return;\n            }\n            \n            tile.SetImage(DataCache.Instance.DefaultImage);\n        }\n\n        private void M_menu_Opened(object sender, EventArgs e)\n        {\n            m_menuShowing = true;\n        }\n\n        private void M_menu_Closed(object sender, ToolStripDropDownClosedEventArgs e)\n        {\n            m_menuShowing = false;\n        }\n\n        private void CmbMaxItemsPerPage_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            GameFileTileManager.Instance.SetMaxItems(Convert.ToInt32(cmbMaxItemsPerPage.SelectedItem));\n        }\n\n        private void Tile_TileDoubleClick(object sender, EventArgs e)\n        {\n            if (!m_visible)\n                return;\n\n            ItemDoubleClick?.Invoke(this, e);\n        }\n\n        private void Tile_TileClick(object sender, MouseEventArgs e)\n        {\n            if (!(sender is GameFileTileBase tile) || !m_visible)\n                return;\n\n            ItemClick?.Invoke(this, EventArgs.Empty);\n\n            if (e.Button == MouseButtons.Left)\n            {\n                if ((ModifierKeys & Keys.Control) == Keys.Control)\n                    ToggleSelection(tile);\n                else if ((ModifierKeys & Keys.Shift) == Keys.Shift && m_selectedTiles.Count > 0)\n                    SelectRange(tile);\n                else\n                    SelectGameFile(tile.GameFile);\n            }\n            else if (e.Button == MouseButtons.Right)\n            {\n                if (!m_selectedTiles.Contains(tile))\n                    SelectGameFile(tile.GameFile);\n                Point pt =  PointToScreen(new Point(Location.X + tile.Location.X + e.X, Location.Y + tile.Location.Y + e.Y));\n                m_menu.Show(pt);\n            }\n        }\n\n        private void SelectRange(GameFileTileBase tile)\n        {\n            int start = GameFileTileIndex(m_selectedTiles.First());\n            int end = GameFileTileIndex(m_selectedTiles.Last());\n\n            if (start == -1 || end == -1)\n                return;\n\n            if (start > end)\n            {\n                int temp = start;\n                end = start;\n                start = temp;\n            }\n\n            int index = GameFileTileIndex(tile);\n            if (index == -1)\n                return;\n\n            if (index < start)\n                start = index;\n            if (index > end)\n                end = index;\n\n            ClearSelection(false);\n\n            for (int i = start; i <= end; i++)\n            {\n                m_selectedTiles.Add(GameFileTileManager.Instance.Tiles[i]);\n                GameFileTileManager.Instance.Tiles[i].SetSelected(true);\n            }\n\n            SelectionChange?.Invoke(this, EventArgs.Empty);\n        }\n\n        private int GameFileTileIndex(GameFileTileBase tile)\n        {\n            for (int i = 0; i < GameFileTileManager.Instance.Tiles.Count; i++)\n            {\n                if (tile == GameFileTileManager.Instance.Tiles[i])\n                    return i;\n            }\n\n            return -1;\n        }\n\n        private void ToggleSelection(GameFileTileBase tile)\n        {\n            tile.SetSelected(!tile.Selected);\n            if (tile.Selected)\n            {\n                m_selectedTiles.Add(tile);\n            }\n            else\n            {\n                m_selectedTiles.Remove(tile);\n            }\n        }\n\n        private void SelectGameFile(IGameFile gameFile)\n        {\n            ClearSelection(false);\n\n            if (gameFile == null)\n                return;\n\n            foreach (GameFileTileBase tile in GameFileTileManager.Instance.Tiles)\n            {\n                if (ShouldSkipTile(tile))\n                    break;\n\n                if (tile.GameFile.Equals(gameFile))\n                {\n                    tile.SetSelected(true);\n                    m_selectedTiles.Add(tile);\n                    break;\n                }\n            }\n\n            if (m_selectedTiles.Count > 0)\n            {\n                flpMain.ScrollControlIntoView(m_selectedTiles[0]);\n                SelectionChange?.Invoke(this, EventArgs.Empty);\n            }\n        }\n\n        private void ClearSelection(bool fireEvent = true)\n        {\n            if (m_selectedTiles.Count == 0)\n                return;\n\n            m_selectedTiles.ForEach(x => x.SetSelected(false));\n            m_selectedTiles.Clear();\n            if (fireEvent)\n                SelectionChange?.Invoke(this, EventArgs.Empty);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileTileViewControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolTip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/GameFileViewControl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GameFileViewControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();\n            this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);\n            this.dgvMain = new DoomLauncher.CDataGridView();\n            ((System.ComponentModel.ISupportInitialize)(this.dgvMain)).BeginInit();\n            this.SuspendLayout();\n            // \n            // dgvMain\n            // \n            this.dgvMain.AllowUserToAddRows = false;\n            this.dgvMain.AllowUserToDeleteRows = false;\n            this.dgvMain.AllowUserToOrderColumns = true;\n            dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));\n            this.dgvMain.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;\n            this.dgvMain.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;\n            this.dgvMain.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal;\n            this.dgvMain.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\n            this.dgvMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dgvMain.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;\n            this.dgvMain.GridColor = System.Drawing.SystemColors.ActiveBorder;\n            this.dgvMain.Location = new System.Drawing.Point(0, 0);\n            this.dgvMain.Name = \"dgvMain\";\n            this.dgvMain.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\n            this.dgvMain.Size = new System.Drawing.Size(150, 150);\n            this.dgvMain.TabIndex = 1;\n            this.dgvMain.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvMain_CellDoubleClick);\n            this.dgvMain.CellMouseDown += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgvMain_CellMouseDown);\n            this.dgvMain.CellMouseEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvMain_CellMouseEnter);\n            this.dgvMain.CellMouseLeave += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvMain_CellMouseLeave);\n            this.dgvMain.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgvMain_RowPostPaint);\n            this.dgvMain.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.dgvMain_KeyPress);\n            // \n            // GameFileViewControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.dgvMain);\n            this.Name = \"GameFileViewControl\";\n            ((System.ComponentModel.ISupportInitialize)(this.dgvMain)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CDataGridView dgvMain;\n        private System.Windows.Forms.ToolTip toolTip1;\n\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileViewControl.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Equin.ApplicationFramework;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GameFileViewControl : UserControl, IGameFileColumnView\n    {\n        public event EventHandler ItemClick;\n        public event EventHandler ItemDoubleClick;\n        public event EventHandler SelectionChange;\n        public event CancelEventHandler CustomRowPaint;\n        public event KeyPressEventHandler ViewKeyPress;\n        public event KeyEventHandler ViewKeyDown;\n        public event GameFileEventHandler GameFileEnter;\n        public event GameFileEventHandler GameFileLeave;\n\n        private readonly Label m_label = new Label();\n        private readonly Dictionary<int, PropertyInfo> m_properties = new Dictionary<int, PropertyInfo>();\n        private BindingListView<IGameFile> m_datasource;\n        private bool m_binding = false;\n\n        public GameFileViewControl()\n        {\n            InitializeComponent();\n\n            SetupGridView();\n\n            StyleDisplayLabel(m_label);\n            Controls.Add(m_label);\n            dgvMain.KeyDown += dgvMain_KeyDown;\n\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public static void StyleDisplayLabel(Label label)\n        {\n            label.AutoSize = true;\n            label.Visible = false;\n            label.Anchor = AnchorStyles.Top | AnchorStyles.Left;\n            label.Margin = new Padding(12);\n            label.Font = new Font(label.Font.FontFamily, 12.0f, FontStyle.Bold);\n        }\n\n        public void SetVisible(bool set)\n        {\n            // Not required\n        }\n\n        public bool MultiSelect\n        {\n            get { return dgvMain.MultiSelect; }\n            set { dgvMain.MultiSelect = value; }\n        }\n\n        public void SetDisplayText(string text)\n        {\n            m_label.Text = text;\n            m_label.Visible = true;\n            BorderStyle = BorderStyle.FixedSingle;\n\n            Controls.Remove(dgvMain);\n        }\n\n        public void SetContextMenuStrip(ContextMenuStrip menu)\n        {\n            dgvMain.ContextMenuStrip = menu;\n        }\n\n        public void SetColumnFields(IEnumerable<ColumnField> columnFields)\n        {\n            m_setting = true;\n            bool resetDataSource = dgvMain.Columns.Count > 0;\n            m_orderLookup.Clear();\n            ColumnFields = columnFields.ToArray();\n            dgvMain.Columns.Clear();\n\n            if (columnFields.Any())\n            {            \n                foreach (var item in columnFields)\n                {\n                    DataGridViewColumn col = new DataGridViewTextBoxColumn\n                    {\n                        HeaderText = item.Title,\n                        Name = item.DataKey,\n                        DataPropertyName = item.DataKey\n                    };\n                    dgvMain.Columns.Add(col);\n                    m_orderLookup.Add(item.DataKey, col);\n                }\n                \n                dgvMain.Columns[dgvMain.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;\n\n                if (resetDataSource) //need to reset datasource so columns show in correct order\n                    SetDataSource(m_datasource);\n            }\n\n            m_setting = false;\n        }\n\n        public void SetColumnFormat(string colName, string format)\n        {\n            if (dgvMain.Columns[colName] != null)\n                dgvMain.Columns[colName].DefaultCellStyle.Format = format;\n        }\n\n        public List<Tuple<string, string>> GetColumnFormats()\n        {\n            List<Tuple<string, string>> formats = new List<Tuple<string, string>>();\n\n            foreach (DataGridViewColumn col in dgvMain.Columns)\n            {\n                if (!string.IsNullOrEmpty(col.DefaultCellStyle.Format))\n                    formats.Add(new Tuple<string, string>(col.Name, col.DefaultCellStyle.Format));\n            }\n\n            return formats;\n        }\n\n        public IEnumerable<IGameFile> DataSource\n        {\n            get\n            {\n                if (m_datasource != null)\n                    return m_datasource;\n                else\n                    return new IGameFile[] { };\n            }\n            set\n            {\n                if (value != null)\n                    SetDataSource(new BindingListView<IGameFile>(value.ToList()));\n                else\n                    SetDataSource(new BindingListView<IGameFile>(new GameFile[] { }));\n            }\n        }\n\n        private void SetDataSource(object datasource)\n        {\n            m_binding = true;\n            m_datasource = (BindingListView<IGameFile>)datasource;\n\n            if (m_datasource == null)\n            {\n                dgvMain.RowCount = 0;\n            }\n            else\n            {\n                dgvMain.RowCount = m_datasource.Count;\n                DataGridViewColumn col = dgvMain.Columns.Cast<DataGridViewColumn>()\n                    .FirstOrDefault(x => x.HeaderCell.SortGlyphDirection != SortOrder.None);\n                if (col != null)\n                    HandleSort(col.Index, false);\n            }\n\n            if (!Controls.Contains(dgvMain))\n            {\n                Controls.Add(dgvMain);\n                m_label.Visible = false;\n                BorderStyle = BorderStyle.None;\n            }\n\n            Refresh();\n\n            m_binding = false;\n        }\n\n        public void UpdateGameFile(IGameFile gameFile)\n        {\n            // Grid view inherently supports this\n        }\n\n        public IGameFile SelectedItem\n        {\n            get\n            {\n                if (dgvMain.SelectedRows.Count > 0)\n                {\n                    DataGridViewRow dgvr = dgvMain.SelectedRows[0];\n                    return m_datasource[dgvr.Index].Object;\n                }\n\n                return null;\n            }\n            set\n            {\n                dgvMain.ClearSelection();\n                int rowIndex = 0;\n\n                foreach (DataGridViewRow dgvr in dgvMain.Rows)\n                {\n                    if (m_datasource[dgvr.Index].Equals(value))\n                    {\n                        dgvr.Selected = true;\n                        dgvr.Cells[0].Selected = true;\n                        dgvMain.FirstDisplayedScrollingRowIndex = rowIndex;\n                        break;\n                    }\n\n                    rowIndex++;\n                }\n            }\n        }\n\n        public IGameFile[] SelectedItems\n        {\n            get\n            {\n                if (m_datasource != null && dgvMain.SelectedRows.Count > 0)\n                {\n                    List<IGameFile> ret = new List<IGameFile>(dgvMain.Rows.Count);\n                    \n                    foreach (DataGridViewRow dgvr in dgvMain.SelectedRows)\n                    {\n                        if (m_datasource.Count > dgvr.Index)\n                            ret.Add(m_datasource[dgvr.Index].Object);\n                    }\n\n                    return ret.ToArray();\n                }\n\n                return new IGameFile[] { };\n            }\n        }\n\n        public IGameFile GameFileForIndex(int index)\n        {\n            if (index > -1 && index < m_datasource.Count)\n                return m_datasource[index].Object;\n\n            return null;\n        }\n\n        public void RefreshData()\n        {\n            Refresh();\n        }\n\n        private void SetupGridView()\n        {\n            dgvMain.SelectionChanged += dgvMain_SelectionChanged;\n            dgvMain.CellClick += dgvMain_CellClick;\n            dgvMain.ColumnDisplayIndexChanged += dgvMain_ColumnDisplayIndexChanged;\n            \n            dgvMain.VirtualMode = true;\n            dgvMain.CellValueNeeded += dgvMain_CellValueNeeded;\n\n            dgvMain.ColumnHeaderMouseClick += dgvMain_ColumnHeaderMouseClick;\n\n            dgvMain.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;\n            dgvMain.AllowUserToResizeRows = false;\n        }\n\n        private void dgvMain_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)\n        {\n            HandleSort(e.ColumnIndex, true);\n        }\n\n        private void HandleSort(int columnIndex, bool flip)\n        {\n            if (m_datasource != null)\n            {\n                DataGridViewColumn dgvcSet = dgvMain.Columns[columnIndex];\n\n                foreach (DataGridViewColumn dgvc in dgvMain.Columns)\n                {\n                    if (dgvc != dgvcSet)\n                        dgvc.HeaderCell.SortGlyphDirection = SortOrder.None;\n                }\n\n                if (flip)\n                {\n                    if (dgvcSet.HeaderCell.SortGlyphDirection == SortOrder.Ascending)\n                        dgvcSet.HeaderCell.SortGlyphDirection = SortOrder.Descending;\n                    else\n                        dgvcSet.HeaderCell.SortGlyphDirection = SortOrder.Ascending;\n                }\n\n                string sortOrder;\n                if (dgvcSet.HeaderCell.SortGlyphDirection == SortOrder.Ascending)\n                    sortOrder = \"ASC\";\n                else\n                    sortOrder = \"DESC\";\n\n                m_datasource.ApplySort(string.Concat(dgvcSet.Name, \" \", sortOrder));\n                dgvMain.Invalidate();\n            }\n        }\n\n        void dgvMain_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)\n        {\n            if (m_datasource != null && m_datasource.Count > e.RowIndex)\n            {\n                IGameFile gameFile = m_datasource[e.RowIndex].Object;\n\n                if (!m_properties.ContainsKey(e.ColumnIndex))\n                    m_properties.Add(e.ColumnIndex, gameFile.GetType().GetProperty(dgvMain.Columns[e.ColumnIndex].DataPropertyName));\n\n                e.Value = m_properties[e.ColumnIndex].GetValue(gameFile);\n            }\n        }\n\n        void dgvMain_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)\n        {\n            ColumnReorderIndex = e.Column.DisplayIndex;\n        }\n\n        void dgvMain_CellClick(object sender, DataGridViewCellEventArgs e)\n        {\n            ItemClick?.Invoke(this, EventArgs.Empty);\n            HandleSelection();\n        }\n\n        void dgvMain_SelectionChanged(object sender, EventArgs e)\n        {\n            HandleSelection();\n        }\n\n        private void HandleSelection()\n        {\n            if (m_setting) return;\n            SelectionChange?.Invoke(this, new EventArgs());\n        }\n\n        private bool m_setting = false;\n\n        private void dgvMain_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)\n        {\n            if (e.RowIndex > -1 && e.Button == MouseButtons.Right && dgvMain.SelectedRows.Count < 2)\n            {\n                m_setting = true;\n                dgvMain.ClearSelection();\n                dgvMain.Rows[e.RowIndex].Selected = true;\n                dgvMain.Rows[e.RowIndex].Cells[0].Selected = true;\n\n                SelectionChange?.Invoke(this, new EventArgs());\n                m_setting = false;\n            }\n        }\n\n        private IGameFile m_lastEnter;\n\n        private void dgvMain_CellMouseEnter(object sender, DataGridViewCellEventArgs e)\n        {\n            if (m_binding)\n                return;\n\n            var gameFile = GameFileForIndex(e.RowIndex);\n            if (gameFile != m_lastEnter)\n            {\n                m_lastEnter = gameFile;\n                GameFileEnter?.Invoke(this, new GameFileEventArgs(gameFile));\n            }\n        }\n\n        private void dgvMain_CellMouseLeave(object sender, DataGridViewCellEventArgs e)\n        {\n            GameFileLeave?.Invoke(this, new GameFileEventArgs(m_lastEnter));\n            m_lastEnter = null;\n        }\n\n        private void dgvMain_CellDoubleClick(object sender, DataGridViewCellEventArgs e)\n        {\n            ItemDoubleClick?.Invoke(this, new EventArgs());\n        }\n\n        public void SetColumnWidth(string key, int width)\n        {\n            if (width <= 0)\n                return;\n\n            if (!m_orderLookup.ContainsKey(key))\n                return;\n\n            m_orderLookup[key].Width = width;\n        }\n\n        public int GetColumnWidth(string key)\n        {\n            if (!m_orderLookup.ContainsKey(key))\n                return 64;\n\n            return m_orderLookup[key].Width;\n        }\n\n        public SortOrder GetColumnSort(string key)\n        {\n            foreach(DataGridViewColumn column in dgvMain.Columns)\n            {\n                if (column.Name.Equals(key, StringComparison.CurrentCultureIgnoreCase))\n                    return column.HeaderCell.SortGlyphDirection;\n            }\n            return SortOrder.None;\n        }\n\n        public string GetSortedColumnKey()\n        {\n            foreach (DataGridViewColumn column in dgvMain.Columns)\n            {\n                if (column.HeaderCell.SortGlyphDirection != SortOrder.None)\n                    return column.Name;\n            }\n\n            return string.Empty;\n        }\n\n        public string[] GetColumnKeyOrder()\n        {\n            string[] items = new string[m_orderLookup.Count];\n\n            int count = 0;\n            foreach (KeyValuePair<string, DataGridViewColumn> item in m_orderLookup)\n            {\n                items[count] = m_orderLookup.First(x => x.Value.DisplayIndex == count).Key;\n                count++;\n            }\n\n            return items;\n        }\n\n        public void SetSortedColumn(string column, SortOrder sort)\n        {\n            DataGridViewColumn col = dgvMain.Columns.Cast<DataGridViewColumn>()\n                .FirstOrDefault(x => x.Name.Equals(column, StringComparison.CurrentCultureIgnoreCase));\n\n            if (col != null)\n            {\n                col.HeaderCell.SortGlyphDirection = sort;\n                if (m_datasource != null)\n                    HandleSort(col.Index, false);\n            }\n        }\n\n        private void dgvMain_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)\n        {\n            if (CustomRowColorPaint && CustomRowPaint != null && !m_binding)\n            {\n                CustomRowPaintDataBoundItem = GameFileForIndex(e.RowIndex);\n\n                CancelEventArgs args = new CancelEventArgs();\n                CustomRowPaint(this, args);\n\n                if (!args.Cancel)\n                    dgvMain.Rows[e.RowIndex].DefaultCellStyle.ForeColor = CustomRowPaintForeColor;\n            }\n        }\n\n        public ColumnField[] ColumnFields { get; private set; }\n        public int ToolTipItemIndex { get; private set; }\n        public int ColumnReorderIndex { get; private set; }\n\n        public bool CustomRowColorPaint { get; set; }\n        public IGameFile CustomRowPaintDataBoundItem { get; private set; }\n        public Color CustomRowPaintForeColor { get; set; }\n\n        public object DoomLauncherParent { get; set; }\n\n        private readonly Dictionary<string, DataGridViewColumn> m_orderLookup = new Dictionary<string, DataGridViewColumn>(StringComparer.OrdinalIgnoreCase);\n\n        private void dgvMain_KeyPress(object sender, KeyPressEventArgs e)\n        {\n            ViewKeyPress?.Invoke(this, e);\n        }\n\n        private void dgvMain_KeyDown(object sender, KeyEventArgs e)\n        {\n            ViewKeyDown?.Invoke(this, e);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GameFileViewControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolTip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/GenericFileView.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GenericFileView\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();\n            this.dgvMain = new DoomLauncher.CDataGridView();\n            ((System.ComponentModel.ISupportInitialize)(this.dgvMain)).BeginInit();\n            this.SuspendLayout();\n            // \n            // dgvMain\n            // \n            this.dgvMain.AllowUserToAddRows = false;\n            this.dgvMain.AllowUserToDeleteRows = false;\n            this.dgvMain.AllowUserToOrderColumns = true;\n            dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));\n            this.dgvMain.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;\n            this.dgvMain.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;\n            this.dgvMain.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal;\n            this.dgvMain.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\n            this.dgvMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dgvMain.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;\n            this.dgvMain.GridColor = System.Drawing.SystemColors.ActiveBorder;\n            this.dgvMain.Location = new System.Drawing.Point(0, 0);\n            this.dgvMain.Name = \"dgvMain\";\n            this.dgvMain.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\n            this.dgvMain.Size = new System.Drawing.Size(150, 150);\n            this.dgvMain.TabIndex = 2;\n            this.dgvMain.CellMouseDown += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgvMain_CellMouseDown);\n            // \n            // DemoView\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.dgvMain);\n            this.Name = \"DemoView\";\n            ((System.ComponentModel.ISupportInitialize)(this.dgvMain)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CDataGridView dgvMain;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GenericFileView.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GenericFileView : BasicFileView\n    {\n        private static readonly string s_dateColumn = \"DateCreated\";\n\n        public GenericFileView()\n        {\n            InitializeComponent();\n\n            SetColumnFields(new Tuple<string, string>[]\n            {\n                new Tuple<string, string>(\"Description\", \"Description\"),\n                new Tuple<string, string>(\"OriginalFileName\", \"File\"),\n                new Tuple<string, string>(s_dateColumn, \"Created\"),\n                new Tuple<string, string>(\"SourcePortName\", \"SourcePort\")\n            });\n        }\n\n        public override void SetData(IGameFile gameFile)\n        {\n            SetData(dgvMain, gameFile);\n        }\n\n        public override void ClearData()\n        {\n            dgvMain.DataSource = null;\n        }\n\n        private void SetColumnFields(IEnumerable<Tuple<string, string>> columnFields)\n        {\n            if (columnFields.Any())\n            {\n                foreach (Tuple<string, string> item in columnFields)\n                {\n                    DataGridViewColumn col = new DataGridViewTextBoxColumn();\n                    col.HeaderText = item.Item2;\n                    col.Name = item.Item1;\n                    col.DataPropertyName = item.Item1;\n                    dgvMain.Columns.Add(col);\n                }\n\n                dgvMain.Columns[s_dateColumn].DefaultCellStyle.Format = string.Format(\"{0} {1}\", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern, \n                    CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern);\n                dgvMain.Columns[dgvMain.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;\n            }\n        }\n\n        private void dgvMain_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)\n        {\n            if (e.RowIndex > -1 && e.Button == MouseButtons.Right && dgvMain.SelectedRows.Count < 2)\n            {\n                dgvMain.ClearSelection();\n                dgvMain.Rows[e.RowIndex].Selected = true;\n                dgvMain.Rows[e.RowIndex].Cells[0].Selected = true;\n            }\n        }\n\n        protected override List<IFileData> GetSelectedFiles()\n        {\n            List<IFileData> files = new List<IFileData>();\n\n            if (dgvMain.SelectedRows.Count > 0)\n            {\n                PropertyInfo pi = dgvMain.SelectedRows[0].DataBoundItem.GetType().GetProperty(\"FileData\");\n\n                foreach (DataGridViewRow row in dgvMain.SelectedRows)\n                    files.Add(pi.GetValue(row.DataBoundItem) as IFileData);\n            }\n\n            return files;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GenericFileView.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/GlowButton.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class GlowButton : Button\n    {\n        private readonly Timer m_timer;\n        private readonly Color m_baseColor;\n        private readonly Color m_baseTextColor;\n        private int m_alpha = 0;\n        private int m_increment = 25;\n\n        public Color BackGroundGlowColor => ColorTheme.Current.Highlight;\n        public Color TextGlowColor => ColorTheme.Current.WindowLight;\n\n        public GlowButton()\n        {\n            DoubleBuffered = true;\n            m_timer = new Timer() { Interval = 50 };\n            m_timer.Tick += timer_Tick;\n\n            FlatStyle = FlatStyle.Flat;\n\n            m_baseColor = ColorTheme.Current.Window;\n            m_baseTextColor = ColorTheme.Current.Text;\n        }\n\n        public void GlowOnce()\n        {\n            m_timer.Start();\n            BackColor = CreateBlendColor(m_alpha, m_baseColor, BackGroundGlowColor);\n        }\n\n        void timer_Tick(object sender, EventArgs e)\n        {\n            int testValue = m_alpha + m_increment;\n\n            if (testValue > 255 || testValue < 0)\n            {\n                if (testValue < 0)\n                {\n                    m_timer.Stop();\n                    BackColor = m_baseColor;\n                    ForeColor = m_baseTextColor;\n                    return;\n                }\n\n                m_increment = -m_increment;\n            }\n\n            m_alpha += m_increment;\n            BackColor = CreateBlendColor(m_alpha, m_baseColor, BackGroundGlowColor);\n            ForeColor = CreateBlendColor(m_alpha, m_baseTextColor, TextGlowColor);\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n                m_timer.Dispose();\n            base.Dispose(disposing);\n        }\n\n        private Color CreateBlendColor(int alpha, Color baseColor, Color glowColor)\n        {\n            return AlphaBlend(Color.FromArgb(alpha, glowColor), baseColor);\n        }\n\n        public Color AlphaBlend(Color A, Color B)\n        {\n            var r = (A.R * A.A / 255) + (B.R * B.A * (255 - A.A) / (255 * 255));\n            var g = (A.G * A.A / 255) + (B.G * B.A * (255 - A.A) / (255 * 255));\n            var b = (A.B * A.A / 255) + (B.B * B.A * (255 - A.A) / (255 * 255));\n            var a = A.A + (B.A * (255 - A.A) / 255);\n            return Color.FromArgb(a, r, g, b);\n        }\n    }\n}"
  },
  {
    "path": "DoomLauncher/Controls/GrowLabel.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GrowLabel\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/GrowLabel.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.IO;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GrowLabel : Label\n    {\n        private bool mGrowing;\n\n        public GrowLabel()\n        {\n            AutoSize = false;\n            IsPath = false;\n        }\n\n        public bool IsPath { get; set; }\n\n        private void ResizeLabel()\n        {\n            if (mGrowing)\n                return;\n\n            try\n            {\n                mGrowing = true;\n                Size sz = new Size(Width, int.MaxValue);\n                string text = Text;\n\n                if (IsPath)\n                    text = Text.Replace(Path.DirectorySeparatorChar, ' ').Replace(Path.AltDirectorySeparatorChar, ' ');\n\n                sz = TextRenderer.MeasureText(text, Font, sz, TextFormatFlags.WordBreak);\n                Height = sz.Height;\n            }\n            finally\n            {\n                mGrowing = false;\n            }\n        }\n\n        protected override void OnTextChanged(EventArgs e)\n        {\n            base.OnTextChanged(e);\n            ResizeLabel();\n        }\n\n        protected override void OnFontChanged(EventArgs e)\n        {\n            base.OnFontChanged(e);\n            ResizeLabel();\n        }\n\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            base.OnSizeChanged(e);\n            ResizeLabel();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/PagingControl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class PagingControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.btnPrev = new System.Windows.Forms.Button();\n            this.btnNext = new System.Windows.Forms.Button();\n            this.label1 = new System.Windows.Forms.Label();\n            this.lblPage = new System.Windows.Forms.Label();\n            this.lblPageTotal = new System.Windows.Forms.Label();\n            this.btnFirst = new System.Windows.Forms.Button();\n            this.btnLast = new System.Windows.Forms.Button();\n            this.tblMain.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 9;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 36F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 36F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 12F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 36F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 36F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblMain.Controls.Add(this.btnPrev, 2, 0);\n            this.tblMain.Controls.Add(this.btnNext, 6, 0);\n            this.tblMain.Controls.Add(this.label1, 4, 0);\n            this.tblMain.Controls.Add(this.lblPage, 3, 0);\n            this.tblMain.Controls.Add(this.lblPageTotal, 5, 0);\n            this.tblMain.Controls.Add(this.btnFirst, 1, 0);\n            this.tblMain.Controls.Add(this.btnLast, 7, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 1;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(240, 30);\n            this.tblMain.TabIndex = 2;\n            // \n            // btnPrev\n            // \n            this.btnPrev.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.btnPrev.Location = new System.Drawing.Point(59, 3);\n            this.btnPrev.Margin = new System.Windows.Forms.Padding(0);\n            this.btnPrev.Name = \"btnPrev\";\n            this.btnPrev.Size = new System.Drawing.Size(34, 23);\n            this.btnPrev.TabIndex = 0;\n            this.btnPrev.Text = \"<\";\n            this.btnPrev.UseVisualStyleBackColor = true;\n            this.btnPrev.Click += new System.EventHandler(this.BtnPrev_Click);\n            // \n            // btnNext\n            // \n            this.btnNext.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.btnNext.Location = new System.Drawing.Point(147, 3);\n            this.btnNext.Margin = new System.Windows.Forms.Padding(0);\n            this.btnNext.Name = \"btnNext\";\n            this.btnNext.Size = new System.Drawing.Size(34, 23);\n            this.btnNext.TabIndex = 1;\n            this.btnNext.Text = \">\";\n            this.btnNext.UseVisualStyleBackColor = true;\n            this.btnNext.Click += new System.EventHandler(this.BtnNext_Click);\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(114, 8);\n            this.label1.Margin = new System.Windows.Forms.Padding(0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(12, 13);\n            this.label1.TabIndex = 2;\n            this.label1.Text = \"/\";\n            // \n            // lblPage\n            // \n            this.lblPage.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.lblPage.AutoSize = true;\n            this.lblPage.Location = new System.Drawing.Point(97, 8);\n            this.lblPage.Margin = new System.Windows.Forms.Padding(0);\n            this.lblPage.Name = \"lblPage\";\n            this.lblPage.Size = new System.Drawing.Size(13, 13);\n            this.lblPage.TabIndex = 3;\n            this.lblPage.Text = \"0\";\n            // \n            // lblPageTotal\n            // \n            this.lblPageTotal.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.lblPageTotal.AutoSize = true;\n            this.lblPageTotal.Location = new System.Drawing.Point(129, 8);\n            this.lblPageTotal.Margin = new System.Windows.Forms.Padding(0);\n            this.lblPageTotal.Name = \"lblPageTotal\";\n            this.lblPageTotal.Size = new System.Drawing.Size(13, 13);\n            this.lblPageTotal.TabIndex = 4;\n            this.lblPageTotal.Text = \"0\";\n            // \n            // btnFirst\n            // \n            this.btnFirst.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.btnFirst.Location = new System.Drawing.Point(23, 3);\n            this.btnFirst.Margin = new System.Windows.Forms.Padding(0);\n            this.btnFirst.Name = \"btnFirst\";\n            this.btnFirst.Size = new System.Drawing.Size(34, 23);\n            this.btnFirst.TabIndex = 5;\n            this.btnFirst.Text = \"<<\";\n            this.btnFirst.UseVisualStyleBackColor = true;\n            this.btnFirst.Click += new System.EventHandler(this.BtnFirst_Click);\n            // \n            // btnLast\n            // \n            this.btnLast.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.btnLast.Location = new System.Drawing.Point(183, 3);\n            this.btnLast.Margin = new System.Windows.Forms.Padding(0);\n            this.btnLast.Name = \"btnLast\";\n            this.btnLast.Size = new System.Drawing.Size(34, 23);\n            this.btnLast.TabIndex = 6;\n            this.btnLast.Text = \">>\";\n            this.btnLast.UseVisualStyleBackColor = true;\n            this.btnLast.Click += new System.EventHandler(this.BtnLast_Click);\n            // \n            // PagingControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Name = \"PagingControl\";\n            this.Size = new System.Drawing.Size(240, 30);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n        private System.Windows.Forms.Button btnPrev;\n        private System.Windows.Forms.Button btnNext;\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label lblPage;\n        private System.Windows.Forms.Label lblPageTotal;\n        private System.Windows.Forms.Button btnFirst;\n        private System.Windows.Forms.Button btnLast;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/PagingControl.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class PagingControl : UserControl\n    {\n        public event EventHandler PageIndexChanged;\n        public int PageIndex { get; private set; }\n        public int Pages { get; private set; }\n\n        public PagingControl()\n        {\n            InitializeComponent();\n            DoubleBuffered = true;\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public void Init(int records, int recordsPerPage, int initialPage)\n        {\n            Pages = records / recordsPerPage;\n            if (records % recordsPerPage != 0)\n                Pages++;\n\n            lblPageTotal.Text = Pages.ToString();\n            var size = TextRenderer.MeasureText(lblPageTotal.Text, lblPageTotal.Font);\n\n            tblMain.ColumnStyles[3].Width = size.Width;\n            tblMain.ColumnStyles[5].Width = size.Width;\n\n            if (Pages > 0)\n                SetPageIndex(initialPage, false);\n            else\n                PageIndex = 0;\n        }\n\n        private void SetPageIndex(int index, bool publishEvent)\n        {\n            if (index < 0)\n                index = 0;\n            if (index >= Pages)\n                index = Pages - 1;\n\n            lblPage.Text = (index + 1).ToString();\n\n            if (PageIndex == index)\n                return;\n\n            PageIndex = index;\n\n            if (publishEvent)\n                PageIndexChanged?.Invoke(this, EventArgs.Empty);\n        }\n\n        private void BtnNext_Click(object sender, EventArgs e)\n        {\n            SetPageIndex(PageIndex + 1, true);\n        }\n\n        private void BtnPrev_Click(object sender, EventArgs e)\n        {\n            SetPageIndex(PageIndex - 1, true);\n        }\n\n        private void BtnFirst_Click(object sender, EventArgs e)\n        {\n            SetPageIndex(0, true);\n        }\n\n        private void BtnLast_Click(object sender, EventArgs e)\n        {\n            SetPageIndex(Pages - 1, true);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/PagingControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/RatingControl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class RatingControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 5;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F));\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 1;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(137, 29);\n            this.tblMain.TabIndex = 0;\n            // \n            // RatingControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Name = \"RatingControl\";\n            this.Size = new System.Drawing.Size(137, 29);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblMain;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/RatingControl.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class RatingControl : UserControl\n    {\n        private readonly int ColumnCount = 5;\n        private int m_selectedRating;\n\n        private List<PictureBox> m_pictures = new List<PictureBox>();\n\n        public RatingControl()\n        {\n            InitializeComponent();\n            InitPictures();\n        }\n\n        private void InitPictures()\n        {\n            foreach(PictureBox pb in m_pictures)\n            {\n                tblMain.Controls.Remove(pb);\n                pb.Dispose();\n            }\n\n            m_pictures.Clear();\n\n            for (int i = 0; i < ColumnCount; i++)\n            {\n                PictureBox pb;\n\n                if (i <= m_selectedRating)\n                    pb = CreatePictureBox(DoomLauncher.Properties.Resources.bon2b);\n                else\n                    pb = CreatePictureBox(DoomLauncher.Properties.Resources.bon2a);\n\n                m_pictures.Add(pb);\n\n                tblMain.Controls.Add(pb, i, 0);\n            }\n        }\n\n        private PictureBox CreatePictureBox(Image img)\n        {\n            PictureBox pb = new PictureBox\n            {\n                Image = img,\n                SizeMode = PictureBoxSizeMode.StretchImage,\n                Margin = new Padding(2, 2, 2, 2),\n                Dock = DockStyle.Fill\n            };\n            pb.MouseDown += pb_MouseDown;\n            return pb;\n        }\n\n        void pb_MouseDown(object sender, MouseEventArgs e)\n        {\n            PictureBox pb = sender as PictureBox;\n\n            for (int i = 0; i < m_pictures.Count; i++)\n            {\n                if (m_pictures[i].Equals(pb))\n                {\n                    m_selectedRating = i;\n                    break;\n                }\n            }\n\n            InitPictures();\n        }\n\n        public int RatingCount\n        {\n            get { return ColumnCount; }\n        }\n\n        public int SelectedRating\n        {\n            get { return m_selectedRating + 1; }\n            set { m_selectedRating = value - 1; InitPictures(); }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/RatingControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/ScreenshotView.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class ScreenshotView\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.flpScreenshots = new DoomLauncher.FlowLayoutPanelDB();\n            this.SuspendLayout();\n            // \n            // flpScreenshots\n            // \n            this.flpScreenshots.AutoScroll = true;\n            this.flpScreenshots.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpScreenshots.Location = new System.Drawing.Point(0, 0);\n            this.flpScreenshots.Name = \"flpScreenshots\";\n            this.flpScreenshots.Size = new System.Drawing.Size(150, 150);\n            this.flpScreenshots.TabIndex = 0;\n            // \n            // ScreenshotView\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.flpScreenshots);\n            this.Name = \"ScreenshotView\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private DoomLauncher.FlowLayoutPanelDB flpScreenshots;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/ScreenshotView.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Forms;\nusing DoomLauncher.Handlers;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class RequestScreenshotsEventArgs : EventArgs\n    {\n        public RequestScreenshotsEventArgs(IGameFile gameFile) { GameFile = gameFile; }\n        public IGameFile GameFile { get; private set; }\n    }\n\n    class PictureItem\n    {\n        public PictureItem(PictureBox pb)\n        {\n            PictureBox = pb;\n        }\n\n        public PictureBox PictureBox { get; private set; }\n        public IFileData CurrentFile { get; set; }\n        public bool Skip { get; set; }\n    }\n\n    public partial class ScreenshotView : BasicFileView\n    {\n        private const double AspectWidth = 16;\n        private const double AspectHeight = 9;\n        private readonly Dictionary<PictureBox, IFileData> m_lookup = new Dictionary<PictureBox, IFileData>();\n        private readonly List<PictureItem> m_pictureBoxes = new List<PictureItem>();\n        private List<IFileData> m_screenshots = new List<IFileData>();\n        private int m_pictureWidth;\n        private CancellationTokenSource m_ct = new CancellationTokenSource();\n        private bool m_imageWorkerComplete = true;\n        private readonly Stopwatch m_clickStopwatch = new Stopwatch();\n        private readonly ToolTipGroup m_toolTipGroup = new ToolTipGroup();\n\n        public event EventHandler<RequestScreenshotsEventArgs> RequestScreenshots;\n\n        public ScreenshotView()\n        {\n            InitializeComponent();\n            flpScreenshots.Click += FlpScreenshots_Click;\n        }\n\n        public void SetPictureWidth(int pictureWidth)\n        {\n            m_pictureWidth = pictureWidth;\n            InitPictureBoxes();\n        }\n\n        private void FlpScreenshots_Click(object sender, EventArgs e)\n        {\n            SelectedFile = null;\n            foreach (PictureBox pbSet in m_lookup.Keys)\n                SetSelectedStyle(pbSet, false);\n        }\n\n        public override void SetData(IGameFile gameFile)\n        {\n            flpScreenshots.BackColor = ColorTheme.Current.GridBackground;\n            SelectedFile = null;\n\n            foreach (PictureBox pbSet in m_lookup.Keys)\n                SetSelectedStyle(pbSet, false);\n\n            flpScreenshots.SuspendLayout();\n            flpScreenshots.Controls.Clear();\n\n            flpScreenshots.ResumeLayout();\n\n            m_lookup.Clear();\n\n            if (gameFile != null && gameFile.GameFileID.HasValue)\n                RequestScreenshots?.Invoke(this, new RequestScreenshotsEventArgs(gameFile));\n        }\n\n        public override void ClearData()\n        {\n            SelectedFile = null;\n            flpScreenshots.SuspendLayout();\n            flpScreenshots.Controls.Clear();\n            flpScreenshots.ResumeLayout();\n            m_lookup.Clear();\n        }\n\n        public override bool ShowCreateNew(IWin32Window parent, IDataSourceAdapter adapter, ISourcePortData sourcePort, string filename, bool isMultiImport,\n            out NewFileData newFileData)\n        {\n            newFileData = null;\n            ScreenshotEditForm screenshotEditForm = new ScreenshotEditForm();\n            screenshotEditForm.StartPosition = FormStartPosition.CenterParent;\n            screenshotEditForm.SetData(adapter.GetGameFile(GameFile.FileName), null);\n\n            if (screenshotEditForm.ShowDialog() != DialogResult.OK)\n                return false;\n            \n            newFileData = new NewFileData()\n            {\n                UserTitle = screenshotEditForm.Title,\n                UserDescription = screenshotEditForm.Description,\n                Map = screenshotEditForm.Map,\n                SourcePortID = -1,\n            };\n            return true;\n        }\n\n        public override bool New()\n        {\n            if (base.New())\n            {\n                ThumbnailManager.UpdateThumbnail(GameFile);\n                return true;\n            }\n\n            return false;\n        }\n\n        public override bool Edit()\n        {\n            if (SelectedFile == null)\n                return false;\n\n            return ScreenshotEditForm.ShowDialogAndUpdate(this, DataSourceAdapter, \n                DataSourceAdapter.GetGameFile(GameFile.FileName), SelectedFile);\n        }\n\n        public override bool Delete()\n        {\n            if (base.Delete())\n            {\n                ThumbnailManager.UpdateThumbnail(GameFile);\n                return true;\n            }\n            \n            return false;\n        }\n\n        public override bool MoveFileOrderUp()\n        {\n            if (base.MoveFileOrderUp())\n            {\n                ThumbnailManager.UpdateThumbnail(GameFile);\n                return true;\n            }\n\n            return false;\n        }\n\n        public override bool MoveFileOrderDown()\n        {\n            if (base.MoveFileOrderDown())\n            {\n                ThumbnailManager.UpdateThumbnail(GameFile);\n                return true;\n            }\n\n            return false;\n        }\n\n        public override bool SetFileOrderFirst()\n        {\n            if (base.SetFileOrderFirst())\n            {\n                ThumbnailManager.UpdateThumbnail(GameFile);\n                return true;\n            }\n\n            return false;\n        }\n\n        private void InitPictureBoxes()\n        {\n            lock (m_pictureBoxes)\n            {\n                foreach (var item in m_pictureBoxes)\n                {\n                    PictureBox pb = item.PictureBox;\n                    if (flpScreenshots.Controls.Contains(pb))\n                        flpScreenshots.Controls.Remove(pb);\n                    if (pb.Image != null)\n                        pb.Image.Dispose();\n                }\n\n                m_pictureBoxes.Clear();\n                ExpandPictureBoxes(50);\n            }\n        }\n\n        private void ExpandPictureBoxes(int count)\n        {\n            for (int i = 0; i < count; i++)\n                m_pictureBoxes.Add(new PictureItem(CreatePictureBox()));\n\n            foreach (var pb in m_pictureBoxes)\n                m_toolTipGroup.SetToolTip(pb.PictureBox, \"Double-click to view\");\n        }\n\n        public void SetScreenshots(List<IFileData> screenshots)\n        {\n            m_ct.Cancel();\n            while (!m_imageWorkerComplete)\n                Thread.Sleep(10);\n            m_imageWorkerComplete = false;\n            m_ct = new CancellationTokenSource();\n\n            flpScreenshots.SuspendLayout();\n\n            m_screenshots = screenshots.ToList();\n            m_lookup.Clear();\n\n            lock (m_pictureBoxes)\n            {\n                if (m_screenshots.Count > m_pictureBoxes.Count)\n                    ExpandPictureBoxes(m_screenshots.Count - m_pictureBoxes.Count);\n\n                List<PictureItem>.Enumerator enumerator = m_pictureBoxes.GetEnumerator();\n\n                foreach (IFileData screen in screenshots)\n                {\n                    enumerator.MoveNext();\n                    if (enumerator.Current == null)\n                        break;\n\n                    PictureBox pbScreen = enumerator.Current.PictureBox;\n                    enumerator.Current.Skip = true;\n                    flpScreenshots.Controls.Add(pbScreen);\n\n                    m_lookup.Add(pbScreen, screen);\n\n                    try\n                    {\n                        if (screen.IsUrl)\n                        {\n                            pbScreen.CancelAsync();\n                            pbScreen.Image = null;\n                            pbScreen.LoadAsync(screen.FileName);\n                        }\n                        else\n                        {\n                            if (screen.Equals(enumerator.Current.CurrentFile))\n                                continue;\n\n                            enumerator.Current.Skip = false;\n                            Image image = pbScreen.Image;\n                            pbScreen.Image = null;\n                            if (image != null)\n                                image.Dispose();\n                        }\n                    }\n                    catch\n                    {\n                        pbScreen.ImageLocation = string.Empty;\n                    }\n                }\n            }\n\n            var thread = new Thread(new ThreadStart(SetImages));\n            thread.Start();\n            flpScreenshots.ResumeLayout();\n        }\n\n        private void SetImages()\n        {\n            lock (m_pictureBoxes)\n            {\n                List<PictureItem>.Enumerator enumerator = m_pictureBoxes.GetEnumerator();\n                foreach (var screen in m_screenshots)\n                {\n                    enumerator.MoveNext();\n                    if (m_ct.IsCancellationRequested || enumerator.Current == null)\n                        break;\n                    if (enumerator.Current.Skip)\n                        continue;\n\n                    PictureBox pbScreen = enumerator.Current.PictureBox;\n                    string file = Path.Combine(DataDirectory.GetFullPath(), screen.FileName);\n\n                    try\n                    {\n                        using (var image = Image.FromFile(file))\n                            pbScreen.Image = image.FixedSize(pbScreen.Width, pbScreen.Height, Color.Black);\n                    }\n                    catch\n                    {\n                        // Most likely file doesn't exist...\n                        // Can also be out of memory exception\n                    }\n\n                    enumerator.Current.CurrentFile = screen;\n                }\n\n                enumerator.MoveNext();\n                while (enumerator.Current != null)\n                {\n                    enumerator.Current.CurrentFile = null;\n                    enumerator.MoveNext();\n                }\n\n                m_imageWorkerComplete = true;\n            }\n        }\n\n        private PictureBox CreatePictureBox()\n        {\n            PictureBox pbScreen = new PictureBox\n            {\n                WaitOnLoad = false,\n                BackColor = Color.Black,\n                Width = m_pictureWidth\n            };\n\n            pbScreen.Height = Convert.ToInt32(pbScreen.Width / (AspectWidth / AspectHeight));\n            pbScreen.SizeMode = PictureBoxSizeMode.Zoom;\n            pbScreen.Margin = new Padding(7);\n            pbScreen.MouseDown += pbScreen_MouseDown;\n            pbScreen.DoubleClick += PbScreen_DoubleClick;\n            pbScreen.Paint += PbScreen_Paint;\n            return pbScreen;\n        }\n\n        private void PbScreen_Paint(object sender, PaintEventArgs e)\n        {\n            PictureBox pb = sender as PictureBox;\n            if (pb == null || !m_lookup.TryGetValue(pb, out var fileData))\n                return;\n\n            string title = FileData.GetTitle(fileData);\n            if (string.IsNullOrEmpty(title))\n                return;\n\n            Util.DrawImageTitleBar(title, pb.ClientRectangle, e, Brushes.White, Font);\n        }\n\n        private void PbScreen_DoubleClick(object sender, EventArgs e)\n        {\n            HandleDoubleClick(sender);\n        }\n\n        void pbScreen_MouseDown(object sender, MouseEventArgs e)\n        {\n            HandleClick(sender, e);\n        }\n\n        private void HandleDoubleClick(object sender)\n        {\n            if (sender is PictureBox pb && m_lookup.ContainsKey(pb))\n            {\n                HandleClick(pb, null);\n                View();\n            }\n        }\n\n        public override void View()\n        {\n            if (m_screenshots.Count > 0)\n            {\n                ScreenshotViewerForm screenshotForm = new ScreenshotViewerForm();\n                screenshotForm.StartPosition = FormStartPosition.CenterParent;\n                var imagePaths = m_screenshots.Select(x => Path.Combine(DataDirectory.GetFullPath(), x.FileName)).ToArray();\n                screenshotForm.SetImageFileData(DataSourceAdapter, DataSourceAdapter.GetGameFile(GameFile.FileName), imagePaths, m_screenshots);\n                screenshotForm.WindowState = FormWindowState.Maximized;\n                screenshotForm.Shown += ScreenshotForm_Shown;\n                screenshotForm.ShowDialog(this);\n                SetData(GameFile);\n            }\n        }\n\n        private void ScreenshotForm_Shown(object sender, EventArgs e)\n        {\n            if (!(sender is ScreenshotViewerForm screenshotForm))\n                return;\n\n            if (SelectedFile != null)\n                screenshotForm.SetImage(Path.Combine(DataDirectory.GetFullPath(), SelectedFile.FileName));\n        }\n\n        private void HandleClick(object sender, MouseEventArgs e)\n        {\n            if (!(sender is PictureBox pb) || !m_lookup.TryGetValue(pb, out var fileData))\n                return;\n\n            if (SelectedFile != null && SelectedFile.FileID == fileData.FileID)\n            {\n                if (e != null && e.Button == MouseButtons.Left && m_clickStopwatch.ElapsedMilliseconds < SystemInformation.DoubleClickTime)\n                    HandleDoubleClick(sender);\n                m_clickStopwatch.Restart();\n            }\n            else\n            {\n                m_clickStopwatch.Restart();\n                foreach (var pbSet in m_lookup.Keys)\n                    SetSelectedStyle(pbSet, false);\n\n                SelectedFile = fileData;\n                SetSelectedStyle(pb, true);\n            }\n\n            if (e != null && e.Button == MouseButtons.Right)\n                m_menu.Show(pb.PointToScreen(e.Location));\n        }\n\n        private void SetSelectedStyle(PictureBox pb, bool selected)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(new Action<PictureBox, bool>(SetSelectedStyle), pb, selected);\n                return;\n            }\n\n            if (selected)\n            {\n                pb.BackColor = ColorTheme.Current.Highlight;\n                pb.Padding = new Padding(2);\n                pb.BorderStyle = BorderStyle.Fixed3D;\n            }\n            else\n            {\n                pb.BackColor = Color.Black;\n                pb.Padding = new Padding(0);\n                pb.BorderStyle = BorderStyle.None;\n            }\n        }\n\n        protected override IFileData[] Files => m_lookup.Values.ToArray();\n\n        protected override List<IFileData> GetSelectedFiles()\n        {\n            var files = new List<IFileData>();\n            if (SelectedFile != null)\n                files.Add(SelectedFile);\n\n            return files;\n        }\n\n        private IFileData SelectedFile { get; set; }\n\n        public override bool EditAllowed => true;\n\n        public override IList<MenuOptions> MenuOptions\n        {\n            get\n            {\n                return new MenuOptions[]\n                {\n                    new MenuOptions()\n                    {\n                        Title = \"Sort by Map\",\n                        Action = SortByMap\n                    }\n                };\n            }\n        }\n\n        private bool SortByMap()\n        {\n            if (Files.Count() <= 1)\n                return false;\n\n            var files = Files.ToList();\n            var firstFile = files[0];\n            files.Sort(new FileMapComparer());\n            int order = 0;\n            foreach (var file in files)\n                file.FileOrder = order++;\n\n            foreach (IFileData fileUpdate in files)\n                DataSourceAdapter.UpdateFile(fileUpdate);\n\n            if (firstFile.FileOrder != 0)\n                ThumbnailManager.UpdateThumbnail(GameFile);\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/ScreenshotView.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/SearchControl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SearchControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.txtSearch = new System.Windows.Forms.TextBox();\n            this.btnFilters = new DoomLauncher.FormButton();\n            this.pbSearch = new System.Windows.Forms.PictureBox();\n            this.tblMain.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearch)).BeginInit();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 3;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30F));\n            this.tblMain.Controls.Add(this.txtSearch, 1, 0);\n            this.tblMain.Controls.Add(this.btnFilters, 2, 0);\n            this.tblMain.Controls.Add(this.pbSearch, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 1;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(415, 23);\n            this.tblMain.TabIndex = 2;\n            // \n            // txtSearch\n            // \n            this.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.txtSearch.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtSearch.Location = new System.Drawing.Point(26, 0);\n            this.txtSearch.Margin = new System.Windows.Forms.Padding(0);\n            this.txtSearch.Name = \"txtSearch\";\n            this.txtSearch.Size = new System.Drawing.Size(359, 22);\n            this.txtSearch.TabIndex = 1;\n            // \n            // btnFilters\n            // \n            this.btnFilters.Dock = System.Windows.Forms.DockStyle.Left;\n            this.btnFilters.Location = new System.Drawing.Point(385, 0);\n            this.btnFilters.Margin = new System.Windows.Forms.Padding(0);\n            this.btnFilters.Name = \"btnFilters\";\n            this.btnFilters.Size = new System.Drawing.Size(30, 23);\n            this.btnFilters.TabIndex = 2;\n            this.btnFilters.Text = \"▼\";\n            this.btnFilters.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            this.btnFilters.UseVisualStyleBackColor = true;\n            this.btnFilters.Click += new System.EventHandler(this.btnFilters_Click);\n            // \n            // pbSearch\n            // \n            this.pbSearch.Location = new System.Drawing.Point(3, 5);\n            this.pbSearch.Margin = new System.Windows.Forms.Padding(3, 5, 0, 3);\n            this.pbSearch.Name = \"pbSearch\";\n            this.pbSearch.Size = new System.Drawing.Size(20, 15);\n            this.pbSearch.TabIndex = 3;\n            this.pbSearch.TabStop = false;\n            // \n            // SearchControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.Name = \"SearchControl\";\n            this.Size = new System.Drawing.Size(415, 23);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearch)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n        private System.Windows.Forms.TextBox txtSearch;\n        private TableLayoutPanelDB tblMain;\n        private FormButton btnFilters;\n        private System.Windows.Forms.PictureBox pbSearch;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/SearchControl.cs",
    "content": "﻿using PresentationControls;\nusing System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class SearchControl : UserControl\n    {\n        public event EventHandler SearchTextChanged;\n        public event EventHandler SearchTextChangedNoDebounce;\n        public event PreviewKeyDownEventHandler SearchTextKeyPreviewDown;\n\n        private readonly Controls.CheckBoxList m_checkBoxList = new Controls.CheckBoxList();\n        private readonly System.Timers.Timer m_textTimer = new System.Timers.Timer();\n        private bool m_fireEvent = true;\n\n        public SearchControl()\n        {\n            InitializeComponent();\n            Stylizer.StylizeControl(m_checkBoxList, DesignMode);\n            pbSearch.Image = Icons.Search;\n            txtSearch.TextChanged += txtSearch_TextChanged;\n            txtSearch.PreviewKeyDown += TxtSearch_PreviewKeyDown;\n            m_textTimer.AutoReset = false;\n            m_textTimer.Interval = 400;\n            m_textTimer.Elapsed += TextTimer_Elapsed;\n        }\n\n        public void SetSearchText(string text, bool fireEvent = false)\n        {\n            m_fireEvent = fireEvent;\n            txtSearch.Text = text;\n            m_fireEvent = true;\n        }\n\n        public void SetShowDropDown(bool set)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            tblMain.ColumnStyles[2].Width = set ? dpiScale.ScaleIntX(30) : 0;\n        }\n\n        private void TextTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)\n        {\n            if (InvokeRequired)\n                Invoke(new Action(InvokeSearchTextChanged));\n            else\n                InvokeSearchTextChanged();\n        }\n\n        private void InvokeSearchTextChanged()\n        {\n            SearchTextChanged?.Invoke(this, EventArgs.Empty);\n        }\n\n        private void TxtSearch_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)\n        {\n            SearchTextKeyPreviewDown?.Invoke(this, e);\n        }\n\n        void txtSearch_TextChanged(object sender, EventArgs e)\n        {\n            if (!m_fireEvent)\n                return;\n\n            SearchTextChangedNoDebounce?.Invoke(this, EventArgs.Empty);\n\n            m_textTimer.Stop();\n            m_textTimer.Start();\n        }\n\n        public void SetSearchFilter(string item, bool check)\n        {\n            m_checkBoxList.SetChecked(item, check);\n        }\n\n        public bool GetSearchFilter(string item)\n        {\n            return m_checkBoxList.IsChecked(item);\n        }\n\n        public string[] GetSearchFilters()\n        {\n            return m_checkBoxList.Items.ToArray();\n        }\n\n        public string[] GetSelectedSearchFilters()\n        {\n            return m_checkBoxList.GetCheckedItems();\n        }\n\n        public void SetSearchFilters(IEnumerable<string> items)\n        {\n            m_checkBoxList.SetItems(items);\n        }\n\n        public string SearchText\n        {\n            get => txtSearch.Text;\n            set => txtSearch.Text = value;\n        }\n\n        private void btnFilters_Click(object sender, EventArgs e)\n        {            \n            Popup popup = new Popup(m_checkBoxList)\n            {\n                Width = btnFilters.Location.X + btnFilters.Width,\n                Height = m_checkBoxList.Height\n            };\n            popup.Show(txtSearch);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/SearchControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/SlideShowPictureBox.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SlideShowPictureBox\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.pbImage = new System.Windows.Forms.PictureBox();\n            ((System.ComponentModel.ISupportInitialize)(this.pbImage)).BeginInit();\n            this.SuspendLayout();\n            // \n            // pbImage\n            // \n            this.pbImage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbImage.Location = new System.Drawing.Point(0, 0);\n            this.pbImage.Name = \"pbImage\";\n            this.pbImage.Size = new System.Drawing.Size(150, 150);\n            this.pbImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\n            this.pbImage.TabIndex = 0;\n            this.pbImage.TabStop = false;\n            // \n            // SlideShowPictureBox\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.pbImage);\n            this.Name = \"SlideShowPictureBox\";\n            ((System.ComponentModel.ISupportInitialize)(this.pbImage)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.PictureBox pbImage;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/SlideShowPictureBox.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing System.Drawing.Imaging;\nusing System.IO;\nusing System.Linq;\nusing System.Diagnostics;\n\nnamespace DoomLauncher\n{\n    public partial class SlideShowPictureBox : UserControl\n    {\n        private const int ImageMilliseconds = 4000;\n        private const int FadeMilliseconds = 500;\n        private const int FadeTimes = 10;\n        private readonly Timer m_timer = new Timer();\n        private readonly Brush m_bgBrush = new SolidBrush(Color.Black);\n        private readonly Stopwatch m_stopwatch = new Stopwatch();\n        private Stopwatch m_fadeOut = new Stopwatch();\n        private int m_index = 0;\n        private int m_fadeCount = 0;\n        private int m_lastFadeDiff = 0;\n        private List<string> m_images = new List<string>();\n        private float m_alpha = 0.0F;\n\n        private SlideshowState m_state = SlideshowState.SetImage;\n        private Image m_currentImage;\n        private Image m_drawImage;\n        private Graphics m_currentGraphics;\n\n        public float ImageAlpha => m_alpha;\n        public int ImageIndex => m_index;\n\n        private enum SlideshowState\n        {\n            SetImage,\n            FadeIn,\n            Wait,\n            FadeOut\n        }\n\n        public int ImageCount => m_images.Count;\n\n        public event EventHandler<int> ImageChanged;\n        public event EventHandler<PaintEventArgs> ImagePaint;\n\n        public SlideShowPictureBox()\n        {\n            InitializeComponent();\n            pbImage.Paint += PbImage_Paint;\n\n            m_timer.Interval = FadeMilliseconds / FadeTimes;\n            m_timer.Tick += M_timer_Tick;\n\n            Resize += SlideShowPictureBox_Resize;\n        }\n\n        private void PbImage_Paint(object sender, PaintEventArgs e)\n        {\n            pbImage.BackColor = ColorTheme.Current.ImageBackground;\n            ImagePaint?.Invoke(this, e);\n        }\n\n        public void Stop()\n        {\n            if (m_images.Count > 0)\n            {\n                SetImages(m_images);\n                m_timer.Stop();\n            }\n        }\n\n        public void Resume()\n        {\n            if (m_images.Count > 0)\n                SetImages(m_images);\n        }\n\n        public void SetImage(Image image)\n        {\n            ClearImage();\n            pbImage.Image = image;\n            ImageChanged?.Invoke(this, m_index);\n        }\n\n        public Image GetImage() => pbImage.Image;\n\n        public bool SetImages(List<string> imagePaths, int startIndex = 0)\n        {\n            imagePaths = imagePaths.Where(x => File.Exists(x)).ToList();\n            if (imagePaths.Count == 0)\n            {\n                ClearImage();\n                m_images.Clear();\n                m_timer.Stop();\n                return false;\n            }\n\n            if (startIndex < 0 || startIndex > imagePaths.Count)\n                startIndex = imagePaths.Count - 1;\n\n            m_alpha = 1.0F;\n            m_index = startIndex;\n            m_images = imagePaths;\n            m_state = SlideshowState.Wait;\n            m_timer.Stop();\n\n            pbImage.CancelAsync();\n\n            // Don't cycle with one image\n            if (imagePaths.Count == 1)\n            {\n                pbImage.ImageLocation = m_images[m_index];\n                return true;\n            }\n\n            m_timer.Start();\n            m_fadeOut.Restart();\n\n            SetImage();\n\n            return true;\n        }\n\n        public void ClearImage()\n        {\n            pbImage.CancelAsync();\n            m_images = new List<string>();\n            m_timer.Stop();\n            pbImage.ImageLocation = string.Empty;\n        }\n\n        private void SlideShowPictureBox_Resize(object sender, EventArgs e)\n        {\n            SetImage();\n        }\n\n        private void HandleState()\n        {\n            switch (m_state)\n            {\n                case SlideshowState.SetImage:\n                    m_state = SlideshowState.FadeIn;\n                    m_alpha = 0.0F;\n                    m_fadeOut.Restart();\n                    SetImage();\n\n                    m_fadeCount = FadeTimes;\n                    break;\n\n                case SlideshowState.FadeIn:\n                    Fade(1.0F / FadeTimes);\n                    if (m_fadeCount == 0)\n                        m_state = SlideshowState.Wait;\n                    break;\n\n                case SlideshowState.Wait:\n                    if (m_fadeOut.ElapsedMilliseconds >= ImageMilliseconds - FadeMilliseconds)\n                    {\n                        m_fadeCount = FadeTimes;\n                        m_state = SlideshowState.FadeOut;\n                    }\n                    break;\n\n                case SlideshowState.FadeOut:\n                    Fade(-1.0F / FadeTimes);\n                    if (m_fadeCount == 0)\n                    {\n                        m_index++;\n                        m_index %= m_images.Count;\n                        m_state = SlideshowState.SetImage;\n                    }\n                    break;\n            }\n        }\n\n        private void M_timer_Tick(object sender, EventArgs e)\n        {\n            HandleState();\n        }\n\n        private void Fade(float step)\n        {\n            m_stopwatch.Start();\n            m_fadeCount--;\n            m_alpha += step;\n\n            SetTransparency();\n\n            // SetTransparency uses DrawImage and becomes slower as the image becomes larger\n            // If the blend takes longer than expected then skip the next one to keep the overall fade time roughly the same\n            if (m_stopwatch.ElapsedMilliseconds + m_lastFadeDiff >= FadeMilliseconds / FadeTimes)\n            {\n                m_lastFadeDiff = (int)m_stopwatch.ElapsedMilliseconds - (FadeMilliseconds / FadeTimes);\n                m_fadeCount--;\n                m_alpha += step;\n\n                if (m_fadeCount <= 0)\n                {\n                    if (step < 0)\n                        m_alpha = 0.0F;\n                    else\n                        m_alpha = 1.0F;\n                    m_fadeCount = 0;\n                }\n            }\n            else\n            {\n                m_lastFadeDiff = 0;\n            }\n\n            m_stopwatch.Reset();\n        }\n\n        private void SetImage()\n        {\n            if (m_images.Count == 0)\n            {\n                pbImage.ImageLocation = string.Empty;\n                return;\n            }\n\n            try\n            {\n                pbImage.Image = null;\n                InitBlendCache();\n                pbImage.Image = m_drawImage;\n                SetTransparency();\n            }\n            catch\n            {\n                // File data is not accessible or out of memory, ignore for now\n            }\n        }\n\n        private void InitBlendCache()\n        {\n            m_currentImage?.Dispose();\n            m_currentGraphics?.Dispose();\n            m_drawImage?.Dispose();\n   \n            using (var image = ImageExtensions.FromFileOrDefault(m_images[m_index]))\n                m_currentImage = image.FixedSize(pbImage.Width, pbImage.Height, Color.Black);\n            m_drawImage = new Bitmap(m_currentImage.Width, m_currentImage.Height);\n            m_currentGraphics = Graphics.FromImage(m_drawImage);\n        }\n\n        private void SetTransparency()\n        {\n            if (m_currentImage == null)\n                return;\n\n            try\n            {\n                if (m_alpha >= 1.0F)\n                {\n                    pbImage.Image = m_currentImage;\n                    return;\n                }\n\n                ColorMatrix colorMatrix = new ColorMatrix(new float[][]\n                {\n                    new [] { 1.0F, 0.0F, 0.0F, 0.0F, 0.0F },\n                    new [] { 0.0F, 1.0F, 0.0F, 0.0F, 0.0F },\n                    new [] { 0.0F, 0.0F, 1.0F, 0.0F, 0.0F },\n                    new [] { 0.0F, 0.0F, 0.0F, 0.0F, 0.0F },\n                    new [] { 0.0F, 0.0F, 0.0F, m_alpha, 1.0F },\n                });\n\n                Rectangle rect = new Rectangle(0, 0, m_currentImage.Width, m_currentImage.Height);\n                m_currentGraphics.FillRectangle(m_bgBrush, rect);\n\n                ImageAttributes imageAttrs = new ImageAttributes();\n                imageAttrs.SetColorMatrix(colorMatrix);\n\n                m_currentGraphics.DrawImage(m_currentImage, rect, 0, 0,\n                    m_drawImage.Width, m_drawImage.Height, GraphicsUnit.Pixel, imageAttrs);\n                pbImage.Image = m_drawImage;\n                pbImage.Refresh();\n            }\n            catch\n            {\n                // Sometimes this can randomly fail, can be timing or whatever... just ignore\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/SlideShowPictureBox.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/SourcePortEdit.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SourcePortEdit\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.label1 = new System.Windows.Forms.Label();\n            this.txtName = new System.Windows.Forms.TextBox();\n            this.tblExec = new System.Windows.Forms.TableLayoutPanel();\n            this.txtExec = new System.Windows.Forms.TextBox();\n            this.btnBrowse = new System.Windows.Forms.Button();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.txtExtensions = new System.Windows.Forms.TextBox();\n            this.lblParameters = new System.Windows.Forms.Label();\n            this.txtParameters = new System.Windows.Forms.TextBox();\n            this.label4 = new System.Windows.Forms.Label();\n            this.tblAltSave = new System.Windows.Forms.TableLayoutPanel();\n            this.txtAltSave = new System.Windows.Forms.TextBox();\n            this.btnAltSaveBrowse = new System.Windows.Forms.Button();\n            this.label5 = new System.Windows.Forms.Label();\n            this.lblFileOption = new System.Windows.Forms.Label();\n            this.txtFileOption = new System.Windows.Forms.TextBox();\n            this.chkArchive = new System.Windows.Forms.CheckBox();\n            this.tblMain.SuspendLayout();\n            this.tblExec.SuspendLayout();\n            this.tblAltSave.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 2;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 180F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.label2, 0, 2);\n            this.tblMain.Controls.Add(this.txtExtensions, 1, 2);\n            this.tblMain.Controls.Add(this.lblParameters, 0, 3);\n            this.tblMain.Controls.Add(this.txtParameters, 1, 3);\n            this.tblMain.Controls.Add(this.label4, 0, 4);\n            this.tblMain.Controls.Add(this.tblAltSave, 1, 4);\n            this.tblMain.Controls.Add(this.label5, 0, 5);\n            this.tblMain.Controls.Add(this.lblFileOption, 0, 6);\n            this.tblMain.Controls.Add(this.txtFileOption, 1, 6);\n            this.tblMain.Controls.Add(this.chkArchive, 1, 5);\n            this.tblMain.Controls.Add(this.label3, 0, 0);\n            this.tblMain.Controls.Add(this.tblExec, 1, 0);\n            this.tblMain.Controls.Add(this.label1, 0, 1);\n            this.tblMain.Controls.Add(this.txtName, 1, 1);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 8;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblMain.Size = new System.Drawing.Size(465, 725);\n            this.tblMain.TabIndex = 0;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(4, 47);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(51, 20);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Name\";\n            // \n            // txtName\n            // \n            this.txtName.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtName.Location = new System.Drawing.Point(184, 43);\n            this.txtName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtName.Name = \"txtName\";\n            this.txtName.Size = new System.Drawing.Size(277, 26);\n            this.txtName.TabIndex = 4;\n            // \n            // tblExec\n            // \n            this.tblExec.ColumnCount = 2;\n            this.tblExec.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblExec.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 120F));\n            this.tblExec.Controls.Add(this.txtExec, 0, 0);\n            this.tblExec.Controls.Add(this.btnBrowse, 1, 0);\n            this.tblExec.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblExec.Location = new System.Drawing.Point(180, 0);\n            this.tblExec.Margin = new System.Windows.Forms.Padding(0);\n            this.tblExec.Name = \"tblExec\";\n            this.tblExec.RowCount = 1;\n            this.tblExec.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblExec.Size = new System.Drawing.Size(285, 38);\n            this.tblExec.TabIndex = 5;\n            // \n            // txtExec\n            // \n            this.txtExec.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtExec.Location = new System.Drawing.Point(4, 5);\n            this.txtExec.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtExec.Name = \"txtExec\";\n            this.txtExec.Size = new System.Drawing.Size(157, 26);\n            this.txtExec.TabIndex = 0;\n            // \n            // btnBrowse\n            // \n            this.btnBrowse.Location = new System.Drawing.Point(165, 0);\n            this.btnBrowse.Margin = new System.Windows.Forms.Padding(0);\n            this.btnBrowse.Name = \"btnBrowse\";\n            this.btnBrowse.Size = new System.Drawing.Size(99, 38);\n            this.btnBrowse.TabIndex = 1;\n            this.btnBrowse.Text = \"Browse\";\n            this.btnBrowse.UseVisualStyleBackColor = true;\n            this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(4, 9);\n            this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(88, 20);\n            this.label3.TabIndex = 1;\n            this.label3.Text = \"Executable\";\n            // \n            // label2\n            // \n            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(4, 85);\n            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(166, 20);\n            this.label2.TabIndex = 2;\n            this.label2.Text = \"Supported Extensions\";\n            // \n            // txtExtensions\n            // \n            this.txtExtensions.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtExtensions.Location = new System.Drawing.Point(184, 81);\n            this.txtExtensions.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtExtensions.Name = \"txtExtensions\";\n            this.txtExtensions.Size = new System.Drawing.Size(277, 26);\n            this.txtExtensions.TabIndex = 6;\n            // \n            // lblParameters\n            // \n            this.lblParameters.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblParameters.AutoSize = true;\n            this.lblParameters.Location = new System.Drawing.Point(4, 123);\n            this.lblParameters.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblParameters.Name = \"lblParameters\";\n            this.lblParameters.Size = new System.Drawing.Size(91, 20);\n            this.lblParameters.TabIndex = 8;\n            this.lblParameters.Text = \"Parameters\";\n            // \n            // txtParameters\n            // \n            this.txtParameters.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtParameters.Location = new System.Drawing.Point(184, 119);\n            this.txtParameters.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtParameters.Name = \"txtParameters\";\n            this.txtParameters.Size = new System.Drawing.Size(277, 26);\n            this.txtParameters.TabIndex = 9;\n            // \n            // label4\n            // \n            this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(4, 161);\n            this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(135, 20);\n            this.label4.TabIndex = 10;\n            this.label4.Text = \"Alt Save Directory\";\n            // \n            // tblAltSave\n            // \n            this.tblAltSave.ColumnCount = 2;\n            this.tblAltSave.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblAltSave.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 120F));\n            this.tblAltSave.Controls.Add(this.txtAltSave, 0, 0);\n            this.tblAltSave.Controls.Add(this.btnAltSaveBrowse, 1, 0);\n            this.tblAltSave.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblAltSave.Location = new System.Drawing.Point(180, 152);\n            this.tblAltSave.Margin = new System.Windows.Forms.Padding(0);\n            this.tblAltSave.Name = \"tblAltSave\";\n            this.tblAltSave.RowCount = 1;\n            this.tblAltSave.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblAltSave.Size = new System.Drawing.Size(285, 38);\n            this.tblAltSave.TabIndex = 11;\n            // \n            // txtAltSave\n            // \n            this.txtAltSave.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtAltSave.Location = new System.Drawing.Point(4, 5);\n            this.txtAltSave.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtAltSave.Name = \"txtAltSave\";\n            this.txtAltSave.Size = new System.Drawing.Size(157, 26);\n            this.txtAltSave.TabIndex = 0;\n            // \n            // btnAltSaveBrowse\n            // \n            this.btnAltSaveBrowse.Location = new System.Drawing.Point(165, 0);\n            this.btnAltSaveBrowse.Margin = new System.Windows.Forms.Padding(0);\n            this.btnAltSaveBrowse.Name = \"btnAltSaveBrowse\";\n            this.btnAltSaveBrowse.Size = new System.Drawing.Size(99, 38);\n            this.btnAltSaveBrowse.TabIndex = 1;\n            this.btnAltSaveBrowse.Text = \"Browse\";\n            this.btnAltSaveBrowse.UseVisualStyleBackColor = true;\n            this.btnAltSaveBrowse.Click += new System.EventHandler(this.btnAltSaveBrowse_Click);\n            // \n            // label5\n            // \n            this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(4, 199);\n            this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(61, 20);\n            this.label5.TabIndex = 12;\n            this.label5.Text = \"Archive\";\n            // \n            // lblFileOption\n            // \n            this.lblFileOption.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblFileOption.AutoSize = true;\n            this.lblFileOption.Location = new System.Drawing.Point(4, 237);\n            this.lblFileOption.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblFileOption.Name = \"lblFileOption\";\n            this.lblFileOption.Size = new System.Drawing.Size(85, 20);\n            this.lblFileOption.TabIndex = 3;\n            this.lblFileOption.Text = \"File Option\";\n            // \n            // txtFileOption\n            // \n            this.txtFileOption.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtFileOption.Location = new System.Drawing.Point(184, 233);\n            this.txtFileOption.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtFileOption.Name = \"txtFileOption\";\n            this.txtFileOption.Size = new System.Drawing.Size(277, 26);\n            this.txtFileOption.TabIndex = 7;\n            // \n            // chkArchive\n            // \n            this.chkArchive.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.chkArchive.AutoSize = true;\n            this.chkArchive.Location = new System.Drawing.Point(183, 198);\n            this.chkArchive.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);\n            this.chkArchive.Name = \"chkArchive\";\n            this.chkArchive.Size = new System.Drawing.Size(22, 21);\n            this.chkArchive.TabIndex = 13;\n            this.chkArchive.UseVisualStyleBackColor = true;\n            // \n            // SourcePortEdit\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"SourcePortEdit\";\n            this.Size = new System.Drawing.Size(465, 725);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.tblExec.ResumeLayout(false);\n            this.tblExec.PerformLayout();\n            this.tblAltSave.ResumeLayout(false);\n            this.tblAltSave.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.TextBox txtExtensions;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.TextBox txtName;\n        private System.Windows.Forms.TableLayoutPanel tblExec;\n        private System.Windows.Forms.TextBox txtExec;\n        private System.Windows.Forms.Button btnBrowse;\n        private System.Windows.Forms.Label lblFileOption;\n        private System.Windows.Forms.TextBox txtFileOption;\n        private System.Windows.Forms.Label lblParameters;\n        private System.Windows.Forms.TextBox txtParameters;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.TableLayoutPanel tblAltSave;\n        private System.Windows.Forms.TextBox txtAltSave;\n        private System.Windows.Forms.Button btnAltSaveBrowse;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.CheckBox chkArchive;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/SourcePortEdit.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.Stylize;\nusing System;\nusing System.IO;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class SourcePortEdit : UserControl\n    {\n        private string m_directory, m_exec;\n        private SourcePortLaunchType m_launchType;\n\n        public SourcePortEdit()\n        {\n            InitializeComponent();\n\n            txtFileOption.Text = \"-file\"; //default for source port, currently user will not see this but it will be populated in the database\n\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public void SetSupportedExtensions(string text)\n        {\n            txtExtensions.Text = text;\n        }\n\n        public void ShowOptions(bool set)\n        {\n            var controls = new Control[] { lblFileOption, txtFileOption };\n            foreach (var ctrl in controls)\n                ctrl.Visible = set;\n\n            if (set)\n                txtFileOption.Text = string.Empty;\n        }\n\n        public void SetDataSource(ISourcePortData sourcePort)\n        {\n            m_directory = sourcePort.Directory.GetPossiblyRelativePath();\n            m_exec = sourcePort.Executable;\n            m_launchType = sourcePort.LaunchType;\n\n            txtName.Text = txtExec.Text = txtExtensions.Text = txtFileOption.Text\n                = txtParameters.Text = txtAltSave.Text = string.Empty;\n\n            if (!string.IsNullOrEmpty(sourcePort.Name)) \n                txtName.Text = sourcePort.Name;\n            if (sourcePort.Directory != null && sourcePort.Executable != null) \n                txtExec.Text = sourcePort.Executable;\n            if (!string.IsNullOrEmpty(sourcePort.SupportedExtensions)) \n                txtExtensions.Text = sourcePort.SupportedExtensions;\n            if (!string.IsNullOrEmpty(sourcePort.FileOption))\n                txtFileOption.Text = sourcePort.FileOption;\n            if (!string.IsNullOrEmpty(sourcePort.ExtraParameters))\n                txtParameters.Text = sourcePort.ExtraParameters;\n            if (sourcePort.AltSaveDirectory != null)\n                txtAltSave.Text = sourcePort.AltSaveDirectory.GetPossiblyRelativePath();\n            chkArchive.Checked = sourcePort.Archived;\n        }\n\n        public void UpdateDataSource(ISourcePortData sourcePort)\n        {\n            sourcePort.Name = txtName.Text;\n            sourcePort.Directory = new LauncherPath(m_directory);\n            sourcePort.Executable = m_exec;\n            sourcePort.SupportedExtensions = txtExtensions.Text;\n            sourcePort.FileOption = txtFileOption.Text;\n            sourcePort.ExtraParameters = txtParameters.Text;\n            sourcePort.AltSaveDirectory = new LauncherPath(txtAltSave.Text);\n            sourcePort.Archived = chkArchive.Checked;\n        }\n\n        public string SourcePortName { get { return txtName.Text;  } }\n        public string SourcePortExec { get { return txtExec.Text; } }\n        public LauncherPath GetSourcePortDirectory() => new LauncherPath(m_directory);\n\n        private string GetFilter()\n        {\n            if (m_launchType == SourcePortLaunchType.Doom64)\n                return \"Doom 64 Executable (DOOM64_x64.exe)|DOOM64_x64.exe|All Files (*.*)|*.*\";\n            else\n                return \"Executable (*.exe)|*.exe|All Files (*.*)|*.*\";\n        }\n\n        private void btnBrowse_Click(object sender, EventArgs e)\n        {\n            OpenFileDialog dialog = new OpenFileDialog();\n            dialog.Filter = GetFilter();\n            dialog.InitialDirectory = m_directory;\n\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                string file = LauncherPath.GetRelativePath(dialog.FileName);\n                \n                string exec = Path.GetFileName(file);\n                string directory = file.Replace(exec, string.Empty);\n\n                if (string.IsNullOrEmpty(directory))\n                {\n                    StyledMessageBox.Show(this, \"The source port can't be in the same directory as Doom Launcher.\", \"Invalid Path\", \n                        MessageBoxButtons.OK, MessageBoxIcon.Error);\n                    return;\n                }\n\n                m_exec = exec;\n                m_directory = directory;\n\n                txtExec.Text = m_exec;\n                if (string.IsNullOrEmpty(txtName.Text))\n                    txtName.Text = Path.GetFileNameWithoutExtension(file);\n            }\n        }\n\n        private void btnAltSaveBrowse_Click(object sender, EventArgs e)\n        {\n            FolderBrowserDialog dialog = new FolderBrowserDialog();\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n                txtAltSave.Text = LauncherPath.GetRelativePath(dialog.SelectedPath);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/SourcePortEdit.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/StatBar.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    class StatBar : UserControl\n    {\n        private static readonly Font DisplayFont = new Font(FontFamily.GenericSerif, 10.0f, FontStyle.Bold);\n        private static readonly Brush FontBrush = new SolidBrush(ColorTheme.Current.StatText);\n\n        private int m_count, m_total, m_maxHeight;\n        private string m_text;\n\n        private static bool UseNewStyling = true;\n\n        public StatBar()\n        {\n            Paint += StatBar_Paint;\n            SizeChanged += StatBar_SizeChanged;\n        }\n\n        public void SetMaxHeight(int maxHeight) => m_maxHeight = maxHeight;\n\n        //this is to get around some sort of bug with the designer initilization blowing away the max size somewhere...\n        private void StatBar_SizeChanged(object sender, EventArgs e)\n        {\n            if (m_maxHeight == 0)\n                m_maxHeight = MaximumSize.Height;\n            if (Height > m_maxHeight)\n                Height = m_maxHeight;\n        }\n\n        public void SetStats(int count, int total, string text)\n        {\n            m_count = count;\n            m_total = total;\n            m_text = text;\n        }\n\n        private void StatBar_Paint(object sender, PaintEventArgs e)\n        {\n            if (m_text != null)\n                DrawProgress(new Point(0, 0), m_count, m_total, m_text);\n        }\n\n        private void DrawProgress(Point pt, int count, int total, string text)\n        {\n            Graphics g = CreateGraphics();\n            DpiScale dpiScale = new DpiScale(g);\n            int offsetX = dpiScale.ScaleIntX(1);\n            int offsetY = dpiScale.ScaleIntY(1);\n\n            int height = Height - offsetY;\n            int width = Width - offsetX;\n            Pen pen = new Pen(Color.Black, 1.0f);\n            Rectangle rect = new Rectangle(pt, new Size(width, height));\n\n            g.DrawRectangle(pen, rect);\n\n            double percent = 0;\n            if (total > 0)\n                percent = count / (double)total;\n\n            width = Width - offsetX;\n            if (total != 0)\n                width = (int)(width * percent);\n\n            pt.Offset(offsetX, offsetY);\n            rect = new Rectangle(pt, new Size(rect.Width - offsetX, rect.Height - offsetY));\n            Brush bgBrush = new LinearGradientBrush(rect, ColorTheme.Current.StatBackgroundGradientFrom, \n                ColorTheme.Current.StatBackgroundGradientTo, 90.0f);\n            Rectangle percentRect = new Rectangle(rect.Location, new Size(width, rect.Height));\n            Brush brush = GetPercentBrush(rect, percent, total);\n\n            g.FillRectangle(bgBrush, rect);\n            if (width > 0)\n            {\n                g.FillRectangle(brush, percentRect);\n                pt.Offset(-offsetX, -offsetY);\n                g.DrawRectangle(GetPrecentPen(percent, total), new Rectangle(pt, new Size(percentRect.Width + offsetX, percentRect.Height + offsetY)));\n            }\n\n            // Not exactly sure what is going on here, have to fudge the value below 125% DPI\n            float fudgeY = dpiScale.DpiScaleY > 1.25f ? 0 : dpiScale.ScaleFloatY(2.5f);\n\n            SizeF size = g.MeasureDisplayString(text, DisplayFont);\n            float stringOffsetY = dpiScale.ScaleFloatY((height - size.Height) / 2);\n\n            PointF position = new PointF(pt.X + dpiScale.ScaleIntX(8), pt.Y + stringOffsetY + fudgeY);\n            g.DrawString(text, DisplayFont, FontBrush, position);\n        }\n\n        private static Brush GetPercentBrush(Rectangle rect, double percent, int total)\n        {\n            if (percent >= 1.0 || total == 0)\n                return GetCompleteBrush(rect);\n\n            return GetUncompleteBrush(rect);\n        }\n\n        private static Brush GetUncompleteBrush(Rectangle rect)\n        {\n            if (UseNewStyling)\n                return new SolidBrush(ColorTheme.Current.Highlight);\n\n            return new LinearGradientBrush(rect, Color.LightBlue, Color.Blue, LinearGradientMode.ForwardDiagonal);\n        }\n\n        private static Brush GetCompleteBrush(Rectangle rect)\n        {\n            if (UseNewStyling)\n                return new SolidBrush(ColorTheme.Current.Highlight);\n\n            return new LinearGradientBrush(rect, Color.LightGreen, Color.Green, LinearGradientMode.ForwardDiagonal);\n        }\n\n        private static Pen GetPrecentPen(double percent, int total)\n        {\n            if (UseNewStyling)\n                return new Pen(Color.Black);\n\n            if (percent >= 1.0 || total == 0)\n                return new Pen(Color.Green);\n            else\n                return new Pen(Color.Blue);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/StatisticsView.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class StatisticsView\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();\n            this.dgvMain = new DoomLauncher.CDataGridView();\n            ((System.ComponentModel.ISupportInitialize)(this.dgvMain)).BeginInit();\n            this.SuspendLayout();\n            // \n            // dgvMain\n            // \n            this.dgvMain.AllowUserToAddRows = false;\n            this.dgvMain.AllowUserToDeleteRows = false;\n            this.dgvMain.AllowUserToOrderColumns = true;\n            dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));\n            this.dgvMain.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;\n            this.dgvMain.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;\n            this.dgvMain.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal;\n            this.dgvMain.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\n            this.dgvMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dgvMain.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;\n            this.dgvMain.GridColor = System.Drawing.SystemColors.ActiveBorder;\n            this.dgvMain.Location = new System.Drawing.Point(0, 0);\n            this.dgvMain.Name = \"dgvMain\";\n            this.dgvMain.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\n            this.dgvMain.Size = new System.Drawing.Size(150, 150);\n            this.dgvMain.TabIndex = 2;\n            // \n            // StatisticsView\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.dgvMain);\n            this.Name = \"StatisticsView\";\n            ((System.ComponentModel.ISupportInitialize)(this.dgvMain)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CDataGridView dgvMain;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/StatisticsView.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.Stylize;\nusing Equin.ApplicationFramework;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Globalization;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class StatisticsView : UserControl, IFileAssociationView\n    {\n        private ContextMenuStrip m_menu;\n        private static readonly Tuple<string, string>[] ColumnFields = new Tuple<string, string>[]\n        {\n            new Tuple<string, string>(\"MapName\", \"Map\"),\n            new Tuple<string, string>(\"FormattedKills\", \"Kills\"),\n            new Tuple<string, string>(\"FormattedSecrets\", \"Secrets\"),\n            new Tuple<string, string>(\"FormattedItems\", \"Items\"),\n            new Tuple<string, string>(\"FormattedTime\", \"Time\"),\n            new Tuple<string, string>(\"RecordTime\", \"Date\"),\n            new Tuple<string, string>(\"Skill\", \"Skill\"),\n            new Tuple<string, string>(\"SourcePort\", \"SourcePort\"),\n        };\n\n        public StatisticsView()\n        {\n            InitializeComponent();\n\n            dgvMain.RowHeadersVisible = false;\n            dgvMain.AutoGenerateColumns = false;\n            dgvMain.ShowCellToolTips = false;\n            dgvMain.DefaultCellStyle.SelectionBackColor = Color.Gray;\n            dgvMain.DefaultCellStyle.NullValue = \"N/A\";\n\n            SetColumnFields(ColumnFields);\n\n            dgvMain.Columns[dgvMain.Columns.Count - 3].DefaultCellStyle.Format = string.Format(\"{0} {1}\",\n                CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern, CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern);\n\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public void SetContextMenu(ContextMenuStrip menu)\n        {\n            m_menu = menu;\n            Stylizer.StylizeControl(m_menu, DesignMode);\n        }\n\n        public void SetData(IGameFile gameFile)\n        {\n            SetDataByMap(gameFile, null);\n        }\n\n        public IEnumerable<IStatsData> SetDataByMap(IGameFile gameFile, string map)\n        {\n            if (gameFile != null && gameFile.GameFileID.HasValue)\n            {\n                IEnumerable<IStatsData> stats = DataSourceAdapter.GetStats(gameFile.GameFileID.Value);\n                if (map != null)\n                    stats = stats.Where(x => x.MapName.Equals(map, StringComparison.OrdinalIgnoreCase));\n                dgvMain.DataSource = new BindingListView<StatsBind>(GetStatsBind(stats));\n                dgvMain.ContextMenuStrip = m_menu;\n                return stats;\n            }\n            else\n            {\n                dgvMain.DataSource = null;\n                return Array.Empty<IStatsData>();\n            }\n        }\n\n        public void ClearData()\n        {\n            dgvMain.DataSource = null;\n        }\n\n        public void SetMapsVisible(bool visible)\n        {\n            dgvMain.Columns.Clear();\n\n            if (visible)\n            {\n                SetColumnFields(ColumnFields);\n                return;\n            }\n\n            SetColumnFields(ColumnFields.Skip(1));\n        }\n\n        private List<StatsBind> GetStatsBind(IEnumerable<IStatsData> stats)\n        {\n            List<ISourcePortData> sourcePorts = Util.GetSourcePortsData(DataSourceAdapter);\n\n            IEnumerable<StatsBind> statsBind = from stat in stats\n                                               join sp in sourcePorts on stat.SourcePortID equals sp.SourcePortID\n                                               select new StatsBind(stat.MapName, stat.FormattedKills, stat.FormattedSecrets,\n                                               stat.FormattedItems, TimeSpan.FromSeconds(stat.LevelTime), stat.RecordTime, stat.Skill, sp.Name, stat);\n            return statsBind.ToList();\n        }\n\n        public bool Delete()\n        {\n            if (dgvMain.SelectedRows.Count > 0 &&\n                StyledMessageBox.Show(this, \"Delete selected statistic(s)?\", \"Confirm\", MessageBoxButtons.OKCancel,\n                MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.OK)\n            {\n                foreach (DataGridViewRow row in dgvMain.SelectedRows)\n                {\n                    IStatsData stats = GetStatsFromGridRow(row);\n                    DataSourceAdapter.DeleteStats(stats.StatID);\n                }\n                return true;\n            }\n\n            return false;\n        }\n\n        public void CopyToClipboard()\n        {\n            Clipboard.SetDataObject(dgvMain.GetClipboardContent(), true);\n        }\n\n        public void CopyAllToClipboard()\n        {\n            dgvMain.SelectAll();\n            Clipboard.SetDataObject(dgvMain.GetClipboardContent(), true);\n        }\n\n        public bool Export() => false;\n\n        public bool ExportAll() => false;\n\n        private IStatsData GetStatsFromGridRow(DataGridViewRow row)\n        {\n            StatsBind bind = ((ObjectView<StatsBind>)row.DataBoundItem).Object as StatsBind;\n            return bind.StatsData;\n        }\n\n        public bool New() { throw new NotSupportedException(); }\n        public bool Edit() { throw new NotSupportedException(); }\n        public void View() { throw new NotSupportedException(); }\n        public bool MoveFileOrderUp() { throw new NotSupportedException(); }\n        public bool MoveFileOrderDown() { throw new NotSupportedException(); }\n        public bool SetFileOrderFirst() { throw new NotSupportedException(); }\n\n        public IDataSourceAdapter DataSourceAdapter { get; set; }\n\n        private void SetColumnFields(IEnumerable<Tuple<string, string>> columnFields)\n        {\n            if (columnFields.Any())\n            {\n                foreach (Tuple<string, string> item in columnFields)\n                {\n                    DataGridViewColumn col = new DataGridViewTextBoxColumn\n                    {\n                        HeaderText = item.Item2,\n                        Name = item.Item1,\n                        DataPropertyName = item.Item1\n                    };\n                    dgvMain.Columns.Add(col);\n                }\n\n                dgvMain.Columns[dgvMain.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;\n            }\n        }\n\n        public IGameFile GameFile { get; set; }\n\n        public bool DeleteAllowed { get { return true; } }\n        public bool CopyOrExportAllowed { get { return false; } }\n        public bool NewAllowed { get { return false; } }\n        public bool EditAllowed { get { return false; } }\n        public bool ViewAllowed { get { return false; } }\n        public bool ChangeOrderAllowed { get { return false; } }\n\n        public IList<MenuOptions> MenuOptions { get { return Array.Empty<MenuOptions>(); } }\n\n        private class StatsBind\n        {\n            public StatsBind(string map, string kills, string secrets, string items, TimeSpan time, DateTime recordtime, int? skill, string sourceport,\n                IStatsData statsdatasource)\n            {\n                MapName = map;\n                FormattedKills = kills;\n                FormattedSecrets = secrets;\n                FormattedItems = items;\n                FormattedTime = time;\n                RecordTime = recordtime;\n                SourcePort = sourceport;\n                Skill = skill;\n                StatsData = statsdatasource;\n            }\n\n            public string MapName { get; set; }\n            public string FormattedKills { get; set; }\n            public string FormattedSecrets { get; set; }\n            public string FormattedItems { get; set; }\n            public TimeSpan FormattedTime { get; set; }\n            public DateTime RecordTime { get; set; }\n            public string SourcePort  { get; set; }\n            public int? Skill { get; set; }\n            public IStatsData StatsData { get; set; }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/StatisticsView.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/StatsControl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class StatsControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblStats = new System.Windows.Forms.TableLayoutPanel();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.pbKills = new System.Windows.Forms.PictureBox();\n            this.pbSecrets = new System.Windows.Forms.PictureBox();\n            this.pbItems = new System.Windows.Forms.PictureBox();\n            this.ctrlStatsSecrets = new DoomLauncher.StatBar();\n            this.ctrlStatsItems = new DoomLauncher.StatBar();\n            this.ctrlStatsKills = new DoomLauncher.StatBar();\n            this.lblMaps = new System.Windows.Forms.Label();\n            this.ctrlStatsMaps = new DoomLauncher.StatBar();\n            this.pbMaps = new System.Windows.Forms.PictureBox();\n            this.tblStats.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbKills)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSecrets)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbItems)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbMaps)).BeginInit();\n            this.SuspendLayout();\n            // \n            // tblStats\n            // \n            this.tblStats.ColumnCount = 3;\n            this.tblStats.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 75F));\n            this.tblStats.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 81F));\n            this.tblStats.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblStats.Controls.Add(this.label1, 1, 2);\n            this.tblStats.Controls.Add(this.label2, 1, 3);\n            this.tblStats.Controls.Add(this.label3, 1, 4);\n            this.tblStats.Controls.Add(this.pbKills, 0, 2);\n            this.tblStats.Controls.Add(this.pbSecrets, 0, 3);\n            this.tblStats.Controls.Add(this.pbItems, 0, 4);\n            this.tblStats.Controls.Add(this.ctrlStatsSecrets, 2, 3);\n            this.tblStats.Controls.Add(this.ctrlStatsItems, 2, 4);\n            this.tblStats.Controls.Add(this.ctrlStatsKills, 2, 2);\n            this.tblStats.Controls.Add(this.lblMaps, 1, 1);\n            this.tblStats.Controls.Add(this.ctrlStatsMaps, 2, 1);\n            this.tblStats.Controls.Add(this.pbMaps, 0, 1);\n            this.tblStats.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblStats.Location = new System.Drawing.Point(0, 0);\n            this.tblStats.Margin = new System.Windows.Forms.Padding(0);\n            this.tblStats.MinimumSize = new System.Drawing.Size(240, 0);\n            this.tblStats.Name = \"tblStats\";\n            this.tblStats.RowCount = 6;\n            this.tblStats.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblStats.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblStats.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 38F));\n            this.tblStats.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));\n            this.tblStats.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblStats.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblStats.Size = new System.Drawing.Size(459, 231);\n            this.tblStats.TabIndex = 7;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(79, 87);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 0, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(40, 20);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Kills:\";\n            // \n            // label2\n            // \n            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(79, 123);\n            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 0, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(68, 20);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"Secrets:\";\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(79, 160);\n            this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 0, 0);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(53, 20);\n            this.label3.TabIndex = 2;\n            this.label3.Text = \"Items:\";\n            // \n            // pbKills\n            // \n            this.pbKills.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.pbKills.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\n            this.pbKills.Location = new System.Drawing.Point(22, 81);\n            this.pbKills.Margin = new System.Windows.Forms.Padding(0);\n            this.pbKills.Name = \"pbKills\";\n            this.pbKills.Size = new System.Drawing.Size(30, 31);\n            this.pbKills.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;\n            this.pbKills.TabIndex = 6;\n            this.pbKills.TabStop = false;\n            // \n            // pbSecrets\n            // \n            this.pbSecrets.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.pbSecrets.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\n            this.pbSecrets.Location = new System.Drawing.Point(22, 118);\n            this.pbSecrets.Margin = new System.Windows.Forms.Padding(0);\n            this.pbSecrets.Name = \"pbSecrets\";\n            this.pbSecrets.Size = new System.Drawing.Size(30, 31);\n            this.pbSecrets.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;\n            this.pbSecrets.TabIndex = 7;\n            this.pbSecrets.TabStop = false;\n            // \n            // pbItems\n            // \n            this.pbItems.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.pbItems.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\n            this.pbItems.Location = new System.Drawing.Point(22, 155);\n            this.pbItems.Margin = new System.Windows.Forms.Padding(0);\n            this.pbItems.Name = \"pbItems\";\n            this.pbItems.Size = new System.Drawing.Size(30, 31);\n            this.pbItems.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;\n            this.pbItems.TabIndex = 8;\n            this.pbItems.TabStop = false;\n            // \n            // ctrlStatsSecrets\n            // \n            this.ctrlStatsSecrets.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlStatsSecrets.Location = new System.Drawing.Point(156, 118);\n            this.ctrlStatsSecrets.Margin = new System.Windows.Forms.Padding(0, 2, 6, 2);\n            this.ctrlStatsSecrets.MaximumSize = new System.Drawing.Size(0, 32);\n            this.ctrlStatsSecrets.Name = \"ctrlStatsSecrets\";\n            this.ctrlStatsSecrets.Size = new System.Drawing.Size(297, 26);\n            this.ctrlStatsSecrets.TabIndex = 10;\n            // \n            // ctrlStatsItems\n            // \n            this.ctrlStatsItems.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlStatsItems.Location = new System.Drawing.Point(156, 153);\n            this.ctrlStatsItems.Margin = new System.Windows.Forms.Padding(0, 2, 6, 2);\n            this.ctrlStatsItems.MaximumSize = new System.Drawing.Size(0, 32);\n            this.ctrlStatsItems.Name = \"ctrlStatsItems\";\n            this.ctrlStatsItems.Size = new System.Drawing.Size(297, 26);\n            this.ctrlStatsItems.TabIndex = 11;\n            // \n            // ctrlStatsKills\n            // \n            this.ctrlStatsKills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlStatsKills.Location = new System.Drawing.Point(156, 80);\n            this.ctrlStatsKills.Margin = new System.Windows.Forms.Padding(0, 2, 6, 2);\n            this.ctrlStatsKills.MaximumSize = new System.Drawing.Size(0, 32);\n            this.ctrlStatsKills.Name = \"ctrlStatsKills\";\n            this.ctrlStatsKills.Size = new System.Drawing.Size(297, 26);\n            this.ctrlStatsKills.TabIndex = 12;\n            // \n            // lblMaps\n            // \n            this.lblMaps.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblMaps.AutoSize = true;\n            this.lblMaps.Location = new System.Drawing.Point(79, 49);\n            this.lblMaps.Margin = new System.Windows.Forms.Padding(4, 0, 0, 0);\n            this.lblMaps.Name = \"lblMaps\";\n            this.lblMaps.Size = new System.Drawing.Size(52, 20);\n            this.lblMaps.TabIndex = 13;\n            this.lblMaps.Text = \"Maps:\";\n            // \n            // ctrlStatsMaps\n            // \n            this.ctrlStatsMaps.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlStatsMaps.Location = new System.Drawing.Point(156, 42);\n            this.ctrlStatsMaps.Margin = new System.Windows.Forms.Padding(0, 2, 6, 2);\n            this.ctrlStatsMaps.MaximumSize = new System.Drawing.Size(0, 32);\n            this.ctrlStatsMaps.Name = \"ctrlStatsMaps\";\n            this.ctrlStatsMaps.Size = new System.Drawing.Size(297, 26);\n            this.ctrlStatsMaps.TabIndex = 14;\n            // \n            // pbMaps\n            // \n            this.pbMaps.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.pbMaps.Location = new System.Drawing.Point(22, 43);\n            this.pbMaps.Margin = new System.Windows.Forms.Padding(0);\n            this.pbMaps.Name = \"pbMaps\";\n            this.pbMaps.Size = new System.Drawing.Size(30, 31);\n            this.pbMaps.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;\n            this.pbMaps.TabIndex = 15;\n            this.pbMaps.TabStop = false;\n            // \n            // StatsControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblStats);\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"StatsControl\";\n            this.Size = new System.Drawing.Size(459, 231);\n            this.tblStats.ResumeLayout(false);\n            this.tblStats.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbKills)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSecrets)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbItems)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbMaps)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblStats;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.PictureBox pbKills;\n        private System.Windows.Forms.PictureBox pbSecrets;\n        private System.Windows.Forms.PictureBox pbItems;\n        private StatBar ctrlStatsSecrets;\n        private StatBar ctrlStatsItems;\n        private StatBar ctrlStatsKills;\n        private System.Windows.Forms.Label lblMaps;\n        private StatBar ctrlStatsMaps;\n        private System.Windows.Forms.PictureBox pbMaps;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/StatsControl.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class StatsControl : UserControl\n    {\n        public StatsControl()\n        {\n            InitializeComponent();\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n\n            SetImage(pbMaps, Properties.Resources.map, 0.7f * dpiScale.DpiScaleY);\n            SetImage(pbKills, Properties.Resources.kill, 0.7f * dpiScale.DpiScaleY);\n            SetImage(pbItems, Properties.Resources.bon2b, 0.8f * dpiScale.DpiScaleY);\n            SetImage(pbSecrets, Properties.Resources.secret, 0.8f * dpiScale.DpiScaleY);\n\n            SetStatBarDpi(ctrlStatsMaps, dpiScale);\n            SetStatBarDpi(ctrlStatsKills, dpiScale);\n            SetStatBarDpi(ctrlStatsSecrets, dpiScale);\n            SetStatBarDpi(ctrlStatsItems, dpiScale);\n        }\n\n        private void SetStatBarDpi(StatBar statBar, DpiScale dpiScale)\n        {\n            statBar.MaximumSize = new Size(statBar.MaximumSize.Width, dpiScale.ScaleIntY(statBar.MaximumSize.Height));\n            statBar.SetMaxHeight(statBar.MaximumSize.Height);\n            statBar.Size = MaximumSize;\n        }\n\n        private void SetImage(PictureBox pb, Bitmap bmp, float scale)\n        {\n            pb.Width = Convert.ToInt32(bmp.Width * scale);\n            pb.Height = Convert.ToInt32(bmp.Height * scale);\n            pb.Image = bmp;\n        }\n\n        public void SetStatistics(IGameFile gameFile, IEnumerable<IStatsData> stats)\n        {\n            SetStatistics(new IGameFile[] { gameFile }, stats);\n        }\n\n        public void SetStatistics(IEnumerable<IGameFile> gameFiles, IEnumerable<IStatsData> stats)\n        {\n            StatsData statTotal = new StatsData();\n            int maps = 0, totalMaps = 0;\n            var groupedStats = stats.OrderByDescending(x => x.RecordTime).GroupBy(x => x.GameFileID);\n\n            foreach (var group in groupedStats)\n            {\n                var gameFile = gameFiles.FirstOrDefault(x => x.GameFileID.Value == group.Key);\n\n                if (gameFile != null)\n                {\n                    var mapStats = group.GroupBy(x => x.MapName).Select(x => x.First());\n\n                    if (gameFile.MapCount.HasValue)\n                    {\n                        int mapCount = mapStats.Count();\n                        if (mapCount > gameFile.MapCount.Value)\n                            mapCount = gameFile.MapCount.Value;\n                        maps += mapCount;\n                        totalMaps += gameFile.MapCount.Value;\n                    }\n\n                    foreach (var stat in mapStats)\n                    {\n                        statTotal.KillCount += stat.KillCount;\n                        statTotal.TotalKills += stat.TotalKills;\n                        statTotal.SecretCount += stat.SecretCount;\n                        statTotal.TotalSecrets += stat.TotalSecrets;\n                        statTotal.ItemCount += stat.ItemCount;\n                        statTotal.TotalItems += stat.TotalItems;\n                        statTotal.LevelTime += stat.LevelTime;\n                    }\n                }\n            }\n\n            ctrlStatsMaps.SetStats(maps, totalMaps, string.Format(\"{0} / {1}\", maps, totalMaps));\n            ctrlStatsKills.SetStats(statTotal.KillCount, statTotal.TotalKills, statTotal.FormattedKills);\n            ctrlStatsSecrets.SetStats(statTotal.SecretCount, statTotal.TotalSecrets, statTotal.FormattedSecrets);\n            ctrlStatsItems.SetStats(statTotal.ItemCount, statTotal.TotalItems, statTotal.FormattedItems);\n        }\n\n        public void SetMapsVisible(bool visible)\n        {\n            ctrlStatsMaps.Visible = visible;\n            pbMaps.Visible = visible;\n            if (visible)\n                tblStats.RowStyles[1].Height = 38;\n            else\n                tblStats.RowStyles[1].Height = 0;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/StatsControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/TableLayoutPanelDB.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TableLayoutPanelDB\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TableLayoutPanelDB.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class TableLayoutPanelDB : TableLayoutPanel\n    {\n        public TableLayoutPanelDB()\n        {\n            SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);\n        }\n\n        protected override CreateParams CreateParams\n        {\n            get\n            {\n                CreateParams cp = base.CreateParams;\n                cp.ExStyle |= 0x02000000; // WS_CLIPCHILDREN\n                return cp;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TagControl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TagControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnAdd = new System.Windows.Forms.Button();\n            this.btnEdit = new System.Windows.Forms.Button();\n            this.btnDelete = new System.Windows.Forms.Button();\n            this.tagSelectCtrl = new DoomLauncher.Controls.TagSelectControl();\n            this.tblMain.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flowLayoutPanel1, 0, 1);\n            this.tblMain.Controls.Add(this.tagSelectCtrl, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.Size = new System.Drawing.Size(296, 150);\n            this.tblMain.TabIndex = 0;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.btnAdd);\n            this.flowLayoutPanel1.Controls.Add(this.btnEdit);\n            this.flowLayoutPanel1.Controls.Add(this.btnDelete);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 118);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(296, 32);\n            this.flowLayoutPanel1.TabIndex = 1;\n            // \n            // btnAdd\n            // \n            this.btnAdd.Location = new System.Drawing.Point(3, 3);\n            this.btnAdd.Name = \"btnAdd\";\n            this.btnAdd.Size = new System.Drawing.Size(75, 23);\n            this.btnAdd.TabIndex = 0;\n            this.btnAdd.Text = \"Add\";\n            this.btnAdd.UseVisualStyleBackColor = true;\n            this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);\n            // \n            // btnEdit\n            // \n            this.btnEdit.Location = new System.Drawing.Point(84, 3);\n            this.btnEdit.Name = \"btnEdit\";\n            this.btnEdit.Size = new System.Drawing.Size(75, 23);\n            this.btnEdit.TabIndex = 1;\n            this.btnEdit.Text = \"Edit\";\n            this.btnEdit.UseVisualStyleBackColor = true;\n            this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);\n            // \n            // btnDelete\n            // \n            this.btnDelete.Location = new System.Drawing.Point(165, 3);\n            this.btnDelete.Name = \"btnDelete\";\n            this.btnDelete.Size = new System.Drawing.Size(75, 23);\n            this.btnDelete.TabIndex = 2;\n            this.btnDelete.Text = \"Delete\";\n            this.btnDelete.UseVisualStyleBackColor = true;\n            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);\n            // \n            // tagSelectCtrl\n            // \n            this.tagSelectCtrl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tagSelectCtrl.Location = new System.Drawing.Point(3, 3);\n            this.tagSelectCtrl.Name = \"tagSelectCtrl\";\n            this.tagSelectCtrl.Size = new System.Drawing.Size(290, 112);\n            this.tagSelectCtrl.TabIndex = 2;\n            // \n            // TagControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Name = \"TagControl\";\n            this.Size = new System.Drawing.Size(296, 150);\n            this.tblMain.ResumeLayout(false);\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button btnAdd;\n        private System.Windows.Forms.Button btnEdit;\n        private System.Windows.Forms.Button btnDelete;\n        private Controls.TagSelectControl tagSelectCtrl;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TagControl.cs",
    "content": "﻿using DoomLauncher.Controls;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.Stylize;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class TagControl : UserControl\n    {\n        private IDataSourceAdapter m_adapter;\n        private readonly List<ITagData> m_addTags = new List<ITagData>();\n        private readonly List<ITagData> m_editTags = new List<ITagData>();\n        private readonly List<ITagData> m_deleteTags = new List<ITagData>();\n\n        public TagControl()\n        {\n            InitializeComponent();\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public void Init(IDataSourceAdapter adapter)\n        {\n            m_adapter = adapter;\n            tagSelectCtrl.Init(new TagSelectOptions() { AllowRowSelect = true, ShowTagData = true, CustomSetData = true });\n            SetTagData();\n        }\n\n        private void SetTagData()\n        {\n            tagSelectCtrl.SetDataSource(DataCache.Instance.SortTags(m_adapter.GetTags()).ToList());\n        }\n\n        public ITagData[] AddedTags\n        {\n            get { return m_addTags.ToArray();  }\n        }\n\n        public ITagData[] EditedTags\n        {\n            get { return m_editTags.ToArray(); }\n        }\n\n        public ITagData[] DeletedTags\n        {\n            get { return m_deleteTags.ToArray(); }\n        }\n\n        private void btnAdd_Click(object sender, EventArgs e)\n        {\n            TagEditForm form = new TagEditForm();\n            form.StartPosition = FormStartPosition.CenterParent;\n\n            if (form.ShowDialog(this) == DialogResult.OK)\n            {\n                TagData tag = new TagData();\n                form.TagEditControl.GetDataSource(tag);\n\n                if (!IsTagNameUnique(tag))\n                {\n                    StyledMessageBox.Show(this, \"Tag name must be unique and not empty.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n                else\n                {\n                    m_adapter.InsertTag(tag);\n                    SetTagData();\n\n                    IEnumerable<ITagData> check = m_adapter.GetTags().Where(x => x.Name == tag.Name);\n\n                    if (check.Any())\n                    {\n                        if (m_addTags.Contains(check.First()))\n                            m_addTags.Remove(check.First());\n\n                        m_addTags.Add(check.First());\n                        tagSelectCtrl.SetSelectedItem(check.First());\n                    }\n                }\n            }\n        }\n\n        private void btnEdit_Click(object sender, EventArgs e)\n        {\n            if (tagSelectCtrl.SelectedItem != null)\n            {\n                ITagData tag = tagSelectCtrl.SelectedItem;\n                TagEditForm form = new TagEditForm();\n                form.TagEditControl.SetDataSource(tag);\n                form.StartPosition = FormStartPosition.CenterParent;\n\n                if (form.ShowDialog(this) == DialogResult.OK)\n                {\n                    form.TagEditControl.GetDataSource(tag);\n\n                    if (!IsTagNameUnique(tag))\n                    {\n                        StyledMessageBox.Show(this, \"Tag name must be unique and not empty.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                        SetTagData();\n                    }\n                    else\n                    {\n                        m_adapter.UpdateTag(tag);\n                        SetTagData();\n\n                        if (m_editTags.Contains(tag))\n                            m_editTags.Remove(tag);\n\n                        m_editTags.Add(tag);\n                    }\n\n                    tagSelectCtrl.SetSelectedItem(tag);\n                }\n            }\n        }\n\n        private bool IsTagNameUnique(ITagData tag)\n        {\n            IEnumerable<ITagData> check = m_adapter.GetTags().Where(x => x.Name.Equals(tag.Name, StringComparison.CurrentCultureIgnoreCase) && !x.Equals(tag));\n            return !(string.IsNullOrEmpty(tag.Name) || check.Any() || TabKeys.KeyNames.ToList().FindAll(x=> tag.Name.Equals(x, StringComparison.CurrentCultureIgnoreCase)).Any());\n        }\n\n        private void btnDelete_Click(object sender, EventArgs e)\n        {\n            if (tagSelectCtrl.SelectedItem != null && StyledMessageBox.Show(this, \"Are you sure you want to delete this tag?\",\n                \"Delete\", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)\n            {\n                ITagData tag = tagSelectCtrl.SelectedItem;\n                m_adapter.DeleteTag(tag);\n                m_adapter.DeleteTagMapping(tag.TagID);\n\n                SetTagData();\n\n                if (m_deleteTags.Contains(tag))\n                    m_deleteTags.Remove(tag);\n\n                m_deleteTags.Add(tag);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TagControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/TagEdit.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TagEdit\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.txtName = new System.Windows.Forms.TextBox();\n            this.cmbTab = new System.Windows.Forms.ComboBox();\n            this.label3 = new System.Windows.Forms.Label();\n            this.flp = new System.Windows.Forms.FlowLayoutPanel();\n            this.pnlColor = new System.Windows.Forms.Panel();\n            this.btnSelect = new System.Windows.Forms.Button();\n            this.cmbExclude = new System.Windows.Forms.ComboBox();\n            this.label4 = new System.Windows.Forms.Label();\n            this.cmbColor = new System.Windows.Forms.ComboBox();\n            this.lblFavorite = new System.Windows.Forms.Label();\n            this.cmbFavorite = new System.Windows.Forms.ComboBox();\n            this.tblMain.SuspendLayout();\n            this.flp.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 2;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 136F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.label1, 0, 0);\n            this.tblMain.Controls.Add(this.label2, 0, 1);\n            this.tblMain.Controls.Add(this.txtName, 1, 0);\n            this.tblMain.Controls.Add(this.cmbTab, 1, 1);\n            this.tblMain.Controls.Add(this.label3, 0, 2);\n            this.tblMain.Controls.Add(this.flp, 1, 5);\n            this.tblMain.Controls.Add(this.cmbExclude, 1, 2);\n            this.tblMain.Controls.Add(this.label4, 0, 4);\n            this.tblMain.Controls.Add(this.cmbColor, 1, 4);\n            this.tblMain.Controls.Add(this.lblFavorite, 0, 3);\n            this.tblMain.Controls.Add(this.cmbFavorite, 1, 3);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 7;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Size = new System.Drawing.Size(294, 178);\n            this.tblMain.TabIndex = 0;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(3, 6);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(35, 13);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Name\";\n            // \n            // label2\n            // \n            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(3, 32);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(56, 13);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"Show Tab\";\n            // \n            // txtName\n            // \n            this.txtName.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtName.Location = new System.Drawing.Point(139, 3);\n            this.txtName.Name = \"txtName\";\n            this.txtName.Size = new System.Drawing.Size(152, 20);\n            this.txtName.TabIndex = 2;\n            // \n            // cmbTab\n            // \n            this.cmbTab.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbTab.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbTab.FormattingEnabled = true;\n            this.cmbTab.Items.AddRange(new object[] {\n            \"Yes\",\n            \"No\"});\n            this.cmbTab.Location = new System.Drawing.Point(139, 29);\n            this.cmbTab.Name = \"cmbTab\";\n            this.cmbTab.Size = new System.Drawing.Size(152, 21);\n            this.cmbTab.TabIndex = 3;\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(3, 58);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(127, 13);\n            this.label3.TabIndex = 4;\n            this.label3.Text = \"Exclude From Other Tabs\";\n            // \n            // flp\n            // \n            this.flp.Controls.Add(this.pnlColor);\n            this.flp.Controls.Add(this.btnSelect);\n            this.flp.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flp.Location = new System.Drawing.Point(136, 130);\n            this.flp.Margin = new System.Windows.Forms.Padding(0);\n            this.flp.Name = \"flp\";\n            this.flp.Size = new System.Drawing.Size(158, 32);\n            this.flp.TabIndex = 7;\n            // \n            // pnlColor\n            // \n            this.pnlColor.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.pnlColor.BackColor = System.Drawing.SystemColors.ActiveCaptionText;\n            this.pnlColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.pnlColor.Location = new System.Drawing.Point(3, 4);\n            this.pnlColor.Margin = new System.Windows.Forms.Padding(3, 4, 0, 0);\n            this.pnlColor.Name = \"pnlColor\";\n            this.pnlColor.Size = new System.Drawing.Size(24, 24);\n            this.pnlColor.TabIndex = 0;\n            // \n            // btnSelect\n            // \n            this.btnSelect.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.btnSelect.Location = new System.Drawing.Point(30, 4);\n            this.btnSelect.Margin = new System.Windows.Forms.Padding(3, 4, 0, 0);\n            this.btnSelect.Name = \"btnSelect\";\n            this.btnSelect.Size = new System.Drawing.Size(75, 23);\n            this.btnSelect.TabIndex = 5;\n            this.btnSelect.Text = \"Select\";\n            this.btnSelect.UseVisualStyleBackColor = true;\n            this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);\n            // \n            // cmbExclude\n            // \n            this.cmbExclude.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbExclude.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbExclude.FormattingEnabled = true;\n            this.cmbExclude.Items.AddRange(new object[] {\n            \"Yes\",\n            \"No\"});\n            this.cmbExclude.Location = new System.Drawing.Point(139, 55);\n            this.cmbExclude.Name = \"cmbExclude\";\n            this.cmbExclude.Size = new System.Drawing.Size(152, 21);\n            this.cmbExclude.TabIndex = 8;\n            // \n            // label4\n            // \n            this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(3, 110);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(75, 13);\n            this.label4.TabIndex = 9;\n            this.label4.Text = \"Highlight Color\";\n            // \n            // cmbColor\n            // \n            this.cmbColor.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbColor.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbColor.FormattingEnabled = true;\n            this.cmbColor.Items.AddRange(new object[] {\n            \"Yes\",\n            \"No\"});\n            this.cmbColor.Location = new System.Drawing.Point(139, 107);\n            this.cmbColor.Name = \"cmbColor\";\n            this.cmbColor.Size = new System.Drawing.Size(152, 21);\n            this.cmbColor.TabIndex = 6;\n            this.cmbColor.SelectedIndexChanged += new System.EventHandler(this.cmbColor_SelectedIndexChanged);\n            // \n            // lblFavorite\n            // \n            this.lblFavorite.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblFavorite.AutoSize = true;\n            this.lblFavorite.Location = new System.Drawing.Point(3, 84);\n            this.lblFavorite.Name = \"lblFavorite\";\n            this.lblFavorite.Size = new System.Drawing.Size(45, 13);\n            this.lblFavorite.TabIndex = 10;\n            this.lblFavorite.Text = \"Favorite\";\n            // \n            // cmbFavorite\n            // \n            this.cmbFavorite.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbFavorite.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbFavorite.FormattingEnabled = true;\n            this.cmbFavorite.Items.AddRange(new object[] {\n            \"Yes\",\n            \"No\"});\n            this.cmbFavorite.Location = new System.Drawing.Point(139, 81);\n            this.cmbFavorite.Name = \"cmbFavorite\";\n            this.cmbFavorite.Size = new System.Drawing.Size(152, 21);\n            this.cmbFavorite.TabIndex = 11;\n            // \n            // TagEdit\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Name = \"TagEdit\";\n            this.Size = new System.Drawing.Size(294, 178);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.flp.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.TextBox txtName;\n        private System.Windows.Forms.ComboBox cmbTab;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Button btnSelect;\n        private System.Windows.Forms.ComboBox cmbColor;\n        private System.Windows.Forms.FlowLayoutPanel flp;\n        private System.Windows.Forms.Panel pnlColor;\n        private System.Windows.Forms.ComboBox cmbExclude;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Label lblFavorite;\n        private System.Windows.Forms.ComboBox cmbFavorite;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TagEdit.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class TagEdit : UserControl\n    {\n        private Color? m_color;\n\n        public TagEdit()\n        {\n            InitializeComponent();\n\n            lblFavorite.Text = string.Concat(\"Favorite \", TagData.FavoriteChar);\n\n            cmbTab.SelectedIndex = 0;\n            cmbColor.SelectedIndex = 1;\n            cmbExclude.SelectedIndex = 1;\n            cmbFavorite.SelectedIndex = 1;\n            m_color = Color.Black;\n\n            Load += TagEdit_Load;\n\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        private void TagEdit_Load(object sender, EventArgs e)\n        {\n            txtName.Select();\n        }\n\n        public void SetDataSource(ITagData tag)\n        {\n            txtName.Text = tag.Name;\n            cmbTab.SelectedIndex = tag.HasTab ? 0 : 1;\n            cmbColor.SelectedIndex = tag.HasColor ? 0 : 1;\n            cmbExclude.SelectedIndex = tag.ExcludeFromOtherTabs ? 0 : 1;\n            cmbFavorite.SelectedIndex = tag.Favorite ? 0 : 1;\n\n            if (tag.HasColor && tag.Color.HasValue)\n                m_color = pnlColor.BackColor = Color.FromArgb(tag.Color.Value);\n        }\n\n        public void GetDataSource(ITagData tag)\n        {\n            tag.Name = txtName.Text;\n            tag.HasTab = cmbTab.SelectedIndex == 0;\n            tag.HasColor = cmbColor.SelectedIndex == 0;\n            tag.ExcludeFromOtherTabs = cmbExclude.SelectedIndex == 0;\n            tag.Favorite = cmbFavorite.SelectedIndex == 0;\n\n            if (m_color.HasValue)\n                tag.Color = m_color.Value.ToArgb();\n            else\n                tag.Color = null;            \n        }\n\n        private void btnSelect_Click(object sender, EventArgs e)\n        {\n            ColorDialog dialog = new ColorDialog();\n            \n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                pnlColor.BackColor = dialog.Color;\n                m_color = dialog.Color;\n            }\n        }\n\n        private void cmbColor_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            btnSelect.Visible = pnlColor.Visible = cmbColor.SelectedIndex == 0;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TagEdit.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/TagSelectControl.Designer.cs",
    "content": "﻿namespace DoomLauncher.Controls\n{\n    partial class TagSelectControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.dgvTags = new System.Windows.Forms.DataGridView();\n            this.tblTop = new System.Windows.Forms.TableLayoutPanel();\n            this.flpSearch = new System.Windows.Forms.FlowLayoutPanel();\n            this.txtSearch = new System.Windows.Forms.TextBox();\n            this.btnPin = new System.Windows.Forms.Button();\n            this.menu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.manageTagsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.pbSearch = new System.Windows.Forms.PictureBox();\n            this.tblMain.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.dgvTags)).BeginInit();\n            this.tblTop.SuspendLayout();\n            this.flpSearch.SuspendLayout();\n            this.menu.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearch)).BeginInit();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.dgvTags, 0, 1);\n            this.tblMain.Controls.Add(this.tblTop, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));\n            this.tblMain.Size = new System.Drawing.Size(290, 516);\n            this.tblMain.TabIndex = 0;\n            // \n            // dgvTags\n            // \n            this.dgvTags.AllowUserToAddRows = false;\n            this.dgvTags.AllowUserToDeleteRows = false;\n            this.dgvTags.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\n            this.dgvTags.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dgvTags.Location = new System.Drawing.Point(4, 43);\n            this.dgvTags.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.dgvTags.Name = \"dgvTags\";\n            this.dgvTags.ReadOnly = true;\n            this.dgvTags.RowHeadersWidth = 62;\n            this.dgvTags.Size = new System.Drawing.Size(282, 469);\n            this.dgvTags.TabIndex = 2;\n            // \n            // tblTop\n            // \n            this.tblTop.ColumnCount = 2;\n            this.tblTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 27F));\n            this.tblTop.Controls.Add(this.flpSearch, 0, 0);\n            this.tblTop.Controls.Add(this.btnPin, 1, 0);\n            this.tblTop.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblTop.Location = new System.Drawing.Point(0, 0);\n            this.tblTop.Margin = new System.Windows.Forms.Padding(0);\n            this.tblTop.Name = \"tblTop\";\n            this.tblTop.RowCount = 1;\n            this.tblTop.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblTop.Size = new System.Drawing.Size(290, 39);\n            this.tblTop.TabIndex = 4;\n            // \n            // flpSearch\n            // \n            this.flpSearch.Controls.Add(this.pbSearch);\n            this.flpSearch.Controls.Add(this.txtSearch);\n            this.flpSearch.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpSearch.Location = new System.Drawing.Point(0, 0);\n            this.flpSearch.Margin = new System.Windows.Forms.Padding(0);\n            this.flpSearch.Name = \"flpSearch\";\n            this.flpSearch.Size = new System.Drawing.Size(263, 39);\n            this.flpSearch.TabIndex = 0;\n            // \n            // txtSearch\n            // \n            this.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.txtSearch.Location = new System.Drawing.Point(26, 6);\n            this.txtSearch.Margin = new System.Windows.Forms.Padding(0, 6, 0, 4);\n            this.txtSearch.MaximumSize = new System.Drawing.Size(169, 26);\n            this.txtSearch.Name = \"txtSearch\";\n            this.txtSearch.Size = new System.Drawing.Size(169, 22);\n            this.txtSearch.TabIndex = 0;\n            this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged);\n            // \n            // btnPin\n            // \n            this.btnPin.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnPin.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;\n            this.btnPin.FlatAppearance.BorderSize = 0;\n            this.btnPin.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\n            this.btnPin.Image = global::DoomLauncher.Properties.Resources.Pin;\n            this.btnPin.Location = new System.Drawing.Point(263, 0);\n            this.btnPin.Margin = new System.Windows.Forms.Padding(0);\n            this.btnPin.Name = \"btnPin\";\n            this.btnPin.Size = new System.Drawing.Size(27, 25);\n            this.btnPin.TabIndex = 4;\n            this.btnPin.UseVisualStyleBackColor = true;\n            this.btnPin.Click += new System.EventHandler(this.btnPin_Click);\n            // \n            // menu\n            // \n            this.menu.ImageScalingSize = new System.Drawing.Size(24, 24);\n            this.menu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.manageTagsToolStripMenuItem});\n            this.menu.Name = \"contextMenuStrip1\";\n            this.menu.Size = new System.Drawing.Size(175, 28);\n            // \n            // manageTagsToolStripMenuItem\n            // \n            this.manageTagsToolStripMenuItem.Name = \"manageTagsToolStripMenuItem\";\n            this.manageTagsToolStripMenuItem.Size = new System.Drawing.Size(174, 24);\n            this.manageTagsToolStripMenuItem.Text = \"Manage Tags...\";\n            this.manageTagsToolStripMenuItem.Click += new System.EventHandler(this.manageTagsToolStripMenuItem_Click);\n            // \n            // pbSearch\n            // \n            this.pbSearch.Location = new System.Drawing.Point(6, 11);\n            this.pbSearch.Margin = new System.Windows.Forms.Padding(6, 11, 0, 3);\n            this.pbSearch.Name = \"pbSearch\";\n            this.pbSearch.Size = new System.Drawing.Size(20, 15);\n            this.pbSearch.TabIndex = 4;\n            this.pbSearch.TabStop = false;\n            // \n            // TagSelectControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.Name = \"TagSelectControl\";\n            this.Size = new System.Drawing.Size(290, 516);\n            this.tblMain.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.dgvTags)).EndInit();\n            this.tblTop.ResumeLayout(false);\n            this.flpSearch.ResumeLayout(false);\n            this.flpSearch.PerformLayout();\n            this.menu.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearch)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flpSearch;\n        private System.Windows.Forms.TextBox txtSearch;\n        private System.Windows.Forms.DataGridView dgvTags;\n        private System.Windows.Forms.TableLayoutPanel tblTop;\n        private System.Windows.Forms.Button btnPin;\n        private System.Windows.Forms.ContextMenuStrip menu;\n        private System.Windows.Forms.ToolStripMenuItem manageTagsToolStripMenuItem;\n        private System.Windows.Forms.PictureBox pbSearch;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TagSelectControl.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\nusing DoomLauncher.Interfaces;\nusing System.Linq;\nusing System.Collections.Generic;\nusing System.Drawing;\n\nnamespace DoomLauncher.Controls\n{\n    public partial class TagSelectControl : UserControl\n    {\n        public event EventHandler<ITagData> TagSelectionChanged;\n        public event EventHandler<string> StaticSelectionChanged;\n        public event EventHandler PinChanged;\n        public event EventHandler ManageTags;\n\n        public bool Pinned { get; private set; }\n\n        private TagSelectOptions m_options = new TagSelectOptions();\n        private List<ITagData> m_checkedTags = new List<ITagData>();\n        private IEnumerable<ITagData> m_customSource;\n        private bool m_loaded;\n\n        public TagSelectControl()\n        {\n            InitializeComponent();\n\n            Icons.DpiScale = new DpiScale(CreateGraphics());\n            pbSearch.Image = Icons.Search;\n            btnPin.Image = Icons.Pin;\n\n            SetPinned(false);\n            Resize += TagSelectControl_Resize;\n            Stylizer.StylizeControl(this, DesignMode);\n            Stylizer.StylizeControl(menu, DesignMode);\n        }\n\n        private void TagSelectControl_Resize(object sender, EventArgs e)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            int offset = btnPin.Width + dpiScale.ScaleIntX(16);\n\n            if (flpSearch.Width < dpiScale.ScaleIntX(80))\n            {\n                pbSearch.Visible = false;\n                return;\n            }\n\n            pbSearch.Visible = true;\n            if (flpSearch.Width < txtSearch.MaximumSize.Width + offset)\n                txtSearch.Width = flpSearch.Width - offset;\n            else\n                txtSearch.Width = txtSearch.MaximumSize.Width;\n        }\n\n        public void Init(TagSelectOptions options)\n        {\n            m_loaded = true;\n            m_options = options;\n\n            btnPin.Visible = options.ShowPin;\n\n            if (options.ShowMenu)\n                dgvTags.ContextMenuStrip = menu;\n\n            InitGrid(dgvTags);\n            EnableSelection();\n\n            DataCache.Instance.TagsChanged += DataCache_TagsChanged;\n            SetTags();\n        }\n\n        public void SetCheckedTags(IEnumerable<ITagData> tags)\n        {\n            m_checkedTags = tags.ToList();\n            SetTags();\n        }\n\n        public void SetCheckedTags()\n        {\n            int index = GetCheckBoxCellIndex();\n            if (index == -1)\n                return;\n\n            HashSet<ITagData> tagHash = new HashSet<ITagData>(m_checkedTags);\n            foreach (DataGridViewRow row in dgvTags.Rows)\n            {\n                ITagData tag = row.DataBoundItem as ITagData;\n                if (!(dgvTags.Rows[row.Index].Cells[index] is DataGridViewCheckBoxCell checkCell))\n                    continue;\n\n                checkCell.Value = tagHash.Contains(tag);\n            }\n        }\n\n        private int GetCheckBoxCellIndex()\n        {\n            int index = 0;\n\n            foreach(DataGridViewColumn column in dgvTags.Columns)\n            {\n                if (column is DataGridViewCheckBoxColumn)\n                    return index;\n                index++;\n            }\n\n            return -1;\n        }\n\n        public List<ITagData> GetCheckedTags() => m_checkedTags;\n\n        public ITagData SelectedItem => dgvTags.SelectedRows.Count == 0 ? null : dgvTags.SelectedRows[0].DataBoundItem as ITagData;\n\n        public void SetSelectedItem(ITagData tag)\n        {\n            ClearSelections();\n\n            foreach (DataGridViewRow row in dgvTags.Rows)\n            {\n                if (row.DataBoundItem is ITagData tagData && tagData.Equals(tag))\n                {\n                    dgvTags.FirstDisplayedScrollingRowIndex = row.Index;\n                    row.Selected = true;\n                    break;\n                }\n            }\n        }\n\n        public void SetDataSource(IEnumerable<ITagData> tags)\n        {\n            if (!m_options.CustomSetData)\n                throw new InvalidOperationException(\"Can only call SetDataSource with CustomSetData in TagSelectOptions.\");\n\n            m_customSource = tags;\n            SetTags();\n        }\n\n        private void SetTags()\n        {\n            DisableSelection();\n\n            IEnumerable<ITagData> tags;\n\n            if (m_options.CustomSetData)\n            {\n                if (m_customSource == null)\n                    return;\n\n                tags = m_customSource;\n            }\n            else\n            {\n                tags = DataCache.Instance.Tags;\n            }\n\n            if (m_options.HasTabOnly)\n                tags = tags.Where(x => x.HasTab);\n            if (!string.IsNullOrEmpty(txtSearch.Text))\n                tags = tags.Where(x => x.Name.IndexOf(txtSearch.Text, StringComparison.CurrentCultureIgnoreCase) >= 0);\n\n            List<ITagData> allTags;\n\n            if (m_options.ShowStatic)\n            {\n                allTags = GetStaticTags();\n                allTags.AddRange(tags);\n            }\n            else\n            {\n                allTags = tags.ToList();\n            }\n\n            dgvTags.DataSource = allTags;\n\n            SetCheckedTags();\n\n            ClearSelections();\n            EnableSelection();\n        }\n\n        private List<ITagData> GetStaticTags()\n        {\n            List<ITagData> tags = new List<ITagData>();\n            HashSet<string> visibleViews = DataCache.Instance.AppConfiguration.VisibleViews;\n\n            foreach (var key in TabKeys.KeyNames)\n            {\n                if (key != TabKeys.LocalKey && !visibleViews.Contains(key))\n                    continue;\n\n                tags.Add(new StaticTagData() { Name = key, Favorite = true });\n            }\n\n            return tags;\n        }\n\n        private void DataCache_TagsChanged(object sender, EventArgs e)\n        {\n            SetTags();\n        }\n\n        private void InitGrid(DataGridView view)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n\n            view.Columns.Clear();\n\n            view.ColumnHeadersVisible = m_options.ShowTagData;\n            view.MultiSelect = false;\n            view.AllowUserToResizeRows = false;\n            view.SelectionMode = DataGridViewSelectionMode.FullRowSelect;\n\n            if (m_options.ShowCheckBoxes)\n                view.Columns.Add(new DataGridViewCheckBoxColumn() { ReadOnly = false, Width = dpiScale.ScaleIntX(32) });\n\n            view.Columns.Add(new DataGridViewTextBoxColumn\n            {\n                HeaderText = \"Name\",\n                Name = nameof(ITagData.Name),\n                DataPropertyName = nameof(ITagData.FavoriteName),\n                Width = dpiScale.ScaleIntX(200)\n            });\n\n            if (m_options.ShowTagData)\n            {\n                view.Columns.Add(new DataGridViewTextBoxColumn\n                {\n                    HeaderText = \"Display Tab\",\n                    Name = nameof(ITagData.HasTab),\n                    DataPropertyName = nameof(ITagData.HasTab)\n                });\n\n                view.Columns.Add(new DataGridViewTextBoxColumn\n                {\n                    HeaderText = \"Exclude\",\n                    Name = nameof(ITagData.ExcludeFromOtherTabs),\n                    DataPropertyName = nameof(ITagData.ExcludeFromOtherTabs)\n                });\n\n                view.Columns.Add(new DataGridViewTextBoxColumn\n                {\n                    HeaderText = \"Favorite\",\n                    Name = nameof(ITagData.Favorite),\n                    DataPropertyName = nameof(ITagData.Favorite)\n                });                \n\n                view.Columns.Add(new DataGridViewTextBoxColumn\n                {\n                    HeaderText = \"Display Color\",\n                    Name = nameof(ITagData.HasColor),\n                    DataPropertyName = nameof(ITagData.HasColor)\n                });\n            }\n\n            view.Columns[view.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;\n        }\n\n        private void View_SelectionChanged(object sender, EventArgs e)\n        {\n            DataGridView view = sender as DataGridView;\n            if (view.SelectedRows.Count == 0)\n                return;\n\n            int checkIndex = GetCheckBoxCellIndex();\n\n            if (m_options.ShowCheckBoxes && checkIndex != -1 && view.SelectedRows[0].Cells[checkIndex] is DataGridViewCheckBoxCell checkBoxCell && \n                checkBoxCell.Value != null)\n            {\n                bool set = !(bool)checkBoxCell.Value;\n                checkBoxCell.Value = set;\n\n                if (set)\n                    m_checkedTags.Add(view.SelectedRows[0].DataBoundItem as ITagData);\n                else\n                    m_checkedTags.Remove(view.SelectedRows[0].DataBoundItem as ITagData);\n            }\n\n            if (dgvTags.SelectedRows[0].DataBoundItem is StaticTagData staticTag)\n                StaticSelectionChanged?.Invoke(this, staticTag.Name);\n            else\n                TagSelectionChanged?.Invoke(this, view.SelectedRows[0].DataBoundItem as ITagData);\n\n            if (!m_options.AllowRowSelect)\n                view.ClearSelection();\n        }\n\n        private void txtSearch_TextChanged(object sender, EventArgs e)\n        {\n            SetTags();\n        }\n\n        public void ClearSelections() => dgvTags.ClearSelection();\n        private void DisableSelection() => dgvTags.SelectionChanged -= View_SelectionChanged;\n\n        private void EnableSelection()\n        {\n            if (m_loaded)\n                dgvTags.SelectionChanged += View_SelectionChanged;\n        }\n\n        private void btnPin_Click(object sender, EventArgs e)\n        {\n            SetPinned(!Pinned);\n            PinChanged?.Invoke(this, EventArgs.Empty);\n        }\n\n        public void SetPinned(bool pinned)\n        {\n            Pinned = pinned;\n\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            Image img = Icons.Pin;\n            if (!Pinned)\n                img = img.Rotate(90);\n\n            btnPin.Image = img;\n            btnPin.Image = img.FixedSize((int)(img.Width * .8), (int)(img.Height * .8), Color.Transparent);\n            btnPin.Width = img.Width + dpiScale.ScaleIntX(2);\n            btnPin.Height = img.Height + dpiScale.ScaleIntY(4);\n        }\n\n        private void manageTagsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ManageTags?.Invoke(this, EventArgs.Empty);\n        }\n    }\n\n    public class TagSelectOptions\n    {\n        public bool ShowStatic { get; set; }\n        public bool HasTabOnly { get; set; }\n        public bool ShowCheckBoxes { get; set; }\n        public bool AllowRowSelect { get; set; }\n        public bool ShowPin { get; set; }\n        public bool ShowTagData { get; set; }\n        public bool CustomSetData { get; set; }\n        public bool ShowMenu { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TagSelectControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"menu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/TitleBarControl.Designer.cs",
    "content": "﻿namespace DoomLauncher.Controls\n{\n    partial class TitleBarControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.lblTitle = new System.Windows.Forms.Label();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnClose = new DoomLauncher.FormButton();\n            this.btnMaximize = new DoomLauncher.FormButton();\n            this.btnMinimize = new DoomLauncher.FormButton();\n            this.tblMain.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 2;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 130F));\n            this.tblMain.Controls.Add(this.lblTitle, 0, 0);\n            this.tblMain.Controls.Add(this.flpButtons, 1, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 1;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(572, 30);\n            this.tblMain.TabIndex = 0;\n            this.tblMain.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tblMain_MouseDoubleClick);\n            this.tblMain.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tblMain_MouseDown);\n            // \n            // lblTitle\n            // \n            this.lblTitle.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblTitle.AutoSize = true;\n            this.lblTitle.Location = new System.Drawing.Point(3, 7);\n            this.lblTitle.Name = \"lblTitle\";\n            this.lblTitle.Size = new System.Drawing.Size(33, 16);\n            this.lblTitle.TabIndex = 0;\n            this.lblTitle.Text = \"Title\";\n            this.lblTitle.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lblTitle_MouseDoubleClick);\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnClose);\n            this.flpButtons.Controls.Add(this.btnMaximize);\n            this.flpButtons.Controls.Add(this.btnMinimize);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpButtons.Location = new System.Drawing.Point(442, 0);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(130, 30);\n            this.flpButtons.TabIndex = 1;\n            // \n            // btnClose\n            // \n            this.btnClose.Location = new System.Drawing.Point(86, 0);\n            this.btnClose.Margin = new System.Windows.Forms.Padding(0);\n            this.btnClose.Name = \"btnClose\";\n            this.btnClose.Size = new System.Drawing.Size(44, 32);\n            this.btnClose.TabIndex = 0;\n            this.btnClose.Text = \"❌\";\n            this.btnClose.UseVisualStyleBackColor = true;\n            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);\n            // \n            // btnMaximize\n            // \n            this.btnMaximize.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.btnMaximize.Location = new System.Drawing.Point(45, 0);\n            this.btnMaximize.Margin = new System.Windows.Forms.Padding(0);\n            this.btnMaximize.Name = \"btnMaximize\";\n            this.btnMaximize.Size = new System.Drawing.Size(41, 32);\n            this.btnMaximize.TabIndex = 1;\n            this.btnMaximize.Text = \"▢\";\n            this.btnMaximize.UseVisualStyleBackColor = true;\n            this.btnMaximize.Click += new System.EventHandler(this.btnMaximize_Click);\n            // \n            // btnMinimize\n            // \n            this.btnMinimize.Location = new System.Drawing.Point(6, 0);\n            this.btnMinimize.Margin = new System.Windows.Forms.Padding(0);\n            this.btnMinimize.Name = \"btnMinimize\";\n            this.btnMinimize.Size = new System.Drawing.Size(39, 32);\n            this.btnMinimize.TabIndex = 2;\n            this.btnMinimize.Text = \"−\";\n            this.btnMinimize.UseVisualStyleBackColor = true;\n            this.btnMinimize.Click += new System.EventHandler(this.btnMinimize_Click);\n            // \n            // TitleBarControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.tblMain);\n            this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.Name = \"TitleBarControl\";\n            this.Size = new System.Drawing.Size(572, 30);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.flpButtons.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.Label lblTitle;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private DoomLauncher.FormButton btnClose;\n        private DoomLauncher.FormButton btnMaximize;\n        private DoomLauncher.FormButton btnMinimize;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TitleBarControl.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Controls\n{\n    public partial class TitleBarControl : UserControl\n    {\n        public const int WM_NCLBUTTONDOWN = 0xA1;\n        public const int HT_CAPTION = 0x2;\n\n        [DllImport(\"user32.dll\")]\n        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);\n\n        [DllImport(\"user32.dll\")]\n        public static extern bool ReleaseCapture();\n\n        public FormWindowState WindowState { get; private set; }\n        private bool m_maximized;\n        private DragState m_dragState;\n        private bool m_settingState;\n        private Size? m_size;\n        private Point? m_location;\n\n        private enum DragState\n        {\n            None,\n            Start,\n            Dragging\n        }\n\n        public string Title\n        {\n            get => lblTitle.Text; \n            set => lblTitle.Text = value;\n        }\n\n        public bool CanClose { get; set; } = true;\n        public bool RememberNormalSize { get; set; } = true;\n        public bool ControlBox\n        {\n            get { return flpButtons.Visible; }\n            set { flpButtons.Visible = value; }\n        }\n\n        public TitleBarControl()\n        {\n            InitializeComponent();\n\n            flpButtons.MouseDown += FlpButtons_MouseDown;\n            flpButtons.DoubleClick += FlpButtons_DoubleClick;\n\n            lblTitle.MouseDown += LblTitle_MouseDown;\n            btnClose.MouseEnter += BtnClose_MouseEnter;\n            btnClose.MouseLeave += BtnClose_MouseLeave;\n\n            lblTitle.AutoEllipsis = true;\n            lblTitle.AutoSize = false;\n\n            Stylizer.StylizeControl(this, DesignMode, StylizerOptions.StylizeTitleBar);\n            SetBackgroundColor();\n            Load += TitleBarControl_Load;\n            Resize += TitleBarControl_Resize;\n        }\n        \n        private void TitleBarControl_Resize(object sender, EventArgs e)\n        {\n            lblTitle.Width = lblTitle.Parent.Width;\n        }\n\n        private void BtnClose_MouseEnter(object sender, EventArgs e)\n        {\n            btnClose.ForeColor = ColorTheme.Current.CloseForeColorHighlight;\n            btnClose.BackColor = ColorTheme.Current.CloseBackgroundHighlight;\n        }\n\n        private void BtnClose_MouseLeave(object sender, EventArgs e)\n        {\n            btnClose.ForeColor = ColorTheme.Current.Text;\n            btnClose.BackColor = ThemeBackColor;\n        }\n\n        public void HandleWindowStateChange(FormWindowState state)\n        {\n            if (state == FormWindowState.Maximized)\n                SetMaximized();\n        }\n\n        public void SetNormal() => SetNormal(true);\n\n        private void TitleBarControl_Load(object sender, EventArgs e)\n        {\n            if (ParentForm == null)\n                return;\n\n            ParentForm.LocationChanged += TitleBarControl_LocationChanged;\n            WindowState = ParentForm.WindowState;\n\n            if (WindowState == FormWindowState.Normal)\n            {\n                m_size = ParentForm.ClientSize;\n                m_location = ParentForm.Location;\n            }\n\n        }\n\n        private Color ThemeBackColor => ColorTheme.Current.TitlebarBackground;\n\n        private void TitleBarControl_LocationChanged(object sender, EventArgs e)\n        {\n            if (ParentForm == null)\n                return;\n\n            if (WindowState == FormWindowState.Normal)\n                m_location = ParentForm.Location;\n\n            if (!m_settingState && m_dragState == DragState.Start && WindowState == FormWindowState.Maximized)\n            {\n                m_dragState = DragState.Dragging;\n                m_settingState = true;\n                SetNormal(false, false);\n                m_settingState = false;\n            }\n        }\n\n        private void SetBackgroundColor()\n        {\n            var backColor = ThemeBackColor;\n            tblMain.BackColor = backColor;\n            flpButtons.BackColor = backColor;\n            lblTitle.BackColor = backColor;\n            btnClose.BackColor = backColor;\n            btnMinimize.BackColor = backColor;\n            btnMaximize.BackColor = backColor;\n        }\n\n        private void SetNormal(bool centerY, bool setLocation = true)\n        {\n            if (ParentForm == null)\n                return;\n\n            m_maximized = false;\n            WindowState = FormWindowState.Normal;\n            ParentForm.WindowState = FormWindowState.Normal;\n            var bounds = Screen.GetWorkingArea(ParentForm);\n\n            if (m_size == null || ParentForm is MainForm)\n            {\n                if (setLocation)\n                    ParentForm.Location = new Point(bounds.X + (int)(bounds.Width * 0.12),\n                        centerY ? bounds.Y + (int)(bounds.Height * 0.12) : 0);\n                ParentForm.Size = new Size((int)(bounds.Width * 0.75), (int)(bounds.Height * 0.75));\n                return;\n            }\n\n            if (setLocation && m_location.HasValue)\n                ParentForm.Location = m_location.Value;\n            ParentForm.Size = m_size.Value;\n        }\n\n        private void SetMaximized()\n        {\n            if (ParentForm == null)\n                return;\n\n            m_maximized = true;\n            WindowState = FormWindowState.Maximized;\n            ParentForm.WindowState = FormWindowState.Normal;\n            var bounds = Screen.GetWorkingArea(ParentForm);\n            ParentForm.StartPosition = FormStartPosition.Manual;\n            ParentForm.Location = bounds.Location;\n            ParentForm.Width = bounds.Width;\n            ParentForm.Height = bounds.Height;\n        }\n\n        public void SetControlBox(bool set)\n        {\n            flpButtons.Visible = set;\n        }\n\n        private void FlpButtons_DoubleClick(object sender, EventArgs e)\n        {\n            SetMinMax();\n        }\n\n        private void tblMain_MouseDoubleClick(object sender, MouseEventArgs e)\n        {\n            SetMinMax();\n        }\n\n        private void lblTitle_MouseDoubleClick(object sender, MouseEventArgs e)\n        {\n            SetMinMax();\n        }\n\n        private void FlpButtons_MouseDown(object sender, MouseEventArgs e)\n        {\n            HandleMousePress(e);\n        }\n\n        private void tblMain_MouseDown(object sender, MouseEventArgs e)\n        {\n            HandleMousePress(e);\n        }\n\n        private void LblTitle_MouseDown(object sender, MouseEventArgs e)\n        {\n            HandleMousePress(e);\n        }\n\n        private void HandleMousePress(MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Left)\n                return;\n\n            if (e.Clicks != 1)\n                return;\n\n            m_dragState = DragState.Start;\n\n            ReleaseCapture();\n            if (ParentForm != null)\n                SendMessage(ParentForm.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);\n        }\n\n        private void btnClose_Click(object sender, EventArgs e)\n        {\n            if (ParentForm != null && CanClose)\n                ParentForm.Close();\n        }\n\n        private void btnMaximize_Click(object sender, EventArgs e)\n        {\n            SetMinMax();\n        }\n\n        private void SetMinMax()\n        {\n            m_settingState = true;\n            if (m_maximized)\n                SetNormal(true);\n            else\n                SetMaximized();\n            m_settingState = false;\n        }\n\n        private void btnMinimize_Click(object sender, EventArgs e)\n        {\n            if (ParentForm == null)\n                return;\n            WindowState = FormWindowState.Minimized;\n            ParentForm.WindowState = FormWindowState.Minimized;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/TitleBarControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Controls/UpdateControl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class UpdateControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.btnInstall = new System.Windows.Forms.Button();\n            this.lblVersion = new System.Windows.Forms.Label();\n            this.lnkPage = new System.Windows.Forms.LinkLabel();\n            this.SuspendLayout();\n            // \n            // btnInstall\n            // \n            this.btnInstall.Location = new System.Drawing.Point(161, 76);\n            this.btnInstall.Margin = new System.Windows.Forms.Padding(4);\n            this.btnInstall.Name = \"btnInstall\";\n            this.btnInstall.Size = new System.Drawing.Size(208, 28);\n            this.btnInstall.TabIndex = 0;\n            this.btnInstall.Text = \"Download and Install\";\n            this.btnInstall.UseVisualStyleBackColor = true;\n            this.btnInstall.Click += new System.EventHandler(this.btnInstall_Click);\n            // \n            // lblVersion\n            // \n            this.lblVersion.AutoSize = true;\n            this.lblVersion.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lblVersion.Location = new System.Drawing.Point(4, 12);\n            this.lblVersion.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblVersion.Name = \"lblVersion\";\n            this.lblVersion.Size = new System.Drawing.Size(46, 17);\n            this.lblVersion.TabIndex = 1;\n            this.lblVersion.Text = \"label1\";\n            // \n            // lnkPage\n            // \n            this.lnkPage.AutoSize = true;\n            this.lnkPage.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lnkPage.Location = new System.Drawing.Point(4, 42);\n            this.lnkPage.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lnkPage.Name = \"lnkPage\";\n            this.lnkPage.Size = new System.Drawing.Size(134, 17);\n            this.lnkPage.TabIndex = 2;\n            this.lnkPage.TabStop = true;\n            this.lnkPage.Text = \"Release Information\";\n            this.lnkPage.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkPage_LinkClicked);\n            // \n            // UpdateControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.Controls.Add(this.lnkPage);\n            this.Controls.Add(this.lblVersion);\n            this.Controls.Add(this.btnInstall);\n            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.Name = \"UpdateControl\";\n            this.Size = new System.Drawing.Size(397, 110);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button btnInstall;\n        private System.Windows.Forms.Label lblVersion;\n        private System.Windows.Forms.LinkLabel lnkPage;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/UpdateControl.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Net;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class UpdateControl : UserControl\n    {\n        public static readonly string AppUpdateFileName = \"AppUpdate.zip\";\n\n        private ApplicationUpdateInfo m_info;\n        private AppConfiguration m_appConfig;\n        private ProgressBarForm m_updateDownloadProgress;\n        private WebClient m_updateWebClient;\n\n        public UpdateControl()\n        {\n            InitializeComponent();\n\n            Stylizer.StylizeControl(this, DesignMode);\n        }\n\n        public void Initialize(AppConfiguration appConfig, ApplicationUpdateInfo info)\n        {\n            m_info = info;\n            m_appConfig = appConfig;\n\n            lblVersion.Text = string.Format(\"{0} - {1}\", m_info.Version.ToString(), m_info.ReleaseDate.ToShortDateString());\n        }\n\n        private void lnkPage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Process.Start(m_info.ReleasePageUrl);\n        }\n\n        private void btnInstall_Click(object sender, EventArgs e)\n        {\n            m_updateDownloadProgress = new ProgressBarForm\n            {\n                Title = \"Downloading\",\n                DisplayText = \"Downloading Update...\",\n                Minimum = 0,\n                Maximum = 100,\n                StartPosition = FormStartPosition.CenterScreen\n            };\n            \n            StartUpdateDownload(m_info);\n            ShowUpdateDownloadProgress();\n        }\n\n        private void StartUpdateDownload(ApplicationUpdateInfo info)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(new Action<ApplicationUpdateInfo>(StartUpdateDownload), new object[] { info });\n            }\n            else\n            {\n                m_updateWebClient = new WebClient();\n                m_updateWebClient.DownloadProgressChanged += WebClient_DownloadProgressChanged;\n                m_updateWebClient.DownloadFileCompleted += WebClient_DownloadFileCompleted;\n                m_updateWebClient.DownloadFileAsync(new Uri(info.DownloadUrl), GetUpdateArchive());\n            }\n        }\n\n        private string GetUpdateArchive()\n        {\n            return Path.Combine(m_appConfig.TempDirectory.GetFullPath(), AppUpdateFileName);\n        }\n\n        private void ShowUpdateDownloadProgress()\n        {\n            if (InvokeRequired)\n                Invoke(new Action(ShowUpdateDownloadProgress));\n            else\n                m_updateDownloadProgress.ShowDialog(this);\n        }\n\n        private void CloseUpdateDownloadProgress()\n        {\n            if (InvokeRequired)\n            {\n                Invoke(new Action(CloseUpdateDownloadProgress));\n            }\n            else\n            {\n                m_updateWebClient.Dispose();\n                m_updateDownloadProgress.Hide();\n                m_updateDownloadProgress.Close();\n\n                ApplicationUpdater applicationUpdater = new ApplicationUpdater(GetUpdateArchive(), AppDomain.CurrentDomain.BaseDirectory);\n                if (!applicationUpdater.Execute())\n                    CreateUpdateFailureForm(applicationUpdater).ShowDialog(this);\n            }\n        }\n\n        public static TextBoxForm CreateUpdateFailureForm(ApplicationUpdater applicationUpdater)\n        {\n            return new TextBoxForm(true, MessageBoxButtons.OK)\n            {\n                Title = \"Update Error\",\n                HeaderText = \"The application was unable to update. Please download the update manually.\",\n                DisplayText = applicationUpdater.LastError,\n                StartPosition = FormStartPosition.CenterScreen\n            };\n        }\n\n        private void UpdateDownloadProgress(int value)\n        {\n            if (InvokeRequired)\n                Invoke(new Action<int>(UpdateDownloadProgress));\n            else\n                m_updateDownloadProgress.Value = value;\n        }\n\n        private void WebClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)\n        {\n            CloseUpdateDownloadProgress();\n        }\n\n        private void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)\n        {\n            UpdateDownloadProgress(e.ProgressPercentage);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Controls/UpdateControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/DataSources/CleanupFile.cs",
    "content": "﻿namespace DoomLauncher.DataSources\n{\n    public class CleanupFile\n    {\n        public int CleanupFileID { get; set; }\n        public string FileName { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/ConfigurationData.cs",
    "content": "﻿using DoomLauncher.Interfaces;\n\nnamespace DoomLauncher.DataSources\n{\n    class ConfigurationData : IConfigurationData\n    {\n        public ConfigurationData()\n        {\n            AvailableValues = string.Empty;\n            Value = string.Empty;\n        }\n\n        public int ConfigID { get; set; }\n        public string Name { get; set; }\n        public string Value { get; set; }\n        public string AvailableValues { get; set; }\n        public bool UserCanModify { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/CustomParam.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public class CustomParamDataSource : ICustomParam\n    {\n        public int CustomParamID { get; set; }\n        public string FileName { get; set; }\n        public string Parameter { get; set; }\n        public int GameFileID { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/FileData.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\n\nnamespace DoomLauncher\n{\n    public class FileData : IFileData\n    {\n        public FileData()\n        {\n            FileOrder = int.MaxValue;\n            DateCreated = DateTime.Now;\n        }\n\n        public int? FileID { get; set; }\n        public int GameFileID { get; set; }\n        public string FileName { get; set; }\n        public DateTime DateCreated { get; set; }\n        public FileType FileTypeID { get; set; }\n        public int SourcePortID { get; set; }\n        public string Description { get; set; }\n        public string OriginalFileName { get; set; }\n        public string OriginalFilePath { get; set; }\n        public string UserTitle { get; set; }\n        public string UserDescription { get; set; }\n        public string Map { get; set; }\n        public int FileOrder { get; set; }\n\n        public virtual bool IsUrl { get { return false; } }\n\n        public static string GetTitle(IFileData fileData)\n        {\n            if (!string.IsNullOrEmpty(fileData.Map))\n            {\n                string title = fileData.Map;\n                if (string.IsNullOrEmpty(fileData.UserTitle))\n                    return title;\n\n                return $\"{title} {fileData.UserTitle}\";\n            }\n\n            if (!string.IsNullOrEmpty(fileData.UserTitle))\n                return fileData.UserTitle;\n\n            return string.Empty;\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (obj is IFileData file && file.IsUrl == IsUrl)\n            {\n                if (FileID.HasValue)\n                    return FileID.Value == file.FileID;\n                else\n                    return FileName.Equals(file.FileName);\n            }\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            if (FileID.HasValue)\n                return FileID.Value;\n\n            return FileName.GetHashCode();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/GameFile.cs",
    "content": "﻿using DoomLauncher.Handlers;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.IO;\n\nnamespace DoomLauncher.DataSources\n{\n    public class GameFile : IGameFile, IGameProfile, ICloneable\n    {\n        public const string DefaultProfileName = \"Default Profile\";\n        public static string[] GetMaps(IGameFile gameFile) => gameFile.Map.Split(new [] { \", \", \",\" }, StringSplitOptions.RemoveEmptyEntries);\n\n        private string m_lastDirectory;\n\n        public GameFile()\n        {\n            FileName = Title = Author = Description = Thumbnail = Comments = Map = SettingsMap = SettingsSkill = SettingsExtraParams = SettingsFiles\n                = SettingsSpecificFiles = string.Empty;\n            Name = DefaultProfileName;\n            SettingsStat = true;\n            GameProfileID = -1;\n        }\n\n        public int? GameFileID { get; set; }\n        public string FullFileName { get; set; }\n        public virtual string FileName { get; set; }\n        public string FileNameBase => Path.GetFileNameWithoutExtension(FileName);\n        public string FileNameNoPath => Path.GetFileName(FileName);\n        public virtual string LastDirectory => GetLastDirectory(FileName);\n        public virtual string Title { get; set; }\n        public virtual string Author { get; set; }\n        public virtual DateTime? ReleaseDate { get; set; }\n        public virtual string Description { get; set; }\n        public int? IWadID { get; set; }\n        public int? SourcePortID { get; set; }\n        public string Thumbnail { get; set; }\n        public string Comments { get; set; }\n        public string Map { get; set; }\n        public int? MapCount { get; set; }\n        public virtual double? Rating { get; set; }\n        public DateTime? LastPlayed { get; set; }\n        public DateTime? Downloaded { get; set; }\n\n        public int GameProfileID { get; set; }\n        public string Name { get; set; }\n        public string SettingsMap { get; set; }\n        public string SettingsSkill { get; set; }\n        public string SettingsExtraParams { get; set; }\n        public string SettingsFiles { get; set; }\n        public string SettingsFilesSourcePort { get; set; }\n        public string SettingsFilesIWAD { get; set; }\n        public string SettingsSpecificFiles { get; set; }\n        public bool SettingsStat { get; set; }\n        public bool SettingsLoadLatestSave { get; set; }\n        public bool SettingsSaved { get; set; }\n        public bool SettingsExtraParamsOnly { get; set; }\n        public int? SettingsGameProfileID { get; set; }\n\n        public bool IsGlobal => false;\n\n        public int MinutesPlayed { get; set; }\n        public virtual int FileSizeBytes { get; set; }\n\n        public bool IsDoom64 { get; set; }\n\n        public bool IsUnmanaged() => IsUnmanaged(FileName);\n\n        public static bool IsUnmanaged(string filename) => \n            Path.IsPathRooted(filename) || (PathExtensions.IsPartiallyQualified(filename) && HasPathSeparator(filename));\n\n        private static bool HasPathSeparator(string filename)\n        {\n            for (int i = 0; i < filename.Length; i++)\n            {\n                if (filename[i] == Path.DirectorySeparatorChar || filename[i] == Path.AltDirectorySeparatorChar)\n                    return true;\n            }\n\n            return false;\n        }\n\n        public bool IsDirectory()\n        {\n            if (!IsUnmanaged())\n                return false;\n\n            return Util.IsDirectory(FileName);\n        }\n\n        public IArchiveReader OpenGameFile(LauncherPath gameFileDirectory)\n        {\n            string file;\n            if (IsUnmanaged())\n                file = new LauncherPath(FileName).GetFullPath();\n            else\n                file = Path.Combine(gameFileDirectory.GetFullPath(), FileName);\n\n            // If the unmanaged file is a pk3 then ArchiveReader.Create will read it as a zip and try to unpack\n            // Return FileArchiveReader instead so the pk3 will be added as a file\n            // Zip extensions are ignored in this case since Doom Launcher's base functionality revovles around reading zip contents\n            // SpecificFilesForm will also read zip files explicitly to allow user to select files in the archive\n            if (!IsDirectory() && IsUnmanaged() && !ArchiveUtil.ShouldReadPackagedArchive(FileName))\n                return new FileArchiveReader(file);\n\n            return ArchiveReader.Create(file);\n        }\n\n        public bool ArchiveExists(LauncherPath gameFileDirectory)\n        {\n            if (IsDirectory())\n            {\n                return Directory.Exists(FileName);\n            }\n            else if (IsUnmanaged())\n            {\n                var launcherPath = new LauncherPath(FileName);\n                FileInfo fi = new FileInfo(launcherPath.GetFullPath());\n                return fi.Exists;\n            }\n            else \n            {\n                FileInfo fi = new FileInfo(Path.Combine(gameFileDirectory.GetFullPath(), FileName));\n                return fi.Exists;\n            }\n        }\n\n        public object Clone()\n        {\n            GameFile gameFile = new GameFile();\n            var properties = gameFile.GetType().GetProperties();\n            foreach (var prop in properties)\n            {\n                if (prop.GetSetMethod() != null)\n                    prop.SetValue(gameFile, prop.GetValue(this));\n            }\n\n            return gameFile;\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (obj is IGameFile gameFile)\n                return gameFile.FileName == FileName;\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            if (FileName != null)\n                return FileName.GetHashCode();\n\n            return 0;\n        }\n\n        public override string ToString()\n        {\n            if (FileName == null)\n                return string.Empty;\n            return FileName;\n        }\n\n        private string GetLastDirectory(string path)\n        {\n            if (m_lastDirectory != null)\n                return m_lastDirectory;\n\n            if (!IsUnmanaged())\n            {\n                m_lastDirectory = string.Empty;\n                return m_lastDirectory;\n            }\n\n            string dir = Path.GetDirectoryName(FileName);\n            m_lastDirectory = new DirectoryInfo(dir).Name;\n            return m_lastDirectory;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/GameProfile.cs",
    "content": "﻿using DoomLauncher.Interfaces;\n\nnamespace DoomLauncher.DataSources\n{\n    public class GameProfile : IGameProfile\n    {\n        public GameProfile()\n        {\n            SettingsMap = SettingsSkill = SettingsExtraParams = SettingsFiles\n                = SettingsSpecificFiles = string.Empty;\n            SettingsStat = SettingsSaved = true;\n        }\n\n        public GameProfile(int gameFileID, string name)\n            : this()\n        {\n            GameFileID = gameFileID;\n            Name = name;\n        }\n\n        public static GameProfile CreateGlobalProfile(string name)\n        {\n            return new GameProfile()\n            {\n                GameFileID = -1,\n                Name = name\n            };\n        }\n\n        public static void ApplyDefaultsToProfile(IGameProfile gameProfile, AppConfiguration appConfig)\n        {\n            if (!gameProfile.SourcePortID.HasValue)\n                gameProfile.SourcePortID = (int)appConfig.GetTypedConfigValue(ConfigType.DefaultSourcePort, typeof(int));\n            if (!gameProfile.IWadID.HasValue)\n                gameProfile.IWadID = (int)appConfig.GetTypedConfigValue(ConfigType.DefaultIWad, typeof(int));\n            if (string.IsNullOrEmpty(gameProfile.SettingsSkill))\n                gameProfile.SettingsSkill = (string)appConfig.GetTypedConfigValue(ConfigType.DefaultSkill, typeof(string));\n        }\n\n        public int GameProfileID { get; set; }\n        public int? GameFileID { get; set; }\n        public int? IWadID { get; set; }\n        public int? SourcePortID { get; set; }\n        public string Name { get; set; }\n        public string SettingsMap { get; set; }\n        public string SettingsSkill { get; set; }\n        public string SettingsExtraParams { get; set; }\n        public string SettingsFiles { get; set; }\n        public string SettingsFilesSourcePort { get; set; }\n        public string SettingsFilesIWAD { get; set; }\n        public string SettingsSpecificFiles { get; set; }\n        public bool SettingsStat { get; set; }\n        public bool SettingsLoadLatestSave { get; set; }\n        public bool SettingsSaved { get; set; }\n        public bool SettingsExtraParamsOnly { get; set; }\n        public bool IsGlobal => GameFileID == -1;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/ITagDataSource.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface ITagDataSource\n    {\n        int TagID { get; set; }\n        string Name { get; set; }\n        bool HasTab { get; set; }\n        bool HasColor { get; set; }\n        int? Color { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/IWadData.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.IO;\n\nnamespace DoomLauncher\n{\n    public class IWadData : IIWadData\n    {\n        public int IWadID { get; set; }\n        public string Name { get; set; }\n        public string FileName { get; set; }\n\n        public string FileNameBase => Path.GetFileNameWithoutExtension(FileName);\n\n        public int? GameFileID { get; set; }\n\n        public override bool Equals(object obj)\n        {\n            IIWadData iwad = obj as IIWadData;\n\n            if (iwad != null)\n            {\n                return iwad.FileName == FileName;\n            }\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return FileName.GetHashCode();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/IdGamesGameFile.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.ComponentModel;\nusing System.Net;\n\nnamespace DoomLauncher.DataSources\n{\n    class IdGamesGameFile : GameFile, IGameFileDownloadable, IDisposable\n    {\n        public event DownloadProgressChangedEventHandler DownloadProgressChanged;\n        public event AsyncCompletedEventHandler DownloadCompleted;\n\n        private WebClient m_webClient;\n\n        public override string Title\n        {\n            get { return title; }\n            set { title = value; }\n        }\n\n        public override string Author\n        {\n            get { return author; }\n            set { author = value; }\n        }\n\n        public override DateTime? ReleaseDate\n        {\n            get { return date; }\n            set { if (value.HasValue) date = value.Value; }\n        }\n\n        public override string Description\n        {\n            get { return description; }\n            set { description = value; }\n        }\n\n        public override double? Rating\n        {\n            get { return rating; }\n            set { if (value.HasValue) rating = value.Value; }\n        }\n\n        public override int FileSizeBytes\n        {\n            get { return size; }\n            set { size = value; }\n        }\n\n        public override string LastDirectory => string.Empty;\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            if (m_webClient != null)\n                m_webClient.Dispose();\n        }\n\n        public int id { get; set; }\n        public string title { get; set; }\n        public string author { get; set; }\n        public string description { get; set; }\n        public DateTime? date { get; set; }\n        public string filename { get; set; }\n        public string dir { get; set; }\n        public double rating { get; set; }\n        public int size { get; set; }\n\n        public void Download(IGameFileDataSourceAdapter adapter, string dlFilename)\n        {\n            IdGamesDataAdapater dataAdapter = adapter as IdGamesDataAdapater;\n\n            if (dataAdapter != null)\n            {\n                m_webClient = new WebClient();\n                m_webClient.DownloadProgressChanged += client_DownloadProgressChanged;\n                m_webClient.DownloadFileCompleted += client_DownloadFileCompleted;\n                m_webClient.DownloadFileAsync(new Uri(dataAdapter.MirrorUrl + dir + filename), dlFilename, id);\n            }\n        }\n\n        public void Cancel()\n        {\n            if (m_webClient != null)\n                m_webClient.CancelAsync();\n        }\n\n        void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)\n        {\n            m_webClient.Dispose();\n            m_webClient = null;\n\n            DownloadCompleted?.Invoke(this, e);\n        }\n\n        void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)\n        {\n            DownloadProgressChanged?.Invoke(this, e);\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (obj is IdGamesGameFile gameFile)\n                return id == gameFile.id;\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return id;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/NewFileData.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public class NewFileData\n    {\n        public int SourcePortID { get; set; }\n        public string Description { get; set; }\n        public string UserTitle { get; set; }\n        public string UserDescription { get; set; }\n        public string Map { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/PreviewImage.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public class PreviewImage\n    {\n        public PreviewImage(string path, string title)\n        {\n            Path = path;\n            Title = title;\n        }\n\n        public string Path { get; set; }\n        public string Title { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/SettingsDataSource.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DoomLauncher.DataSources\n{\n    class SettingsDataSource : ISettingsDataSource\n    {\n        public int GameFileID { get; set; }\n        public int SettingsID { get; set; }\n        public string SettingsName { get; set; }\n        public string SettingsMap { get; set; }\n        public string SettingsSkill { get; set; }\n        public string SettingsExtraParams { get; set; }\n        public string SettingsFiles { get; set; }\n        public string SettingsSpecificFiles { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/SourcePortData.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher.DataSources\n{\n    public class SourcePortData : ISourcePortData\n    {\n        public int SourcePortID { get; set; }\n        public string Name { get; set; }\n        public string SupportedExtensions { get; set; }\n        public string SettingsFiles { get; set; }\n        public string Executable { get; set; }\n        public SourcePortLaunchType LaunchType { get; set; }\n        public string FileOption { get; set; }\n        public string ExtraParameters { get; set; }\n        public LauncherPath AltSaveDirectory { get; set; }\n        public bool Archived { get; set; }\n        public LauncherPath Directory { get; set; }\n\n        public ISourcePortFlavor GetFlavor()\n        {\n            ISourcePortFlavor[] sourcePortFlavors = new ISourcePortFlavor[]\n            {\n                new ZDoomSourcePortFlavor(this),\n                new StatdumpSourcePortFlavor(this),\n                new LevelstatSourcePortFlavor(this),\n                new DoomsdaySourcePortFlavor(this),\n                new HelionSourcePortFlavor(this),\n                new GenericSourcePortFlavor(this)\n            };\n\n            return sourcePortFlavors.First(x => x.Supported());\n        }\n\n        public string GetFullExecutablePath()\n        {\n            return Path.Combine(Directory.GetFullPath(), Executable);\n        }\n\n        public LauncherPath GetReadSavePath()\n        {\n            if (!string.IsNullOrEmpty(AltSaveDirectory.GetFullPath()))\n                return AltSaveDirectory;\n\n            return Directory;\n        }\n\n        public LauncherPath GetLoadSavePath()\n        {\n            if (!string.IsNullOrEmpty(AltSaveDirectory.GetFullPath()))\n                return AltSaveDirectory;\n\n            return LauncherPath.NoPath;\n        }\n\n        public override bool Equals(object obj)\n        {\n            ISourcePortData sourcePort = obj as ISourcePortData;\n\n            if (sourcePort != null)\n            {\n                return sourcePort.SourcePortID == SourcePortID;\n            }\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return SourcePortID;\n        }\n\n        public static string[] GetSupportedExtensions(ISourcePortData sourcePort)\n        {\n            string[] supportedExtensions = new string[] { };\n\n            if (sourcePort != null)\n                supportedExtensions = sourcePort.SupportedExtensions.Split(new string[] { \", \", \",\" }, StringSplitOptions.RemoveEmptyEntries);\n\n            return supportedExtensions;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/SourcePortLaunchType.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum SourcePortLaunchType\n    {\n        SourcePort,\n        Utility,\n        Doom64\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/StaticTagData.cs",
    "content": "﻿using DoomLauncher.DataSources;\n\nnamespace DoomLauncher\n{\n    class StaticTagData : TagData\n    {\n        public static string GetFavoriteName(string name) => string.Concat(\"● \", name);\n\n        public override string FavoriteName => GetFavoriteName(Name);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/StatsData.cs",
    "content": "﻿using System;\nusing System.Globalization;\n\nnamespace DoomLauncher\n{\n    public class StatsData : IStatsData\n    {\n        public int KillCount { get; set; }\n        public int TotalKills { get; set; }\n        public int SecretCount { get; set; }\n        public int TotalSecrets { get; set; }\n        public float LevelTime { get; set; }\n        public int ItemCount { get; set; }\n        public int TotalItems { get; set; }\n        public string MapName { get; set; }\n        public DateTime RecordTime { get; set; }\n        public int? Skill { get; set; }\n\n        public string FormattedKills { get { return string.Format(\"{0} / {1}\", KillCount.ToString(\"N0\", CultureInfo.InvariantCulture), TotalKills.ToString(\"N0\", CultureInfo.InvariantCulture)); } }\n        public string FormattedSecrets { get { return string.Format(\"{0} / {1}\", SecretCount.ToString(\"N0\", CultureInfo.InvariantCulture), TotalSecrets.ToString(\"N0\", CultureInfo.InvariantCulture)); } }\n        public string FormattedItems { get { return string.Format(\"{0} / {1}\", ItemCount.ToString(\"N0\", CultureInfo.InvariantCulture), TotalItems.ToString(\"N0\", CultureInfo.InvariantCulture)); } }\n        public string FormattedTime\n        {\n            get\n            {\n                TimeSpan ts = TimeSpan.FromSeconds(LevelTime);\n                return string.Format(\"{0:D2}:{1:D2}:{2:D2}:{3:D3}ms\",\n                                ts.Hours,\n                                ts.Minutes,\n                                ts.Seconds,\n                                ts.Milliseconds);\n            }\n        }\n\n        public int GameFileID { get; set; }\n        public int SourcePortID { get; set; }\n        public int StatID { get; set; }\n\n        public string SaveFile { get; set; }\n\n        public override bool Equals(object obj)\n        {\n            if (obj is IStatsData stats)\n            {\n                return GameFileID == stats.GameFileID && KillCount == stats.KillCount && TotalKills == stats.TotalKills &&\n                    SecretCount == stats.SecretCount && TotalSecrets == stats.TotalSecrets &&\n                    ItemCount == stats.ItemCount && TotalItems == stats.TotalItems &&\n                    LevelTime == stats.LevelTime && Skill == Skill &&\n                    MapName.Equals(stats.MapName, StringComparison.OrdinalIgnoreCase);\n            }\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return string.Format(\"{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}\", GameFileID, KillCount, TotalKills, SecretCount, TotalSecrets, \n                ItemCount, TotalItems, LevelTime, Skill.HasValue ? Skill : 0, MapName.ToLower()).GetHashCode();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/TagData.cs",
    "content": "﻿using DoomLauncher.Interfaces;\n\nnamespace DoomLauncher.DataSources\n{\n    public class TagData : ITagData\n    {\n        public static readonly string FavoriteChar = \"★\";\n\n        public int TagID { get; set; }\n        public string Name { get; set; }\n        public bool HasTab { get; set; }\n        public bool HasColor { get; set; }\n        public int? Color { get; set; }\n        public bool ExcludeFromOtherTabs { get; set; }\n        public bool Favorite { get; set; }\n\n        public virtual string FavoriteName => Favorite ? string.Concat(FavoriteChar, \" \", Name) : Name;\n\n        public override bool Equals(object obj)\n        {\n            if (obj is ITagData tag)\n                return tag.TagID == TagID;\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return TagID;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/TagMapping.cs",
    "content": "﻿using DoomLauncher.Interfaces;\n\nnamespace DoomLauncher.DataSources\n{\n    public class TagMapping : ITagMapping\n    {\n        public int TagID { get; set; }\n        public int FileID { get; set; }\n\n        public override bool Equals(object obj)\n        {\n            ITagMapping mapping = obj as ITagMapping;\n\n            if (mapping != null)\n            {\n                return mapping.FileID == this.FileID && mapping.TagID == this.TagID;\n            }\n\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return string.Format(\"{0},{1}\", FileID, TagID).GetHashCode();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/WadArchiveFile.cs",
    "content": "﻿namespace DoomLauncher.DataSources\n{\n    class WadArchiveFile : FileData\n    {\n        public override bool IsUrl { get { return true; } }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DataSources/WadArchiveGameFile.cs",
    "content": "﻿using Newtonsoft.Json;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.DataSources\n{\n    class WadArchiveGameFile : GameFile\n    {\n        public override string FileName\n        {\n            get\n            {\n                if (filenames != null && filenames.Length > 0)\n                    return filenames[0];\n                return null;\n            }\n            set\n            {\n                if (filenames == null)\n                    filenames = new string[1];\n                filenames[0] = value;\n            }\n        }\n        [JsonProperty(\"extra\")]\n        public override string Title { get; set; }\n        [JsonProperty(\"size\")]\n        public override int FileSizeBytes { get; set; }\n        [JsonProperty(\"type\")]\n        public string type { get; set; }\n        [JsonProperty(\"port\")]\n        public string port { get; set; }\n        [JsonProperty(\"links\")]\n        public string[] links { get; set; }\n        [JsonProperty(\"filenames\")]\n        public string[] filenames { get; set; }\n        [JsonProperty(\"screenshots\")]\n        public Dictionary<string, string> screenshots { get; set; }\n        public override string LastDirectory => string.Empty;\n    }\n\n    class ScreenshotItem\n    {\n        [JsonProperty(\"name\")]\n        public string name { get; set; }\n        [JsonProperty(\"value\")]\n        public string value { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Demo/CldDemoParser.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher.Demo\n{\n    public class CldDemoParser : IDemoParser\n    {\n        private enum DemoCmds\n        {\n            CLD_DEMOLENGTH = 242,\n            CLD_DEMOVERSION,\n            CLD_CVARS,\n            CLD_USERINFO,\n            CLD_BODYSTART,\n            CLD_TICCMD,\n            CLD_LOCALCOMMAND,\n            CLD_DEMOEND,\n            CLD_DEMOWADS,\n            NUM_DEMO_COMMANDS\n        };\n\n        private readonly string m_file;\n        private const int m_hdr = 0x444C435A;\n\n        public CldDemoParser(string demofile)\n        {\n            m_file = demofile;\n        }\n\n        public bool CanParse()\n        {\n            if (File.Exists(m_file))\n            {\n                using (BinaryReader br = new BinaryReader(new FileStream(m_file, FileMode.Open)))\n                {\n                    return br.BaseStream.Length > 16 && br.ReadInt32() == m_hdr && br.ReadByte() == (byte)DemoCmds.CLD_DEMOLENGTH;\n                }\n            }\n\n            return false;\n        }\n\n        public string[] GetRequiredFiles()\n        {\n            string[] wads = new string[] { };\n            try\n            {\n                using (BinaryReader br = new BinaryReader(new FileStream(m_file, FileMode.Open)))\n                {\n                    if (br.ReadInt32() == m_hdr && br.ReadByte() == (byte)DemoCmds.CLD_DEMOLENGTH)\n                    {\n                        bool bodyStart = false;\n\n                        while (!bodyStart)\n                        {\n                            byte cmd = br.ReadByte();\n                            switch ((DemoCmds)cmd)\n                            {\n                                case DemoCmds.CLD_DEMOVERSION:\n                                    ReadVersion(br);\n                                    break;\n\n                                case DemoCmds.CLD_DEMOWADS:\n                                    return ReadDemoWads(br);\n\n                                case DemoCmds.CLD_BODYSTART:\n                                    bodyStart = false;\n                                    break;\n\n                                default:\n                                    break;\n                            }\n                        }\n                    }\n                }\n            }\n            catch\n            {\n                //bad file, do nothing\n            }\n\n            return wads;\n        }\n\n        private void ReadVersion(BinaryReader br)\n        {\n            br.ReadInt16(); //demo version\n            ReadString(br); //string app version\n            br.ReadByte();\n            br.ReadInt32();\n        }\n\n        private string[] ReadDemoWads(BinaryReader br)\n        {\n            List<string> wads = new List<string>();\n            short wadCount = br.ReadInt16();\n            for (short i = 0; i < wadCount; i++)\n                wads.Add(ReadString(br));\n            return wads.ToArray();\n        }\n\n        private string ReadString(BinaryReader br)\n        {\n            List<char> data = new List<char>();\n\n            do\n            {\n                data.Add((char)br.ReadByte());\n            } while (data.Last() != 0);\n\n            return new string(data.Take(data.Count - 1).ToArray());\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Demo/DemoUtil.cs",
    "content": "﻿using System.Linq;\n\nnamespace DoomLauncher.Demo\n{\n    public static class DemoUtil\n    {\n        public static IDemoParser GetDemoParser(string demoFile)\n        {\n            IDemoParser[] parsers = new IDemoParser[]\n            {\n                new CldDemoParser(demoFile)\n            };\n\n            return parsers.FirstOrDefault(x => x.CanParse());\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Demo/IDemoParser.cs",
    "content": "﻿namespace DoomLauncher.Demo\n{\n    public interface IDemoParser\n    {\n        bool CanParse();\n        string[] GetRequiredFiles();    \n    }\n}\n"
  },
  {
    "path": "DoomLauncher/DoomLauncher.VisualElementsManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Application xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n\t<VisualElements\n\t\tBackgroundColor=\"#463628\" \n\t\tForegroundText=\"light\" \n\t\tShowNameOnSquare150x150Logo=\"on\" \n\t\tSquare150x150Logo=\"TileImages\\DoomLauncherTile.png\" \n\t\tSquare70x70Logo=\"TileImages\\DoomLauncherTileSmall.png\"/>\n</Application>"
  },
  {
    "path": "DoomLauncher/DoomLauncher.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"..\\packages\\EntityFramework.6.4.4\\build\\EntityFramework.props\" Condition=\"Exists('..\\packages\\EntityFramework.6.4.4\\build\\EntityFramework.props')\" />\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>DoomLauncher</RootNamespace>\n    <AssemblyName>DoomLauncher</AssemblyName>\n    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <PublishUrl>publish\\</PublishUrl>\n    <Install>true</Install>\n    <InstallFrom>Disk</InstallFrom>\n    <UpdateEnabled>false</UpdateEnabled>\n    <UpdateMode>Foreground</UpdateMode>\n    <UpdateInterval>7</UpdateInterval>\n    <UpdateIntervalUnits>Days</UpdateIntervalUnits>\n    <UpdatePeriodically>false</UpdatePeriodically>\n    <UpdateRequired>false</UpdateRequired>\n    <MapFileExtensions>true</MapFileExtensions>\n    <ApplicationRevision>0</ApplicationRevision>\n    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>\n    <IsWebBootstrapper>false</IsWebBootstrapper>\n    <UseApplicationTrust>false</UseApplicationTrust>\n    <BootstrapperEnabled>true</BootstrapperEnabled>\n    <TargetFrameworkProfile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ApplicationIcon>DoomLauncher.ico</ApplicationIcon>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ApplicationManifest>app.manifest</ApplicationManifest>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.6.4.4\\lib\\net45\\EntityFramework.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.6.4.4\\lib\\net45\\EntityFramework.SqlServer.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Gameloop.Vdf, Version=0.6.2.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Gameloop.Vdf.0.6.2\\lib\\net45\\Gameloop.Vdf.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.13.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Octokit, Version=0.50.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Octokit.0.50.0\\lib\\net46\\Octokit.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"SevenZipSharp, Version=0.64.3890.29348, Culture=neutral, PublicKeyToken=20de82c62b055c88, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SevenZipSharp.0.64\\lib\\SevenZipSharp.dll</HintPath>\n    </Reference>\n    <Reference Include=\"SharpCompress, Version=0.31.0.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SharpCompress.0.31.0\\lib\\net461\\SharpCompress.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Buffers.4.5.1\\lib\\net461\\System.Buffers.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Collections.Specialized, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Collections.Specialized.4.3.0\\lib\\net46\\System.Collections.Specialized.dll</HintPath>\n      <Private>True</Private>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.SQLite, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\\lib\\net46\\System.Data.SQLite.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.SQLite.EF6, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Data.SQLite.EF6.1.0.115.5\\lib\\net46\\System.Data.SQLite.EF6.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.SQLite.Linq, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Data.SQLite.Linq.1.0.115.5\\lib\\net46\\System.Data.SQLite.Linq.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IO.Compression\" />\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\n    <Reference Include=\"System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Memory.4.5.4\\lib\\net461\\System.Memory.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Numerics\" />\n    <Reference Include=\"System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.5.0\\lib\\net46\\System.Numerics.Vectors.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Runtime.CompilerServices.Unsafe.5.0.0\\lib\\net45\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Text.Encoding.CodePages, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Text.Encoding.CodePages.5.0.0\\lib\\net461\\System.Text.Encoding.CodePages.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Deployment\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"WindowsFormsIntegration\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Adapters\\Launch\\GameFilesLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\LaunchResult.cs\" />\n    <Compile Include=\"Adapters\\Launch\\UtilityFilesLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\IWadLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\LoadSaveLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\StatisticsReaderLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\SourcePortExtraParametersLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\ILaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\LaunchParameters.cs\" />\n    <Compile Include=\"Adapters\\Launch\\PlayDemoLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\ExtraParametersLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\RecordLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\Launch\\MapSkillLaunchFeature.cs\" />\n    <Compile Include=\"Adapters\\PlaySession.cs\" />\n    <Compile Include=\"Adapters\\WadArchiveDataAdapter.cs\" />\n    <Compile Include=\"Archive\\ArchiveReader.cs\" />\n    <Compile Include=\"Archive\\Directory\\DirectoryArchiveEntry.cs\" />\n    <Compile Include=\"Archive\\EmptyArchiveReader.cs\" />\n    <Compile Include=\"Archive\\FileArchiveReader.cs\" />\n    <Compile Include=\"Archive\\Directory\\DirectoryArchiveReader.cs\" />\n    <Compile Include=\"Archive\\IArchiveEntry.cs\" />\n    <Compile Include=\"Archive\\RecursiveArchiveReader.cs\" />\n    <Compile Include=\"Config\\ColorTheme.cs\" />\n    <Compile Include=\"Config\\ColorThemeType.cs\" />\n    <Compile Include=\"Config\\IDirectoriesConfiguration.cs\" />\n    <Compile Include=\"Controls\\CCheckBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\CComboBox.cs\" />\n    <Compile Include=\"Controls\\CheckBoxList.cs\" />\n    <Compile Include=\"Controls\\CheckBoxList.Designer.cs\">\n      <DependentUpon>CheckBoxList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\CProgressBar.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\CTabControl.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Archive\\Rar\\RarArchiveEntry.cs\" />\n    <Compile Include=\"Archive\\Rar\\RarArchiveReader.cs\" />\n    <Compile Include=\"Archive\\SevenZip\\SevenZipArchiveEntry.cs\" />\n    <Compile Include=\"Archive\\SevenZip\\SevenZipArchiveReader.cs\" />\n    <Compile Include=\"Archive\\Wad\\WadArchiveReader.cs\" />\n    <Compile Include=\"Archive\\Wad\\WadEntry.cs\" />\n    <Compile Include=\"Archive\\Zip\\ZipArchiveReader.cs\" />\n    <Compile Include=\"Archive\\Zip\\ZipArchiveReaderEntry.cs\" />\n    <Compile Include=\"Controls\\FormButton.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileTile.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileTile.Designer.cs\">\n      <DependentUpon>GameFileTile.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\GlowButton.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TagSelectControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TagSelectControl.Designer.cs\">\n      <DependentUpon>TagSelectControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\TitleBarControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TitleBarControl.Designer.cs\">\n      <DependentUpon>TitleBarControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\UpdateControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\UpdateControl.Designer.cs\">\n      <DependentUpon>UpdateControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Config\\DataCache.cs\" />\n    <Compile Include=\"DataSources\\CleanupFile.cs\" />\n    <Compile Include=\"DataSources\\GameProfile.cs\" />\n    <Compile Include=\"Config\\FileManagement.cs\" />\n    <Compile Include=\"Controls\\FlowLayoutPanelDB.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\FlowLayoutPanelDB.Designer.cs\">\n      <DependentUpon>FlowLayoutPanelDB.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"DataSources\\NewFileData.cs\" />\n    <Compile Include=\"DataSources\\PreviewImage.cs\" />\n    <Compile Include=\"Forms\\FileManagementSelect.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\FileManagementSelect.Designer.cs\">\n      <DependentUpon>FileManagementSelect.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Archive\\IArchiveReader.cs\" />\n    <Compile Include=\"Controls\\GameFileTileViewControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileTileViewControl.Designer.cs\">\n      <DependentUpon>GameFileTileViewControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileTileBase.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileTileExpanded.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileTileExpanded.Designer.cs\">\n      <DependentUpon>GameFileTileExpanded.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Config\\GameFileListEventArgs.cs\" />\n    <Compile Include=\"Forms\\PlayRandomForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\PlayRandomForm.Designer.cs\">\n      <DependentUpon>PlayRandomForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\SaveInfo.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\SaveInfo.Designer.cs\">\n      <DependentUpon>SaveInfo.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\ScreenshotEditForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\ScreenshotEditForm.Designer.cs\">\n      <DependentUpon>ScreenshotEditForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\TextBoxForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\TextBoxForm.Designer.cs\">\n      <DependentUpon>TextBoxForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"GameFileView\\GameFileViewFactory.cs\" />\n    <Compile Include=\"GameFileView\\GameFileViewType.cs\" />\n    <Compile Include=\"Handlers\\AutoCompleteCombo.cs\" />\n    <Compile Include=\"Handlers\\Sync\\Doom64TitlePicSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\GameConfSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\GameInfoSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\ISyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\IWadTitlesSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\KnownWadsSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\MapInfoUtil.cs\" />\n    <Compile Include=\"Handlers\\Sync\\MapStringSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\StartupImageSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\SyncResult.cs\" />\n    <Compile Include=\"Handlers\\Sync\\Doom64SyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\TextFileSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\TitlePicUtil.cs\" />\n    <Compile Include=\"Handlers\\FileMapComparer.cs\" />\n    <Compile Include=\"Handlers\\GameFileTileManager.cs\" />\n    <Compile Include=\"Config\\Icons.cs\" />\n    <Compile Include=\"Handlers\\GameProfileUtil.cs\" />\n    <Compile Include=\"Handlers\\Sync\\TitlePicSyncAction.cs\" />\n    <Compile Include=\"Handlers\\Sync\\IdGamesTextInfo.cs\" />\n    <Compile Include=\"Handlers\\ImageExtensions.cs\" />\n    <Compile Include=\"Handlers\\MenuConstants.cs\" />\n    <Compile Include=\"Handlers\\ArchiveUtil.cs\" />\n    <Compile Include=\"Handlers\\PathExtensions.cs\" />\n    <Compile Include=\"Handlers\\ToolTipGroup.cs\" />\n    <Compile Include=\"Handlers\\VersionUpdateResults.cs\" />\n    <Compile Include=\"Interfaces\\IGameFileSortableView.cs\" />\n    <Compile Include=\"Interfaces\\IGameFileTile.cs\" />\n    <Compile Include=\"Interfaces\\IGameFileColumnView.cs\" />\n    <Compile Include=\"Interfaces\\IGameFileView.cs\" />\n    <Compile Include=\"Interfaces\\IGameProfile.cs\" />\n    <Compile Include=\"IWad\\IWadInfo.cs\" />\n    <Compile Include=\"Controls\\PagingControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\PagingControl.Designer.cs\">\n      <DependentUpon>PagingControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\ToolTipDisplayHandler.cs\" />\n    <Compile Include=\"Handlers\\ThumbnailManager.cs\" />\n    <Compile Include=\"Controls\\SlideShowPictureBox.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\SlideShowPictureBox.Designer.cs\">\n      <DependentUpon>SlideShowPictureBox.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\TabKeys.cs\" />\n    <Compile Include=\"Forms\\TagSelectForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\TagSelectForm.Designer.cs\">\n      <DependentUpon>TagSelectForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"DataSources\\StaticTagData.cs\" />\n    <Compile Include=\"LaunchArgs.cs\" />\n    <Compile Include=\"Program.Init.cs\" />\n    <Compile Include=\"ProgressBarType.cs\" />\n    <Compile Include=\"SaveGame\\HelionSaveGameReader.cs\" />\n    <Compile Include=\"SourcePort\\HelionSourcePortFlavor.cs\" />\n    <Compile Include=\"SourcePort\\LevelstatSourcePortFlavor.cs\" />\n    <Compile Include=\"SourcePort\\StatdumpSourcePortFlavor.cs\" />\n    <Compile Include=\"GameStores\\AutomaticGameStoreCheck.cs\" />\n    <Compile Include=\"GameStores\\StoreGame.cs\" />\n    <Compile Include=\"GameStores\\StoreGameLoader.cs\" />\n    <Compile Include=\"GameStores\\GameStoreFiles.cs\" />\n    <Compile Include=\"Stylize\\CToolStripRenderer.cs\" />\n    <Compile Include=\"Stylize\\DarkTheme.cs\" />\n    <Compile Include=\"Stylize\\DefaultTheme.cs\" />\n    <Compile Include=\"Stylize\\ImmersiveDarkMode.cs\" />\n    <Compile Include=\"Stylize\\StyledMessageBox.cs\" />\n    <Compile Include=\"Stylize\\Stylizer.cs\" />\n    <Compile Include=\"Stylize\\IThemeColors.cs\" />\n    <Compile Include=\"Update\\ApplicationUpdater.cs\" />\n    <Compile Include=\"Update\\ApplicationUpdateInfo.cs\" />\n    <Compile Include=\"Controls\\ColumnField.cs\" />\n    <Compile Include=\"Controls\\CRichTextBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\CRichTextBox.Designer.cs\">\n      <DependentUpon>CRichTextBox.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Dpi\\DpiScale.cs\" />\n    <Compile Include=\"Forms\\FilterForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\FilterForm.Designer.cs\">\n      <DependentUpon>FilterForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\FilterSettingsForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\FilterSettingsForm.Designer.cs\">\n      <DependentUpon>FilterSettingsForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\ScreenshotViewerForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\ScreenshotViewerForm.Designer.cs\">\n      <DependentUpon>ScreenshotViewerForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\Welcome.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\Welcome.Designer.cs\">\n      <DependentUpon>Welcome.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\FIleAddResults.cs\" />\n    <Compile Include=\"DataSources\\CustomParam.cs\" />\n    <Compile Include=\"Demo\\CldDemoParser.cs\" />\n    <Compile Include=\"Demo\\DemoUtil.cs\" />\n    <Compile Include=\"Demo\\IDemoParser.cs\" />\n    <Compile Include=\"Forms\\DirectoriesForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\DirectoriesForm.Designer.cs\">\n      <DependentUpon>DirectoriesForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\AddFileType.cs\" />\n    <Compile Include=\"Config\\ConfigType.cs\" />\n    <Compile Include=\"Controls\\BasicFileView.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\FilesCtrl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\FilesCtrl.Designer.cs\">\n      <DependentUpon>FilesCtrl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"DataSources\\WadArchiveFile.cs\" />\n    <Compile Include=\"DataSources\\WadArchiveGameFile.cs\" />\n    <Compile Include=\"Forms\\CumulativeStats.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\CumulativeStats.Designer.cs\">\n      <DependentUpon>CumulativeStats.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\FileLoadHandler.cs\" />\n    <Compile Include=\"Handlers\\FileLoadHandlerLegacy.cs\" />\n    <Compile Include=\"Interfaces\\ICustomParam.cs\" />\n    <Compile Include=\"Interfaces\\IStatsDataSourceAdapter.cs\" />\n    <Compile Include=\"Controls\\StatisticsView.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\StatisticsView.Designer.cs\">\n      <DependentUpon>StatisticsView.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Config\\LauncherPath.cs\" />\n    <Compile Include=\"DataSources\\SourcePortLaunchType.cs\" />\n    <Compile Include=\"Forms\\SimpleFileSelectForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\SimpleFileSelectForm.Designer.cs\">\n      <DependentUpon>SimpleFileSelectForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\LaunchData.cs\" />\n    <Compile Include=\"Handlers\\NativeMethods.cs\" />\n    <Compile Include=\"SaveGame\\DsgSaveGameReader.cs\" />\n    <Compile Include=\"SaveGame\\ISaveGameReader.cs\" />\n    <Compile Include=\"SaveGame\\ZDoomSaveGameReader.cs\" />\n    <Compile Include=\"Controls\\StatBar.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Config\\ScreenFilter.cs\" />\n    <Compile Include=\"SourcePort\\DoomsdaySourcePortFlavor.cs\" />\n    <Compile Include=\"SourcePort\\GenericSourcePortFlavor.cs\" />\n    <Compile Include=\"SourcePort\\ISourcePortFlavor.cs\" />\n    <Compile Include=\"SourcePort\\SpData.cs\" />\n    <Compile Include=\"SourcePort\\ZDoomSourcePortFlavor.cs\" />\n    <Compile Include=\"Statistics\\LevelstatReader.cs\" />\n    <Compile Include=\"Config\\AppVersion.cs\" />\n    <Compile Include=\"Config\\ColumnConfig.cs\" />\n    <Compile Include=\"DataSources\\StatsData.cs\" />\n    <Compile Include=\"DataSources\\TagData.cs\" />\n    <Compile Include=\"DataSources\\TagMapping.cs\" />\n    <Compile Include=\"Controls\\FileType.cs\" />\n    <Compile Include=\"Forms\\FileDetailsEditForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\FileDetailsEditForm.Designer.cs\">\n      <DependentUpon>FileDetailsEditForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\MessageCheckBox.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\MessageCheckBox.Designer.cs\">\n      <DependentUpon>MessageCheckBox.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\SplashScreen.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\SplashScreen.Designer.cs\">\n      <DependentUpon>SplashScreen.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\RatingControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\RatingControl.Designer.cs\">\n      <DependentUpon>RatingControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\MainForm_Config.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\MainForm_Init.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\MainForm_Sync.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\MainForm_Play.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Interfaces\\IStatsData.cs\" />\n    <Compile Include=\"Interfaces\\ITagData.cs\" />\n    <Compile Include=\"Interfaces\\ITagMapping.cs\" />\n    <Compile Include=\"Controls\\TagEdit.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TagEdit.Designer.cs\">\n      <DependentUpon>TagEdit.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\TagForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\TagForm.Designer.cs\">\n      <DependentUpon>TagForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Interfaces\\ITagMapLookup.cs\" />\n    <Compile Include=\"Forms\\SpecificFilesForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\SpecificFilesForm.Designer.cs\">\n      <DependentUpon>SpecificFilesForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\MetaDataForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\MetaDataForm.Designer.cs\">\n      <DependentUpon>MetaDataForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\InvalidFile.cs\" />\n    <Compile Include=\"Forms\\MainForm_Meta.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Statistics\\StatdumpReader.cs\" />\n    <Compile Include=\"Statistics\\IStatisticsReader.cs\" />\n    <Compile Include=\"Statistics\\MultiLineStatReader.cs\" />\n    <Compile Include=\"Statistics\\NewStatisticsEventArgs.cs\" />\n    <Compile Include=\"Statistics\\StatFileScanner.cs\" />\n    <Compile Include=\"Statistics\\ZDoomStatsReader.cs\" />\n    <Compile Include=\"Forms\\StatsInfo.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\StatsInfo.Designer.cs\">\n      <DependentUpon>StatsInfo.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\StatsControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\StatsControl.Designer.cs\">\n      <DependentUpon>StatsControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\SyncStatusForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\SyncStatusForm.Designer.cs\">\n      <DependentUpon>SyncStatusForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\SyncFileData.cs\" />\n    <Compile Include=\"Handlers\\SyncFileOption.cs\" />\n    <Compile Include=\"TabViews\\LocalTabViewCtrl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"TabViews\\IdGamesTabViewCtrl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"TabViews\\IdGamesTabViewCtrl.Designer.cs\">\n      <DependentUpon>IdGamesTabViewCtrl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"TabViews\\BasicTabViewCtrl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"TabViews\\BasicTabViewCtrl.Designer.cs\">\n      <DependentUpon>BasicTabViewCtrl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\AboutBox.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\AboutBox.Designer.cs\">\n      <DependentUpon>AboutBox.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Config\\AppConfiguration.cs\" />\n    <Compile Include=\"DataSources\\ConfigurationData.cs\" />\n    <Compile Include=\"DataSources\\IdGamesGameFile.cs\" />\n    <Compile Include=\"DataSources\\FileData.cs\" />\n    <Compile Include=\"DataSources\\SourcePortData.cs\" />\n    <Compile Include=\"Adapters\\GameLauncher.cs\" />\n    <Compile Include=\"Adapters\\IdGamesDataAdapater.cs\" />\n    <Compile Include=\"Controls\\GameFileEdit.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileEdit.Designer.cs\">\n      <DependentUpon>GameFileEdit.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\GenericFileView.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GenericFileView.Designer.cs\">\n      <DependentUpon>GenericFileView.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\DownloadView.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\DownloadView.Designer.cs\">\n      <DependentUpon>DownloadView.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\DownloadViewItem.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\DownloadViewItem.Designer.cs\">\n      <DependentUpon>DownloadViewItem.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\FileSelectForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\FileSelectForm.Designer.cs\">\n      <DependentUpon>FileSelectForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\SettingsForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\SettingsForm.Designer.cs\">\n      <DependentUpon>SettingsForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Interfaces\\IConfigurationData.cs\" />\n    <Compile Include=\"Interfaces\\IConfigurationDataSourceAdapter.cs\" />\n    <Compile Include=\"Handlers\\SaveGameHandler.cs\" />\n    <Compile Include=\"Interfaces\\ITabView.cs\" />\n    <Compile Include=\"TabViews\\OptionsTabViewCtrl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"TabViews\\OptionsTabViewCtrl.Designer.cs\">\n      <DependentUpon>OptionsTabViewCtrl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"TabViews\\IWadTabViewCtrl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"TabViews\\IWadTabViewCtrl.Designer.cs\">\n      <DependentUpon>IWadTabViewCtrl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Search\\GameFileGetOptions.cs\" />\n    <Compile Include=\"Handlers\\DemoHandler.cs\" />\n    <Compile Include=\"Handlers\\DownloadHandler.cs\" />\n    <Compile Include=\"Forms\\GameFileEditForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\GameFileEditForm.Designer.cs\">\n      <DependentUpon>GameFileEditForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileAssociationView.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileAssociationView.Designer.cs\">\n      <DependentUpon>GameFileAssociationView.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Search\\IGameFileGetOptions.cs\" />\n    <Compile Include=\"Interfaces\\IFileAssociationView.cs\" />\n    <Compile Include=\"Interfaces\\IIWadDataSourceAdapter.cs\" />\n    <Compile Include=\"DataSources\\IWadData.cs\" />\n    <Compile Include=\"Interfaces\\IFileData.cs\" />\n    <Compile Include=\"Interfaces\\INewFileDetector.cs\" />\n    <Compile Include=\"Handlers\\NewFileDetector.cs\" />\n    <Compile Include=\"Handlers\\ScreenshotHandler.cs\" />\n    <Compile Include=\"Controls\\ScreenshotView.cs\" />\n    <Compile Include=\"Controls\\ScreenshotView.Designer.cs\">\n      <DependentUpon>ScreenshotView.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\ProgressBarForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\ProgressBarForm.Designer.cs\">\n      <DependentUpon>ProgressBarForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Search\\OrderType.cs\" />\n    <Compile Include=\"Search\\GameFileSearchOp.cs\" />\n    <Compile Include=\"Search\\GameFileSearchField.cs\" />\n    <Compile Include=\"Search\\GameFileFieldType.cs\" />\n    <Compile Include=\"Controls\\GameFileViewControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileViewControl.Designer.cs\">\n      <DependentUpon>GameFileViewControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileSummary.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GameFileSummary.Designer.cs\">\n      <DependentUpon>GameFileSummary.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\GrowLabel.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\GrowLabel.Designer.cs\">\n      <DependentUpon>GrowLabel.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Interfaces\\IDataSourceAdapter.cs\" />\n    <Compile Include=\"Forms\\PlayForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\PlayForm.Designer.cs\">\n      <DependentUpon>PlayForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Interfaces\\IGameFileDownloadable.cs\" />\n    <Compile Include=\"Controls\\TableLayoutPanelDB.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TableLayoutPanelDB.Designer.cs\">\n      <DependentUpon>TableLayoutPanelDB.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\CDataGridView.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Adapters\\DataAccess.cs\" />\n    <Compile Include=\"Adapters\\DbDataSourceAdapter.cs\" />\n    <Compile Include=\"Adapters\\DirectoryDataSourceAdapter.cs\" />\n    <Compile Include=\"DataSources\\GameFile.cs\" />\n    <Compile Include=\"Adapters\\MSSQLDataAdapter.cs\" />\n    <Compile Include=\"Adapters\\SqliteDatabaseAdapter.cs\" />\n    <Compile Include=\"Forms\\MainForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\MainForm.Designer.cs\">\n      <DependentUpon>MainForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Interfaces\\IDatabaseAdapter.cs\" />\n    <Compile Include=\"Interfaces\\IGameFileDataSourceAdapter.cs\" />\n    <Compile Include=\"Interfaces\\IGameFile.cs\" />\n    <Compile Include=\"Interfaces\\IIWadData.cs\" />\n    <Compile Include=\"Interfaces\\ISourcePortData.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Controls\\SearchControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\SearchControl.Designer.cs\">\n      <DependentUpon>SearchControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\SyncLibraryHandler.cs\" />\n    <Compile Include=\"Forms\\SourcePortViewForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\SourcePortViewForm.Designer.cs\">\n      <DependentUpon>SourcePortViewForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\SourcePortEditForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\SourcePortEditForm.Designer.cs\">\n      <DependentUpon>SourcePortEditForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\SourcePortEdit.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\SourcePortEdit.Designer.cs\">\n      <DependentUpon>SourcePortEdit.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\TabHandler.cs\" />\n    <Compile Include=\"TabViews\\TagTabView.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"TabViews\\TagTabView.Designer.cs\">\n      <DependentUpon>TagTabView.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\TagControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TagControl.Designer.cs\">\n      <DependentUpon>TagControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Forms\\TagEditForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\TagEditForm.Designer.cs\">\n      <DependentUpon>TagEditForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Config\\TagMapLookup.cs\" />\n    <Compile Include=\"Handlers\\Sync\\IdGamesTextFileParser.cs\" />\n    <Compile Include=\"Handlers\\ToolTipHandler.cs\" />\n    <Compile Include=\"Forms\\TxtGenerator.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Forms\\TxtGenerator.Designer.cs\">\n      <DependentUpon>TxtGenerator.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Handlers\\Util.cs\" />\n    <Compile Include=\"Handlers\\VersionHandler.cs\" />\n    <Compile Include=\"TextFileParsers\\ZdlParser.cs\" />\n    <Compile Include=\"Handlers\\UtilityHandler.cs\" />\n    <Compile Include=\"TabViews\\UntaggedTabView.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Update\\ApplicationUpdate.cs\" />\n    <Compile Include=\"WindowsVersion\\WindowsVersion.cs\" />\n    <EmbeddedResource Include=\"Controls\\CheckBoxList.resx\">\n      <DependentUpon>CheckBoxList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\FilesCtrl.resx\">\n      <DependentUpon>FilesCtrl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\GameFileTile.resx\">\n      <DependentUpon>GameFileTile.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\GameFileTileViewControl.resx\">\n      <DependentUpon>GameFileTileViewControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\StatisticsView.resx\">\n      <DependentUpon>StatisticsView.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\StatsControl.resx\">\n      <DependentUpon>StatsControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\TagSelectControl.resx\">\n      <DependentUpon>TagSelectControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\TitleBarControl.resx\">\n      <DependentUpon>TitleBarControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\FileManagementSelect.resx\">\n      <DependentUpon>FileManagementSelect.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\FilterForm.resx\">\n      <DependentUpon>FilterForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\CumulativeStats.resx\">\n      <DependentUpon>CumulativeStats.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\DirectoriesForm.resx\">\n      <DependentUpon>DirectoriesForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\FileDetailsEditForm.resx\">\n      <DependentUpon>FileDetailsEditForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\FilterSettingsForm.resx\">\n      <DependentUpon>FilterSettingsForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\MessageCheckBox.resx\">\n      <DependentUpon>MessageCheckBox.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\MetaDataForm.resx\">\n      <DependentUpon>MetaDataForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\PlayRandomForm.resx\">\n      <DependentUpon>PlayRandomForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\SaveInfo.resx\">\n      <DependentUpon>SaveInfo.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\ScreenshotEditForm.resx\">\n      <DependentUpon>ScreenshotEditForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\ScreenshotViewerForm.resx\">\n      <DependentUpon>ScreenshotViewerForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\SplashScreen.resx\">\n      <DependentUpon>SplashScreen.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\RatingControl.resx\">\n      <DependentUpon>RatingControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\SpecificFilesForm.resx\">\n      <DependentUpon>SpecificFilesForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\StatsInfo.resx\">\n      <DependentUpon>StatsInfo.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\SyncStatusForm.resx\">\n      <DependentUpon>SyncStatusForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\SimpleFileSelectForm.resx\">\n      <DependentUpon>SimpleFileSelectForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\TextBoxForm.resx\">\n      <DependentUpon>TextBoxForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\Welcome.resx\">\n      <DependentUpon>Welcome.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\PagingControl.resx\">\n      <DependentUpon>PagingControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\GameFileTileExpanded.resx\">\n      <DependentUpon>GameFileTileExpanded.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\SlideShowPictureBox.resx\">\n      <DependentUpon>SlideShowPictureBox.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"TabViews\\BasicTabViewCtrl.resx\">\n      <DependentUpon>BasicTabViewCtrl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\AboutBox.resx\">\n      <DependentUpon>AboutBox.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\GenericFileView.resx\">\n      <DependentUpon>GenericFileView.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\DownloadView.resx\">\n      <DependentUpon>DownloadView.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\DownloadViewItem.resx\">\n      <DependentUpon>DownloadViewItem.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\FileSelectForm.resx\">\n      <DependentUpon>FileSelectForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\GameFileEditForm.resx\">\n      <DependentUpon>GameFileEditForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\MainForm.resx\">\n      <DependentUpon>MainForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\GameFileViewControl.resx\">\n      <DependentUpon>GameFileViewControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\GameFileSummary.resx\">\n      <DependentUpon>GameFileSummary.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\GameFileEdit.resx\">\n      <DependentUpon>GameFileEdit.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\GameFileAssociationView.resx\">\n      <DependentUpon>GameFileAssociationView.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\ProgressBarForm.resx\">\n      <DependentUpon>ProgressBarForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\SettingsForm.resx\">\n      <DependentUpon>SettingsForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\SourcePortViewForm.resx\">\n      <DependentUpon>SourcePortViewForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n      <DesignTime>True</DesignTime>\n    </Compile>\n    <EmbeddedResource Include=\"Forms\\PlayForm.resx\">\n      <DependentUpon>PlayForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\SearchControl.resx\">\n      <DependentUpon>SearchControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\ScreenshotView.resx\">\n      <DependentUpon>ScreenshotView.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\SourcePortEditForm.resx\">\n      <DependentUpon>SourcePortEditForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\SourcePortEdit.resx\">\n      <DependentUpon>SourcePortEdit.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\TagControl.resx\">\n      <DependentUpon>TagControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\TagEdit.resx\">\n      <DependentUpon>TagEdit.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\TagForm.resx\">\n      <DependentUpon>TagForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\TagEditForm.resx\">\n      <DependentUpon>TagEditForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\TxtGenerator.resx\">\n      <DependentUpon>TxtGenerator.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\UpdateControl.resx\">\n      <DependentUpon>UpdateControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Forms\\TagSelectForm.resx\">\n      <DependentUpon>TagSelectForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <None Include=\"app.manifest\" />\n    <None Include=\"DoomLauncher.sqlite\" />\n    <None Include=\"Help.docx\" />\n    <None Include=\"Help.pdf\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"packages.config\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\">\n      <SubType>Designer</SubType>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\BindingListView\\BindingListView.csproj\">\n      <Project>{75af36a8-7797-4023-b183-5b63d448420a}</Project>\n      <Name>BindingListView</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\CheckBoxComboBox\\CheckBoxComboBox.csproj\">\n      <Project>{70a25201-8ea4-48f8-a4a6-ed13adf8823c}</Project>\n      <Name>CheckBoxComboBox</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\WadReader\\WadReader.csproj\">\n      <Project>{15a9a8fc-096e-4458-ab7f-02386740cf4e}</Project>\n      <Name>WadReader</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\HereticPalette.pal\" />\n    <None Include=\"Resources\\HexenPalette.pal\" />\n    <None Include=\"Resources\\PLAYPAL.LMP\" />\n    <None Include=\"Resources\\th.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <BootstrapperPackage Include=\".NETFramework,Version=v4.5\">\n      <Visible>False</Visible>\n      <ProductName>Microsoft .NET Framework 4.5 %28x86 and x64%29</ProductName>\n      <Install>true</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Client.3.5\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.3.5.SP1\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.5 SP1</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"DoomLauncher.ico\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"DoomLauncher.VisualElementsManifest.xml\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\doom64.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\heretic.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\hexen.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\plutonia.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\strife.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\tnt.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <None Include=\"Resources\\DoomLauncherTile.png\" />\n    <None Include=\"Resources\\map.bmp\" />\n    <None Include=\"Resources\\PMAPA0.png\" />\n    <None Include=\"Resources\\DownArrow.bmp\" />\n    <None Include=\"Resources\\arrow-down-solid.png\" />\n    <None Include=\"Resources\\Delete.png\" />\n    <None Include=\"Resources\\DownArrow.png\" />\n    <None Include=\"Resources\\Edit.png\" />\n    <None Include=\"Resources\\Export.png\" />\n    <None Include=\"Resources\\ExportAll.png\" />\n    <None Include=\"Resources\\Save.png\" />\n    <None Include=\"Resources\\UpArrow.png\" />\n    <None Include=\"Resources\\File.png\" />\n    <None Include=\"Resources\\FolderOpen.png\" />\n    <None Include=\"Resources\\Video.png\" />\n    <None Include=\"Resources\\StepBack.png\" />\n    <None Include=\"Resources\\Search.png\" />\n    <None Include=\"Resources\\Play.png\" />\n    <None Include=\"Resources\\Bars.png\" />\n    <None Include=\"Resources\\Tags.png\" />\n    <None Include=\"Resources\\Pin.png\" />\n    <None Include=\"Resources\\BackgroundImage.png\" />\n    <Content Include=\"TileImages\\chexquest.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\chexquest3.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\doom.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\doom2.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\DoomLauncherTile.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"TileImages\\DoomLauncherTileSmall.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <None Include=\"Resources\\SOULB0.png\" />\n    <None Include=\"Resources\\POSSL0.png\" />\n    <None Include=\"Resources\\bon2a_extra.png\" />\n    <None Include=\"Resources\\bon2d.png\" />\n    <None Include=\"Resources\\bon2a_.png\" />\n    <None Include=\"Resources\\bona.bmp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <COMReference Include=\"IWshRuntimeLibrary\">\n      <Guid>{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}</Guid>\n      <VersionMajor>1</VersionMajor>\n      <VersionMinor>0</VersionMinor>\n      <Lcid>0</Lcid>\n      <WrapperTool>tlbimp</WrapperTool>\n      <Isolated>False</Isolated>\n      <EmbedInteropTypes>True</EmbedInteropTypes>\n    </COMReference>\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>if $(ConfigurationName) == Release $(SolutionDir)DoomLauncherRelease\\bin\\$(ConfigurationName)\\DoomLauncherRelease.exe\n</PostBuildEvent>\n  </PropertyGroup>\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\EntityFramework.6.4.4\\build\\EntityFramework.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\EntityFramework.6.4.4\\build\\EntityFramework.props'))\" />\n    <Error Condition=\"!Exists('..\\packages\\EntityFramework.6.4.4\\build\\EntityFramework.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\EntityFramework.6.4.4\\build\\EntityFramework.targets'))\" />\n    <Error Condition=\"!Exists('..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\\build\\net46\\Stub.System.Data.SQLite.Core.NetFramework.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\\build\\net46\\Stub.System.Data.SQLite.Core.NetFramework.targets'))\" />\n    <Error Condition=\"!Exists('..\\packages\\SevenZipSharp.Interop.19.0.2\\build\\SevenZipSharp.Interop.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\SevenZipSharp.Interop.19.0.2\\build\\SevenZipSharp.Interop.targets'))\" />\n  </Target>\n  <Import Project=\"..\\packages\\EntityFramework.6.4.4\\build\\EntityFramework.targets\" Condition=\"Exists('..\\packages\\EntityFramework.6.4.4\\build\\EntityFramework.targets')\" />\n  <Import Project=\"..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\\build\\net46\\Stub.System.Data.SQLite.Core.NetFramework.targets\" Condition=\"Exists('..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\\build\\net46\\Stub.System.Data.SQLite.Core.NetFramework.targets')\" />\n  <Import Project=\"..\\packages\\SevenZipSharp.Interop.19.0.2\\build\\SevenZipSharp.Interop.targets\" Condition=\"Exists('..\\packages\\SevenZipSharp.Interop.19.0.2\\build\\SevenZipSharp.Interop.targets')\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "DoomLauncher/Dpi/DpiScale.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class DpiScale\n    {\n        public DpiScale(Graphics g)\n        {\n            DpiScaleX = g.DpiX / 96.0f;\n            DpiScaleY = g.DpiY / 96.0f;\n        }\n\n        public DpiScale(float scaleX, float scaleY)\n        {\n            DpiScaleX = scaleX;\n            DpiScaleY = scaleY;\n        }\n\n        public int ScaleIntY(int height) => (int)(height * DpiScaleY);\n        public int ScaleIntX(int width) => (int)(width * DpiScaleY);\n\n        public float ScaleFloatY(float height) => height * DpiScaleY;\n        public float ScaleFloatX(float width) => width * DpiScaleX;\n\n        public readonly float DpiScaleX;\n        public readonly float DpiScaleY;\n\n        public void ScaleControl(Control control)\n        {\n            control.Width = ScaleIntX(control.Width);\n            control.Height = ScaleIntY(control.Height);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/AboutBox.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class AboutBox\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox));\n            this.tblInfo = new System.Windows.Forms.TableLayoutPanel();\n            this.logoPictureBox = new System.Windows.Forms.PictureBox();\n            this.labelProductName = new System.Windows.Forms.Label();\n            this.labelVersion = new System.Windows.Forms.Label();\n            this.okButton = new System.Windows.Forms.Button();\n            this.label1 = new System.Windows.Forms.Label();\n            this.lblAuthor = new System.Windows.Forms.Label();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.lnkRepository = new System.Windows.Forms.LinkLabel();\n            this.lnkThread = new System.Windows.Forms.LinkLabel();\n            this.lnkThread2 = new System.Windows.Forms.LinkLabel();\n            this.lblWindowsVersion = new System.Windows.Forms.Label();\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblInfo.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.tblMain.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblInfo\n            // \n            this.tblInfo.ColumnCount = 2;\n            this.tblInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));\n            this.tblInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));\n            this.tblInfo.Controls.Add(this.logoPictureBox, 0, 0);\n            this.tblInfo.Controls.Add(this.labelProductName, 1, 0);\n            this.tblInfo.Controls.Add(this.labelVersion, 1, 1);\n            this.tblInfo.Controls.Add(this.okButton, 1, 6);\n            this.tblInfo.Controls.Add(this.label1, 1, 4);\n            this.tblInfo.Controls.Add(this.lblAuthor, 1, 3);\n            this.tblInfo.Controls.Add(this.flowLayoutPanel1, 1, 5);\n            this.tblInfo.Controls.Add(this.lblWindowsVersion, 1, 2);\n            this.tblInfo.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblInfo.Location = new System.Drawing.Point(4, 45);\n            this.tblInfo.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblInfo.Name = \"tblInfo\";\n            this.tblInfo.RowCount = 7;\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 60F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblInfo.Size = new System.Drawing.Size(644, 386);\n            this.tblInfo.TabIndex = 0;\n            // \n            // logoPictureBox\n            // \n            this.logoPictureBox.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"logoPictureBox.Image\")));\n            this.logoPictureBox.Location = new System.Drawing.Point(10, 5);\n            this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.logoPictureBox.Name = \"logoPictureBox\";\n            this.tblInfo.SetRowSpan(this.logoPictureBox, 7);\n            this.logoPictureBox.Size = new System.Drawing.Size(192, 197);\n            this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;\n            this.logoPictureBox.TabIndex = 12;\n            this.logoPictureBox.TabStop = false;\n            // \n            // labelProductName\n            // \n            this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.labelProductName.Location = new System.Drawing.Point(221, 0);\n            this.labelProductName.Margin = new System.Windows.Forms.Padding(9, 0, 4, 0);\n            this.labelProductName.MaximumSize = new System.Drawing.Size(0, 26);\n            this.labelProductName.Name = \"labelProductName\";\n            this.labelProductName.Size = new System.Drawing.Size(419, 26);\n            this.labelProductName.TabIndex = 19;\n            this.labelProductName.Text = \"Product Name\";\n            this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // labelVersion\n            // \n            this.labelVersion.BackColor = System.Drawing.Color.Transparent;\n            this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.labelVersion.Location = new System.Drawing.Point(221, 49);\n            this.labelVersion.Margin = new System.Windows.Forms.Padding(9, 0, 4, 0);\n            this.labelVersion.MaximumSize = new System.Drawing.Size(0, 26);\n            this.labelVersion.Name = \"labelVersion\";\n            this.labelVersion.Size = new System.Drawing.Size(419, 26);\n            this.labelVersion.TabIndex = 0;\n            this.labelVersion.Text = \"Version\";\n            this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // okButton\n            // \n            this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.okButton.Location = new System.Drawing.Point(528, 346);\n            this.okButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.okButton.Name = \"okButton\";\n            this.okButton.Size = new System.Drawing.Size(112, 35);\n            this.okButton.TabIndex = 24;\n            this.okButton.Text = \"&OK\";\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.label1.Location = new System.Drawing.Point(221, 196);\n            this.label1.Margin = new System.Windows.Forms.Padding(9, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(419, 49);\n            this.label1.TabIndex = 26;\n            this.label1.Text = \"Please check out these links to post questions, comments, bugs, and feature reque\" +\n    \"sts!\\r\\n\";\n            this.label1.UseMnemonic = false;\n            // \n            // lblAuthor\n            // \n            this.lblAuthor.AutoSize = true;\n            this.lblAuthor.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblAuthor.Location = new System.Drawing.Point(221, 147);\n            this.lblAuthor.Margin = new System.Windows.Forms.Padding(9, 0, 4, 0);\n            this.lblAuthor.MaximumSize = new System.Drawing.Size(0, 26);\n            this.lblAuthor.Name = \"lblAuthor\";\n            this.lblAuthor.Size = new System.Drawing.Size(419, 26);\n            this.lblAuthor.TabIndex = 28;\n            this.lblAuthor.Text = \"Author: Nick St Laurent\";\n            this.lblAuthor.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.lnkRepository);\n            this.flowLayoutPanel1.Controls.Add(this.lnkThread);\n            this.flowLayoutPanel1.Controls.Add(this.lnkThread2);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(216, 245);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(424, 81);\n            this.flowLayoutPanel1.TabIndex = 29;\n            // \n            // lnkRepository\n            // \n            this.lnkRepository.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lnkRepository.Location = new System.Drawing.Point(4, 0);\n            this.lnkRepository.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lnkRepository.Name = \"lnkRepository\";\n            this.lnkRepository.Size = new System.Drawing.Size(187, 38);\n            this.lnkRepository.TabIndex = 28;\n            this.lnkRepository.TabStop = true;\n            this.lnkRepository.Text = \"GitHub Repository\";\n            this.lnkRepository.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.lnkRepository.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkRepository_LinkClicked);\n            // \n            // lnkThread\n            // \n            this.lnkThread.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lnkThread.Location = new System.Drawing.Point(4, 38);\n            this.lnkThread.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lnkThread.Name = \"lnkThread\";\n            this.lnkThread.Size = new System.Drawing.Size(187, 38);\n            this.lnkThread.TabIndex = 27;\n            this.lnkThread.TabStop = true;\n            this.lnkThread.Text = \"Doomworld Thread\";\n            this.lnkThread.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.lnkThread.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkThread_LinkClicked);\n            // \n            // lnkThread2\n            // \n            this.lnkThread2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lnkThread2.Location = new System.Drawing.Point(199, 0);\n            this.lnkThread2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lnkThread2.Name = \"lnkThread2\";\n            this.lnkThread2.Size = new System.Drawing.Size(191, 38);\n            this.lnkThread2.TabIndex = 26;\n            this.lnkThread2.TabStop = true;\n            this.lnkThread2.Text = \"Realm 667 Forum\";\n            this.lnkThread2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.lnkThread2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkThread2_LinkClicked);\n            // \n            // lblWindowsVersion\n            // \n            this.lblWindowsVersion.AutoSize = true;\n            this.lblWindowsVersion.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblWindowsVersion.Location = new System.Drawing.Point(221, 98);\n            this.lblWindowsVersion.Margin = new System.Windows.Forms.Padding(9, 0, 4, 0);\n            this.lblWindowsVersion.MaximumSize = new System.Drawing.Size(0, 26);\n            this.lblWindowsVersion.Name = \"lblWindowsVersion\";\n            this.lblWindowsVersion.Size = new System.Drawing.Size(419, 26);\n            this.lblWindowsVersion.TabIndex = 30;\n            this.lblWindowsVersion.Text = \"Windows Version\";\n            this.lblWindowsVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Controls.Add(this.tblInfo, 0, 1);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(652, 436);\n            this.tblMain.TabIndex = 1;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(652, 40);\n            this.titleBar.TabIndex = 0;\n            this.titleBar.Title = \"Doom Launcher\";\n            // \n            // AboutBox\n            // \n            this.AcceptButton = this.okButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(652, 436);\n            this.Controls.Add(this.tblMain);\n            this.DoubleBuffered = true;\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"AboutBox\";\n            this.ShowInTaskbar = false;\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\n            this.Text = \"AboutBox\";\n            this.tblInfo.ResumeLayout(false);\n            this.tblInfo.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.tblMain.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblInfo;\n        private System.Windows.Forms.PictureBox logoPictureBox;\n        private System.Windows.Forms.Label labelProductName;\n        private System.Windows.Forms.Label labelVersion;\n        private System.Windows.Forms.Button okButton;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label lblAuthor;\n        private System.Windows.Forms.LinkLabel lnkRepository;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.LinkLabel lnkThread;\n        private System.Windows.Forms.LinkLabel lnkThread2;\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private Controls.TitleBarControl titleBar;\n        private System.Windows.Forms.Label lblWindowsVersion;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/AboutBox.cs",
    "content": "﻿using DoomLauncher.WindowsVersion;\nusing System.Diagnostics;\nusing System.Reflection;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    partial class AboutBox : Form\n    {\n        public AboutBox()\n        {\n            InitializeComponent();\n            Text = string.Format(\"About {0}\", AssemblyTitle);\n            labelProductName.Text = AssemblyProduct;\n            labelVersion.Text = string.Format(\"Version {0}\", AssemblyVersion);\n\n            if (WindowsVersionInfo.GetOsVersionInfo(out var versionInfo))\n                lblWindowsVersion.Text =\n                    $\"Windows Version: Major:{versionInfo.Major} Build: {versionInfo.Build}\";\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        #region Assembly Attribute Accessors\n\n        public string AssemblyTitle\n        {\n            get\n            {\n                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);\n                if (attributes.Length > 0)\n                {\n                    AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];\n                    if (titleAttribute.Title != \"\")\n                    {\n                        return titleAttribute.Title;\n                    }\n                }\n                return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);\n            }\n        }\n\n        public string AssemblyVersion\n        {\n            get\n            {\n                return Assembly.GetExecutingAssembly().GetName().Version.ToString();\n            }\n        }\n\n        public string AssemblyDescription\n        {\n            get\n            {\n                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);\n                if (attributes.Length == 0)\n                {\n                    return \"\";\n                }\n                return ((AssemblyDescriptionAttribute)attributes[0]).Description;\n            }\n        }\n\n        public string AssemblyProduct\n        {\n            get\n            {\n                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);\n                if (attributes.Length == 0)\n                {\n                    return \"\";\n                }\n                return ((AssemblyProductAttribute)attributes[0]).Product;\n            }\n        }\n\n        public string AssemblyCopyright\n        {\n            get\n            {\n                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);\n                if (attributes.Length == 0)\n                {\n                    return \"\";\n                }\n                return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;\n            }\n        }\n\n        public string AssemblyCompany\n        {\n            get\n            {\n                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);\n                if (attributes.Length == 0)\n                {\n                    return \"\";\n                }\n                return ((AssemblyCompanyAttribute)attributes[0]).Company;\n            }\n        }\n        #endregion\n\n        private void lnkRepository_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Process.Start(Util.GitHubRepository);\n        }\n\n        private void lnkThread_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Process.Start(Util.DoomworldThread);\n        }\n\n        private void lnkThread2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Process.Start(Util.Realm667Thread);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/AboutBox.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"logoPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        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\n</value>\n  </data>\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/CumulativeStats.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class CumulativeStats\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CumulativeStats));\n            this.btnOK = new System.Windows.Forms.Button();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.lblNote = new System.Windows.Forms.Label();\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.lblDisplay2 = new System.Windows.Forms.Label();\n            this.lblDisplay1 = new System.Windows.Forms.Label();\n            this.lblTimeLaunched = new System.Windows.Forms.Label();\n            this.lblTimePlayed = new System.Windows.Forms.Label();\n            this.ctrlStats = new DoomLauncher.StatsControl();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.tableLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(355, 267);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(100, 28);\n            this.btnOK.TabIndex = 9;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.lblNote, 0, 1);\n            this.tblMain.Controls.Add(this.btnOK, 0, 4);\n            this.tblMain.Controls.Add(this.tableLayoutPanel1, 0, 2);\n            this.tblMain.Controls.Add(this.ctrlStats, 0, 3);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 5;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 60F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 128F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(459, 303);\n            this.tblMain.TabIndex = 2;\n            // \n            // lblNote\n            // \n            this.lblNote.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblNote.AutoSize = true;\n            this.lblNote.Location = new System.Drawing.Point(4, 43);\n            this.lblNote.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblNote.Name = \"lblNote\";\n            this.lblNote.Size = new System.Drawing.Size(39, 16);\n            this.lblNote.TabIndex = 10;\n            this.lblNote.Text = \"Note:\";\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.ColumnCount = 2;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 178F));\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel1.Controls.Add(this.lblDisplay2, 0, 1);\n            this.tableLayoutPanel1.Controls.Add(this.lblDisplay1, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.lblTimeLaunched, 1, 0);\n            this.tableLayoutPanel1.Controls.Add(this.lblTimePlayed, 1, 1);\n            this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(1, 71);\n            this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(1, 0, 1, 0);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(4, 0, 0, 0);\n            this.tableLayoutPanel1.RowCount = 2;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(457, 60);\n            this.tableLayoutPanel1.TabIndex = 12;\n            // \n            // lblDisplay2\n            // \n            this.lblDisplay2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblDisplay2.AutoSize = true;\n            this.lblDisplay2.Location = new System.Drawing.Point(8, 37);\n            this.lblDisplay2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblDisplay2.Name = \"lblDisplay2\";\n            this.lblDisplay2.Size = new System.Drawing.Size(128, 16);\n            this.lblDisplay2.TabIndex = 11;\n            this.lblDisplay2.Text = \"Time Played (Stats):\";\n            // \n            // lblDisplay1\n            // \n            this.lblDisplay1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblDisplay1.AutoSize = true;\n            this.lblDisplay1.Location = new System.Drawing.Point(8, 7);\n            this.lblDisplay1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblDisplay1.Name = \"lblDisplay1\";\n            this.lblDisplay1.Size = new System.Drawing.Size(157, 16);\n            this.lblDisplay1.TabIndex = 7;\n            this.lblDisplay1.Text = \"Time Played (Launched):\";\n            // \n            // lblTimeLaunched\n            // \n            this.lblTimeLaunched.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblTimeLaunched.AutoSize = true;\n            this.lblTimeLaunched.Location = new System.Drawing.Point(185, 7);\n            this.lblTimeLaunched.Name = \"lblTimeLaunched\";\n            this.lblTimeLaunched.Size = new System.Drawing.Size(66, 16);\n            this.lblTimeLaunched.TabIndex = 12;\n            this.lblTimeLaunched.Text = \"Launched\";\n            // \n            // lblTimePlayed\n            // \n            this.lblTimePlayed.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblTimePlayed.AutoSize = true;\n            this.lblTimePlayed.Location = new System.Drawing.Point(185, 37);\n            this.lblTimePlayed.Name = \"lblTimePlayed\";\n            this.lblTimePlayed.Size = new System.Drawing.Size(50, 16);\n            this.lblTimePlayed.TabIndex = 13;\n            this.lblTimePlayed.Text = \"Played\";\n            // \n            // ctrlStats\n            // \n            this.ctrlStats.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlStats.Location = new System.Drawing.Point(4, 135);\n            this.ctrlStats.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.ctrlStats.Name = \"ctrlStats\";\n            this.ctrlStats.Size = new System.Drawing.Size(451, 120);\n            this.ctrlStats.TabIndex = 13;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(459, 32);\n            this.titleBar.TabIndex = 14;\n            this.titleBar.Title = \"Cumulative Stats\";\n            // \n            // CumulativeStats\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(459, 303);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.Name = \"CumulativeStats\";\n            this.Text = \"Cumulative Stats\";\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.Label lblDisplay1;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.Label lblNote;\n        private System.Windows.Forms.Label lblDisplay2;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.Label lblTimeLaunched;\n        private System.Windows.Forms.Label lblTimePlayed;\n        private StatsControl ctrlStats;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/CumulativeStats.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class CumulativeStats : Form\n    {\n        public CumulativeStats()\n        {\n            InitializeComponent();\n            tblMain.CellPaint += TblMain_CellPaint;\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public string Title\n        {\n            get { return Text; }\n            set { Text = value; }\n        }\n\n        public void SetStatistics(IEnumerable<IGameFile> gameFiles, IEnumerable<IStatsData> stats)\n        {\n            lblNote.Text = $\"Note: Search filters apply ({gameFiles.Count()} Files)\";\n\n            int statsMinutes = 0;\n            int launchMinutes = 0;\n            foreach (IStatsData stat in stats)\n                statsMinutes += (int)(stat.LevelTime / 60.0);\n\n            foreach (IGameFile gameFile in gameFiles)\n                launchMinutes += gameFile.MinutesPlayed;\n\n            lblTimeLaunched.Text = Util.GetTimePlayedString(launchMinutes);\n            lblTimePlayed.Text = Util.GetTimePlayedString(statsMinutes);\n            ctrlStats.SetStatistics(gameFiles, stats);\n        }\n\n        private void TblMain_CellPaint(object sender, TableLayoutCellPaintEventArgs e)\n        {\n            Point pt = e.CellBounds.Location;\n            Pen pen = new Pen(ColorTheme.Current.GridBorder);\n            e.Graphics.DrawLine(pen, pt.X, pt.Y, pt.X, pt.Y + e.CellBounds.Height);\n            e.Graphics.DrawLine(pen, pt.X + e.CellBounds.Width - 1, pt.Y, e.CellBounds.Width - 1, pt.Y + e.CellBounds.Height);\n            e.Graphics.DrawLine(pen, pt.X, pt.Y + e.CellBounds.Height - 1, pt.X + e.CellBounds.Width, pt.Y + e.CellBounds.Height - 1);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/CumulativeStats.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/DirectoriesForm.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class DirectoriesForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DirectoriesForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.toolStrip1 = new System.Windows.Forms.ToolStrip();\n            this.btnAdd = new System.Windows.Forms.ToolStripButton();\n            this.btnDelete = new System.Windows.Forms.ToolStripButton();\n            this.flp = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnSave = new System.Windows.Forms.Button();\n            this.lstDirectories = new System.Windows.Forms.ListView();\n            this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.tblMain.SuspendLayout();\n            this.toolStrip1.SuspendLayout();\n            this.flp.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.toolStrip1, 0, 0);\n            this.tblMain.Controls.Add(this.flp, 0, 2);\n            this.tblMain.Controls.Add(this.lstDirectories, 0, 1);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.Size = new System.Drawing.Size(384, 261);\n            this.tblMain.TabIndex = 0;\n            // \n            // toolStrip1\n            // \n            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.btnAdd,\n            this.btnDelete});\n            this.toolStrip1.Location = new System.Drawing.Point(0, 0);\n            this.toolStrip1.Name = \"toolStrip1\";\n            this.toolStrip1.Size = new System.Drawing.Size(384, 25);\n            this.toolStrip1.TabIndex = 4;\n            this.toolStrip1.Text = \"toolStrip1\";\n            // \n            // btnAdd\n            // \n            this.btnAdd.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.btnAdd.Image = ((System.Drawing.Image)(resources.GetObject(\"btnAdd.Image\")));\n            this.btnAdd.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.btnAdd.Name = \"btnAdd\";\n            this.btnAdd.Size = new System.Drawing.Size(23, 22);\n            this.btnAdd.Text = \"Add\";\n            this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);\n            // \n            // btnDelete\n            // \n            this.btnDelete.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.btnDelete.Image = ((System.Drawing.Image)(resources.GetObject(\"btnDelete.Image\")));\n            this.btnDelete.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.btnDelete.Name = \"btnDelete\";\n            this.btnDelete.Size = new System.Drawing.Size(23, 22);\n            this.btnDelete.Text = \"Remove\";\n            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);\n            // \n            // flp\n            // \n            this.flp.Controls.Add(this.btnCancel);\n            this.flp.Controls.Add(this.btnSave);\n            this.flp.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flp.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flp.Location = new System.Drawing.Point(0, 229);\n            this.flp.Margin = new System.Windows.Forms.Padding(0);\n            this.flp.Name = \"flp\";\n            this.flp.Size = new System.Drawing.Size(384, 32);\n            this.flp.TabIndex = 0;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(306, 3);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnSave\n            // \n            this.btnSave.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnSave.Location = new System.Drawing.Point(225, 3);\n            this.btnSave.Name = \"btnSave\";\n            this.btnSave.Size = new System.Drawing.Size(75, 23);\n            this.btnSave.TabIndex = 1;\n            this.btnSave.Text = \"Accept\";\n            this.btnSave.UseVisualStyleBackColor = true;\n            // \n            // lstDirectories\n            // \n            this.lstDirectories.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.columnHeader1});\n            this.lstDirectories.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lstDirectories.FullRowSelect = true;\n            this.lstDirectories.HideSelection = false;\n            this.lstDirectories.Location = new System.Drawing.Point(3, 35);\n            this.lstDirectories.MultiSelect = false;\n            this.lstDirectories.Name = \"lstDirectories\";\n            this.lstDirectories.Size = new System.Drawing.Size(378, 191);\n            this.lstDirectories.TabIndex = 5;\n            this.lstDirectories.UseCompatibleStateImageBehavior = false;\n            this.lstDirectories.View = System.Windows.Forms.View.Details;\n            // \n            // DirectoriesForm\n            // \n            this.AcceptButton = this.btnSave;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(384, 261);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Name = \"DirectoriesForm\";\n            this.Text = \"Directories\";\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.toolStrip1.ResumeLayout(false);\n            this.toolStrip1.PerformLayout();\n            this.flp.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flp;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnSave;\n        private System.Windows.Forms.ToolStrip toolStrip1;\n        private System.Windows.Forms.ToolStripButton btnAdd;\n        private System.Windows.Forms.ToolStripButton btnDelete;\n        private System.Windows.Forms.ListView lstDirectories;\n        private System.Windows.Forms.ColumnHeader columnHeader1;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/DirectoriesForm.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class DirectoriesForm : Form\n    {\n        public DirectoriesForm()\n        {\n            InitializeComponent();\n            lstDirectories.HeaderStyle = ColumnHeaderStyle.None;\n            lstDirectories.Columns[0].Width = lstDirectories.Width;\n            Icons.DpiScale = new DpiScale(CreateGraphics());\n            btnAdd.Image = Icons.File;\n            btnDelete.Image = Icons.Delete;\n\n            Stylizer.Stylize(this, DesignMode);\n        }\n\n        public void SetDirectories(string[] directories)\n        {\n            Array.ForEach(directories, x => lstDirectories.Items.Add(x));\n        }\n\n        public List<string> GetDirectories()\n        {\n            List<string> ret = new List<string>();\n\n            foreach (ListViewItem item in lstDirectories.Items)\n                ret.Add(item.Text);\n\n            return ret;\n        }\n\n        private void btnAdd_Click(object sender, EventArgs e)\n        {\n            FolderBrowserDialog dialog = new FolderBrowserDialog();\n\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                lstDirectories.Items.Add(dialog.SelectedPath);\n            }\n        }\n\n        private void btnDelete_Click(object sender, EventArgs e)\n        {\n            if (lstDirectories.SelectedItems.Count > 0)\n                lstDirectories.Items.Remove(lstDirectories.SelectedItems[0]);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/DirectoriesForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolStrip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"toolStrip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"btnAdd.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGjSURBVDhPjZFLSwJRFMcvQStp1TboA7RqUZuofY9N65b1\n        JYKgD5CbCoWeRA/IAiELQqEXFWQSIlZYWSL2YPKZadrMOP/OnbmjRjT4h8O5nHN//zvnDDOVSo2UFWU4\n        ggUGhBkUZTAmSUOyaFurErF55HEC4QD2KN8aZ71W6N0S1/6XGrFdVYEVih1mnKmWu+uB+/AaLm8Q67t+\n        rO36pwRWk2ynyw6KaQ5xbRpfMk+xadaAxe1jdA+M/TWRbpkihVo1zNBlmh9PzcAR5XInkGgTOL2x7oXv\n        /Fo3WfVc2AVOI6hDgeoI/EV6vboTTOow1+zqvg6bIXAyKPSdVIElytEm/WzU5jirS1EruolpJHBDWqpj\n        ovLQ4oSboOd2ID1Of2BBoICmaSiWZEjpom7Q1T/628DUsvtUIL/1LavIfJQQf/uwNph3HQqkJrWiIV/8\n        xmuygPt4xtrAueETWE2lsoJk9guxlxzCD0lrA96sF19c7rOMhJRHJJZG4OatcYP6xUUTWYTu3nEWfG7c\n        oH5xN48p+MOvOLiMN2bAs1VYGvBmI8EYYz/DeTd1SwVw7gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"btnDelete.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIFSURBVDhPYwABLy8vAzcvzz2enp5O9fX1TGBBYkFoaCiz\n        k5NruqOjy38nZ+dv3t7egSAxqDQKsLe3ZwkKClJyd3fNgwpBBB0dnZNs7R22mVva/tfS0vrj7u5ZhW6I\n        vLw9h6Wto5O3l9d3e3vHOVBhCLC1dZe0t3excHBw2WZlY//fzt7hv7+P50ZXV1dukLyFhQWnu7v7CkVl\n        p9+mpubdQEt4wBrRAdBWNicnlwJlB+ffdnZO/4HeWWZubqNnaWk32dbG5r+egclkJSVjfqhynIDRzs5F\n        09bW6byZufV/fX3974bGRu/VtHTXychYcELVEAb6+sYOevomPy2tgOGib3RPRkZLCCpFGOibmyuoqGhd\n        0tUz/KdvYPLfxNTiv5a2zi2oNH5gaGgor6aufVVNXeuPhqbmGmFhCRNZWZVtBobG/1XUtDOhyrADYOhK\n        yMorn5JTVP2vrWdwSEZGRkhcXJwbhOUU1aYbGBh/UdbWloUqRwXy9vYcMoqqiySkpT9qaRk+0dIy0IJK\n        gRIBBwODEJ+2vsFZCSn5SUARzIQmLSfnLSah8F9VTRvoVI1WBgZxcBpAAkzKyloqysrK9wUEBORBfIgw\n        BLAJC4u2CgmL/5eXV97FxsarBhTDlieYTU0tJ3PycZoC2ajyknLKRqys7BOBTDsg5gULYgcsQMwFYQ48\n        YGAAAEPWdZixdbnSAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/FileDetailsEditForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class FileDetailsEditForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FileDetailsEditForm));\n            this.btnSave = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.tblData = new DoomLauncher.TableLayoutPanelDB();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.txtDescription = new System.Windows.Forms.TextBox();\n            this.cmbSourcePort = new System.Windows.Forms.ComboBox();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblData.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.tblMain.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnSave\n            // \n            this.btnSave.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnSave.Location = new System.Drawing.Point(182, 5);\n            this.btnSave.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnSave.Name = \"btnSave\";\n            this.btnSave.Size = new System.Drawing.Size(112, 35);\n            this.btnSave.TabIndex = 1;\n            this.btnSave.Text = \"Save\";\n            this.btnSave.UseVisualStyleBackColor = true;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(302, 5);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(112, 35);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // tblData\n            // \n            this.tblData.ColumnCount = 2;\n            this.tblData.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 150F));\n            this.tblData.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblData.Controls.Add(this.label1, 0, 0);\n            this.tblData.Controls.Add(this.label2, 0, 1);\n            this.tblData.Controls.Add(this.txtDescription, 1, 1);\n            this.tblData.Controls.Add(this.cmbSourcePort, 1, 0);\n            this.tblData.Controls.Add(this.flowLayoutPanel1, 1, 2);\n            this.tblData.Location = new System.Drawing.Point(4, 45);\n            this.tblData.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblData.Name = \"tblData\";\n            this.tblData.RowCount = 3;\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblData.Size = new System.Drawing.Size(568, 353);\n            this.tblData.TabIndex = 0;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(4, 14);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(93, 20);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Source Port\";\n            // \n            // label2\n            // \n            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(4, 166);\n            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(89, 20);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"Description\";\n            // \n            // txtDescription\n            // \n            this.txtDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtDescription.Location = new System.Drawing.Point(154, 54);\n            this.txtDescription.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtDescription.Multiline = true;\n            this.txtDescription.Name = \"txtDescription\";\n            this.txtDescription.Size = new System.Drawing.Size(410, 245);\n            this.txtDescription.TabIndex = 2;\n            // \n            // cmbSourcePort\n            // \n            this.cmbSourcePort.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.cmbSourcePort.FormattingEnabled = true;\n            this.cmbSourcePort.Location = new System.Drawing.Point(154, 10);\n            this.cmbSourcePort.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbSourcePort.Name = \"cmbSourcePort\";\n            this.cmbSourcePort.Size = new System.Drawing.Size(410, 28);\n            this.cmbSourcePort.TabIndex = 3;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.btnCancel);\n            this.flowLayoutPanel1.Controls.Add(this.btnSave);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(150, 304);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(418, 49);\n            this.flowLayoutPanel1.TabIndex = 4;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.tblData, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(576, 403);\n            this.tblMain.TabIndex = 1;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(576, 37);\n            this.titleBar.TabIndex = 1;\n            this.titleBar.Title = \"Details\";\n            // \n            // FileDetailsEditForm\n            // \n            this.AcceptButton = this.btnSave;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(576, 403);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"FileDetailsEditForm\";\n            this.Text = \"Details\";\n            this.tblData.ResumeLayout(false);\n            this.tblData.PerformLayout();\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.tblMain.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblData;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.TextBox txtDescription;\n        private System.Windows.Forms.ComboBox cmbSourcePort;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnSave;\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/FileDetailsEditForm.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class FileDetailsEditForm : Form\n    {\n        public FileDetailsEditForm()\n        {\n            InitializeComponent();\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public void Initialize(IDataSourceAdapter adapter)\n        {\n            Initialize(adapter, null);\n        }\n\n        public void Initialize(IDataSourceAdapter adapter, IFileData file)\n        {\n            DataSourceAdapter = adapter;\n\n            cmbSourcePort.DisplayMember = \"Name\";\n            cmbSourcePort.ValueMember = \"SourcePortID\";\n            cmbSourcePort.DataSource = adapter.GetSourcePorts();\n\n            if (file != null)\n            {\n                cmbSourcePort.SelectedValue = file.SourcePortID;\n                txtDescription.Text = file.Description;\n            }\n        }\n\n        public void ShowDescription(bool set)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            if (set)\n            {\n                txtDescription.Visible = true;\n                Height = dpiScale.ScaleIntY(300);\n                MaximumSize = new Size(dpiScale.ScaleIntX(400), Height);\n            }\n            else\n            {\n                txtDescription.Visible = false;\n                Height = dpiScale.ScaleIntY(104);\n                MaximumSize = new Size(dpiScale.ScaleIntX(400), Height);\n            }\n        }\n\n        public ISourcePortData SourcePort\n        {\n            get { return cmbSourcePort.SelectedItem as ISourcePortData; }\n            set { cmbSourcePort.SelectedValue = value.SourcePortID; }\n        }\n\n        public string Description\n        {\n            get { return txtDescription.Text; }\n            set { txtDescription.Text = value; }\n        }\n\n        public IDataSourceAdapter DataSourceAdapter { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/FileDetailsEditForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/FileManagementSelect.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class FileManagementSelect\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FileManagementSelect));\n            this.cmbFileManagement = new System.Windows.Forms.ComboBox();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.label1 = new System.Windows.Forms.Label();\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.panel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // cmbFileManagement\n            // \n            this.cmbFileManagement.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbFileManagement.FormattingEnabled = true;\n            this.cmbFileManagement.Location = new System.Drawing.Point(10, 28);\n            this.cmbFileManagement.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.cmbFileManagement.Name = \"cmbFileManagement\";\n            this.cmbFileManagement.Size = new System.Drawing.Size(330, 24);\n            this.cmbFileManagement.TabIndex = 0;\n            // \n            // btnOK\n            // \n            this.btnOK.Location = new System.Drawing.Point(240, 75);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(100, 28);\n            this.btnOK.TabIndex = 1;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.BtnOK_Click);\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(7, 8);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(273, 16);\n            this.label1.TabIndex = 2;\n            this.label1.Text = \"Select the management method for the file(s).\";\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.panel1, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 16F));\n            this.tblMain.Size = new System.Drawing.Size(356, 150);\n            this.tblMain.TabIndex = 3;\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.label1);\n            this.panel1.Controls.Add(this.cmbFileManagement);\n            this.panel1.Controls.Add(this.btnOK);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panel1.Location = new System.Drawing.Point(3, 34);\n            this.panel1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(350, 114);\n            this.panel1.TabIndex = 0;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(356, 32);\n            this.titleBar.TabIndex = 1;\n            this.titleBar.Title = \"File Management\";\n            // \n            // FileManagementSelect\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(356, 150);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.Name = \"FileManagementSelect\";\n            this.Text = \"File Management\";\n            this.tblMain.ResumeLayout(false);\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ComboBox cmbFileManagement;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.Panel panel1;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/FileManagementSelect.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class FileManagementSelect : Form\n    {\n        public FileManagementSelect()\n        {\n            InitializeComponent();\n            cmbFileManagement.DataSource = new string[] { \"Managed\", \"Unmanaged\" };\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public FileManagement GetSelectedFileManagement()\n        {\n            if (cmbFileManagement.SelectedIndex == 0)\n                return FileManagement.Managed;\n\n            return FileManagement.Unmanaged;\n        }\n\n        private void BtnOK_Click(object sender, System.EventArgs e)\n        {\n            Close();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/FileManagementSelect.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/FileSelectForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class FileSelectForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FileSelectForm));\n            this.btnOK = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.flpSearch = new System.Windows.Forms.FlowLayoutPanel();\n            this.ctrlSearch = new DoomLauncher.SearchControl();\n            this.lblText = new System.Windows.Forms.Label();\n            this.tabControl = new DoomLauncher.CTabControl();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.flpSearch.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnOK\n            // \n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(1132, 4);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(100, 28);\n            this.btnOK.TabIndex = 1;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(1240, 4);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(100, 28);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flpButtons, 0, 3);\n            this.tblMain.Controls.Add(this.flpSearch, 0, 1);\n            this.tblMain.Controls.Add(this.tabControl, 0, 2);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 4;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.Size = new System.Drawing.Size(1344, 898);\n            this.tblMain.TabIndex = 0;\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnCancel);\n            this.flpButtons.Controls.Add(this.btnOK);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpButtons.Location = new System.Drawing.Point(0, 859);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(1344, 39);\n            this.flpButtons.TabIndex = 1;\n            // \n            // flpSearch\n            // \n            this.flpSearch.Controls.Add(this.ctrlSearch);\n            this.flpSearch.Controls.Add(this.lblText);\n            this.flpSearch.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpSearch.Location = new System.Drawing.Point(0, 32);\n            this.flpSearch.Margin = new System.Windows.Forms.Padding(0);\n            this.flpSearch.Name = \"flpSearch\";\n            this.flpSearch.Size = new System.Drawing.Size(1344, 39);\n            this.flpSearch.TabIndex = 2;\n            // \n            // ctrlSearch\n            // \n            this.ctrlSearch.Location = new System.Drawing.Point(8, 5);\n            this.ctrlSearch.Margin = new System.Windows.Forms.Padding(8, 5, 4, 4);\n            this.ctrlSearch.Name = \"ctrlSearch\";\n            this.ctrlSearch.SearchText = \"\";\n            this.ctrlSearch.Size = new System.Drawing.Size(260, 28);\n            this.ctrlSearch.TabIndex = 2;\n            // \n            // lblText\n            // \n            this.lblText.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblText.AutoSize = true;\n            this.lblText.Location = new System.Drawing.Point(276, 10);\n            this.lblText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblText.Name = \"lblText\";\n            this.lblText.Size = new System.Drawing.Size(0, 16);\n            this.lblText.TabIndex = 4;\n            // \n            // tabControl\n            // \n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;\n            this.tabControl.ItemSize = new System.Drawing.Size(0, 22);\n            this.tabControl.Location = new System.Drawing.Point(4, 75);\n            this.tabControl.Margin = new System.Windows.Forms.Padding(4);\n            this.tabControl.Multiline = true;\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(1336, 780);\n            this.tabControl.TabIndex = 3;\n            this.tabControl.SelectedIndexChanged += new System.EventHandler(this.TabControl_SelectedIndexChanged);\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(1344, 32);\n            this.titleBar.TabIndex = 4;\n            this.titleBar.Title = \"Select File\";\n            // \n            // FileSelectForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(1344, 898);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.Name = \"FileSelectForm\";\n            this.Text = \"Select File\";\n            this.tblMain.ResumeLayout(false);\n            this.flpButtons.ResumeLayout(false);\n            this.flpSearch.ResumeLayout(false);\n            this.flpSearch.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.FlowLayoutPanel flpSearch;\n        private SearchControl ctrlSearch;\n        private DoomLauncher.CTabControl tabControl;\n        private System.Windows.Forms.Label lblText;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/FileSelectForm.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class FileSelectForm : Form\n    {\n        private TabHandler m_tabHandler;\n        private bool m_bOverrideInit, m_multiSelect;\n        private IGameFileView m_lastView;\n\n        public FileSelectForm()\n        {\n            InitializeComponent();\n            SetupSearchFilters();\n            Icons.DpiScale = new DpiScale(CreateGraphics());\n            m_multiSelect = m_bOverrideInit = false;\n            ctrlSearch.SearchTextChanged += CtrlSearch_SearchTextChanged;\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        private void CtrlSearch_SearchTextChanged(object sender, EventArgs e)\n        {\n            IGameFileView ctrl = CurrentGameFileControl;\n            if (ctrl != null)\n                HandleSearch(ctrl);\n        }\n\n        public void Initialize(IDataSourceAdapter adapter, ITabView tabView, IEnumerable<IGameFile> gameFilesBind)\n        {\n            Initialize(adapter, new ITabView[] { tabView });\n            m_tabHandler.TabViews[0].SetGameFilesData(gameFilesBind);\n            m_bOverrideInit = true;\n        }\n\n        public void Initialize(IDataSourceAdapter adapter, IEnumerable<ITabView> views)\n        {\n            DataSourceAdapter = adapter;\n            m_tabHandler = new TabHandler(tabControl);\n\n            foreach(ITabView view in views)\n            {\n                ITabView viewAdd = (ITabView)view.Clone();\n                viewAdd.GameFileViewControl.MultiSelect = MultiSelect;\n                viewAdd.GameFileViewControl.ItemDoubleClick += GameFileViewControl_RowDoubleClicked;\n                m_tabHandler.AddTab(viewAdd);\n            }\n        }\n\n        private void GameFileViewControl_RowDoubleClicked(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        public bool MultiSelect\n        {\n            get { return m_multiSelect;  }\n            set\n            {\n                m_multiSelect = value;\n                if (m_tabHandler != null)\n                {\n                    foreach(ITabView view in m_tabHandler.TabViews)\n                    {\n                        view.GameFileViewControl.MultiSelect = MultiSelect;\n                    }\n                }\n            }\n        }\n\n        public ITabView[] TabViews\n        {\n            get { return m_tabHandler.TabViews; }\n        }\n\n        public void SetShowCancel(bool set)\n        {\n            btnCancel.Visible = set;\n        }\n\n        public void SetDisplayText(string text)\n        {\n            lblText.Text = text;\n        }\n\n        public void ShowSearchControl(bool set)\n        {\n            ctrlSearch.Visible = set;\n        }\n\n        protected override void OnShown(EventArgs e)\n        {\n            foreach (ITabView view in m_tabHandler.TabViews)\n            {\n                HandleSearch(view.GameFileViewControl);\n            }\n        }\n\n        private void SetupSearchFilters()\n        {\n            Util.SetDefaultSearchFields(ctrlSearch);\n        }\n\n        public IDataSourceAdapter DataSourceAdapter { get; set; }\n\n        public IGameFile[] SelectedFiles => CurrentGameFileControl.SelectedItems;\n\n        private void btnSearch_Click(object sender, EventArgs e)\n        {\n            IGameFileView ctrl = CurrentGameFileControl;\n\n            if (ctrl != null)\n                HandleSearch(ctrl);\n        }\n\n        private void HandleSearch(IGameFileView ctrl)\n        {\n            if (!m_bOverrideInit)\n            {\n                ITabView view = m_tabHandler.TabViewForControl(ctrl);\n\n                if (view != null)\n                {\n                    if (!string.IsNullOrEmpty(ctrlSearch.SearchText))\n                        view.SetGameFiles(Util.SearchFieldsFromSearchCtrl(ctrlSearch));\n                    else\n                        view.SetGameFiles();\n                }\n            }\n        }\n\n        private void TabControl_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            var gameFileControl = CurrentGameFileControl;\n\n            if (m_lastView != null)\n                m_lastView.SetVisible(false);\n\n            if (gameFileControl != null)\n                gameFileControl.SetVisible(true);\n\n            m_lastView = gameFileControl;\n        }\n\n        private IGameFileView CurrentGameFileControl\n        {\n            get\n            {\n                if (tabControl.SelectedTab.Controls[0] is ITabView view)\n                    return view.GameFileViewControl;\n\n                return null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/FileSelectForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/FilterForm.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class FilterForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n                m_pen.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.SuspendLayout();\n            // \n            // CrtFilterForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(800, 450);\n            this.Name = \"CrtFilterForm\";\n            this.Text = \"CrtFilterForm\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/FilterForm.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class FilterForm : Form\n    {\n        private List<RectangleF> m_rects = new List<RectangleF>();\n        private List<Tuple<PointF, PointF>> m_lines = new List<Tuple<PointF, PointF>>();\n\n        private readonly Pen m_pen;\n\n        public FilterForm(Screen screen, ScreenFilter filter)\n        {\n            Init(screen);\n\n            m_pen = new Pen(new SolidBrush(Color.Black), filter.LineThickness);\n            Opacity = filter.Opacity;\n            Rectangle rect = screen.Bounds;\n\n            if (filter.Type == ScreenFilterType.Ellipse)\n                InitEllipse(filter, rect);\n            else\n                InitScanline(filter, rect);\n\n            Stylizer.Stylize(this, DesignMode);\n        }\n\n        private void InitScanline(ScreenFilter filter, Rectangle rect)\n        {\n            if (filter.VerticalScanlines)\n            {\n                for (float x = rect.Left; x < rect.Right; x += filter.ScanlineSpacing)\n                    m_lines.Add(new Tuple<PointF, PointF>(new PointF(x, rect.Top), new PointF(x, rect.Bottom)));\n            }\n\n            if (filter.HorizontalScanlines)\n            {\n                for (float y = rect.Top; y < rect.Height; y += filter.ScanlineSpacing)\n                    m_lines.Add(new Tuple<PointF, PointF>(new PointF(rect.Left, y), new PointF(rect.Right, y)));\n            }\n        }\n\n        private void InitEllipse(ScreenFilter filter, Rectangle rect)\n        {\n            int count = 0;\n            float add = 0.0f;\n\n            for (float x = rect.Left; x < rect.Right; x += filter.BlockSize + filter.SpacingX)\n            {\n                if (filter.Stagger)\n                    add = count % 2 == 0 ? 0 : filter.BlockSize / 2;\n\n                for (float y = rect.Top - filter.BlockSize; y < rect.Height + filter.BlockSize; y += filter.BlockSize + filter.SpacingY)\n                    m_rects.Add(new RectangleF(new PointF(x, y + add), new SizeF(filter.BlockSize, filter.BlockSize)));\n\n                count++;\n            }\n        }\n\n        private void Init(Screen screen)\n        {\n            InitializeComponent();\n            Text = string.Empty;\n            NativeMethods.MoveWindow(Handle, screen.Bounds.Location.X, screen.Bounds.Location.Y, screen.Bounds.Width, screen.Bounds.Height, false);\n            ControlBox = false;\n            FormBorderStyle = FormBorderStyle.None;\n            TransparencyKey = BackColor;\n            WindowState = FormWindowState.Maximized;\n            DoubleBuffered = true;\n            //For some reason the first call randomly doesn't take up the whole screen, so call it again\n            NativeMethods.MoveWindow(Handle, screen.Bounds.Location.X, screen.Bounds.Location.Y, screen.Bounds.Width, screen.Bounds.Height, false);\n\n            Load += CrtFilterForm_Load;\n        }\n\n        protected override void OnShown(EventArgs e)\n        {\n            base.OnShown(e);\n            int wl = NativeMethods.GetWindowLong(this.Handle, NativeMethods.GWL.ExStyle);\n            wl = wl | 0x80000 | 0x20;\n            NativeMethods.SetWindowLong(this.Handle, NativeMethods.GWL.ExStyle, wl);\n        }\n\n        private void CrtFilterForm_Load(object sender, EventArgs e)\n        {\n            Task.Run(() => TopMostFunc());\n        }\n\n        private void TopMostFunc()\n        {\n            try\n            {\n                while (true)\n                {\n                    Invoke(new Action(SetTopMost));\n                    System.Threading.Thread.Sleep(5);\n                }\n            }\n            catch\n            {\n                //exception will happen when the form closes, just use this to stop the thread\n            }\n        }\n\n        private void SetTopMost()\n        {\n            TopMost = true;\n            TopLevel = true;\n        }\n\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            foreach (var item in m_rects)\n                e.Graphics.DrawEllipse(m_pen, item);\n\n            foreach (var item in m_lines)\n                e.Graphics.DrawLine(m_pen, item.Item1, item.Item2);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/FilterForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/FilterSettingsForm.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class FilterSettingsForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            DoomLauncher.Controls.TitleBarControl titleBar;\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FilterSettingsForm));\n            this.chkStagger = new DoomLauncher.CCheckBox();\n            this.numBlockSize = new System.Windows.Forms.NumericUpDown();\n            this.numSpacingX = new System.Windows.Forms.NumericUpDown();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.btnPreview = new System.Windows.Forms.Button();\n            this.label3 = new System.Windows.Forms.Label();\n            this.numSpacingY = new System.Windows.Forms.NumericUpDown();\n            this.grpEllipse = new System.Windows.Forms.GroupBox();\n            this.grpScanline = new System.Windows.Forms.GroupBox();\n            this.numScanlineSize = new System.Windows.Forms.NumericUpDown();\n            this.label4 = new System.Windows.Forms.Label();\n            this.chkHorizontal = new DoomLauncher.CCheckBox();\n            this.chkVertical = new DoomLauncher.CCheckBox();\n            this.cmbMode = new System.Windows.Forms.ComboBox();\n            this.label5 = new System.Windows.Forms.Label();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.label6 = new System.Windows.Forms.Label();\n            this.numOpacity = new System.Windows.Forms.NumericUpDown();\n            this.numThickness = new System.Windows.Forms.NumericUpDown();\n            this.label7 = new System.Windows.Forms.Label();\n            this.tblInfo = new System.Windows.Forms.TableLayoutPanel();\n            this.label8 = new System.Windows.Forms.Label();\n            this.pbInfo = new System.Windows.Forms.PictureBox();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.panel1 = new System.Windows.Forms.Panel();\n            titleBar = new DoomLauncher.Controls.TitleBarControl();\n            ((System.ComponentModel.ISupportInitialize)(this.numBlockSize)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.numSpacingX)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.numSpacingY)).BeginInit();\n            this.grpEllipse.SuspendLayout();\n            this.grpScanline.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.numScanlineSize)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.numOpacity)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.numThickness)).BeginInit();\n            this.tblInfo.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).BeginInit();\n            this.tblMain.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.panel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // titleBar\n            // \n            titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            titleBar.CanClose = true;\n            titleBar.ControlBox = true;\n            titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            titleBar.ForeColor = System.Drawing.Color.White;\n            titleBar.Location = new System.Drawing.Point(0, 0);\n            titleBar.Margin = new System.Windows.Forms.Padding(0);\n            titleBar.Name = \"titleBar\";\n            titleBar.Size = new System.Drawing.Size(378, 32);\n            titleBar.TabIndex = 2;\n            titleBar.Title = \"Filter Settings\";\n            // \n            // chkStagger\n            // \n            this.chkStagger.AutoSize = true;\n            this.chkStagger.Location = new System.Drawing.Point(20, 21);\n            this.chkStagger.Margin = new System.Windows.Forms.Padding(4);\n            this.chkStagger.Name = \"chkStagger\";\n            this.chkStagger.Size = new System.Drawing.Size(77, 20);\n            this.chkStagger.TabIndex = 0;\n            this.chkStagger.Text = \"Stagger\";\n            // \n            // numBlockSize\n            // \n            this.numBlockSize.Location = new System.Drawing.Point(119, 50);\n            this.numBlockSize.Margin = new System.Windows.Forms.Padding(4);\n            this.numBlockSize.Name = \"numBlockSize\";\n            this.numBlockSize.Size = new System.Drawing.Size(139, 22);\n            this.numBlockSize.TabIndex = 1;\n            this.numBlockSize.Value = new decimal(new int[] {\n            4,\n            0,\n            0,\n            0});\n            // \n            // numSpacingX\n            // \n            this.numSpacingX.DecimalPlaces = 1;\n            this.numSpacingX.Increment = new decimal(new int[] {\n            1,\n            0,\n            0,\n            65536});\n            this.numSpacingX.Location = new System.Drawing.Point(119, 82);\n            this.numSpacingX.Margin = new System.Windows.Forms.Padding(4);\n            this.numSpacingX.Minimum = new decimal(new int[] {\n            100,\n            0,\n            0,\n            -2147483648});\n            this.numSpacingX.Name = \"numSpacingX\";\n            this.numSpacingX.Size = new System.Drawing.Size(139, 22);\n            this.numSpacingX.TabIndex = 2;\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(16, 52);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(70, 16);\n            this.label1.TabIndex = 4;\n            this.label1.Text = \"Block Size\";\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(20, 82);\n            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(68, 16);\n            this.label2.TabIndex = 5;\n            this.label2.Text = \"X Spacing\";\n            // \n            // btnPreview\n            // \n            this.btnPreview.Location = new System.Drawing.Point(52, 170);\n            this.btnPreview.Margin = new System.Windows.Forms.Padding(4);\n            this.btnPreview.Name = \"btnPreview\";\n            this.btnPreview.Size = new System.Drawing.Size(216, 28);\n            this.btnPreview.TabIndex = 7;\n            this.btnPreview.Text = \"Preview For 3 Seconds\";\n            this.btnPreview.UseVisualStyleBackColor = true;\n            this.btnPreview.Click += new System.EventHandler(this.btnPreview_Click);\n            // \n            // label3\n            // \n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(20, 114);\n            this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(69, 16);\n            this.label3.TabIndex = 9;\n            this.label3.Text = \"Y Spacing\";\n            // \n            // numSpacingY\n            // \n            this.numSpacingY.DecimalPlaces = 1;\n            this.numSpacingY.Increment = new decimal(new int[] {\n            1,\n            0,\n            0,\n            65536});\n            this.numSpacingY.Location = new System.Drawing.Point(119, 114);\n            this.numSpacingY.Margin = new System.Windows.Forms.Padding(4);\n            this.numSpacingY.Minimum = new decimal(new int[] {\n            100,\n            0,\n            0,\n            -2147483648});\n            this.numSpacingY.Name = \"numSpacingY\";\n            this.numSpacingY.Size = new System.Drawing.Size(139, 22);\n            this.numSpacingY.TabIndex = 8;\n            // \n            // grpEllipse\n            // \n            this.grpEllipse.Controls.Add(this.label3);\n            this.grpEllipse.Controls.Add(this.chkStagger);\n            this.grpEllipse.Controls.Add(this.numSpacingY);\n            this.grpEllipse.Controls.Add(this.numBlockSize);\n            this.grpEllipse.Controls.Add(this.numSpacingX);\n            this.grpEllipse.Controls.Add(this.label2);\n            this.grpEllipse.Controls.Add(this.label1);\n            this.grpEllipse.Location = new System.Drawing.Point(5, 207);\n            this.grpEllipse.Margin = new System.Windows.Forms.Padding(4);\n            this.grpEllipse.Name = \"grpEllipse\";\n            this.grpEllipse.Padding = new System.Windows.Forms.Padding(4);\n            this.grpEllipse.Size = new System.Drawing.Size(361, 150);\n            this.grpEllipse.TabIndex = 10;\n            this.grpEllipse.TabStop = false;\n            this.grpEllipse.Text = \"Ellipse\";\n            // \n            // grpScanline\n            // \n            this.grpScanline.Controls.Add(this.numScanlineSize);\n            this.grpScanline.Controls.Add(this.label4);\n            this.grpScanline.Controls.Add(this.chkHorizontal);\n            this.grpScanline.Controls.Add(this.chkVertical);\n            this.grpScanline.Location = new System.Drawing.Point(5, 365);\n            this.grpScanline.Margin = new System.Windows.Forms.Padding(4);\n            this.grpScanline.Name = \"grpScanline\";\n            this.grpScanline.Padding = new System.Windows.Forms.Padding(4);\n            this.grpScanline.Size = new System.Drawing.Size(361, 106);\n            this.grpScanline.TabIndex = 11;\n            this.grpScanline.TabStop = false;\n            this.grpScanline.Text = \"Scanline\";\n            // \n            // numScanlineSize\n            // \n            this.numScanlineSize.Location = new System.Drawing.Point(119, 23);\n            this.numScanlineSize.Margin = new System.Windows.Forms.Padding(4);\n            this.numScanlineSize.Name = \"numScanlineSize\";\n            this.numScanlineSize.Size = new System.Drawing.Size(139, 22);\n            this.numScanlineSize.TabIndex = 13;\n            this.numScanlineSize.Value = new decimal(new int[] {\n            4,\n            0,\n            0,\n            0});\n            // \n            // label4\n            // \n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(20, 26);\n            this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(33, 16);\n            this.label4.TabIndex = 14;\n            this.label4.Text = \"Size\";\n            // \n            // chkHorizontal\n            // \n            this.chkHorizontal.AutoSize = true;\n            this.chkHorizontal.Checked = true;\n            this.chkHorizontal.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkHorizontal.Location = new System.Drawing.Point(24, 76);\n            this.chkHorizontal.Margin = new System.Windows.Forms.Padding(4);\n            this.chkHorizontal.Name = \"chkHorizontal\";\n            this.chkHorizontal.Size = new System.Drawing.Size(89, 20);\n            this.chkHorizontal.TabIndex = 12;\n            this.chkHorizontal.Text = \"Horizontal\";\n            // \n            // chkVertical\n            // \n            this.chkVertical.AutoSize = true;\n            this.chkVertical.Checked = true;\n            this.chkVertical.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkVertical.Location = new System.Drawing.Point(23, 48);\n            this.chkVertical.Margin = new System.Windows.Forms.Padding(4);\n            this.chkVertical.Name = \"chkVertical\";\n            this.chkVertical.Size = new System.Drawing.Size(74, 20);\n            this.chkVertical.TabIndex = 1;\n            this.chkVertical.Text = \"Vertical\";\n            // \n            // cmbMode\n            // \n            this.cmbMode.FormattingEnabled = true;\n            this.cmbMode.Items.AddRange(new object[] {\n            \"Ellipse\",\n            \"Scanline\"});\n            this.cmbMode.Location = new System.Drawing.Point(125, 73);\n            this.cmbMode.Margin = new System.Windows.Forms.Padding(4);\n            this.cmbMode.Name = \"cmbMode\";\n            this.cmbMode.Size = new System.Drawing.Size(137, 24);\n            this.cmbMode.TabIndex = 12;\n            this.cmbMode.SelectedIndexChanged += new System.EventHandler(this.cmbMode_SelectedIndexChanged);\n            // \n            // label5\n            // \n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(14, 76);\n            this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(42, 16);\n            this.label5.TabIndex = 13;\n            this.label5.Text = \"Mode\";\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(268, 4);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(100, 28);\n            this.btnCancel.TabIndex = 14;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnOK\n            // \n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(160, 4);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(100, 28);\n            this.btnOK.TabIndex = 15;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            // \n            // label6\n            // \n            this.label6.AutoSize = true;\n            this.label6.Location = new System.Drawing.Point(15, 106);\n            this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(53, 16);\n            this.label6.TabIndex = 16;\n            this.label6.Text = \"Opacity\";\n            // \n            // numOpacity\n            // \n            this.numOpacity.DecimalPlaces = 2;\n            this.numOpacity.Increment = new decimal(new int[] {\n            5,\n            0,\n            0,\n            131072});\n            this.numOpacity.Location = new System.Drawing.Point(125, 106);\n            this.numOpacity.Margin = new System.Windows.Forms.Padding(4);\n            this.numOpacity.Maximum = new decimal(new int[] {\n            10,\n            0,\n            0,\n            65536});\n            this.numOpacity.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            131072});\n            this.numOpacity.Name = \"numOpacity\";\n            this.numOpacity.Size = new System.Drawing.Size(139, 22);\n            this.numOpacity.TabIndex = 17;\n            this.numOpacity.Value = new decimal(new int[] {\n            3,\n            0,\n            0,\n            65536});\n            // \n            // numThickness\n            // \n            this.numThickness.Location = new System.Drawing.Point(125, 138);\n            this.numThickness.Margin = new System.Windows.Forms.Padding(4);\n            this.numThickness.Minimum = new decimal(new int[] {\n            10,\n            0,\n            0,\n            65536});\n            this.numThickness.Name = \"numThickness\";\n            this.numThickness.Size = new System.Drawing.Size(139, 22);\n            this.numThickness.TabIndex = 19;\n            this.numThickness.Value = new decimal(new int[] {\n            10,\n            0,\n            0,\n            65536});\n            // \n            // label7\n            // \n            this.label7.AutoSize = true;\n            this.label7.Location = new System.Drawing.Point(15, 138);\n            this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label7.Name = \"label7\";\n            this.label7.Size = new System.Drawing.Size(69, 16);\n            this.label7.TabIndex = 18;\n            this.label7.Text = \"Thickness\";\n            // \n            // tblInfo\n            // \n            this.tblInfo.ColumnCount = 2;\n            this.tblInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 43F));\n            this.tblInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInfo.Controls.Add(this.label8, 1, 0);\n            this.tblInfo.Controls.Add(this.pbInfo, 0, 0);\n            this.tblInfo.Location = new System.Drawing.Point(0, 0);\n            this.tblInfo.Margin = new System.Windows.Forms.Padding(0);\n            this.tblInfo.Name = \"tblInfo\";\n            this.tblInfo.RowCount = 1;\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInfo.Size = new System.Drawing.Size(365, 60);\n            this.tblInfo.TabIndex = 20;\n            // \n            // label8\n            // \n            this.label8.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label8.AutoSize = true;\n            this.label8.Location = new System.Drawing.Point(47, 6);\n            this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label8.Name = \"label8\";\n            this.label8.Size = new System.Drawing.Size(303, 48);\n            this.label8.TabIndex = 3;\n            this.label8.Text = \"Works best with ports that use a software renderer and do not change your resolut\" +\n    \"ion like Chocolate/Crispy Doom or Odamex.\";\n            // \n            // pbInfo\n            // \n            this.pbInfo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\n            this.pbInfo.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbInfo.Location = new System.Drawing.Point(4, 4);\n            this.pbInfo.Margin = new System.Windows.Forms.Padding(4);\n            this.pbInfo.Name = \"pbInfo\";\n            this.pbInfo.Size = new System.Drawing.Size(35, 52);\n            this.pbInfo.TabIndex = 0;\n            this.pbInfo.TabStop = false;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flowLayoutPanel1, 0, 2);\n            this.tblMain.Controls.Add(this.panel1, 0, 1);\n            this.tblMain.Controls.Add(titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.Size = new System.Drawing.Size(378, 562);\n            this.tblMain.TabIndex = 21;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.btnCancel);\n            this.flowLayoutPanel1.Controls.Add(this.btnOK);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(3, 524);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(372, 36);\n            this.flowLayoutPanel1.TabIndex = 0;\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.tblInfo);\n            this.panel1.Controls.Add(this.grpEllipse);\n            this.panel1.Controls.Add(this.btnPreview);\n            this.panel1.Controls.Add(this.grpScanline);\n            this.panel1.Controls.Add(this.numThickness);\n            this.panel1.Controls.Add(this.cmbMode);\n            this.panel1.Controls.Add(this.label7);\n            this.panel1.Controls.Add(this.label5);\n            this.panel1.Controls.Add(this.numOpacity);\n            this.panel1.Controls.Add(this.label6);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panel1.Location = new System.Drawing.Point(3, 34);\n            this.panel1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(372, 486);\n            this.panel1.TabIndex = 1;\n            // \n            // FilterSettingsForm\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(378, 562);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.Name = \"FilterSettingsForm\";\n            this.Text = \"Filter Settings\";\n            ((System.ComponentModel.ISupportInitialize)(this.numBlockSize)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.numSpacingX)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.numSpacingY)).EndInit();\n            this.grpEllipse.ResumeLayout(false);\n            this.grpEllipse.PerformLayout();\n            this.grpScanline.ResumeLayout(false);\n            this.grpScanline.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.numScanlineSize)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.numOpacity)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.numThickness)).EndInit();\n            this.tblInfo.ResumeLayout(false);\n            this.tblInfo.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).EndInit();\n            this.tblMain.ResumeLayout(false);\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n        private System.Windows.Forms.NumericUpDown numBlockSize;\n        private System.Windows.Forms.NumericUpDown numSpacingX;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Button btnPreview;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.NumericUpDown numSpacingY;\n        private System.Windows.Forms.GroupBox grpEllipse;\n        private System.Windows.Forms.GroupBox grpScanline;\n        private System.Windows.Forms.NumericUpDown numScanlineSize;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.ComboBox cmbMode;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.NumericUpDown numOpacity;\n        private System.Windows.Forms.NumericUpDown numThickness;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.TableLayoutPanel tblInfo;\n        private System.Windows.Forms.PictureBox pbInfo;\n        private System.Windows.Forms.Label label8;\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Panel panel1;\n        private CCheckBox chkStagger;\n        private CCheckBox chkVertical;\n        private CCheckBox chkHorizontal;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/FilterSettingsForm.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class FilterSettingsForm : Form\n    {\n        private FilterForm m_filterForm;\n\n        public FilterSettingsForm(ScreenFilter settings)\n        {\n            InitializeComponent();\n\n            pbInfo.Image = DoomLauncher.Properties.Resources.bon2b;\n\n            cmbMode.DropDownStyle = ComboBoxStyle.DropDownList;\n            numOpacity.Value = Convert.ToDecimal(settings.Opacity);\n            numThickness.Value = Convert.ToDecimal(settings.LineThickness);\n            cmbMode.SelectedIndex = (int)settings.Type;\n            numBlockSize.Value = settings.BlockSize;\n            numSpacingX.Value = Convert.ToDecimal(settings.SpacingX);\n            numSpacingY.Value = Convert.ToDecimal(settings.SpacingY);\n            chkStagger.Checked = settings.Stagger;\n            numScanlineSize.Value = Convert.ToDecimal(settings.ScanlineSpacing);\n            chkVertical.Checked = settings.VerticalScanlines;\n            chkHorizontal.Checked = settings.HorizontalScanlines;\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public ScreenFilter GetFilterSettings()\n        {\n            return new ScreenFilter()\n            {\n                Type = (ScreenFilterType)cmbMode.SelectedIndex,\n                Opacity = Convert.ToSingle(numOpacity.Value),\n                LineThickness = Convert.ToInt32(numThickness.Value),\n                BlockSize = Convert.ToInt32(numBlockSize.Value),\n                SpacingX = Convert.ToSingle(numSpacingX.Value),\n                SpacingY = Convert.ToSingle(numSpacingY.Value),\n                Stagger = chkStagger.Checked,\n                ScanlineSpacing = Convert.ToInt32(numScanlineSize.Value),\n                VerticalScanlines = chkVertical.Checked,\n                HorizontalScanlines = chkHorizontal.Checked\n            };\n        }\n\n        private void btnPreview_Click(object sender, EventArgs e)\n        {\n            if (m_filterForm == null)\n            {\n                m_filterForm = new FilterForm(Screen.FromControl(this), GetFilterSettings());\n                m_filterForm.Show(this);\n                Task.Delay(3000).ContinueWith(t => CloseFilterFormTask());\n            }\n        }\n\n        private void CloseFilterFormTask()\n        {\n            Invoke(new Action(CloseFilterForm));\n        }\n\n        private void CloseFilterForm()\n        {\n            m_filterForm.Close();\n            m_filterForm = null;\n        }\n\n        private void cmbMode_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            grpEllipse.Enabled = cmbMode.SelectedIndex != 1;\n            grpScanline.Enabled = cmbMode.SelectedIndex == 1;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/FilterSettingsForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"titleBar.GenerateMember\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>False</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/GameFileEditForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class GameFileEditForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GameFileEditForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.gameFileEdit1 = new DoomLauncher.GameFileEdit();\n            this.tblButtons = new System.Windows.Forms.TableLayoutPanel();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnSaveSelect = new System.Windows.Forms.Button();\n            this.btnCopyFrom = new System.Windows.Forms.Button();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.tblButtons.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.gameFileEdit1, 0, 1);\n            this.tblMain.Controls.Add(this.tblButtons, 0, 3);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 4;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.Size = new System.Drawing.Size(645, 960);\n            this.tblMain.TabIndex = 1;\n            // \n            // gameFileEdit1\n            // \n            this.gameFileEdit1.AuthorChecked = true;\n            this.gameFileEdit1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.gameFileEdit1.CommentsChecked = true;\n            this.gameFileEdit1.DescriptionChecked = true;\n            this.gameFileEdit1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gameFileEdit1.ForeColor = System.Drawing.Color.White;\n            this.gameFileEdit1.Location = new System.Drawing.Point(6, 48);\n            this.gameFileEdit1.MapsChecked = true;\n            this.gameFileEdit1.Margin = new System.Windows.Forms.Padding(6, 8, 6, 8);\n            this.gameFileEdit1.Name = \"gameFileEdit1\";\n            this.gameFileEdit1.RatingChecked = true;\n            this.gameFileEdit1.ReleaseDateChecked = true;\n            this.gameFileEdit1.Size = new System.Drawing.Size(633, 806);\n            this.gameFileEdit1.TabIndex = 0;\n            this.gameFileEdit1.TagsChecked = true;\n            this.gameFileEdit1.TitleChecked = true;\n            // \n            // tblButtons\n            // \n            this.tblButtons.ColumnCount = 2;\n            this.tblButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblButtons.Controls.Add(this.flowLayoutPanel1, 1, 0);\n            this.tblButtons.Controls.Add(this.btnCopyFrom, 0, 0);\n            this.tblButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblButtons.Location = new System.Drawing.Point(0, 911);\n            this.tblButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.tblButtons.Name = \"tblButtons\";\n            this.tblButtons.RowCount = 1;\n            this.tblButtons.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblButtons.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblButtons.Size = new System.Drawing.Size(645, 49);\n            this.tblButtons.TabIndex = 2;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.btnCancel);\n            this.flowLayoutPanel1.Controls.Add(this.btnSaveSelect);\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(322, 0);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(322, 49);\n            this.flowLayoutPanel1.TabIndex = 1;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(206, 5);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(112, 35);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnSaveSelect\n            // \n            this.btnSaveSelect.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnSaveSelect.Location = new System.Drawing.Point(86, 5);\n            this.btnSaveSelect.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnSaveSelect.Name = \"btnSaveSelect\";\n            this.btnSaveSelect.Size = new System.Drawing.Size(112, 35);\n            this.btnSaveSelect.TabIndex = 3;\n            this.btnSaveSelect.Text = \"Save\";\n            this.btnSaveSelect.UseVisualStyleBackColor = true;\n            // \n            // btnCopyFrom\n            // \n            this.btnCopyFrom.Location = new System.Drawing.Point(4, 5);\n            this.btnCopyFrom.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnCopyFrom.Name = \"btnCopyFrom\";\n            this.btnCopyFrom.Size = new System.Drawing.Size(166, 35);\n            this.btnCopyFrom.TabIndex = 3;\n            this.btnCopyFrom.Text = \"Copy From File...\";\n            this.btnCopyFrom.UseVisualStyleBackColor = true;\n            this.btnCopyFrom.Click += new System.EventHandler(this.btnCopyFrom_Click);\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(645, 40);\n            this.titleBar.TabIndex = 3;\n            this.titleBar.Title = \"Edit\";\n            // \n            // GameFileEditForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(645, 960);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"GameFileEditForm\";\n            this.Text = \"Edit\";\n            this.tblMain.ResumeLayout(false);\n            this.tblButtons.ResumeLayout(false);\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private GameFileEdit gameFileEdit1;\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.TableLayoutPanel tblButtons;\n        private System.Windows.Forms.Button btnCopyFrom;\n        private System.Windows.Forms.Button btnSaveSelect;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/GameFileEditForm.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class GameFileEditForm : Form\n    {\n        private IDataSourceAdapter m_adapter;\n        private ITabView m_view;\n\n        public GameFileEditForm()\n        {\n            InitializeComponent();\n            btnCopyFrom.Visible = false;\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public void SetCopyFromFileAllowed(IDataSourceAdapter adapter, ITabView view)\n        {\n            m_adapter = adapter;\n            m_view = view;\n            btnCopyFrom.Visible = true;\n\n            Stylizer.Stylize(this, DesignMode);\n        }\n\n        public void SetSelectDataMode()\n        {\n            EditControl.SetShowCheckBoxes(true);\n            EditControl.SetShowTagCheckBox(true);\n            btnSaveSelect.Text = \"Select\";\n        }\n\n        public bool TagsChanged\n        {\n            get;\n            private set;\n        }\n\n        public GameFileEdit EditControl\n        {\n            get { return gameFileEdit1;  }\n        }\n\n        private void btnCopyFrom_Click(object sender, EventArgs e)\n        {\n            // Select the file you want to copy data from\n            using (FileSelectForm fileSelect = CreateFileSelectForm())\n            {\n                if (fileSelect.ShowDialog(this) == DialogResult.OK)\n                {\n                    // Show another GameFileEdit with checkboxes to select what fields\n                    using (GameFileEditForm dataSelect = CreateDataSelectForm(fileSelect))\n                    {\n                        if (dataSelect.ShowDialog(this) == DialogResult.OK)\n                        {\n                            // Clone GameFile otherwise we are modifying the datasource the gridview is using\n                            GameFile updateFile = ((GameFile)EditControl.DataSource).Clone() as GameFile; \n                            List<GameFileFieldType> fields = dataSelect.EditControl.UpdateDataSource(EditControl.DataSource);\n\n                            foreach (var field in fields)\n                            {\n                                var property = typeof(IGameFile).GetProperty(field.ToString(\"g\"));\n                                var fieldData = property.GetValue(dataSelect.EditControl.DataSource);\n                                property.SetValue(updateFile, fieldData);                      \n                            }\n\n                            TagsChanged = dataSelect.EditControl.TagsChecked;\n\n                            if (TagsChanged)\n                                EditControl.SetDataSource(updateFile, dataSelect.EditControl.TagData);\n                            else\n                                EditControl.SetDataSource(updateFile, EditControl.TagData);\n                        }\n                    }\n                }\n            }\n        }\n\n        private FileSelectForm CreateFileSelectForm()\n        {\n            FileSelectForm fileSelect = new FileSelectForm();\n            fileSelect.Initialize(m_adapter, new ITabView[] { m_view });\n            fileSelect.StartPosition = FormStartPosition.CenterParent;\n            fileSelect.MultiSelect = false;\n            return fileSelect;\n        }\n\n        private GameFileEditForm CreateDataSelectForm(FileSelectForm fileSelect)\n        {\n            GameFileEditForm dataSelect = new GameFileEditForm\n            {\n                Text = \"Select Fields to Copy\",\n                StartPosition = FormStartPosition.CenterParent\n            };\n\n            IGameFile selectedFile = m_adapter.GetGameFile(fileSelect.SelectedFiles[0].FileName);\n            IEnumerable<ITagMapping> tagMapping = m_adapter.GetTagMappings(selectedFile.GameFileID.Value);\n            var tags = from tag in m_adapter.GetTags() join map in tagMapping on tag.TagID equals map.TagID select tag;\n            dataSelect.EditControl.SetDataSource(selectedFile, tags);\n            dataSelect.SetSelectDataMode();\n            return dataSelect;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/GameFileEditForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/MainForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class MainForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));\n            this.mnuLocal = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.viewTextFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.openZipFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.playToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\n            this.resyncToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.resyncIgnoreTitlepicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.updateMetadataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();\n            this.sortByToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.tagToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.newTagToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();\n            this.utilityToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.manageUtilitiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator();\n            this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();\n            this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.renameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();\n            this.generateTextFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();\n            this.cumulativeStatisticsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();\n            this.createShortcutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.createAutoPlayShortcutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.tblTop = new DoomLauncher.TableLayoutPanelDB();\n            this.flpSearch = new DoomLauncher.FlowLayoutPanelDB();\n            this.toolStrip1 = new System.Windows.Forms.ToolStrip();\n            this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton();\n            this.addFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.addDirectoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.addIWADsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.addFIlesRecursivelyToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.loadWadsFromSteamMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator();\n            this.sourcePortsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.utilitiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.addDoom64ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.createZipToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\n            this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.manageTagsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\n            this.playNowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.playRandomToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();\n            this.showToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.generateTextFileToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.cumulativeStatisticsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.globalCumulativeStatisticsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator();\n            this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.manualUpdateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.btnMainMenu = new DoomLauncher.FormButton();\n            this.ctrlSearch = new DoomLauncher.SearchControl();\n            this.chkIncludeAll = new DoomLauncher.CCheckBox();\n            this.btnPlay = new System.Windows.Forms.Button();\n            this.btnDownloads = new DoomLauncher.FormButton();\n            this.btnUpdate = new DoomLauncher.GlowButton();\n            this.tblDataView = new DoomLauncher.TableLayoutPanelDB();\n            this.splitLeftRight = new System.Windows.Forms.SplitContainer();\n            this.splitTagSelect = new System.Windows.Forms.SplitContainer();\n            this.splitTopBottom = new System.Windows.Forms.SplitContainer();\n            this.tabControl = new DoomLauncher.CTabControl();\n            this.ctrlAssociationView = new DoomLauncher.GameFileAssociationView();\n            this.ctrlSummary = new DoomLauncher.GameFileSummary();\n            this.flpTags = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnTags = new DoomLauncher.FormButton();\n            this.lblSelectedTag = new System.Windows.Forms.Label();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);\n            this.mnuIdGames = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.downloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.viewWebPageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolTip2 = new System.Windows.Forms.ToolTip(this.components);\n            this.mnuLocal.SuspendLayout();\n            this.tblMain.SuspendLayout();\n            this.tblTop.SuspendLayout();\n            this.flpSearch.SuspendLayout();\n            this.toolStrip1.SuspendLayout();\n            this.tblDataView.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitLeftRight)).BeginInit();\n            this.splitLeftRight.Panel1.SuspendLayout();\n            this.splitLeftRight.Panel2.SuspendLayout();\n            this.splitLeftRight.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitTagSelect)).BeginInit();\n            this.splitTagSelect.Panel2.SuspendLayout();\n            this.splitTagSelect.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitTopBottom)).BeginInit();\n            this.splitTopBottom.Panel1.SuspendLayout();\n            this.splitTopBottom.Panel2.SuspendLayout();\n            this.splitTopBottom.SuspendLayout();\n            this.flpTags.SuspendLayout();\n            this.mnuIdGames.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // mnuLocal\n            // \n            this.mnuLocal.ImageScalingSize = new System.Drawing.Size(20, 20);\n            this.mnuLocal.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.viewTextFileToolStripMenuItem,\n            this.openZipFileToolStripMenuItem,\n            this.playToolStripMenuItem,\n            this.editToolStripMenuItem,\n            this.toolStripSeparator1,\n            this.resyncToolStripMenuItem,\n            this.resyncIgnoreTitlepicToolStripMenuItem,\n            this.updateMetadataToolStripMenuItem,\n            this.toolStripSeparator8,\n            this.sortByToolStripMenuItem,\n            this.tagToolStripMenuItem,\n            this.utilityToolStripMenuItem,\n            this.toolStripSeparator5,\n            this.deleteToolStripMenuItem,\n            this.renameToolStripMenuItem,\n            this.toolStripSeparator9,\n            this.generateTextFileToolStripMenuItem,\n            this.toolStripSeparator11,\n            this.cumulativeStatisticsToolStripMenuItem1,\n            this.toolStripSeparator12,\n            this.createShortcutToolStripMenuItem,\n            this.createAutoPlayShortcutToolStripMenuItem});\n            this.mnuLocal.Name = \"mnuGrid\";\n            this.mnuLocal.Size = new System.Drawing.Size(211, 436);\n            this.mnuLocal.Opening += new System.ComponentModel.CancelEventHandler(this.MnuLocal_Opening);\n            // \n            // viewTextFileToolStripMenuItem\n            // \n            this.viewTextFileToolStripMenuItem.Name = \"viewTextFileToolStripMenuItem\";\n            this.viewTextFileToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.viewTextFileToolStripMenuItem.Text = \"View Text File...\";\n            this.viewTextFileToolStripMenuItem.Click += new System.EventHandler(this.viewTextFileToolStripMenuItem_Click);\n            // \n            // openZipFileToolStripMenuItem\n            // \n            this.openZipFileToolStripMenuItem.Name = \"openZipFileToolStripMenuItem\";\n            this.openZipFileToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.openZipFileToolStripMenuItem.Text = \"Open Archive...\";\n            this.openZipFileToolStripMenuItem.Click += new System.EventHandler(this.openZipFileToolStripMenuItem_Click);\n            // \n            // playToolStripMenuItem\n            // \n            this.playToolStripMenuItem.Name = \"playToolStripMenuItem\";\n            this.playToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.playToolStripMenuItem.Text = \"Play...\";\n            this.playToolStripMenuItem.Click += new System.EventHandler(this.playToolStripMenuItem_Click);\n            // \n            // editToolStripMenuItem\n            // \n            this.editToolStripMenuItem.Name = \"editToolStripMenuItem\";\n            this.editToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.editToolStripMenuItem.Text = \"Edit...\";\n            this.editToolStripMenuItem.Click += new System.EventHandler(this.editToolStripMenuItem_Click);\n            // \n            // toolStripSeparator1\n            // \n            this.toolStripSeparator1.Name = \"toolStripSeparator1\";\n            this.toolStripSeparator1.Size = new System.Drawing.Size(207, 6);\n            // \n            // resyncToolStripMenuItem\n            // \n            this.resyncToolStripMenuItem.Name = \"resyncToolStripMenuItem\";\n            this.resyncToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.resyncToolStripMenuItem.Text = \"Resync\";\n            this.resyncToolStripMenuItem.Click += new System.EventHandler(this.resyncToolStripMenuItem_Click);\n            // \n            // resyncIgnoreTitlepicToolStripMenuItem\n            // \n            this.resyncIgnoreTitlepicToolStripMenuItem.Name = \"resyncIgnoreTitlepicToolStripMenuItem\";\n            this.resyncIgnoreTitlepicToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.resyncIgnoreTitlepicToolStripMenuItem.Text = \"Resync (Ignore Titlepic)\";\n            this.resyncIgnoreTitlepicToolStripMenuItem.Click += new System.EventHandler(this.resyncIgnoreTitlepicToolStripMenuItem_Click);\n            // \n            // updateMetadataToolStripMenuItem\n            // \n            this.updateMetadataToolStripMenuItem.Name = \"updateMetadataToolStripMenuItem\";\n            this.updateMetadataToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.updateMetadataToolStripMenuItem.Text = \"Update metadata...\";\n            this.updateMetadataToolStripMenuItem.Click += new System.EventHandler(this.updateMetadataToolStripMenuItem_Click);\n            // \n            // toolStripSeparator8\n            // \n            this.toolStripSeparator8.Name = \"toolStripSeparator8\";\n            this.toolStripSeparator8.Size = new System.Drawing.Size(207, 6);\n            // \n            // sortByToolStripMenuItem\n            // \n            this.sortByToolStripMenuItem.Name = \"sortByToolStripMenuItem\";\n            this.sortByToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.sortByToolStripMenuItem.Text = \"Sort By\";\n            // \n            // tagToolStripMenuItem\n            // \n            this.tagToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.newTagToolStripMenuItem,\n            this.toolStripSeparator6});\n            this.tagToolStripMenuItem.Name = \"tagToolStripMenuItem\";\n            this.tagToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.tagToolStripMenuItem.Text = \"Tag\";\n            // \n            // newTagToolStripMenuItem\n            // \n            this.newTagToolStripMenuItem.Name = \"newTagToolStripMenuItem\";\n            this.newTagToolStripMenuItem.Size = new System.Drawing.Size(152, 22);\n            this.newTagToolStripMenuItem.Text = \"Manage Tags...\";\n            this.newTagToolStripMenuItem.Click += new System.EventHandler(this.newTagToolStripMenuItem_Click);\n            // \n            // toolStripSeparator6\n            // \n            this.toolStripSeparator6.Name = \"toolStripSeparator6\";\n            this.toolStripSeparator6.Size = new System.Drawing.Size(149, 6);\n            // \n            // utilityToolStripMenuItem\n            // \n            this.utilityToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.manageUtilitiesToolStripMenuItem,\n            this.toolStripSeparator13});\n            this.utilityToolStripMenuItem.Name = \"utilityToolStripMenuItem\";\n            this.utilityToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.utilityToolStripMenuItem.Text = \"Utility\";\n            // \n            // manageUtilitiesToolStripMenuItem\n            // \n            this.manageUtilitiesToolStripMenuItem.Name = \"manageUtilitiesToolStripMenuItem\";\n            this.manageUtilitiesToolStripMenuItem.Size = new System.Drawing.Size(168, 22);\n            this.manageUtilitiesToolStripMenuItem.Text = \"Manage Utilities...\";\n            this.manageUtilitiesToolStripMenuItem.Click += new System.EventHandler(this.manageUtilitiesToolStripMenuItem_Click);\n            // \n            // toolStripSeparator13\n            // \n            this.toolStripSeparator13.Name = \"toolStripSeparator13\";\n            this.toolStripSeparator13.Size = new System.Drawing.Size(165, 6);\n            // \n            // toolStripSeparator5\n            // \n            this.toolStripSeparator5.Name = \"toolStripSeparator5\";\n            this.toolStripSeparator5.Size = new System.Drawing.Size(207, 6);\n            // \n            // deleteToolStripMenuItem\n            // \n            this.deleteToolStripMenuItem.Name = \"deleteToolStripMenuItem\";\n            this.deleteToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.deleteToolStripMenuItem.Text = \"Delete\";\n            this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click);\n            // \n            // renameToolStripMenuItem\n            // \n            this.renameToolStripMenuItem.Name = \"renameToolStripMenuItem\";\n            this.renameToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.renameToolStripMenuItem.Text = \"Rename...\";\n            this.renameToolStripMenuItem.Click += new System.EventHandler(this.renameToolStripMenuItem_Click);\n            // \n            // toolStripSeparator9\n            // \n            this.toolStripSeparator9.Name = \"toolStripSeparator9\";\n            this.toolStripSeparator9.Size = new System.Drawing.Size(207, 6);\n            // \n            // generateTextFileToolStripMenuItem\n            // \n            this.generateTextFileToolStripMenuItem.Name = \"generateTextFileToolStripMenuItem\";\n            this.generateTextFileToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.generateTextFileToolStripMenuItem.Text = \"Generate Text File...\";\n            this.generateTextFileToolStripMenuItem.Click += new System.EventHandler(this.generateTextFileToolStripMenuItem_Click);\n            // \n            // toolStripSeparator11\n            // \n            this.toolStripSeparator11.Name = \"toolStripSeparator11\";\n            this.toolStripSeparator11.Size = new System.Drawing.Size(207, 6);\n            // \n            // cumulativeStatisticsToolStripMenuItem1\n            // \n            this.cumulativeStatisticsToolStripMenuItem1.Name = \"cumulativeStatisticsToolStripMenuItem1\";\n            this.cumulativeStatisticsToolStripMenuItem1.Size = new System.Drawing.Size(210, 22);\n            this.cumulativeStatisticsToolStripMenuItem1.Text = \"Cumulative Statistics...\";\n            this.cumulativeStatisticsToolStripMenuItem1.Click += new System.EventHandler(this.cumulativeStatisticsToolStripMenuItem1_Click);\n            // \n            // toolStripSeparator12\n            // \n            this.toolStripSeparator12.Name = \"toolStripSeparator12\";\n            this.toolStripSeparator12.Size = new System.Drawing.Size(207, 6);\n            // \n            // createShortcutToolStripMenuItem\n            // \n            this.createShortcutToolStripMenuItem.Name = \"createShortcutToolStripMenuItem\";\n            this.createShortcutToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.createShortcutToolStripMenuItem.Text = \"Create Shortcut\";\n            this.createShortcutToolStripMenuItem.Click += new System.EventHandler(this.createShortcutToolStripMenuItem_Click);\n            // \n            // createAutoPlayShortcutToolStripMenuItem\n            // \n            this.createAutoPlayShortcutToolStripMenuItem.Name = \"createAutoPlayShortcutToolStripMenuItem\";\n            this.createAutoPlayShortcutToolStripMenuItem.Size = new System.Drawing.Size(210, 22);\n            this.createAutoPlayShortcutToolStripMenuItem.Text = \"Create Auto Play Shortcut\";\n            this.createAutoPlayShortcutToolStripMenuItem.Click += new System.EventHandler(this.createAutoPlayShortcutToolStripMenuItem_Click);\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.tblTop, 0, 2);\n            this.tblMain.Controls.Add(this.tblDataView, 0, 4);\n            this.tblMain.Controls.Add(this.flpTags, 0, 3);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 5;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 3F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(1008, 613);\n            this.tblMain.TabIndex = 1;\n            // \n            // tblTop\n            // \n            this.tblTop.ColumnCount = 4;\n            this.tblTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 98.03922F));\n            this.tblTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 1.960784F));\n            this.tblTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 140F));\n            this.tblTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 179F));\n            this.tblTop.Controls.Add(this.flpSearch, 0, 0);\n            this.tblTop.Controls.Add(this.btnDownloads, 3, 0);\n            this.tblTop.Controls.Add(this.btnUpdate, 2, 0);\n            this.tblTop.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblTop.Location = new System.Drawing.Point(0, 29);\n            this.tblTop.Margin = new System.Windows.Forms.Padding(0);\n            this.tblTop.Name = \"tblTop\";\n            this.tblTop.RowCount = 1;\n            this.tblTop.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblTop.Size = new System.Drawing.Size(1008, 32);\n            this.tblTop.TabIndex = 1;\n            // \n            // flpSearch\n            // \n            this.flpSearch.AutoSize = true;\n            this.flpSearch.CaptureArrowKeys = false;\n            this.flpSearch.Controls.Add(this.toolStrip1);\n            this.flpSearch.Controls.Add(this.btnMainMenu);\n            this.flpSearch.Controls.Add(this.ctrlSearch);\n            this.flpSearch.Controls.Add(this.chkIncludeAll);\n            this.flpSearch.Controls.Add(this.btnPlay);\n            this.flpSearch.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpSearch.Location = new System.Drawing.Point(0, 0);\n            this.flpSearch.Margin = new System.Windows.Forms.Padding(0);\n            this.flpSearch.Name = \"flpSearch\";\n            this.flpSearch.Size = new System.Drawing.Size(675, 32);\n            this.flpSearch.TabIndex = 0;\n            // \n            // toolStrip1\n            // \n            this.toolStrip1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.toolStrip1.Dock = System.Windows.Forms.DockStyle.None;\n            this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.toolStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);\n            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.toolStripDropDownButton1});\n            this.toolStrip1.Location = new System.Drawing.Point(4, 1);\n            this.toolStrip1.Margin = new System.Windows.Forms.Padding(4, 0, 0, 0);\n            this.toolStrip1.Name = \"toolStrip1\";\n            this.toolStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 2, 0);\n            this.toolStrip1.Size = new System.Drawing.Size(39, 27);\n            this.toolStrip1.TabIndex = 5;\n            this.toolStrip1.Text = \"Options\";\n            // \n            // toolStripDropDownButton1\n            // \n            this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.addFilesToolStripMenuItem,\n            this.addDirectoryToolStripMenuItem,\n            this.addIWADsToolStripMenuItem,\n            this.addFIlesRecursivelyToolStripMenuItem1,\n            this.loadWadsFromSteamMenuItem,\n            this.toolStripSeparator15,\n            this.sourcePortsToolStripMenuItem,\n            this.utilitiesToolStripMenuItem,\n            this.addDoom64ToolStripMenuItem,\n            this.createZipToolStripMenuItem,\n            this.toolStripSeparator2,\n            this.settingsToolStripMenuItem,\n            this.manageTagsToolStripMenuItem,\n            this.toolStripSeparator3,\n            this.playNowToolStripMenuItem,\n            this.playRandomToolStripMenuItem1,\n            this.toolStripSeparator4,\n            this.showToolStripMenuItem,\n            this.generateTextFileToolStripMenuItem1,\n            this.cumulativeStatisticsToolStripMenuItem,\n            this.globalCumulativeStatisticsToolStripMenuItem,\n            this.toolStripSeparator14,\n            this.aboutToolStripMenuItem,\n            this.helpToolStripMenuItem,\n            this.manualUpdateToolStripMenuItem});\n            this.toolStripDropDownButton1.Image = ((System.Drawing.Image)(resources.GetObject(\"toolStripDropDownButton1.Image\")));\n            this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.toolStripDropDownButton1.Margin = new System.Windows.Forms.Padding(2, 1, 0, 2);\n            this.toolStripDropDownButton1.Name = \"toolStripDropDownButton1\";\n            this.toolStripDropDownButton1.Size = new System.Drawing.Size(33, 24);\n            this.toolStripDropDownButton1.Text = \"Options\";\n            this.toolStripDropDownButton1.DropDownClosed += new System.EventHandler(this.ToolStripDropDownButton1_DropDownClosed);\n            this.toolStripDropDownButton1.DropDownOpened += new System.EventHandler(this.ToolStripDropDownButton1_DropDownOpened);\n            // \n            // addFilesToolStripMenuItem\n            // \n            this.addFilesToolStripMenuItem.Name = \"addFilesToolStripMenuItem\";\n            this.addFilesToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.addFilesToolStripMenuItem.Text = \"Add Files...\";\n            this.addFilesToolStripMenuItem.Click += new System.EventHandler(this.addFilesToolStripMenuItem_Click);\n            // \n            // addDirectoryToolStripMenuItem\n            // \n            this.addDirectoryToolStripMenuItem.Name = \"addDirectoryToolStripMenuItem\";\n            this.addDirectoryToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.addDirectoryToolStripMenuItem.Text = \"Add Directory...\";\n            this.addDirectoryToolStripMenuItem.Click += new System.EventHandler(this.addDirectoryToolStripMenuItem_Click);\n            // \n            // addIWADsToolStripMenuItem\n            // \n            this.addIWADsToolStripMenuItem.Name = \"addIWADsToolStripMenuItem\";\n            this.addIWADsToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.addIWADsToolStripMenuItem.Text = \"Add IWADs...\";\n            this.addIWADsToolStripMenuItem.Click += new System.EventHandler(this.addIWADsToolStripMenuItem_Click);\n            // \n            // addFIlesRecursivelyToolStripMenuItem1\n            // \n            this.addFIlesRecursivelyToolStripMenuItem1.Name = \"addFIlesRecursivelyToolStripMenuItem1\";\n            this.addFIlesRecursivelyToolStripMenuItem1.Size = new System.Drawing.Size(230, 22);\n            this.addFIlesRecursivelyToolStripMenuItem1.Text = \"Add Files Recursively...\";\n            this.addFIlesRecursivelyToolStripMenuItem1.Click += new System.EventHandler(this.addFIlesRecursivelyToolStripMenuItem1_Click);\n            // \n            // autoLoadFromSteamMenuItem\n            // \n            this.loadWadsFromSteamMenuItem.Name = \"loadWadsFromSteamMenuItem\";\n            this.loadWadsFromSteamMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.loadWadsFromSteamMenuItem.Text = \"Load WADs from Steam or GOG\";\n            this.loadWadsFromSteamMenuItem.Click += new System.EventHandler(this.loadWadsFromSteamMenuItem_Click);\n            // \n            // toolStripSeparator15\n            // \n            this.toolStripSeparator15.Name = \"toolStripSeparator15\";\n            this.toolStripSeparator15.Size = new System.Drawing.Size(227, 6);\n            // \n            // sourcePortsToolStripMenuItem\n            // \n            this.sourcePortsToolStripMenuItem.Name = \"sourcePortsToolStripMenuItem\";\n            this.sourcePortsToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.sourcePortsToolStripMenuItem.Text = \"Source Ports...\";\n            this.sourcePortsToolStripMenuItem.Click += new System.EventHandler(this.sourcePortsToolStripMenuItem_Click);\n            // \n            // utilitiesToolStripMenuItem\n            // \n            this.utilitiesToolStripMenuItem.Name = \"utilitiesToolStripMenuItem\";\n            this.utilitiesToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.utilitiesToolStripMenuItem.Text = \"Utilities...\";\n            this.utilitiesToolStripMenuItem.Click += new System.EventHandler(this.utilitiesToolStripMenuItem_Click);\n            // \n            // addDoom64ToolStripMenuItem\n            // \n            this.addDoom64ToolStripMenuItem.Name = \"addDoom64ToolStripMenuItem\";\n            this.addDoom64ToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.addDoom64ToolStripMenuItem.Text = \"Doom64...\";\n            this.addDoom64ToolStripMenuItem.Click += new System.EventHandler(this.addDoom64ToolStripMenuItem_Click);\n            // \n            // createZipToolStripMenuItem\n            // \n            this.createZipToolStripMenuItem.Name = \"createZipToolStripMenuItem\";\n            this.createZipToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.createZipToolStripMenuItem.Text = \"Create Zip From Directory...\";\n            this.createZipToolStripMenuItem.Click += new System.EventHandler(this.createZipToolStripMenuItem_Click);\n            // \n            // toolStripSeparator2\n            // \n            this.toolStripSeparator2.Name = \"toolStripSeparator2\";\n            this.toolStripSeparator2.Size = new System.Drawing.Size(227, 6);\n            // \n            // settingsToolStripMenuItem\n            // \n            this.settingsToolStripMenuItem.Name = \"settingsToolStripMenuItem\";\n            this.settingsToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.settingsToolStripMenuItem.Text = \"Settings...\";\n            this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click);\n            // \n            // manageTagsToolStripMenuItem\n            // \n            this.manageTagsToolStripMenuItem.Name = \"manageTagsToolStripMenuItem\";\n            this.manageTagsToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.manageTagsToolStripMenuItem.Text = \"Manage Tags...\";\n            this.manageTagsToolStripMenuItem.Click += new System.EventHandler(this.manageTagsToolStripMenuItem_Click);\n            // \n            // toolStripSeparator3\n            // \n            this.toolStripSeparator3.Name = \"toolStripSeparator3\";\n            this.toolStripSeparator3.Size = new System.Drawing.Size(227, 6);\n            // \n            // playNowToolStripMenuItem\n            // \n            this.playNowToolStripMenuItem.Name = \"playNowToolStripMenuItem\";\n            this.playNowToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.playNowToolStripMenuItem.Text = \"Play\";\n            this.playNowToolStripMenuItem.Click += new System.EventHandler(this.playNowToolStripMenuItem_Click);\n            // \n            // playRandomToolStripMenuItem1\n            // \n            this.playRandomToolStripMenuItem1.Name = \"playRandomToolStripMenuItem1\";\n            this.playRandomToolStripMenuItem1.Size = new System.Drawing.Size(230, 22);\n            this.playRandomToolStripMenuItem1.Text = \"Play Random\";\n            this.playRandomToolStripMenuItem1.Click += new System.EventHandler(this.playRandomToolStripMenuItem1_Click);\n            // \n            // toolStripSeparator4\n            // \n            this.toolStripSeparator4.Name = \"toolStripSeparator4\";\n            this.toolStripSeparator4.Size = new System.Drawing.Size(227, 6);\n            // \n            // showToolStripMenuItem\n            // \n            this.showToolStripMenuItem.Name = \"showToolStripMenuItem\";\n            this.showToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.showToolStripMenuItem.Text = \"Sync Status...\";\n            this.showToolStripMenuItem.Click += new System.EventHandler(this.showToolStripMenuItem_Click);\n            // \n            // generateTextFileToolStripMenuItem1\n            // \n            this.generateTextFileToolStripMenuItem1.Name = \"generateTextFileToolStripMenuItem1\";\n            this.generateTextFileToolStripMenuItem1.Size = new System.Drawing.Size(230, 22);\n            this.generateTextFileToolStripMenuItem1.Text = \"Generate Text File...\";\n            this.generateTextFileToolStripMenuItem1.Click += new System.EventHandler(this.generateTextFileToolStripMenuItem1_Click);\n            // \n            // cumulativeStatisticsToolStripMenuItem\n            // \n            this.cumulativeStatisticsToolStripMenuItem.Name = \"cumulativeStatisticsToolStripMenuItem\";\n            this.cumulativeStatisticsToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.cumulativeStatisticsToolStripMenuItem.Text = \"Cumulative Statistics...\";\n            this.cumulativeStatisticsToolStripMenuItem.Click += new System.EventHandler(this.cumulativeStatisticsToolStripMenuItem_Click);\n            // \n            // globalCumulativeStatisticsToolStripMenuItem\n            // \n            this.globalCumulativeStatisticsToolStripMenuItem.Name = \"globalCumulativeStatisticsToolStripMenuItem\";\n            this.globalCumulativeStatisticsToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.globalCumulativeStatisticsToolStripMenuItem.Text = \"Global Cumulative Statistics...\";\n            this.globalCumulativeStatisticsToolStripMenuItem.Click += new System.EventHandler(this.globalCumulativeStatisticsToolStripMenuItem_Click);\n            // \n            // toolStripSeparator14\n            // \n            this.toolStripSeparator14.Name = \"toolStripSeparator14\";\n            this.toolStripSeparator14.Size = new System.Drawing.Size(227, 6);\n            // \n            // aboutToolStripMenuItem\n            // \n            this.aboutToolStripMenuItem.Name = \"aboutToolStripMenuItem\";\n            this.aboutToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.aboutToolStripMenuItem.Text = \"About...\";\n            this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);\n            // \n            // helpToolStripMenuItem\n            // \n            this.helpToolStripMenuItem.Name = \"helpToolStripMenuItem\";\n            this.helpToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.helpToolStripMenuItem.Text = \"Help...\";\n            this.helpToolStripMenuItem.Click += new System.EventHandler(this.helpToolStripMenuItem_Click);\n            // \n            // manualUpdateToolStripMenuItem\n            // \n            this.manualUpdateToolStripMenuItem.Name = \"manualUpdateToolStripMenuItem\";\n            this.manualUpdateToolStripMenuItem.Size = new System.Drawing.Size(230, 22);\n            this.manualUpdateToolStripMenuItem.Text = \"Manual Update...\";\n            this.manualUpdateToolStripMenuItem.Click += new System.EventHandler(this.manualUpdateToolStripMenuItem_Click);\n            // \n            // btnMainMenu\n            // \n            this.btnMainMenu.Image = global::DoomLauncher.Properties.Resources.Bars;\n            this.btnMainMenu.ImageAlign = System.Drawing.ContentAlignment.TopCenter;\n            this.btnMainMenu.Location = new System.Drawing.Point(45, 2);\n            this.btnMainMenu.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);\n            this.btnMainMenu.Name = \"btnMainMenu\";\n            this.btnMainMenu.Size = new System.Drawing.Size(27, 21);\n            this.btnMainMenu.TabIndex = 9;\n            this.btnMainMenu.UseVisualStyleBackColor = true;\n            this.btnMainMenu.Click += new System.EventHandler(this.btnMainMenu_Click);\n            // \n            // ctrlSearch\n            // \n            this.ctrlSearch.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.ctrlSearch.Location = new System.Drawing.Point(77, 4);\n            this.ctrlSearch.Margin = new System.Windows.Forms.Padding(3, 2, 3, 3);\n            this.ctrlSearch.Name = \"ctrlSearch\";\n            this.ctrlSearch.SearchText = \"\";\n            this.ctrlSearch.Size = new System.Drawing.Size(195, 20);\n            this.ctrlSearch.TabIndex = 0;\n            // \n            // chkIncludeAll\n            // \n            this.chkIncludeAll.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.chkIncludeAll.AutoSize = true;\n            this.chkIncludeAll.Location = new System.Drawing.Point(277, 6);\n            this.chkIncludeAll.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\n            this.chkIncludeAll.Name = \"chkIncludeAll\";\n            this.chkIncludeAll.Size = new System.Drawing.Size(75, 17);\n            this.chkIncludeAll.TabIndex = 8;\n            this.chkIncludeAll.Text = \"Include All\";\n            this.toolTip1.SetToolTip(this.chkIncludeAll, \"Shows results from exclude tags\");\n            this.chkIncludeAll.CheckedChanged += new System.EventHandler(this.chkIncludeAll_CheckedChanged);\n            // \n            // btnPlay\n            // \n            this.btnPlay.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;\n            this.btnPlay.Enabled = false;\n            this.btnPlay.FlatAppearance.BorderColor = System.Drawing.Color.Silver;\n            this.btnPlay.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.btnPlay.Image = global::DoomLauncher.Properties.Resources.Play;\n            this.btnPlay.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;\n            this.btnPlay.Location = new System.Drawing.Point(360, 2);\n            this.btnPlay.Margin = new System.Windows.Forms.Padding(6, 2, 3, 3);\n            this.btnPlay.Name = \"btnPlay\";\n            this.btnPlay.Size = new System.Drawing.Size(75, 24);\n            this.btnPlay.TabIndex = 6;\n            this.btnPlay.Text = \"Play\";\n            this.btnPlay.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\n            this.btnPlay.UseVisualStyleBackColor = true;\n            this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);\n            // \n            // btnDownloads\n            // \n            this.btnDownloads.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnDownloads.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;\n            this.btnDownloads.FlatAppearance.BorderSize = 0;\n            this.btnDownloads.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\n            this.btnDownloads.Image = global::DoomLauncher.Properties.Resources.th;\n            this.btnDownloads.Location = new System.Drawing.Point(910, 2);\n            this.btnDownloads.Margin = new System.Windows.Forms.Padding(0, 2, 2, 0);\n            this.btnDownloads.Name = \"btnDownloads\";\n            this.btnDownloads.Size = new System.Drawing.Size(96, 22);\n            this.btnDownloads.TabIndex = 1;\n            this.btnDownloads.Text = \"Downloads\";\n            this.btnDownloads.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage;\n            this.btnDownloads.UseVisualStyleBackColor = true;\n            this.btnDownloads.Click += new System.EventHandler(this.btnDownloads_Click);\n            // \n            // btnUpdate\n            // \n            this.btnUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnUpdate.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;\n            this.btnUpdate.FlatAppearance.BorderSize = 0;\n            this.btnUpdate.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\n            this.btnUpdate.Image = global::DoomLauncher.Properties.Resources.bon2b;\n            this.btnUpdate.Location = new System.Drawing.Point(706, 2);\n            this.btnUpdate.Margin = new System.Windows.Forms.Padding(0, 2, 2, 0);\n            this.btnUpdate.Name = \"btnUpdate\";\n            this.btnUpdate.Size = new System.Drawing.Size(120, 22);\n            this.btnUpdate.TabIndex = 2;\n            this.btnUpdate.Text = \"Update Available\";\n            this.btnUpdate.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage;\n            this.btnUpdate.UseVisualStyleBackColor = true;\n            this.btnUpdate.Visible = false;\n            this.btnUpdate.Click += new System.EventHandler(this.btnUpdate_Click);\n            // \n            // tblDataView\n            // \n            this.tblDataView.ColumnCount = 1;\n            this.tblDataView.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblDataView.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblDataView.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblDataView.Controls.Add(this.splitLeftRight, 0, 0);\n            this.tblDataView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblDataView.Location = new System.Drawing.Point(3, 87);\n            this.tblDataView.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);\n            this.tblDataView.Name = \"tblDataView\";\n            this.tblDataView.RowCount = 1;\n            this.tblDataView.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblDataView.Size = new System.Drawing.Size(1002, 526);\n            this.tblDataView.TabIndex = 4;\n            // \n            // splitLeftRight\n            // \n            this.splitLeftRight.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitLeftRight.Location = new System.Drawing.Point(3, 6);\n            this.splitLeftRight.Margin = new System.Windows.Forms.Padding(3, 6, 3, 3);\n            this.splitLeftRight.Name = \"splitLeftRight\";\n            // \n            // splitLeftRight.Panel1\n            // \n            this.splitLeftRight.Panel1.Controls.Add(this.splitTagSelect);\n            // \n            // splitLeftRight.Panel2\n            // \n            this.splitLeftRight.Panel2.Controls.Add(this.ctrlSummary);\n            this.splitLeftRight.Size = new System.Drawing.Size(996, 517);\n            this.splitLeftRight.SplitterDistance = 677;\n            this.splitLeftRight.TabIndex = 9;\n            // \n            // splitTagSelect\n            // \n            this.splitTagSelect.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitTagSelect.Location = new System.Drawing.Point(0, 0);\n            this.splitTagSelect.Name = \"splitTagSelect\";\n            this.splitTagSelect.Panel1Collapsed = true;\n            this.splitTagSelect.Panel1MinSize = 100;\n            // \n            // splitTagSelect.Panel2\n            // \n            this.splitTagSelect.Panel2.Controls.Add(this.splitTopBottom);\n            this.splitTagSelect.Panel2MinSize = 0;\n            this.splitTagSelect.Size = new System.Drawing.Size(677, 517);\n            this.splitTagSelect.SplitterDistance = 100;\n            this.splitTagSelect.TabIndex = 9;\n            // \n            // splitTopBottom\n            // \n            this.splitTopBottom.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitTopBottom.Location = new System.Drawing.Point(0, 0);\n            this.splitTopBottom.Margin = new System.Windows.Forms.Padding(0);\n            this.splitTopBottom.Name = \"splitTopBottom\";\n            this.splitTopBottom.Orientation = System.Windows.Forms.Orientation.Horizontal;\n            // \n            // splitTopBottom.Panel1\n            // \n            this.splitTopBottom.Panel1.Controls.Add(this.tabControl);\n            // \n            // splitTopBottom.Panel2\n            // \n            this.splitTopBottom.Panel2.Controls.Add(this.ctrlAssociationView);\n            this.splitTopBottom.Size = new System.Drawing.Size(677, 517);\n            this.splitTopBottom.SplitterDistance = 354;\n            this.splitTopBottom.TabIndex = 8;\n            // \n            // tabControl\n            // \n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;\n            this.tabControl.HotTrack = true;\n            this.tabControl.ItemSize = new System.Drawing.Size(0, 18);\n            this.tabControl.Location = new System.Drawing.Point(0, 0);\n            this.tabControl.Multiline = true;\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(677, 354);\n            this.tabControl.TabIndex = 6;\n            this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);\n            // \n            // ctrlAssociationView\n            // \n            this.ctrlAssociationView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.ctrlAssociationView.DataSourceAdapter = null;\n            this.ctrlAssociationView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlAssociationView.ForeColor = System.Drawing.Color.White;\n            this.ctrlAssociationView.Location = new System.Drawing.Point(0, 0);\n            this.ctrlAssociationView.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.ctrlAssociationView.Name = \"ctrlAssociationView\";\n            this.ctrlAssociationView.SaveGameDirectory = null;\n            this.ctrlAssociationView.ScreenshotDirectory = null;\n            this.ctrlAssociationView.Size = new System.Drawing.Size(677, 159);\n            this.ctrlAssociationView.TabIndex = 7;\n            // \n            // ctrlSummary\n            // \n            this.ctrlSummary.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlSummary.Font = new System.Drawing.Font(\"Arial\", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.ctrlSummary.Location = new System.Drawing.Point(0, 0);\n            this.ctrlSummary.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);\n            this.ctrlSummary.Name = \"ctrlSummary\";\n            this.ctrlSummary.Size = new System.Drawing.Size(315, 517);\n            this.ctrlSummary.TabIndex = 4;\n            this.ctrlSummary.TagText = \"Tags:\";\n            // \n            // flpTags\n            // \n            this.flpTags.Controls.Add(this.btnTags);\n            this.flpTags.Controls.Add(this.lblSelectedTag);\n            this.flpTags.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpTags.Location = new System.Drawing.Point(0, 61);\n            this.flpTags.Margin = new System.Windows.Forms.Padding(0);\n            this.flpTags.Name = \"flpTags\";\n            this.flpTags.Size = new System.Drawing.Size(1008, 26);\n            this.flpTags.TabIndex = 6;\n            // \n            // btnTags\n            // \n            this.btnTags.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnTags.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;\n            this.btnTags.FlatAppearance.BorderSize = 0;\n            this.btnTags.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\n            this.btnTags.Image = global::DoomLauncher.Properties.Resources.Tags;\n            this.btnTags.Location = new System.Drawing.Point(0, 0);\n            this.btnTags.Margin = new System.Windows.Forms.Padding(0, 0, 2, 0);\n            this.btnTags.Name = \"btnTags\";\n            this.btnTags.Size = new System.Drawing.Size(66, 22);\n            this.btnTags.TabIndex = 5;\n            this.btnTags.Text = \"Tags\";\n            this.btnTags.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage;\n            this.btnTags.UseVisualStyleBackColor = true;\n            this.btnTags.Click += new System.EventHandler(this.btnTags_Click);\n            // \n            // lblSelectedTag\n            // \n            this.lblSelectedTag.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblSelectedTag.AutoSize = true;\n            this.lblSelectedTag.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lblSelectedTag.Location = new System.Drawing.Point(68, 4);\n            this.lblSelectedTag.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);\n            this.lblSelectedTag.Name = \"lblSelectedTag\";\n            this.lblSelectedTag.Size = new System.Drawing.Size(79, 15);\n            this.lblSelectedTag.TabIndex = 6;\n            this.lblSelectedTag.Text = \"Selected Tag\";\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(1008, 26);\n            this.titleBar.TabIndex = 7;\n            this.titleBar.Title = \"Doom Launcher\";\n            // \n            // mnuIdGames\n            // \n            this.mnuIdGames.ImageScalingSize = new System.Drawing.Size(20, 20);\n            this.mnuIdGames.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.downloadToolStripMenuItem,\n            this.viewWebPageToolStripMenuItem});\n            this.mnuIdGames.Name = \"mnuIdGames\";\n            this.mnuIdGames.Size = new System.Drawing.Size(165, 48);\n            // \n            // downloadToolStripMenuItem\n            // \n            this.downloadToolStripMenuItem.Name = \"downloadToolStripMenuItem\";\n            this.downloadToolStripMenuItem.Size = new System.Drawing.Size(164, 22);\n            this.downloadToolStripMenuItem.Text = \"Download...\";\n            this.downloadToolStripMenuItem.Click += new System.EventHandler(this.downloadToolStripMenuItem_Click);\n            // \n            // viewWebPageToolStripMenuItem\n            // \n            this.viewWebPageToolStripMenuItem.Name = \"viewWebPageToolStripMenuItem\";\n            this.viewWebPageToolStripMenuItem.Size = new System.Drawing.Size(164, 22);\n            this.viewWebPageToolStripMenuItem.Text = \"View Web Page...\";\n            this.viewWebPageToolStripMenuItem.Click += new System.EventHandler(this.viewWebPageToolStripMenuItem_Click);\n            // \n            // MainForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(1008, 613);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.MinimumSize = new System.Drawing.Size(798, 590);\n            this.Name = \"MainForm\";\n            this.Text = \"Doom Launcher\";\n            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);\n            this.Shown += new System.EventHandler(this.MainForm_Shown);\n            this.mnuLocal.ResumeLayout(false);\n            this.tblMain.ResumeLayout(false);\n            this.tblTop.ResumeLayout(false);\n            this.tblTop.PerformLayout();\n            this.flpSearch.ResumeLayout(false);\n            this.flpSearch.PerformLayout();\n            this.toolStrip1.ResumeLayout(false);\n            this.toolStrip1.PerformLayout();\n            this.tblDataView.ResumeLayout(false);\n            this.splitLeftRight.Panel1.ResumeLayout(false);\n            this.splitLeftRight.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.splitLeftRight)).EndInit();\n            this.splitLeftRight.ResumeLayout(false);\n            this.splitTagSelect.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.splitTagSelect)).EndInit();\n            this.splitTagSelect.ResumeLayout(false);\n            this.splitTopBottom.Panel1.ResumeLayout(false);\n            this.splitTopBottom.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.splitTopBottom)).EndInit();\n            this.splitTopBottom.ResumeLayout(false);\n            this.flpTags.ResumeLayout(false);\n            this.flpTags.PerformLayout();\n            this.mnuIdGames.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ContextMenuStrip mnuLocal;\n        private System.Windows.Forms.ToolStripMenuItem viewTextFileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem openZipFileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem playToolStripMenuItem;\n        private System.Windows.Forms.ToolTip toolTip1;\n        private System.Windows.Forms.ContextMenuStrip mnuIdGames;\n        private System.Windows.Forms.ToolStripMenuItem downloadToolStripMenuItem;\n        private GameFileSummary ctrlSummary;\n        private SearchControl ctrlSearch;\n        private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;\n        private GameFileAssociationView ctrlAssociationView;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\n        private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem;\n        private DoomLauncher.FormButton btnDownloads;\n        private System.Windows.Forms.ToolStripMenuItem viewWebPageToolStripMenuItem;\n        private System.Windows.Forms.ToolStrip toolStrip1;\n        private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton1;\n        private System.Windows.Forms.ToolStripMenuItem sourcePortsToolStripMenuItem;\n        private System.Windows.Forms.ToolTip toolTip2;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;\n        private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem addFilesToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem addIWADsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem addDoom64ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;\n        private System.Windows.Forms.Button btnPlay;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;\n        private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;\n        private System.Windows.Forms.SplitContainer splitTopBottom;\n        private System.Windows.Forms.SplitContainer splitLeftRight;\n        private DoomLauncher.CTabControl tabControl;\n        private System.Windows.Forms.ToolStripMenuItem tagToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem newTagToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;\n        private System.Windows.Forms.ToolStripMenuItem manageTagsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem updateMetadataToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;\n        private System.Windows.Forms.ToolStripMenuItem showToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator9;\n        private System.Windows.Forms.ToolStripMenuItem generateTextFileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem generateTextFileToolStripMenuItem1;\n        private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem cumulativeStatisticsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;\n        private System.Windows.Forms.ToolStripMenuItem cumulativeStatisticsToolStripMenuItem1;\n        private System.Windows.Forms.ToolStripMenuItem utilityToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem utilitiesToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem createShortcutToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem createAutoPlayShortcutToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem manageUtilitiesToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator12;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator13;\n        private System.Windows.Forms.ToolStripMenuItem playNowToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem playRandomToolStripMenuItem1;\n        private System.Windows.Forms.ToolStripMenuItem createZipToolStripMenuItem;\n        private DoomLauncher.GlowButton btnUpdate;\n        private System.Windows.Forms.ToolStripMenuItem addFIlesRecursivelyToolStripMenuItem1;\n        private System.Windows.Forms.ToolStripMenuItem loadWadsFromSteamMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator14;\n        private System.Windows.Forms.ToolStripMenuItem sortByToolStripMenuItem;\n        private System.Windows.Forms.FlowLayoutPanel flpTags;\n        private DoomLauncher.FormButton btnTags;\n        private System.Windows.Forms.Label lblSelectedTag;\n        private System.Windows.Forms.SplitContainer splitTagSelect;\n        private System.Windows.Forms.ToolStripMenuItem addDirectoryToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator15;\n        private System.Windows.Forms.ToolStripMenuItem resyncToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem resyncIgnoreTitlepicToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem manualUpdateToolStripMenuItem;\n        private Controls.TitleBarControl titleBar;\n        private FormButton btnMainMenu;\n        private CCheckBox chkIncludeAll;\n        private TableLayoutPanelDB tblMain;\n        private TableLayoutPanelDB tblTop;\n        private FlowLayoutPanelDB flpSearch;\n        private TableLayoutPanelDB tblDataView;\n        private System.Windows.Forms.ToolStripMenuItem globalCumulativeStatisticsToolStripMenuItem;\n    }\n}\n\n"
  },
  {
    "path": "DoomLauncher/Forms/MainForm.cs",
    "content": "﻿using DoomLauncher.Controls;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Forms;\nusing DoomLauncher.Handlers;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.Stylize;\nusing PresentationControls;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Net;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;\n\nnamespace DoomLauncher\n{\n    public partial class MainForm : Form\n    {\n        public bool ShouldShowToolTip { get; private set; } = true;\n\n        private readonly string m_workingDirectory;\n        private bool m_idGamesLoaded;\n        private IGameFile m_lastSelectedItem;\n        private PlayForm m_currentPlayForm;\n        private DownloadView m_downloadView;\n        private DownloadHandler m_downloadHandler;\n        private List<INewFileDetector> m_screenshotDetectors;\n        private List<INewFileDetector> m_saveFileDetectors;\n        private IFileData[] m_saveGames;\n        private TabHandler m_tabHandler;\n        private VersionHandler m_versionHandler;\n        private readonly SplashScreen m_splash;\n        private readonly UpdateControl m_updateControl = new UpdateControl();\n        private readonly TagSelectControl m_tagSelectControl = new TagSelectControl();\n        private readonly Dictionary<string, string> m_searchByTab = new Dictionary<string, string>();\n        private Popup m_tagPopup;\n\n        private string m_launchFile;\n        private readonly LaunchArgs m_launchArgs;\n        private readonly Dictionary<ITabView, GameFileSearchField[]> m_savedTabSearches = new Dictionary<ITabView, GameFileSearchField[]>();\n        private readonly Dictionary<ProgressBarType, ProgressBarForm> m_progressBars = new Dictionary<ProgressBarType, ProgressBarForm>();\n        private FormWindowState m_windowState;\n        private bool m_progressBarCancelled;\n        private bool m_writeConfigOnClose = true;\n        private IGameFile m_lastPlayRandomFile;\n        private string m_lastPlayRandomMap;\n        private ITabView m_lastSelectedTabView;\n\n        public MainForm(LaunchArgs launchArgs, SplashScreen splashScreen)\n        {\n            m_launchFile = launchArgs.LaunchFileName;\n            m_launchArgs = launchArgs;\n            m_splash = splashScreen;\n\n            InitializeComponent();\n            Stylizer.SetupTitleBar(this);\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n\n            InitProgressBars();\n            InitIcons();\n            ClearSummary();\n\n            m_workingDirectory = LauncherPath.GetDataDirectory();\n        }\n\n        private void InitProgressBars()\n        {\n            var copyProgressBar = CreateProgressBar(\"Copying...\", ProgressBarStyle.Continuous, true);\n            copyProgressBar.Cancelled += m_progressBarFormCopy_Cancelled;\n\n            m_progressBars[ProgressBarType.Copy] = copyProgressBar;\n            m_progressBars[ProgressBarType.Sync] = CreateProgressBar(\"Syncing...\", ProgressBarStyle.Continuous, false);\n            m_progressBars[ProgressBarType.Update] = CreateProgressBar(\"Updating...\", ProgressBarStyle.Marquee, false);\n            m_progressBars[ProgressBarType.Delete] = CreateProgressBar(\"Deleting...\", ProgressBarStyle.Marquee, false);\n            m_progressBars[ProgressBarType.Search] = CreateProgressBar(\"Searching...\", ProgressBarStyle.Marquee, false);\n            m_progressBars[ProgressBarType.CreateZip] = CreateProgressBar(\"Creating zip...\", ProgressBarStyle.Marquee, false);\n        }\n\n        protected override void OnClientSizeChanged(EventArgs e)\n        {\n            var windowState = titleBar.WindowState;\n            if (windowState != m_windowState)\n            {\n                if (m_windowState != FormWindowState.Minimized && windowState == FormWindowState.Minimized)\n                    ctrlSummary.PauseSlideshow();\n                else if (m_windowState == FormWindowState.Minimized && windowState != FormWindowState.Minimized)\n                    ctrlSummary.ResumeSlideshow();\n\n                m_windowState = windowState;\n            }\n\n            base.OnClientSizeChanged(e);\n        }\n\n        private void InitIcons()\n        {\n            Icons.DpiScale = new DpiScale(CreateGraphics());\n            btnPlay.Image = Icons.Play;\n            toolStripDropDownButton1.Image = Icons.Bars;\n            btnDownloads.Image = Icons.Download;\n            btnTags.Image = Icons.Tags;\n            \n            var padding = btnMainMenu.Padding;\n            padding.Top = ctrlSearch.Location.Y - Icons.DpiScale.ScaleIntY(2);\n            btnMainMenu.Margin = padding;\n        }\n\n        public async Task Init()\n        {\n            await Initialize();\n\n            InitWindow();\n\n            await CheckFirstInit();\n            UpdateLocal();\n\n            SetupSearchFilters();\n\n            HandleTabSelectionChange();\n            InvokeHideSplashScreen();\n\n            _ = Task.Run(() => CheckForAppUpdate());\n        }\n\n        private void InvokeHideSplashScreen()\n        {\n            if (InvokeRequired)\n                Invoke(new Action(HideSplashScreen));\n            else\n                HideSplashScreen();\n        }\n\n        private void HideSplashScreen()\n        {\n            m_splash?.Close();\n        }\n\n        private void InitWindow()\n        {\n            Stylizer.StylizeControl(mnuLocal, DesignMode);\n            Stylizer.StylizeControl(mnuIdGames, DesignMode);\n            Stylizer.StylizeControl(toolStripDropDownButton1, DesignMode);\n            toolStrip1.Visible = false;\n            btnMainMenu.Image = Icons.Bars;\n\n            if (m_launchArgs.LaunchGameFileID != null && m_launchArgs.AutoClose)\n            {\n                WindowState = FormWindowState.Minimized;\n                return;\n            }\n\n            //Only set location and window state if the location is valid, either way we always set Width, Height, and splitter values\n            if (ValidatePosition(AppConfiguration))\n            {\n                WindowState = AppConfiguration.WindowState == FormWindowState.Minimized ? FormWindowState.Normal : AppConfiguration.WindowState;\n                StartPosition = FormStartPosition.Manual;\n                Location = new Point(AppConfiguration.AppX, AppConfiguration.AppY);\n                if (AppConfiguration.AppWidth > 0 && AppConfiguration.AppHeight > 0)\n                    Size = new Size(AppConfiguration.AppWidth, AppConfiguration.AppHeight);\n\n                titleBar.HandleWindowStateChange(AppConfiguration.WindowState);\n            }\n\n            SetSplitters();\n            m_windowState = titleBar.WindowState;\n        }\n\n        private void SetSplitters()\n        {\n            splitTopBottom.SplitterDistance = GetSplitterDistancePixels(AppConfiguration.SplitTopBottom, Height, 0.64);\n            splitLeftRight.SplitterDistance = GetSplitterDistancePixels(AppConfiguration.SplitLeftRight, Width, 0.78);\n            splitTagSelect.SplitterDistance = GetSplitterDistancePixels(AppConfiguration.SplitTagSelect, Width, 0.1);\n        }\n\n        private static int GetSplitterDistancePixels(double configValue, int windowDimension, double defaultPercentage)\n        {\n            configValue = Math.Abs(configValue);\n            // Previous configurations were set in pixels\n            if (configValue > 1)\n            {\n                int value = (int)configValue;\n                if (configValue >= windowDimension)\n                    return (int)(defaultPercentage * windowDimension);\n\n                return (int)configValue;\n            }\n\n            //New configuration is percentage 0 - 1\n            return Math.Max((int)(configValue * windowDimension), 32);\n        }\n\n        public IGameFileView GetCurrentViewControl()\n        {\n            ITabView view = GetCurrentTabView();\n            return view?.GameFileViewControl;\n        }\n\n        private void ctrlAssociationView_FileAdded(object sender, EventArgs e)\n        {\n            UpdateCurrentView();\n        }\n\n        void ctrlAssociationView_FileDeleted(object sender, EventArgs e)\n        {\n            UpdateCurrentView();\n        }\n\n        void ctrlAssociationView_FileOrderChanged(object sender, EventArgs e)\n        {\n            UpdateCurrentView();\n        }\n\n        void CtrlAssociationView_FileDetailsChanged(object sender, EventArgs e)\n        {\n            UpdateCurrentView();\n        }\n\n        private void UpdateCurrentView()\n        {\n            IGameFileView view = GetCurrentViewControl();\n            view.UpdateGameFile(view.SelectedItem);\n            HandleSelectionChange(view, true);\n        }\n\n        private void chkIncludeAll_CheckedChanged(object sender, EventArgs e)\n        {\n            HandleSearch();\n        }\n\n        void DownloadView_UserPlay(object sender, EventArgs e)\n        {\n            if (m_downloadView.SelectedItem != null)\n            {\n                IGameFile gameFile = DataSourceAdapter.GetGameFile(m_downloadView.SelectedItem.Key.ToString());\n                if (gameFile != null)\n                    HandlePlay(new IGameFile[] { gameFile });\n            }\n        }\n\n        void ctrlView_SelectionChange(object sender, EventArgs e)\n        {\n            HandleSelectionChange(sender, false);\n        }\n\n        void ctrlView_RowDoubleClicked(object sender, EventArgs e)\n        {\n            HandleRowDoubleClicked(sender as IGameFileView);\n        }\n\n        void ctrlView_GridKeyPress(object sender, KeyPressEventArgs e)\n        {\n            HandleKeyPress(e);\n        }\n\n        private void HandleRowDoubleClicked(IGameFileView ctrl)\n        {\n            if (ctrl != null)\n            {\n                ITabView tabView = m_tabHandler.TabViewForControl(ctrl);\n\n                if (tabView != null && tabView is IdGamesTabViewCtrl)\n                    HandleDownload(AppConfiguration.TempDirectory);\n                else if (tabView != null && tabView.IsPlayAllowed)\n                    HandlePlay();\n            }\n        }\n\n        private void HandleSearch()\n        {\n            var ctrl = GetCurrentViewControl();\n            if (ctrl == null)\n                return;\n\n            ITabView tabView = m_tabHandler.TabViewForControl(ctrl);\n            if (tabView == null)\n                return;\n\n            if (tabView != null && tabView.IsSearchAllowed)\n            {\n                if (string.IsNullOrEmpty(ctrlSearch.SearchText.Trim()))\n                {\n                    tabView.SetGameFiles();\n                    UpdateSavedTabSearch(tabView, null);\n                }\n                else\n                {\n                    var searchFields = Util.SearchFieldsFromSearchCtrl(ctrlSearch);\n                    UpdateSavedTabSearch(tabView, searchFields);\n                    tabView.SetGameFiles(searchFields);\n                }\n                    \n                HandleSelectionChange(GetCurrentViewControl(), false);\n            }            \n        }\n\n        private void UpdateSavedTabSearch(ITabView tabView, GameFileSearchField[] searchFields)\n        {\n            if (searchFields == null)\n                m_savedTabSearches.Remove(tabView);\n            else\n                m_savedTabSearches[tabView] = searchFields;\n        }\n\n        private void CleanTempDirectory()\n        {\n            DirectoryInfo dir = new DirectoryInfo(AppConfiguration.TempDirectory.GetFullPath());\n\n            if (dir.Exists)\n            {\n                foreach (FileInfo fi in dir.GetFiles())\n                {\n                    try\n                    {\n                        fi.Delete();\n                    }\n                    catch\n                    {\n                        //failed, nothing to do\n                    }\n                }\n            }\n        }\n\n        private void viewTextFileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleViewTextFile();\n        }\n\n        private void openZipFileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleOpenArchiveFile();\n        }\n\n        private void playToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandlePlay(PlayOptions.ForceDialog);\n        }\n\n        private void btnPlay_Click(object sender, EventArgs e)\n        {\n            HandlePlay();\n        }\n\n        private void playNowToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandlePlay();\n        }\n\n        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleDelete();\n        }\n\n        private void ToolStripDropDownButton1_DropDownOpened(object sender, EventArgs e)\n        {\n            ShouldShowToolTip = false;\n        }\n\n        private void ToolStripDropDownButton1_DropDownClosed(object sender, EventArgs e)\n        {\n            ShouldShowToolTip = true;\n        }\n\n        private void HandleRename()\n        {\n            IGameFile gameFile = SelectedItems(GetCurrentViewControl()).FirstOrDefault();\n            if (gameFile == null)\n                return;\n\n            bool success = false;\n            TextBoxForm form = new TextBoxForm(false, MessageBoxButtons.OKCancel);\n            form.SetMaxLength(72);\n            form.DisplayText = gameFile.FileNameNoPath;\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.Title = $\"Rename {gameFile.FileNameNoPath}\";\n\n            int idx = form.DisplayText.IndexOf('.');\n            if (idx != -1)\n                form.SelectDisplayText(0, idx);\n\n            while (!success && form.ShowDialog(this) == DialogResult.OK)\n            {\n                success = RenameGameFile(gameFile, form.DisplayText);\n\n                idx = form.DisplayText.IndexOf('.');\n                if (idx != -1)\n                    form.SelectDisplayText(0, idx);\n            }\n        }\n\n        private bool RenameGameFile(IGameFile gameFile, string fileName)\n        {\n            string error = null;\n            bool valid = VerifyFileName(fileName);\n            try\n            {\n                if (valid)\n                {\n                    if (!string.IsNullOrEmpty(fileName) && fileName != gameFile.FileName)\n                        error = HandleRenameFile(gameFile, fileName);\n                    else\n                        error = \"The new file name must be different and not empty.\";\n                }\n                else\n                {\n                    error = \"The entered file name is invalid.\";\n                }\n            }\n            catch (IOException ex)\n            {\n                error = ex.Message;\n            }\n            catch (Exception ex)\n            {\n                Util.DisplayUnexpectedException(this, ex);\n            }\n\n            if (!string.IsNullOrEmpty(error))\n            {\n                StyledMessageBox.Show(this, error, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return false;\n            }\n\n            return true;\n        }\n\n        private string HandleRenameFile(IGameFile gameFile, string fileName)\n        {\n            FileInfo fi = GetRenameFileInfo(gameFile, fileName, out string oldFilePath, out string newFilePath, out string gameFileUpdateFileName);\n            if (!fi.Exists)\n                return string.Format($\"Could not find {gameFile.FileName} to rename.\");\n\n            FileInfo fiCheck = new FileInfo(newFilePath);\n            if (fiCheck.Exists)\n                return string.Format($\"The file {fileName} already exists.\");\n\n            fi.MoveTo(newFilePath);\n\n            IGameFile gameFileUpdate = DataSourceAdapter.GetGameFile(gameFile.FileName); //Need to to populate all info before updating\n            gameFile.FileName = gameFileUpdateFileName;\n            gameFileUpdate.FileName = gameFileUpdateFileName;\n            DataSourceAdapter.UpdateGameFile(gameFileUpdate, new GameFileFieldType[] { GameFileFieldType.Filename });\n            UpdateAdditinalFileReferences(oldFilePath, fileName);\n            HandleSelectionChange(GetCurrentViewControl(), true);\n            return null;\n        }\n\n        private FileInfo GetRenameFileInfo(IGameFile gameFile, string fileName, out string oldFilePath, out string newFilePath,\n            out string gameFileUpdateFileName)\n        {\n            if (gameFile.IsUnmanaged())\n            {\n                FileInfo fi = new FileInfo(gameFile.FileName);\n                oldFilePath = gameFile.FileName;\n                newFilePath = Path.Combine(fi.DirectoryName, fileName);\n                gameFileUpdateFileName = newFilePath;\n                return fi;\n            }\n\n            oldFilePath = gameFile.FileName;\n            newFilePath = Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), fileName);\n            gameFileUpdateFileName = fileName;\n            return new FileInfo(Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), gameFile.FileName));\n        }\n\n        private void UpdateAdditinalFileReferences(string oldFileName, string newFileName)\n        {\n            GameFileFieldType[] updateFields = new GameFileFieldType[] { GameFileFieldType.SettingsFiles };\n            GameFileGetOptions options = new GameFileGetOptions(new GameFileFieldType[] { GameFileFieldType.GameFileID, GameFileFieldType.SettingsFiles });\n            var gameFiles = DataSourceAdapter.GetGameFiles(options).Where(x => x.SettingsFiles.Length > 0);\n\n            foreach (var databaseGameFile in gameFiles)\n            {\n                string[] files = Util.SplitString(databaseGameFile.SettingsFiles);\n                if (files.Contains(oldFileName))\n                {\n                    databaseGameFile.SettingsFiles = GetRenamedAdditionalFileSetting(files, oldFileName, newFileName);\n                    DataSourceAdapter.UpdateGameFile(databaseGameFile, updateFields);\n                }\n            }\n\n            var sourcePorts = DataSourceAdapter.GetSourcePorts();\n\n            foreach (var databaseSourcePort in sourcePorts)\n            {\n                string[] files = Util.SplitString(databaseSourcePort.SettingsFiles);\n                if (files.Contains(oldFileName))\n                {\n                    databaseSourcePort.SettingsFiles = GetRenamedAdditionalFileSetting(files, oldFileName, newFileName);\n                    DataSourceAdapter.UpdateSourcePort(databaseSourcePort);\n                }\n            }\n        }\n\n        private static string GetRenamedAdditionalFileSetting(string[] files, string oldFileName, string newFileName)\n        {\n            for (int i = 0; i < files.Length; i++)\n            {\n                if (files[i] == oldFileName)\n                {\n                    files[i] = newFileName;\n                    break;\n                }\n            }\n\n            return string.Join(\";\", files);\n        }\n\n        private static bool VerifyFileName(string fileName)\n        {\n            return fileName.Except(Path.GetInvalidFileNameChars()).Count() == fileName.Distinct().Count() &&\n                fileName.Except(Path.GetInvalidPathChars()).Count() == fileName.Distinct().Count();\n        }\n\n        private void HandleViewTextFile()\n        {\n            if (GetCurrentViewControl() == null)\n                return;\n\n            IGameFile[] items = SelectedItems(GetCurrentViewControl());\n\n            foreach (IGameFile item in items)\n            {\n                if (item != null && AssertFile(Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), item.FileName)))\n                {\n                    using (IArchiveReader reader = ArchiveReader.Create(Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), item.FileName)))\n                    {\n                        var entries = reader.Entries.Where(x => x.FullName.EndsWith(\".txt\", StringComparison.OrdinalIgnoreCase));\n\n                        if (entries.Any())\n                        {\n                            var entry = entries.First();\n                            if (entries.Count() > 1)\n                            {\n                                entry = null;\n                                SimpleFileSelectForm form = new SimpleFileSelectForm();\n                                form.Initialize(GetSortedTextFiles(item, entries));\n                                form.StartPosition = FormStartPosition.CenterParent;\n                                if (form.ShowDialog(this) == DialogResult.OK)\n                                    entry = entries.FirstOrDefault(x => x.Name == form.SelectedFile);\n                            }\n\n                            if (entry != null)\n                            {\n                                string extractedFileName = Path.Combine(AppConfiguration.TempDirectory.GetFullPath(), entry.Name);\n                                entry.ExtractToFile(extractedFileName, true);\n                                Process.Start(extractedFileName);\n                            }\n                        }\n                        else\n                        {\n                            StyledMessageBox.Show(this, \"No text file found.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                        }\n                    }\n                }\n            }\n        }\n\n        private IEnumerable<string> GetSortedTextFiles(IGameFile item, IEnumerable<IArchiveEntry> entries)\n        {\n            FileInfo fi = new FileInfo(item.FileName);\n            string baseFile = fi.Name;\n            if (fi.Extension.Length > 0)\n                baseFile = fi.Name.Replace(fi.Extension, string.Empty);\n\n            var find = entries.Select(x => x.Name).ToList();\n            var first = find.FirstOrDefault(x => x.StartsWith(baseFile, StringComparison.InvariantCultureIgnoreCase));\n\n            if (first != null)\n            {\n                find.Remove(first);\n                find.Insert(0, first);\n            }\n\n            return find;\n        }\n\n        private void HandleOpenArchiveFile()\n        {\n            if (GetCurrentViewControl() == null)\n                return;\n\n            IGameFile[] items = SelectedItems(GetCurrentViewControl());\n            if (items.Length == 0)\n                return;\n\n            IGameFile failedOpen = null;\n            foreach (IGameFile item in items)\n            {\n                if (item == null)\n                    continue;\n\n                bool isDirectory = item.IsUnmanaged() && Util.IsDirectory(item.FileName);\n                if (!isDirectory && !Util.GetReadablePkExtensions().Contains(Path.GetExtension(item.FileName)) && \n                    !ArchiveUtil.ShouldReadPackagedArchive(item.FileName))\n                    continue;\n\n                string path = item.IsUnmanaged() ? item.FileName : Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), item.FileName);\n                if (!AssertFile(path))\n                    continue;\n\n                try\n                {\n                    Process.Start(path);\n                    return;\n                }\n                catch\n                {\n                    failedOpen = item;\n                    break;\n                }\n            }\n \n            if (failedOpen == null)\n                failedOpen = items[0];\n            StyledMessageBox.Show(this, $\"Could not open {failedOpen.FileNameNoPath}\", \"Cannot Open\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n\n        private void HandleDelete()\n        {\n            if (GetCurrentViewControl() != null)\n            {\n                MessageCheckBox messageBox = null;\n                ITabView tabView = m_tabHandler.TabViewForControl(GetCurrentViewControl());\n                bool showDialog = true;\n                bool update = false;\n\n                if (tabView != null && tabView.IsDeleteAllowed && tabView.IsLocal)\n                {\n                    IGameFile[] items = SelectedItems(GetCurrentViewControl());\n                    bool hasUnmanaged = items.Any(x => x.IsUnmanaged());\n                    foreach (IGameFile gameFile in items)\n                    {\n                        if (showDialog)\n                        {\n                            string text = $\"Delete {gameFile.FileName} and all associated data?\";\n                            if (hasUnmanaged)\n                                text += \"\\n\\n(Unmanaged files will only be removed from Doom Launcher)\";\n\n                            messageBox = new MessageCheckBox(\"Confirm\", text,\n                                $\"Do this for all {items.Length} items\", SystemIcons.Question, MessageBoxButtons.OKCancel);\n                            messageBox.SetShowCheckBox(items.Length > 1);\n                        }\n\n                        if (gameFile != null && (!showDialog || messageBox.ShowDialog(this) == DialogResult.OK))\n                        {\n                            try\n                            {\n                                DeleteGameFileAndAssociations(gameFile);\n                                update = true;\n                            }\n                            catch\n                            {\n                                StyledMessageBox.Show(this, string.Format(\"The file {0} appears to be in use and could not be deleted.\", gameFile.FileName),\n                                    \"In Use\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                            }\n                        }\n\n                        if (messageBox != null && messageBox.Checked)\n                            showDialog = false;\n                        if (messageBox != null && messageBox.Checked && messageBox.DialogResult == DialogResult.Cancel)\n                            break;\n                    }\n                }\n\n                if (update)\n                {\n                    GetCurrentViewControl().SelectedItem = null;\n                    UpdateLocal();\n                    HandleSelectionChange(GetCurrentViewControl(), true);\n                }\n            }\n        }\n\n        private void DeleteGameFileAndAssociations(IGameFile gameFile)\n        {\n            DeleteLocalFileAssociations(gameFile);\n\n            IIWadData iwadFind = DataSourceAdapter.GetIWad(gameFile.GameFileID.Value);\n            if (iwadFind != null)\n                DataSourceAdapter.DeleteIWad(iwadFind);\n            //note: appears sqlite we re-use deleted auto-inc ids so we have to be careful and delete everything\n            if (!gameFile.IsUnmanaged())\n                DirectoryDataSourceAdapter.DeleteGameFile(gameFile);\n            DataSourceAdapter.DeleteGameFile(gameFile);\n            if (gameFile.GameFileID.HasValue)\n                DataSourceAdapter.DeleteStatsByFile(gameFile.GameFileID.Value);\n\n            // If we're deleting Doom64, delete the source port too\n            if (gameFile.IsDoom64)\n            {\n                var doom64SourcePort = DataSourceAdapter.GetDoom64().FirstOrDefault();\n                DataSourceAdapter.DeleteSourcePort(doom64SourcePort);\n            }\n\n            var tagMapping = DataSourceAdapter.GetTagMappings(gameFile.GameFileID.Value);\n            tagMapping.ToList().ForEach(x => DataSourceAdapter.DeleteTagMapping(x));\n\n            var profiles = DataSourceAdapter.GetGameProfiles(gameFile.GameFileID.Value);\n            profiles.ToList().ForEach(x => DataSourceAdapter.DeleteGameProfile(x.GameProfileID));\n\n            DataCache.Instance.TagMapLookup.RemoveGameFile(gameFile);\n        }\n\n        private void DeleteLocalFileAssociations(IGameFile gameFIle)\n        {\n            IEnumerable<IFileData> files = DataSourceAdapter.GetFiles(gameFIle);\n\n            foreach (IFileData file in files)\n            {\n                string path = DirectoryForFileType(file.FileTypeID).GetFullPath();\n                FileInfo fi = new FileInfo(Path.Combine(path, file.FileName));\n\n                if (fi.Exists)\n                    fi.Delete();\n\n                DataSourceAdapter.DeleteFile(file);\n            }\n        }\n\n        private LauncherPath DirectoryForFileType(FileType fileTypeID)\n        {\n            switch (fileTypeID)\n            {\n                case FileType.Screenshot:\n                    return AppConfiguration.ScreenshotDirectory;\n                case FileType.Demo:\n                    return AppConfiguration.DemoDirectory;\n                case FileType.SaveGame:\n                    return AppConfiguration.SaveGameDirectory;\n                case FileType.Thumbnail:\n                    return AppConfiguration.ThumbnailDirectory;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        private void HandleSelectionChange(object sender, bool forceChange)\n        {\n            if (!(sender is IGameFileView))\n                return;\n\n            IGameFile item = null;\n            IGameFile[] items = SelectedItems(GetCurrentViewControl());\n            if (items.Length > 0)\n                item = items.First();\n\n            if (!forceChange && !AssertCurrentViewItem(item))\n            {\n                if (item == null)\n                {\n                    m_lastSelectedItem = null;\n                    ctrlAssociationView.ClearData();\n                    ClearSummary();\n                    btnPlay.Enabled = false;\n                }\n                return;\n            }\n\n            if (GetCurrentTabView() is IdGamesTabViewCtrl)\n                ctrlAssociationView.SetButtonsAllButtonsEnabled(false);\n            else\n                ctrlAssociationView.SetData(item);\n\n            if (item != null)\n            {\n                IEnumerable<IStatsData> stats = Array.Empty<IStatsData>();\n                if (item.GameFileID.HasValue)\n                    stats = DataSourceAdapter.GetStats(item.GameFileID.Value);\n\n                SetSummary(item);\n                ctrlSummary.SetStatistics(item, stats);\n            }\n            else\n            {\n                btnPlay.Enabled = false;\n                ctrlAssociationView.ClearData();\n            }\n\n            if (forceChange)\n                GetCurrentViewControl().RefreshData();\n        }\n\n        private bool AssertCurrentViewItem(IGameFile item)\n        {\n            if (item == null || (m_lastSelectedItem != null && m_lastSelectedItem.Equals(item)))\n            {\n                return false;\n            }\n\n            m_lastSelectedItem = item;\n            return true;\n        }\n\n        private void SetSummary(IGameFile item)\n        {\n            ctrlSummary.SetTitle(item.Title);\n            ctrlSummary.SetDescription(item.Description);\n            ctrlSummary.TagText = BuildTagText(item);\n            ctrlSummary.SetTimePlayed(item.MinutesPlayed);\n \n            if (!string.IsNullOrEmpty(item.Comments))\n                ctrlSummary.SetComments(item.Comments);\n            else\n                ctrlSummary.ClearComments();\n\n            List<PreviewImage> imagePaths = new List<PreviewImage>();\n            if (item.GameFileID.HasValue)\n            {\n                SetGameFileImages(item, imagePaths);\n\n                if (imagePaths.Count == 0 && item.IWadID.HasValue)\n                {\n                    var iwad = ThumbnailManager.IWads.FirstOrDefault(x => x.IWadID == item.IWadID.Value);\n                    if (iwad != null)\n                    {\n                        // If this is an IWAD attempt to get user set images, otherwise use pre-defined tile image if exists\n                        if (iwad.GameFileID.HasValue && iwad.GameFileID == item.GameFileID)                        \n                            SetGameFileImages(iwad, imagePaths);\n\n                        if (imagePaths.Count == 0 && ThumbnailManager.IWadTileImages.TryGetValue(item.IWadID.Value, out var fileData))\n                            imagePaths.Add(new PreviewImage(fileData.FileName, string.Empty));\n                    }\n                }\n            }\n\n            if (imagePaths.Count > 0)\n                SetPreviewImages(imagePaths);\n            else\n                ctrlSummary.SetPreviewImage(DataCache.Instance.DefaultImage);\n        }\n\n        private void SetGameFileImages(IGameFile item, List<PreviewImage> imagePaths)\n        {\n            foreach (var screenshot in DataSourceAdapter.GetFiles(item, FileType.Screenshot))\n            {\n                string path = Path.Combine(DataCache.Instance.AppConfiguration.ScreenshotDirectory.GetFullPath(), screenshot.FileName);\n                imagePaths.Add(new PreviewImage(path, FileData.GetTitle(screenshot)));\n            }\n        }\n\n        private void ClearSummary()\n        {\n            ctrlSummary.SetTitle(string.Empty);\n            ctrlSummary.SetDescription(string.Empty);\n            ctrlSummary.ClearPreviewImage();\n            ctrlSummary.TagText = string.Empty;\n            ctrlSummary.SetTimePlayed(0);\n            ctrlSummary.ClearComments();\n        }\n\n        private void SetPreviewImages(List<PreviewImage> imagePaths)\n        {\n            bool success;\n            try\n            {\n                success = ctrlSummary.SetPreviewImages(imagePaths);\n            }\n            catch\n            {\n                success = false;\n            }\n\n            if (!success)\n                ctrlSummary.SetPreviewImage(DataCache.Instance.DefaultImage);\n        }\n\n        private string BuildTagText(IGameFile gameFile)\n        {\n            if (gameFile.GameFileID.HasValue)\n            {\n                IEnumerable<ITagData> tags = GetTagsFromFile(gameFile);\n\n                if (tags.Any())\n                    return string.Join(\", \", tags.Select(x => x.Name));\n            }\n\n            return \"N/A\";\n        }\n\n        private IEnumerable<ITagData> GetTagsFromFile(IGameFile gameFile)\n        {\n            return DataCache.Instance.TagMapLookup.GetTags(gameFile);\n        }\n\n        private IGameFile[] SelectedItems(IGameFileView ctrl)\n        {\n            return ctrl.SelectedItems;\n        }\n\n        private void SetSelectedItem(IGameFileView ctrl, IGameFile gameFile)\n        {\n            IGameFile ctrlItem = ctrl.DataSource.FirstOrDefault(x => x.Equals(gameFile));\n\n            if (ctrlItem != null)\n                ctrl.SelectedItem = ctrlItem;\n        }\n\n        private void UpdateDataSourceViews(IGameFile gameFile)\n        {\n            foreach (ITabView tab in m_tabHandler.TabViews)\n                tab.UpdateDataSourceFile(gameFile);\n        }\n\n        private void btnSearch_Click(object sender, EventArgs e)\n        {\n            HandleSearch();\n        }\n\n        private IGameFile CurrentDownloadFile { get; set; }\n\n        private void HandleDownload(LauncherPath directory)\n        {\n            ITabView tabView = m_tabHandler.TabViews.FirstOrDefault(x => x is IdGamesTabViewCtrl);\n            bool displayDownloads = false;\n\n            if (tabView == null)\n                return;\n\n            IGameFile[] dsItems = SelectedItems(tabView.GameFileViewControl);\n            bool showAlreadyDownloading = true;\n            bool doForAll = false;\n            bool download = true;\n            List<IGameFileDownloadable> errorFiles = new List<IGameFileDownloadable>();\n\n            try\n            {\n                foreach (IGameFile dsItem in dsItems)\n                {\n                    if (dsItem != null && dsItem is IGameFileDownloadable dlItem)\n                    {\n                        GameFileGetOptions options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.GameFileID,\n                            ((IdGamesGameFile)dsItem).id.ToString()));\n\n                        IGameFile dsItemFull = tabView.Adapter.GetGameFiles(options).FirstOrDefault();\n                        if (dsItemFull == null)\n                        {\n                            errorFiles.Add(dlItem);\n                            continue;\n                        }\n\n                        dlItem = dsItemFull as IGameFileDownloadable;\n\n                        if (!doForAll)\n                            download = PromptUserDownload(dsItems, ref showAlreadyDownloading, ref doForAll, dlItem, dsItemFull, dsItems.Length > 1);\n\n                        if (dlItem != null && download)\n                        {\n                            CurrentDownloadFile = dsItemFull;\n                            dlItem.DownloadCompleted += dlItem_DownloadCompleted;\n                            m_downloadHandler.DownloadDirectory = directory;\n                            m_downloadHandler.Download(tabView.Adapter, dlItem);\n                            displayDownloads = true;\n                        }\n                    }\n                }\n            }\n            catch (WebException)\n            {\n                ShowBadConnectionError();\n            }\n            \n            if (errorFiles.Count > 0)\n                StyledMessageBox.Show(this, $\"An error occured when trying to download {string.Join(\",\", errorFiles.Select(x => x.FileName))}\", \n                    \"Download Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n\n            if (displayDownloads)\n                DisplayDownloads();\n        }\n\n        private void ShowBadConnectionError()\n        {\n            StyledMessageBox.Show(this, \"Unable to reach server. Lost connection?\", \"Bad Connection\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n\n        private bool PromptUserDownload(IGameFile[] dsItems, ref bool showAlreadyDownloading, ref bool doForAll,\n            IGameFileDownloadable dlItem, IGameFile dsItemFull, bool showCheckBox)\n        {\n            if (showAlreadyDownloading && m_downloadHandler.IsDownloading(dlItem))\n            {\n                MessageCheckBox messageBox = ShowAlreadyDownloading(dlItem, showCheckBox);\n                showAlreadyDownloading = !messageBox.Checked;\n            }\n\n            if (!doForAll)\n            {\n                IGameFile dsCheck = DataSourceAdapter.GetGameFile(dsItemFull.FileName);\n\n                if (dsCheck != null)\n                {\n                    MessageCheckBox messageBox = ShowAlreadyExists(dsItems, dsCheck, showCheckBox);\n                    doForAll = messageBox.Checked;\n                    if (messageBox.DialogResult == DialogResult.Cancel)\n                        return false;\n                }\n            }\n\n            return true;\n        }\n\n        private MessageCheckBox ShowAlreadyExists(IGameFile[] dsItems, IGameFile dsCheck, bool showCheckBox)\n        {\n            MessageCheckBox messageBox = new MessageCheckBox(\"Already Exists\", string.Format(\"The file {0} already exists in the library. Continue Download?\", dsCheck.FileName),\n                string.Format(\"Do this for all {0} items\", dsItems.Length), SystemIcons.Warning, MessageBoxButtons.OKCancel);\n            messageBox.SetShowCheckBox(showCheckBox);\n            messageBox.ShowDialog(this);\n            return messageBox;\n        }\n\n        private MessageCheckBox ShowAlreadyDownloading(IGameFileDownloadable dlItem, bool showCheckBox)\n        {\n            MessageCheckBox messageBox = new MessageCheckBox(\"Already Downloading\", string.Format(\"The file {0} is already downloading\", dlItem.FileName),\n                \"Do not show this message again\", SystemIcons.Error, MessageBoxButtons.OK);\n            messageBox.SetShowCheckBox(showCheckBox);\n            messageBox.ShowDialog(this);\n            return messageBox;\n        }\n\n        private void HandleEdit()\n        {\n            IGameFileView ctrl = GetCurrentViewControl();\n            if (ctrl == null)\n                return;\n\n            ITabView tabView = m_tabHandler.TabViewForControl(ctrl);\n            IGameFile[] gameFiles = SelectedItems(ctrl);\n\n            if (!CheckEdit(tabView, gameFiles))\n                return;\n\n            IGameFile gameFile = DataSourceAdapter.GetGameFile(gameFiles.First().FileName);\n            IEnumerable<ITagData> tags = GetTagsFromFile(gameFile);\n\n            ITabView localView = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(TabKeys.LocalKey));\n            if (localView == null)\n                return;\n\n            GameFileEditForm form = new GameFileEditForm();\n            form.SetCopyFromFileAllowed(DataSourceAdapter, localView);\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.EditControl.SetShowCheckBoxes(false);\n            form.EditControl.SetDataSource(gameFile, tags);\n\n            if (gameFiles.Length > 1)\n            {\n                form.Text = \"*** Multiple Edit\";\n                form.EditControl.SetShowCheckBoxes(true);\n                form.EditControl.SetCheckBoxesChecked(false);\n            }\n\n            if (form.ShowDialog(this) != DialogResult.OK)\n                return;\n\n            foreach (IGameFile updateGameFile in gameFiles)\n            {\n                var fields = form.EditControl.UpdateDataSource(updateGameFile);\n                if (form.TagsChanged || form.EditControl.TagsChanged)\n                    DataCache.Instance.UpdateGameFileTags(new [] { updateGameFile }, form.EditControl.TagData);\n                tabView.Adapter.UpdateGameFile(updateGameFile, fields.ToArray());\n                UpdateDataSourceViews(updateGameFile);\n            }\n\n            if (gameFiles.Any())\n                HandleSelectionChange(ctrl, true);\n        }\n\n        private static bool CheckEdit(ITabView tabView, IGameFile[] gameFiles)\n        {\n            return gameFiles.Length > 0 && tabView != null && tabView.IsEditAllowed;\n        }\n\n        private void HandleViewWebPage()\n        {\n            IGameFileView ctrl = GetCurrentViewControl();\n\n            if (ctrl != null)\n            {\n                IGameFile dsItem = SelectedItems(ctrl).FirstOrDefault();\n\n                if (dsItem != null && dsItem is IdGamesGameFile)\n                {\n                    try\n                    {\n                        GameFileGetOptions options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.GameFileID,\n                                ((IdGamesGameFile)dsItem).id.ToString()));\n                        IdGamesGameFile dsItemFull = IdGamesDataSourceAdapter.GetGameFiles(options).FirstOrDefault() as IdGamesGameFile;\n\n                        if (dsItemFull != null)\n                            Process.Start(string.Format(\"{0}?file={1}{2}\", AppConfiguration.IdGamesUrl, dsItemFull.dir, dsItemFull.FileName));\n                    }\n                    catch (WebException)\n                    {\n                        ShowBadConnectionError();\n                    }\n                }\n            }\n        }\n\n        private void dlItem_DownloadCompleted(object sender, AsyncCompletedEventArgs e)\n        {\n            HandleDownloadComplete(sender, e);\n        }\n\n        private async void HandleDownloadComplete(object sender, AsyncCompletedEventArgs e)\n        {\n            if (!e.Cancelled)\n            {\n                IGameFileDownloadable dlFile = sender as IGameFileDownloadable;\n\n                if (e.Error != null)\n                {\n                    StyledMessageBox.Show(this, e.Error.Message + \"\\n\\nIf this error keeps occuring try chaning your mirror in the Settings menu.\", \"Download Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n                else\n                {\n                    if (dlFile != null)\n                        await WriteDownloadFile(dlFile);\n                }\n\n                try\n                {\n                    IDisposable dlDispose = sender as IDisposable;\n                    if (dlDispose != null)\n                        dlDispose.Dispose();\n                }\n                catch (Exception ex)\n                {\n                    Util.DisplayUnexpectedException(this, ex);\n                }\n            }\n        }\n\n        private async Task WriteDownloadFile(IGameFileDownloadable dlFile)\n        {\n            try\n            {\n                FileInfo fi = new FileInfo(Path.Combine(AppConfiguration.TempDirectory.GetFullPath(), dlFile.FileName));\n                fi.CopyTo(Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), dlFile.FileName), true);\n                fi.Delete();\n\n                await SyncLocalDatabase(new string[] { fi.Name }, FileManagement.Managed, true);\n            }\n            catch (IOException)\n            {\n                StyledMessageBox.Show(this, string.Format(\"The file {0} is in use and cannot be written.\", dlFile.FileName),\n                    \"File Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n            catch (Exception ex)\n            {\n                Util.DisplayUnexpectedException(this, ex);\n            }\n        }\n\n        private void downloadToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleDownload(AppConfiguration.TempDirectory);\n        }\n\n        private void editToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleEdit();\n        }\n\n        private void tabControl_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            HandleTabSelectionChange();\n        }\n\n        private void HandleTabSelectionChange()\n        {\n            if (tabControl.SelectedTab == null)\n                return;\n            \n            m_lastSelectedTabView?.GameFileViewControl.SetVisible(false);\n\n            ITabView tabView = GetCurrentTabView();\n            if (tabView == null)\n                return;\n\n            bool isIdGamesTab = tabView is IdGamesTabViewCtrl;\n            ctrlSearch.SetSearchText(GetTabSearchText(tabView.Key.ToString()), !isIdGamesTab);\n\n            m_lastSelectedTabView = tabView;\n            btnPlay.Enabled = tabView.IsPlayAllowed;\n            chkIncludeAll.Enabled = tabView.IsAutoSearchAllowed;\n\n            if (isIdGamesTab && !m_idGamesLoaded)\n            {\n                tabView.SetGameFiles();\n                m_idGamesLoaded = true;\n            }\n\n            tabView.GameFileViewControl.Focus();\n            tabView.GameFileViewControl.SetVisible(true);\n            AppConfiguration.LastSelectedTabIndex = tabControl.SelectedIndex;\n\n            SetSelectedTabText(tabView);\n            HandleSelectionChange(tabView.GameFileViewControl, false);            \n        }\n\n        private void SetSelectedTabText(ITabView tabView)\n        {\n            if (tabControl.SelectedTab != null)\n                lblSelectedTag.Text = $\"{tabControl.SelectedTab.Text.Trim()} ({tabView.GameFileViewControl.DataSource.Count()} Files)\";\n        }\n\n        private ITabView GetCurrentTabView()\n        {\n            return tabControl.SelectedTab.Controls[0] as ITabView;\n        }\n\n        private void sourcePortsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleEditSourcePorts(false);\n        }\n\n        private void viewWebPageToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleViewWebPage();\n        }\n\n        private void btnDownloads_Click(object sender, EventArgs e)\n        {\n            DisplayDownloads();\n        }\n\n        private void btnTags_Click(object sender, EventArgs e)\n        {\n            DisplayTags();\n        }\n\n        private void btnUpdate_Click(object sender, EventArgs e)\n        {\n            DisplayUpdate();\n        }\n\n        private void HandleEditSourcePorts(bool initSetup)\n        {\n            SourcePortViewForm form = new SourcePortViewForm(DataSourceAdapter, AppConfiguration, GetAdditionalTabViews().ToArray(), SourcePortLaunchType.SourcePort);\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.SourcePortLaunched += form_SourcePortLaunched;\n\n            if (initSetup)\n                form.DisplayInitSetupButton();\n\n            form.ShowDialog(this);\n            HandleSelectionChange(GetCurrentViewControl(), true);\n        }\n\n        private void HandleEditDoom64()\n        {\n            SourcePortEditForm editForm = new SourcePortEditForm(DataSourceAdapter, GetAdditionalTabViews().ToArray(), SourcePortLaunchType.Doom64);\n            editForm.StartPosition = FormStartPosition.CenterParent;\n\n            ISourcePortData sourcePort = DataSourceAdapter.GetDoom64(false).FirstOrDefault();\n            bool isNew = sourcePort == null;\n            if (!isNew)\n            {\n                editForm.SetDataSource(sourcePort);\n\n                if (editForm.ShowDialog(this) == DialogResult.OK)\n                {\n                    editForm.UpdateDataSource(sourcePort);\n                    DataSourceAdapter.UpdateSourcePort(sourcePort);\n                }\n            } \n            else // new\n            {\n                if (editForm.ShowDialog(this) == DialogResult.OK)\n                {\n                    var newSourcePort = new SourcePortData();\n                    editForm.UpdateDataSource(newSourcePort);\n                    newSourcePort.LaunchType = SourcePortLaunchType.Doom64;\n                    DataSourceAdapter.InsertSourcePort(newSourcePort);\n                }\n            }\n\n            // var doom64Directory = Path.GetDirectoryName(sourcePort.GetFullExecutablePath());\n            //var wadFile = Path.Combine(doom64Directory, \"DOOM64.WAD\");\n        }\n\n        private void HandleEditUtilities()\n        {\n            SourcePortViewForm form = new SourcePortViewForm(DataSourceAdapter, AppConfiguration, GetAdditionalTabViews().ToArray(), SourcePortLaunchType.Utility);\n            form.ShowPlayButton(false);\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.ShowDialog(this);\n\n            RebuildUtilityToolStrip();\n        }\n\n        void form_SourcePortLaunched(object sender, EventArgs e)\n        {\n            SourcePortViewForm form = sender as SourcePortViewForm;\n\n            if (form != null && form.GetSelectedSourcePort() != null)\n                HandlePlay(null, form.GetSelectedSourcePort());\n        }\n\n        private void DisplayDownloads()\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            Popup popup = new Popup(m_downloadView)\n            {\n                Width = dpiScale.ScaleIntX(300),\n                Height = m_downloadView.Height\n            };\n            popup.Show(btnDownloads);\n        }\n\n        private void DisplayUpdate()\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            Popup popup = new Popup(m_updateControl)\n            {\n                Width = dpiScale.ScaleIntX(300),\n                Height = m_updateControl.Height\n            };\n            popup.Show(btnUpdate);\n        }\n\n        private void DisplayTags()\n        {\n            if (m_tagSelectControl.Pinned)\n                return;\n\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            m_tagSelectControl.ClearSelections();\n            m_tagPopup = new Popup(m_tagSelectControl)\n            {\n                Width = dpiScale.ScaleIntX((int)(Width * AppConfiguration.SplitTagSelect)),\n                Height = Height - PointToClient(btnTags.PointToScreen(btnTags.Location)).Y - btnTags.Height - dpiScale.ScaleIntY(40)\n            };\n            m_tagPopup.Show(btnTags);\n        }\n\n        private void settingsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            bool success = false;\n            bool firstRun = true;\n            DialogResult result;\n\n            do\n            {\n                success = ShowSettings(firstRun, out result);\n                firstRun = false;\n            }\n            while (!success);\n        }\n\n        private bool ShowSettings(bool allowCancel, out DialogResult result)\n        {\n            SettingsForm form = new SettingsForm(DataSourceAdapter, AppConfiguration);\n            form.SetCancelAllowed(allowCancel);\n            form.StartPosition = FormStartPosition.CenterParent;\n            result = form.ShowDialog(this);\n\n            if (result == DialogResult.OK)\n            {\n                try\n                {\n                    AppConfiguration.Refresh();\n                }\n                catch (DirectoryNotFoundException ex)\n                {\n                    StyledMessageBox.Show(this, string.Format(\"The directory {0} was not found. DoomLauncher will not operate correctly with invalid paths. \" +\n                        \"Make sure the directory you are setting contains all folders required (Demos, SaveGames, Screenshots, Temp)\", ex.Message),\n                        \"Invalid Directory\",\n                        MessageBoxButtons.OK, MessageBoxIcon.Error);\n                    return false;\n                }\n                catch (Exception ex)\n                {\n                    Util.DisplayUnexpectedException(this, ex);\n                    return false;\n                }\n\n                RefreshConfigItems();\n                HandleSelectionChange(GetCurrentViewControl(), true);\n            }\n\n            return true;\n        }\n\n        private void RefreshConfigItems()\n        {\n            IdGamesDataSourceAdapter = new IdGamesDataAdapater(AppConfiguration.IdGamesUrl, AppConfiguration.ApiPage, AppConfiguration.MirrorUrl);\n\n            if (m_tabHandler != null)\n            {\n                ITabView tabView = m_tabHandler.TabViews.FirstOrDefault(x => x is IdGamesTabViewCtrl);\n                if (tabView != null)\n                    tabView.Adapter = IdGamesDataSourceAdapter;\n            }\n\n            ctrlAssociationView.Initialize(DataSourceAdapter, AppConfiguration);\n            SetShowTabHeaders();\n        }\n\n        private void CtrlAssociationView_RequestScreenshots(object sender, RequestScreenshotsEventArgs e)\n        {\n            List<IFileData> screens = DataSourceAdapter.GetFiles(e.GameFile, FileType.Screenshot).ToList();\n            ctrlAssociationView.SetScreenshots(screens);\n        }\n\n        private void addFilesToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleAddFiles();\n        }\n\n        private void addDirectoryToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleAddDirectory();\n        }\n\n        private async void HandleAddDirectory()\n        {\n            await HandleAddFiles(AddFileType.GameFile, Array.Empty<string>(), \"Select Folder\", browseDirectory: true);\n        }\n\n        private async void HandleAddFiles()\n        {\n            await HandleAddFiles(AddFileType.GameFile, new string[] { \"Zip\", \"WAD\", \"pk3\", \"rar\", \"7z\", \"txt\", \"zdl\" }, \"Select Game Files\");\n        }\n\n        private async void addIWADsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            await HandleAddIWads();\n        }\n\n        private async Task HandleAddIWads()\n        {\n            await HandleAddFiles(AddFileType.IWad, new string[] { \"WAD\", \"iwad\", \"ipk3\" }, \"Select IWADs\");\n        }\n\n        private void addDoom64ToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleEditDoom64();\n        }\n\n        private void UpdateLocal()\n        {\n            foreach (ITabView tab in m_tabHandler.TabViews)\n                UpdateLocalTabData(tab);\n        }\n\n        private void UpdateLocalTabData(ITabView tab)\n        {\n            if (!tab.IsLocal)\n                return;\n            \n            if (m_savedTabSearches.ContainsKey(tab))\n                tab.SetGameFiles(m_savedTabSearches[tab]);\n            else\n                tab.SetGameFiles();\n        }\n\n        private IGameFile[] m_pendingZdlFiles;\n\n        // A non-null value for pullTitlepic will override the users configuration value for AutomaticallyPullTitlepic.\n        // The value will be restored on completion.\n        private async Task HandleAddGameFiles(AddFileType type, string[] files, \n            ITagData tag = null, FileManagement? overrideManagement = null, bool? overridePullTitlepic = null)\n        {\n            Activate();\n            if (!VerifyAddFiles(type, files))\n                return;\n\n            List<string> libraryFiles = new List<string>(files);\n            string[] zdlFiles = GetZdlFiles(files).ToArray();\n            libraryFiles = libraryFiles.Except(zdlFiles).ToList();\n\n            string[] zdlLibraryFiles = HandleZdlFiles(zdlFiles);\n            libraryFiles.AddRange(zdlLibraryFiles);\n            //only launch zdl file if it's the only one\n            if (m_launchFile == null && zdlLibraryFiles.Length == 1 && libraryFiles.Count == 1)\n            {\n                FileInfo fi = new FileInfo(zdlLibraryFiles[0]);\n                m_launchFile = fi.Name.Replace(fi.Extension, \".zip\");\n            }\n\n            string[] missingFiles = libraryFiles.Where(x => !File.Exists(x) && !Directory.Exists(x)).ToArray();\n\n            if (missingFiles.Length > 0)\n            {\n                StringBuilder sb = new StringBuilder();\n                Array.ForEach(missingFiles, x => sb.Append(x + \"\\n\"));\n                StyledMessageBox.Show(this, \"The following files were not found and will not be added:\" + Environment.NewLine + Environment.NewLine +\n                    sb.ToString(), \"Files Not Found\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                libraryFiles = libraryFiles.Except(missingFiles).ToList();\n            }\n\n            string[] libraryFilesAsDirectories = libraryFiles.Where(x => Util.IsDirectory(x)).ToArray();\n            string[] libraryFilesAsFiles = libraryFiles.Except(libraryFilesAsDirectories).ToArray();\n\n            if (libraryFiles.Count > 0)\n            {\n                bool saveTitlepicValue = AppConfiguration.AutomaticallyPullTitlpic;\n                if (overridePullTitlepic != null)\n                    AppConfiguration.AutomaticallyPullTitlpic = overridePullTitlepic.Value;\n\n                if (libraryFilesAsFiles.Length > 0)\n                    await HandleCopyFiles(type, libraryFilesAsFiles, overrideManagement ?? GetUserSelectedFileManagement(), tag);\n                if (libraryFilesAsDirectories.Length > 0)\n                    await HandleCopyFiles(type, libraryFilesAsDirectories, FileManagement.Unmanaged, tag);\n\n                AppConfiguration.AutomaticallyPullTitlpic = saveTitlepicValue;\n            }\n            else if (m_zdlInvalidFiles.Count > 0)\n            {\n                DisplayInvalidFilesError(m_zdlInvalidFiles);\n            }\n        }\n\n        private bool VerifyAddFiles(AddFileType type, string[] files)\n        {\n            List<string> warnFiles = new List<string>();\n\n            foreach (string file in files)\n            {\n                IWadInfo info = IWadInfo.GetIWadInfo(file);\n\n                if (type == AddFileType.GameFile && info != null)\n                    warnFiles.Add(Path.GetFileName(file));\n                else if (type == AddFileType.IWad && info == null)\n                    warnFiles.Add(Path.GetFileName(file));\n            }\n\n            if (warnFiles.Count > 0)\n            {\n                StringBuilder warn = new StringBuilder();\n                if (type == AddFileType.GameFile)\n                    warn.Append(\"The following file(s) were detected be IWADS and are being added as game files:\");\n                else\n                    warn.Append(\"The following files(s) were not detected to be IWADS and are being added as IWADS:\");\n\n                warn.AppendLine();\n                warn.Append(string.Join(\", \", warnFiles));\n                warn.Append(\"\\n\\nContinue?\");\n                                \n                bool ret = StyledMessageBox.Show(this, warn.ToString(), \"File Verification\", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes;\n                return ret;\n            }\n\n            return true;\n        }\n\n        private async Task HandleAddFiles(AddFileType type, string[] extensions, string dialogTitle, bool browseDirectory = false)\n        {\n            if (browseDirectory)\n            {\n                FolderBrowserDialog folderDialog = new FolderBrowserDialog();\n                if (folderDialog.ShowDialog(this) == DialogResult.OK)\n                    await HandleAddGameFiles(type, new string[] { folderDialog.SelectedPath });\n                return;\n            }\n\n            OpenFileDialog dialog = new OpenFileDialog();\n            dialog.Title = dialogTitle;\n            dialog.Multiselect = true;\n            dialog.Filter = GetDialogFilter(\"Game Files\", extensions);\n\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n                await HandleAddGameFiles(type, dialog.FileNames);\n        }\n\n        private async Task HandleCopyFiles(AddFileType type, string[] fileNames, FileManagement fileManagement, ITagData tag)\n        {\n            var copyProgressBar = ProgressBarStart(ProgressBarType.Copy);\n            FileAddResults fileAddResults = await CopyFiles(fileNames, fileManagement, copyProgressBar);\n            string[] files = fileAddResults.GetAllFiles().ToArray();\n\n            ProgressBarEnd(ProgressBarType.Copy);\n\n            switch (type)\n            {\n                case AddFileType.GameFile:\n                    await SyncLocalDatabase(files, fileManagement, true, tag);\n                    break;\n                case AddFileType.IWad:\n                    var handler = await SyncLocalDatabase(files, fileManagement, fileAddResults.ReplacedFiles.Count > 0);\n                    SyncIWads(handler.AddedGameFiles);\n                    break;\n                default:\n                    break;\n            }\n\n            if (fileAddResults.Errors.Count > 0)\n            {\n                string start = fileAddResults.Errors.Count > 1 ? string.Concat(\"Errors:\", Environment.NewLine) : string.Empty;\n                string tab = fileAddResults.Errors.Count > 1 ? \"\\t\" : string.Empty;\n                StringBuilder sb = new StringBuilder(start);\n                fileAddResults.Errors.ForEach(x => sb.Append(string.Concat(tab, x.FileName, \": \", x.Error, Environment.NewLine)));\n                MessageBox.Show(this, sb.ToString(), \"Failed to Add\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n\n        private async Task<FileAddResults> CopyFiles(string[] fileNames, FileManagement fileManagement, ProgressBarForm progressBar)\n        {\n            FileAddResults fileAddResults = new FileAddResults();\n            if (fileManagement == FileManagement.Managed)\n                await Task.Run(() => fileAddResults = CopyFiles(fileNames, AppConfiguration.GameFileDirectory.GetFullPath(), progressBar));\n            else\n                fileAddResults = UnmanagedAddCheck(fileNames, AppConfiguration.GameFileDirectory.GetFullPath());\n            return fileAddResults;\n        }\n\n        private FileAddResults UnmanagedAddCheck(string[] fileNames, string directory)\n        {\n            FileAddResults results = new FileAddResults();\n\n            string managedError = \"File already exists as a managed file.\";\n            string unmanagedError = \"File already exists as an unmanaged file.\";\n\n            foreach (string fileName in fileNames)\n            {\n                string zipName = Path.Combine(directory, Path.GetFileNameWithoutExtension(fileName) + \".zip\");\n                IGameFile existingGameFile = DataSourceAdapter.GetGameFile(fileName);\n\n                if (File.Exists(zipName))\n                {\n                    results.Errors.Add(new FileError { FileName = fileName, Error = managedError  });\n                }\n                else if (existingGameFile != null)\n                {\n                    if (!existingGameFile.IsUnmanaged() && Path.IsPathRooted(existingGameFile.FileName))\n                        results.Errors.Add(new FileError { FileName = fileName, Error = unmanagedError });\n                    else\n                        results.NewFiles.Add(fileName);\n                }\n                else\n                {\n                    results.NewFiles.Add(fileName);\n                }\n            }\n\n            return results;\n        }\n\n        private FileManagement GetUserSelectedFileManagement()\n        {\n            FileManagement fileManagement = AppConfiguration.FileManagement;\n            if (fileManagement == FileManagement.Prompt)\n            {\n                Activate();\n                FileManagementSelect select = new FileManagementSelect();\n                select.StartPosition = FormStartPosition.CenterParent;\n                select.ShowDialog(this);\n                fileManagement = select.GetSelectedFileManagement();\n            }\n            return fileManagement;\n        }\n\n        private List<InvalidFile> m_zdlInvalidFiles = new List<InvalidFile>();\n\n        private string[] HandleZdlFiles(string[] files)\n        {\n            m_zdlInvalidFiles = new List<InvalidFile>();\n            List<string> libraryFiles = new List<string>();\n            List<IGameFile> pendingGameFiles = new List<IGameFile>();\n            ZdlParser parser = new ZdlParser(DataSourceAdapter.GetSourcePorts(), DataSourceAdapter.GetIWads());\n\n            foreach (string file in files)\n            {\n                IGameFile[] gameFiles = parser.Parse(File.ReadAllText(file));\n\n                foreach (IGameFile gameFile in gameFiles)\n                {\n                    FileInfo fi = new FileInfo(gameFile.FileName);\n\n                    libraryFiles.Add(gameFile.FileName);\n                    gameFile.FileName = fi.Name.Replace(fi.Extension, \".zip\"); //set to name only, doomlauncher uses zip extension\n                    pendingGameFiles.Add(gameFile);\n\n                    if (gameFile == gameFiles.First()) //first file is the 'launch' file and rest are 'additional files' as far as we are concerned\n                    {\n                        StringBuilder sb = new StringBuilder();\n                        Array.ForEach(gameFiles.Select(x => Path.GetFileName(x.FileName).Replace(Path.GetExtension(x.FileName), \".zip\")).ToArray(),\n                            x => sb.Append(x + ';'));\n                        sb.Remove(sb.Length - 1, 1);\n                        gameFile.SettingsFiles = sb.ToString();\n                    }\n                }\n\n                if (parser.Errors.Length > 0)\n                    m_zdlInvalidFiles.Add(new InvalidFile(file, string.Join(\", \", parser.Errors)));\n            }\n\n            m_pendingZdlFiles = pendingGameFiles.ToArray();\n            return libraryFiles.ToArray();\n        }\n\n        private IEnumerable<string> GetZdlFiles(string[] files)\n        {\n            return files.Where(x => Path.GetExtension(x).Equals(\".zdl\", StringComparison.OrdinalIgnoreCase));\n        }\n\n        private string GetDialogFilter(string name, string[] extensions)\n        {\n            StringBuilder sb = new StringBuilder();\n\n            foreach (string ext in extensions)\n            {\n                sb.Append(string.Format(\"*.{0};\", ext.ToLower()));\n            }\n\n            sb.Remove(sb.Length - 1, 1);\n\n            return string.Format(\"{0} ({1})|{1}|All Files (*.*)|*.*\", name, sb.ToString());\n        }\n\n        private FileAddResults CopyFiles(string[] files, string directory, ProgressBarForm progressBar)\n        {\n            FileAddResults results = new FileAddResults();\n            HashSet<string> addedNames = new HashSet<string>();\n\n            List<string> fileNames = files.ToList();\n            fileNames.Sort();\n            int count = 0;\n            bool promptOverwrite = true;\n            bool overwrite = false;\n\n            foreach (string file in fileNames)\n            {\n                if (m_progressBarCancelled)\n                    break;\n\n                // Ignore. This is the same file and should be from a Resync call.\n                if (file.StartsWith(AppConfiguration.GameFileDirectory.GetFullPath()))\n                {\n                    results.ReplacedFiles.Add(Path.GetFileName(file));\n                    continue;\n                }\n\n                if (progressBar != null)\n                    UpdateProgressBar(progressBar, $\"Copying {file}...\", Convert.ToInt32(count / (double)fileNames.Count * 100));\n\n                FileInfo fi = new FileInfo(file);\n                if (ArchiveUtil.IsTransformableToZip(fi.Extension))\n                {\n                    if (!ArchiveUtil.CreateZipFrom(fi, AppConfiguration.TempDirectory.GetFullPath(), out fi))\n                    {\n                        results.Errors.Add(new FileError { FileName = file, Error = \"Failed to create zip from file.\" });\n                        continue;\n                    }\n                }\n\n                string baseName = fi.Name.Replace(fi.Extension, string.Empty);\n                if (!IsZipFile(fi) && addedNames.Contains(baseName)) //archive with this name exists, add the file (match .txt with .wad etc)\n                    AddEntryToExistingFile(directory, file, fi, baseName);\n\n                if (!addedNames.Contains(baseName))\n                    addedNames.Add(baseName);\n\n                string zipName = Path.Combine(directory, fi.Name);\n                bool isZip = IsZipFile(fi);\n\n                if (!isZip)\n                    zipName = Path.Combine(directory, baseName + \".zip\");\n\n                IEnumerable<string> existingFileNames = DataSourceAdapter.GetGameFileNames();\n\n                try\n                {\n                    string existingFile = existingFileNames.FirstOrDefault(x => Path.GetFileName(x).Equals(fi.Name));\n\n                    if (existingFile != null && GameFile.IsUnmanaged(existingFile))\n                    {\n                        results.Errors.Add(new FileError { FileName = baseName, Error = \"File already exists as an unmanaged file.\" });\n                    }\n                    else if (File.Exists(zipName))\n                    {\n                        if (promptOverwrite)\n                        {\n                            Tuple<bool, bool> result = PromptCopyFileOverwrite(baseName);\n                            overwrite = result.Item1;\n                            promptOverwrite = !result.Item2;\n                        }\n\n                        if (overwrite)\n                        {\n                            results.ReplacedFiles.Add(baseName + \".zip\");\n                            if (isZip)\n                                fi.CopyTo(zipName, true);\n                            else\n                                HandleNonZipReplacement(fi, zipName);\n                        }\n                    }\n                    else\n                    {\n                        results.NewFiles.Add(baseName + \".zip\");\n\n                        if (IsZipFile(fi))\n                        {\n                            fi.CopyTo(Path.Combine(directory, fi.Name));\n                        }\n                        else\n                        {\n                            string newZipName = Path.Combine(directory, baseName + \".zip\");\n                            AddZipEntry(file, fi.Name, newZipName);\n                        }\n                    }\n                }\n                catch (IOException)\n                {\n                    results.Errors.Add(new FileError { FileName = baseName, Error = \"File is in use.\" });\n                }\n                catch (Exception ex)\n                {\n                    results.Errors.Add(new FileError { FileName = baseName, Error = string.Concat(\"Unknown error: \", ex.HResult) }); //Shouldn't happen\n                }\n\n                count++;\n            }\n\n            return results;\n        }\n\n        private static void AddZipEntry(string file, string name, string newZipName)\n        {\n            using (ZipArchive za = ZipFile.Open(newZipName, ZipArchiveMode.Create))\n            {\n                using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))\n                {\n                    var entry = za.CreateEntry(name);\n                    using (var destStream = entry.Open())\n                        fileStream.CopyTo(destStream);\n                }\n            }\n        }\n\n        private void HandleNonZipReplacement(FileInfo fi, string zipName)\n        {\n            string tempFile = Path.Combine(AppConfiguration.TempDirectory.GetFullPath(), fi.Name);\n            if (File.Exists(tempFile))\n                File.Delete(tempFile);\n\n            fi.CopyTo(tempFile);\n\n            using (ZipArchive za = ZipFile.Open(zipName, File.Exists(zipName) ? ZipArchiveMode.Update : ZipArchiveMode.Create))\n            {\n                var existingEntries = za.Entries.Where(x => x.Name == fi.Name).ToArray();\n\n                if (existingEntries.Any())\n                {\n                    foreach (var entry in existingEntries)\n                    {\n                        entry.Delete();\n                        za.CreateEntryFromFile(tempFile, Path.Combine(Path.GetDirectoryName(entry.FullName), fi.Name));\n                    }\n                }\n                else\n                {\n                    za.CreateEntryFromFile(tempFile, fi.Name);\n                }\n            }\n        }\n\n        private static void AddEntryToExistingFile(string directory, string file, FileInfo fi, string baseName)\n        {\n            string newZipName = Path.Combine(directory, baseName, \".zip\");\n\n            if (File.Exists(newZipName))\n            {\n                using (ZipArchive za = ZipFile.Open(newZipName, ZipArchiveMode.Update))\n                {\n                    if (!za.Entries.Any(x => x.Name == fi.Name)) //make sure this file does not already exist in the archive \n                        za.CreateEntryFromFile(file, fi.Name);\n                }\n            }\n        }\n\n        private Tuple<bool, bool> PromptCopyFileOverwrite(string file)\n        {\n            if (InvokeRequired)\n            {\n                return (Tuple<bool, bool>)Invoke(new Func<string, Tuple<bool, bool>>(PromptCopyFileOverwrite), new object[] { file });\n            }\n            else\n            {\n                MessageCheckBox msg = new MessageCheckBox(\"Overwrite\", string.Format(\"The file {0} already exists. Overwrite?\", file),\n                    \"Accept For All\", SystemIcons.Question, MessageBoxButtons.OKCancel);\n\n                if (msg.ShowDialog() == DialogResult.OK)\n                    return new Tuple<bool, bool>(true, msg.Checked);\n\n                return new Tuple<bool, bool>(false, msg.Checked);\n            }\n        }\n\n        private static bool IsZipFile(FileInfo fi)\n        {\n            return fi.Extension.Equals(\".zip\", StringComparison.OrdinalIgnoreCase);\n        }\n\n        void m_progressBarFormCopy_Cancelled(object sender, EventArgs e)\n        {\n            m_progressBarCancelled = true;\n            if (sender is ProgressBarForm progressBarForm)\n                ProgressBarEnd(ProgressBarType.Copy);\n        }\n\n        private void UpdateProgressBar(ProgressBarForm form, string text, int value)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(new Action<ProgressBarForm, string, int>(UpdateProgressBar), new object[] { form, text, value });\n            }\n            else\n            {\n                form.DisplayText = text;\n                form.Value = value;\n            }\n        }\n\n        private async void ctrlView_DragDrop(object sender, DragEventArgs e)\n        {\n            if (sender is IGameFileView ctrl && e.Data.GetData(DataFormats.FileDrop) is string[] files)\n            {\n                ITagData tag = null;\n                if (m_tabHandler.TabViewForControl(ctrl) is TagTabView tagTabView)\n                    tag = tagTabView.TagDataSource;                \n                if (ctrl.DoomLauncherParent != null && ctrl.DoomLauncherParent is IWadTabViewCtrl)\n                    await HandleAddGameFiles(AddFileType.IWad, files);\n                else\n                    await HandleAddGameFiles(AddFileType.GameFile, files, tag);\n            }\n        }\n\n        private void ctrlView_DragEnter(object sender, DragEventArgs e)\n        {\n            if (e.Data.GetDataPresent(DataFormats.FileDrop))\n                e.Effect = DragDropEffects.Copy;\n        }\n\n        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            AboutBox about = new AboutBox();\n            about.ShowDialog(this);\n        }\n\n        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)\n        {\n            HandleFormClosing();\n        }\n\n        private void MnuLocal_Opening(object sender, CancelEventArgs e)\n        {\n            RebuildTagToolStrip();\n\n            if (!(GetCurrentViewControl() is IGameFileSortableView sortableView))\n                return;\n\n            ToolStripMenuItem sortToolStrip = GetToolStripItem(mnuLocal, \"Sort By\");\n            IGameFileView view = GetCurrentViewControl();\n            sortToolStrip.Visible = view is GameFileTileViewControl;\n\n            SetVisibleLocalMenuItems(view);\n\n            for (int i = 0; i < GameFileViewFactory.DefaultColumnTextFields.Length; i++)\n            {\n                ColumnField columnField = GameFileViewFactory.DefaultColumnTextFields[i];\n                string text = columnField.Title;\n\n                if (columnField.DataKey.Equals(sortableView.GetSortedColumnKey(), StringComparison.InvariantCultureIgnoreCase) && sortableView.GetColumnSort(sortableView.GetSortedColumnKey()) != SortOrder.None)\n                {\n                    if (sortableView.GetColumnSort(sortableView.GetSortedColumnKey()) == SortOrder.Ascending)\n                        text += \" ▲\";\n                    else\n                        text += \" ▼\";\n                }\n\n                sortToolStrip.DropDownItems[i].Text = text;\n            }\n\n            Stylizer.StylizeControl(mnuLocal, DesignMode);\n        }\n\n        private void SetVisibleLocalMenuItems(IGameFileView view)\n        {\n            IGameFile[] gameFiles = SelectedItems(view);\n            if (gameFiles.Length == 0)\n                return;\n\n            bool nonDirectory = gameFiles.All(x => !x.IsDirectory());\n            foreach (var item in GetNonDirectoryMenuItems())\n                item.Visible = nonDirectory;\n        }\n\n        private ToolStripMenuItem[] GetNonDirectoryMenuItems()\n        {\n            return new ToolStripMenuItem[]\n            {\n                GetToolStripItem(mnuLocal, MenuConstants.Rename),\n                //GetToolStripItem(mnuLocal, MenuConstants.OpenArchive),\n                GetToolStripItem(mnuLocal, MenuConstants.Utility)\n            };\n        }\n\n        ToolStripMenuItem GetToolStripItem(ContextMenuStrip strip, string text) =>\n            strip.Items.Cast<ToolStripItem>().FirstOrDefault(x => x.Text == text) as ToolStripMenuItem;\n\n        private void newTagToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleManageTags();\n        }\n\n        private void manageTagsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleManageTags();\n        }\n\n        private void sortToolStripItem_Click(object sender, EventArgs e)\n        {\n            if (!(GetCurrentViewControl() is IGameFileSortableView sortableView))\n                return;\n\n            IGameFileView view = GetCurrentViewControl();\n            ToolStripItem strip = sender as ToolStripItem;\n            ToolStripMenuItem sortToolStrip = GetSortByToolStrip();\n\n            int index = 0;\n            for (int i = 0; i < sortToolStrip.DropDownItems.Count; i++)\n            {\n                if (sortToolStrip.DropDownItems[i] == strip)\n                {\n                    index = i;\n                    break;\n                }\n            }\n\n            ColumnField columnField = GameFileViewFactory.DefaultColumnTextFields[index];\n            SortOrder sortOrder;\n\n            if (sortableView.GetColumnSort(columnField.DataKey) == SortOrder.Descending)\n                sortOrder = SortOrder.Ascending;\n            else\n                sortOrder = SortOrder.Descending;\n\n            sortableView.SetSortedColumn(columnField.DataKey, sortOrder);\n            view.DataSource = GetViewSort(view, view.DataSource);\n        }\n\n        private void TabView_DataSourceChanging(object sender, GameFileListEventArgs e)\n        {\n            if (sender is ITabView tabView)\n            {\n                if (!(sender is IWadTabViewCtrl))\n                    e.GameFiles = RemoveExcludeTags(tabView, e.GameFiles);\n                e.GameFiles = GetViewSort(tabView.GameFileViewControl, e.GameFiles);\n            }\n        }\n\n        private void TabView_DataSourceChanged(object sender, GameFileListEventArgs e)\n        {\n            if (sender is ITabView tabView && tabView.Key == GetCurrentTabView().Key)\n                SetSelectedTabText(tabView);\n        }\n\n        private IEnumerable<IGameFile> RemoveExcludeTags(ITabView tabView, IEnumerable<IGameFile> gameFiles)\n        {\n            if (chkIncludeAll.Checked)\n                return gameFiles;\n\n            ITagData currentTag = null;\n            if (tabView is TagTabView tagTabView)\n                currentTag = tagTabView.TagDataSource;\n\n            List<IGameFile> gameFilesInclude = new List<IGameFile>(gameFiles.Count());\n\n            foreach (IGameFile gameFile in gameFiles)\n            {\n                var tags = DataCache.Instance.TagMapLookup.GetTags(gameFile);\n\n                // This tab is for this tag, include it\n                if (currentTag != null && currentTag.ExcludeFromOtherTabs && tags.Any(x => x.TagID == currentTag.TagID))\n                {\n                    gameFilesInclude.Add(gameFile);\n                    continue;\n                }\n\n                if (!tags.Any(x => x.ExcludeFromOtherTabs))\n                    gameFilesInclude.Add(gameFile);\n            }\n\n            return gameFilesInclude;\n        }\n\n        private IEnumerable<IGameFile> GetViewSort(IGameFileView view, IEnumerable<IGameFile> gameFiles)\n        {\n            if (!(view is IGameFileSortableView sortableView) || string.IsNullOrEmpty(sortableView.GetSortedColumnKey()))\n                return gameFiles;\n\n            ColumnField columnField = GameFileViewFactory.DefaultColumnTextFields.FirstOrDefault(x => x.DataKey.Equals(sortableView.GetSortedColumnKey(), StringComparison.InvariantCultureIgnoreCase));\n\n            if (columnField != null)\n            {\n                var property = typeof(IGameFile).GetProperty(columnField.DataKey);\n                var sort = sortableView.GetColumnSort(sortableView.GetSortedColumnKey());\n\n                if (sort == SortOrder.Ascending)\n                    return gameFiles.OrderBy(x => property.GetValue(x));\n                else if (sort == SortOrder.Descending)\n                    return gameFiles.OrderByDescending(x => property.GetValue(x));\n            }\n\n            return gameFiles;\n        }\n\n        private void HandleManageTags()\n        {\n            TagForm form = new TagForm();\n            form.Init(DataSourceAdapter);\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.ShowDialog(this);\n\n            DataCache.Instance.TagMapLookup.Refresh(new ITagData[] { });\n\n            if (form.TagControl.AddedTags.Length > 0 && GameFileViewFactory.IsUsingColumnView)\n            {\n                UpdateColumnConfig(); //the ordered tab insert will use this column configuration\n                AppConfiguration.RefreshColumnConfig();\n            }\n\n            foreach (ITagData tag in form.TagControl.AddedTags)\n            {\n                if (tag.HasTab)\n                    OrderedTagTabInsert(tag);\n            }\n\n            foreach (ITagData tag in form.TagControl.EditedTags)\n            {\n                ITabView tabView = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(tag.TagID) && x is TagTabView);\n\n                if (tabView != null)\n                {\n                    if (tag.HasTab)\n                        m_tabHandler.UpdateTabTitle(tabView, tag.FavoriteName);\n                    else\n                        m_tabHandler.RemoveTab(tabView);\n                }\n                else\n                {\n                    if (tag.HasTab)\n                        OrderedTagTabInsert(tag);\n                }\n            }\n\n            UpdateTagColumnConfig(form.TagControl.EditedTags);\n\n            foreach (ITagData tag in form.TagControl.DeletedTags)\n            {\n                ITabView tabView = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(tag.TagID) && x is TagTabView);\n\n                if (tabView != null)\n                    m_tabHandler.RemoveTab(tabView);\n            }\n\n            DataCache.Instance.UpdateTags();\n            UpdateTabOrder();\n\n            UpdateLocal();\n            HandleSelectionChange(GetCurrentViewControl(), false);\n        }\n\n        private void UpdateTabOrder()\n        {\n            int index = 1;\n            foreach (string name in TabKeys.KeyNames)\n            {\n                if (AppConfiguration.VisibleViews.Contains(name))\n                    index++;\n            }\n\n            foreach (var tag in DataCache.Instance.Tags)\n            {\n                if (!tag.HasTab)\n                    continue;\n\n                ITabView tabView = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(tag.TagID) && x is TagTabView);\n                if (tabView == null)\n                    continue;\n\n                int checkIndex = m_tabHandler.GetTabIndex(tabView);\n\n                if (checkIndex != -1 && checkIndex != index)\n                    m_tabHandler.SetTabIndex(index, tabView);\n\n                index++;\n            }\n        }\n\n        private void UpdateTagColumnConfig(ITagData[] editedTags)\n        {\n            ColumnConfig[] columnConfig = DataCache.Instance.GetColumnConfig();\n\n            foreach (ITagData tag in editedTags)\n            {\n                ITagData previousRevision = DataCache.Instance.PreviousTags.FirstOrDefault(x => x.TagID == tag.TagID);\n                if (previousRevision == null)\n                    continue;\n\n                var updateColumns = columnConfig.Where(x => x.Parent == previousRevision.Name);\n                foreach (var col in updateColumns)\n                    col.Parent = tag.Name;\n            }\n\n            IEnumerable<IConfigurationData> config = DataSourceAdapter.GetConfiguration();\n            DataCache.Instance.UpdateConfig(config, AppConfiguration.ColumnConfigName, SerializeColumnConfig(columnConfig.ToList()));\n            AppConfiguration.RefreshColumnConfig();\n        }\n\n        private void OrderedTagTabInsert(ITagData tag)\n        {\n            int start = m_tabHandler.TabViews.Length - 1;\n            int end = 1;\n\n            ITabView[] tabViews = m_tabHandler.TabViews;\n\n            while (start > end && tabViews[start] is TagTabView &&\n                tabViews[start].Title.CompareTo(tag.Name) > 0)\n            {\n                start--;\n            }\n\n            m_tabHandler.InsertTab(start + 1, CreateTagTab(GameFileViewFactory.DefaultColumnTextFields, DataCache.Instance.GetColumnConfig(), tag.FavoriteName, tag, true));\n        }\n\n        private void utilityToolStripItem_Click(object sender, EventArgs e)\n        {\n            ToolStripItem strip = sender as ToolStripItem;\n            var utilities = DataSourceAdapter.GetUtilities();\n            var utility = utilities.FirstOrDefault(x => x.Name == strip.Text);\n            if (utility == null)\n            {\n                MessageBox.Show(this, \"Failed to find the utility.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            LaunchData launchData = GetLaunchFiles(SelectedItems(GetCurrentViewControl()), checkActiveSessions: false);\n            if (!launchData.Success)\n            {\n                if (!string.IsNullOrEmpty(launchData.ErrorTitle))\n                    MessageBox.Show(this, launchData.ErrorDescription, launchData.ErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            UtilityHandler handler = new UtilityHandler(this, AppConfiguration, utility);\n            if (!handler.RunUtility(launchData.GameFile))\n                MessageBox.Show(this, \"The utility was an invalid application or not found.\", \"Invalid Utility\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n\n        private void doom64ToolStripItem_Click(object sender, EventArgs e)\n        {\n            ToolStripItem strip = sender as ToolStripItem;\n            var doom64s = DataSourceAdapter.GetDoom64();\n            var doom64 = doom64s.FirstOrDefault(x => x.Name == strip.Text);\n            if (doom64 == null)\n            {\n                MessageBox.Show(this, \"Failed to find Doom64.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            LaunchData launchData = GetLaunchFiles(SelectedItems(GetCurrentViewControl()), checkActiveSessions: false);\n            if (!launchData.Success)\n            {\n                if (!string.IsNullOrEmpty(launchData.ErrorTitle))\n                    MessageBox.Show(this, launchData.ErrorDescription, launchData.ErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            UtilityHandler handler = new UtilityHandler(this, AppConfiguration, doom64);\n            if (!handler.RunUtility(launchData.GameFile))\n                MessageBox.Show(this, \"The utility was an invalid application or not found.\", \"Invalid Utility\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n\n        private void tagToolStripItem_Click(object sender, EventArgs e)\n        {\n            if (!(sender is ToolStripMenuItem strip))\n                return;\n\n            // This is the tag that was clicked\n            ITagData tag = DataCache.Instance.Tags.FirstOrDefault(x => x.TagID.Equals(strip.Tag));\n            if (tag == null)\n                return;\n\n            IGameFile[] gameFiles = SelectedItems(GetCurrentViewControl());\n\n            if (strip.Checked)\n                DataCache.Instance.AddGameFileTag(gameFiles, tag, out List<IGameFile> alreadyTagged);\n            else \n                DataCache.Instance.RemoveGameFileTag(gameFiles, tag);\n\n            // Update mutable cache of tag mappings & publish an event\n            DataCache.Instance.TagMapLookup.Refresh(new ITagData[] { tag });\n            UpdateTagTabData(tag.TagID);\n\n            // Update the current view \n            foreach (IGameFile gameFile in gameFiles)\n                GetCurrentViewControl().UpdateGameFile(gameFile);\n\n            HandleSelectionChange(GetCurrentViewControl(), true);\n        }\n\n        private void playRandomToolStripMenuItem1_Click(object sender, EventArgs e)\n        {\n            CheckLastPlayRandom();\n\n            PlayRandomForm form = new PlayRandomForm();\n            form.Initialize(GetCurrentTabView(), AppConfiguration, m_lastPlayRandomFile, m_lastPlayRandomMap);\n            form.StartPosition = FormStartPosition.CenterParent;\n            if (form.ShowDialog(this) == DialogResult.OK)\n            {\n                if (form.GeneratedGameFile == null)\n                {\n                    MessageBox.Show(this, \"No file was generated.\", \"None Found\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                    return;\n                }\n\n                ITabView tabView = GetCurrentTabView();\n                if (form.SelectedType != PlayRandomType.CurrentTab)\n                {\n                    tabControl.SelectedTab = tabControl.TabPages[1];\n                    tabView = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(TabKeys.LocalKey));\n                    if (tabView == null)\n                        return;\n                }\n\n                tabView.GameFileViewControl.SelectedItem = form.GeneratedGameFile;\n                PlayOptions playOptions = form.ShowPlayDialog ? PlayOptions.ForceDialog : PlayOptions.None;\n                if (form.GeneratedGameFile != null)\n                {\n                    m_lastPlayRandomFile = form.GeneratedGameFile;\n                    m_lastPlayRandomMap = form.GeneratedMap;\n                    HandlePlay(new IGameFile[] { form.GeneratedGameFile }, map: form.GeneratedMap,\n                        playOptions: playOptions);\n                }\n            }\n        }\n\n        private void CheckLastPlayRandom()\n        {\n            if (m_lastPlayRandomFile == null || !m_lastPlayRandomFile.GameFileID.HasValue)\n            {\n                m_lastPlayRandomFile = null;\n                m_lastPlayRandomMap = null;\n                return;\n            }\n\n            var options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.GameFileID,\n                m_lastPlayRandomFile.GameFileID.Value.ToString()));\n            var existingFile = DataSourceAdapter.GetGameFiles(options).FirstOrDefault();\n            if (existingFile != null)\n                return;\n\n            m_lastPlayRandomFile = null;\n            m_lastPlayRandomMap = null;\n        }\n\n        private void UpdateTagTabData(int tagID)\n        {\n            UpdateTagTabData(new int[] { tagID });\n        }\n\n        private void UpdateTagTabData(IEnumerable<int> tagIDs)\n        {\n            foreach (var tagID in tagIDs)\n            {\n                ITabView tab = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(tagID) && x is TagTabView);\n\n                if (tab != null)\n                    tab.SetGameFiles();\n            }\n\n            ITabView untaggedView = m_tabHandler.TabViews.FirstOrDefault(x => x is UntaggedTabView);\n\n            if (untaggedView != null)\n                untaggedView.SetGameFiles();\n        }\n\n        private void showToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleSyncStatus();\n        }\n\n        private void ShowTextBoxForm(string title, string header, string text, bool dialog)\n        {\n            TextBoxForm form = new TextBoxForm();\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.Title = title;\n            form.HeaderText = header;\n            form.DisplayText = text;\n\n            if (dialog)\n                form.Show(this);\n            else\n                form.ShowDialog(this);\n        }\n\n        private void generateTextFileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            IGameFile file = SelectedItems(GetCurrentViewControl()).FirstOrDefault();\n            file = DataSourceAdapter.GetGameFile(file.FileName); //populate all the date for the file\n            if (file != null)\n                ShowTextFileGenerator(file);\n        }\n\n        private void generateTextFileToolStripMenuItem1_Click(object sender, EventArgs e)\n        {\n            ShowTextFileGenerator(null);\n        }\n\n        private void ShowTextFileGenerator(IGameFile file)\n        {\n            TxtGenerator generator = new TxtGenerator();\n            generator.SetData(DataSourceAdapter, file);\n            generator.StartPosition = FormStartPosition.CenterParent;\n            generator.ShowDialog(this);\n        }\n\n        private void renameToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleRename();\n        }\n\n        private string m_typeSearch;\n        private DateTime m_typeSearchLastPress;\n\n        private void HandleKeyPress(KeyPressEventArgs e)\n        {\n            if (GetCurrentViewControl() != null)\n            {\n                if (m_typeSearch != null && DateTime.Now.Subtract(m_typeSearchLastPress).TotalMilliseconds > 700)\n                    m_typeSearch = null;\n\n                if (m_typeSearch == null)\n                    m_typeSearch = char.ToLower(e.KeyChar).ToString();\n                else\n                    m_typeSearch += char.ToLower(e.KeyChar).ToString();\n\n                m_typeSearchLastPress = DateTime.Now;\n\n                if (!SelectItem(GetCurrentViewControl(), m_typeSearch))\n                    System.Media.SystemSounds.Beep.Play();\n            }\n        }\n\n        private bool SelectItem(IGameFileView ctrl, string search)\n        {\n           bool success = false, isIdGames = false;\n\n            ITabView tabView = m_tabHandler.TabViewForControl(ctrl);\n            if (tabView != null && tabView is IdGamesTabViewCtrl)\n                isIdGames = true;\n\n            foreach (IGameFile item in GetCurrentViewControl().DataSource)\n            {\n                if (isIdGames)\n                    success = item.Title.ToLower().StartsWith(search);\n                else\n                    success = item.FileName.ToLower().StartsWith(search);\n\n                if (success)\n                {\n                    SetSelectedItem(GetCurrentViewControl(), item);\n                    break;\n                }\n            }\n\n            return success;\n        }\n\n        private void cumulativeStatisticsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleCumulativeStatistics();\n        }\n\n        private void cumulativeStatisticsToolStripMenuItem1_Click(object sender, EventArgs e)\n        {\n            HandleCumulativeStatistics();\n        }\n\n        private void globalCumulativeStatisticsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleCumulativeStatistics(true);\n        }\n\n        private void HandleCumulativeStatistics(bool global = false)\n        { \n\n            var gameFiles = Enumerable.Empty<IGameFile>();\n            string tabText;\n\n            if (global)\n            {\n                tabText = \"Global\";\n                var localTabView = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(TabKeys.LocalKey));\n                if (localTabView != null)\n                    gameFiles = localTabView.GameFileViewControl.DataSource;\n                var iwadTabView = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(TabKeys.IWadsKey));\n                if (iwadTabView != null)\n                    gameFiles = gameFiles.Union(iwadTabView.GameFileViewControl.DataSource);\n            }\n            else\n            {\n                IGameFileView view = GetCurrentViewControl();\n                if (view == null)\n                    return;\n\n                ITabView tabView = m_tabHandler.TabViewForControl(view);\n                tabText = tabView == null ? string.Empty : tabView.Title;\n                gameFiles = view.DataSource;\n            }\n\n            CumulativeStats form = new CumulativeStats();\n            form.Title = $\"Cumulative Stats - {tabText.Replace(\"● \", string.Empty)}\";\n            form.SetStatistics(gameFiles, DataSourceAdapter.GetStats(gameFiles));\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.ShowDialog(this);\n        }\n\n        private string GetTabSearchText(string tabKey)\n        {\n            if (m_searchByTab.TryGetValue(tabKey, out var text))\n                return text;\n            return string.Empty;\n        }\n\n        private ProgressBarForm CreateProgressBar(string text, ProgressBarStyle style, bool cancelAllowed)\n        {\n            ProgressBarForm form = new ProgressBarForm();\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.DisplayText = text;\n            form.SetCancelAllowed(cancelAllowed);\n\n            if (style == ProgressBarStyle.Marquee)\n            {\n                form.ProgressBarStyle = ProgressBarStyle.Marquee;\n            }\n            else\n            {\n                form.Minimum = 0;\n                form.Maximum = 100;\n            }\n\n            return form;\n        }\n\n        private ProgressBarForm ProgressBarStart(ProgressBarType type)\n        {\n            m_progressBarCancelled = false;\n\n            if (InvokeRequired)\n            {\n                return (ProgressBarForm)Invoke(new Func<ProgressBarType, Form>(ProgressBarStart), type);\n            }\n            else\n            {\n                UseWaitCursor = true;\n                if (!m_progressBars.TryGetValue(type, out var progressBar))\n                    return null;\n\n                progressBar.StartPosition = FormStartPosition.CenterParent;\n                progressBar.Show(this);\n                return progressBar;\n            }\n        }\n\n        private void ProgressBarEnd(ProgressBarType type)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(new Action<ProgressBarType>(ProgressBarEnd), new object[] { type });\n            }\n            else\n            {\n                UseWaitCursor = false;\n                if (!m_progressBars.TryGetValue(type, out var progressBar))\n                    return;\n\n                progressBar.Hide();\n            }\n        }\n\n        private void utilitiesToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleEditUtilities();\n        }\n\n        private void manageUtilitiesToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleEditUtilities();\n        }\n\n        private void createAutoPlayShortcutToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            CreateShortcut(true);\n        }\n\n        private void createShortcutToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            CreateShortcut(false);\n        }\n\n        private void CreateShortcut(bool autoPlay)\n        {\n            try\n            {\n                IGameFile[] gameFiles = SelectedItems(GetCurrentViewControl());\n                StringBuilder sbFileNames = new StringBuilder();\n                foreach (IGameFile gameFile in gameFiles)\n                {\n                    string fileName = string.IsNullOrEmpty(gameFile.Title) ? gameFile.FileName : gameFile.Title;\n                    Array.ForEach(Path.GetInvalidFileNameChars(), x => fileName = fileName.Replace(x, ' '));\n                    string filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), string.Concat(fileName, \".lnk\"));\n\n                    IWshRuntimeLibrary.WshShell wsh = new IWshRuntimeLibrary.WshShell();\n                    IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut(filePath) as IWshRuntimeLibrary.IWshShortcut;\n                    if (autoPlay)\n                        shortcut.Arguments = $\"-{nameof(LaunchArgs.LaunchGameFileID)} {gameFile.GameFileID} -{nameof(LaunchArgs.AutoClose)}\";\n                    else\n                        shortcut.Arguments = gameFile.FileName;\n                    shortcut.TargetPath = string.Format(Path.Combine(Directory.GetCurrentDirectory(), Util.GetExecutableNoPath()));\n                    shortcut.WindowStyle = 1;\n                    shortcut.Description = string.Concat(\"Doom Launcher - \", gameFile.FileName);\n                    shortcut.WorkingDirectory = Directory.GetCurrentDirectory();\n                    shortcut.IconLocation = string.Format(Path.Combine(Directory.GetCurrentDirectory(), \"DoomLauncher.ico\"));\n                    shortcut.Save();\n\n                    sbFileNames.Append(fileName);\n                    sbFileNames.Append(\", \");\n                }\n\n                sbFileNames.Length -= 2;\n                MessageBox.Show(this, string.Format(\"Shortcut successfully created for: {0}\", sbFileNames.ToString()), \"Shortcut Success\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Information);\n            }\n            catch (Exception ex)\n            {\n                Util.DisplayUnexpectedException(this, ex);\n            }\n        }\n\n        private void helpToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            try\n            {\n                Process.Start(\"Help.pdf\");\n            }\n            catch\n            {\n                MessageBox.Show(this, \"The help document is missing and could not be opened.\", \"Help Missing\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n\n        private void createZipToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            HandleCreateZip();\n        }\n\n        private async void HandleCreateZip()\n        {\n            FolderBrowserDialog folderDialog = new FolderBrowserDialog();\n            if (folderDialog.ShowDialog(this) == DialogResult.OK)\n            {\n                SaveFileDialog fileDialog = new SaveFileDialog();\n                fileDialog.Filter = \"Zip|*.zip\";\n\n                if (fileDialog.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(fileDialog.FileName))\n                {\n                    ProgressBarStart(ProgressBarType.CreateZip);\n                    bool success = false;\n                    await Task.Run(() => success = CreateZipFromDirectory(folderDialog.SelectedPath, fileDialog.FileName));\n                    ProgressBarEnd(ProgressBarType.CreateZip);\n\n                    if (!success)\n                        MessageBox.Show(this, \"Failed to create zip file. File may be in use.\", \"Zip Failure\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n            }\n        }\n\n        private static bool CreateZipFromDirectory(string folderPath, string zipFileName)\n        {\n            try\n            {\n                if (File.Exists(zipFileName))\n                    File.Delete(zipFileName);\n                ZipFile.CreateFromDirectory(folderPath, zipFileName);\n            }\n            catch\n            {\n                return false;\n            }\n\n            return true;\n        }\n\n        private async void addFIlesRecursivelyToolStripMenuItem1_Click(object sender, EventArgs e)\n        {\n            FolderBrowserDialog dialog = new FolderBrowserDialog();\n\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                List<string> extensions = Util.GetPkExtenstions().Union(Util.GetDehackedExtensions()).ToList();\n                extensions.Add(\".wad\");\n                for (int i = 0; i < extensions.Count; i++)\n                    extensions[i] = \"*\" + extensions[i];\n\n                IEnumerable<string> files = new List<string>();\n\n                foreach (string ext in extensions)\n                    files = files.Union(Directory.EnumerateFiles(dialog.SelectedPath, ext, SearchOption.AllDirectories));\n\n                await HandleAddGameFiles(AddFileType.GameFile, files.ToArray());\n            }\n        }\n\n        private async void loadWadsFromSteamMenuItem_Click(object sender, EventArgs e)\n        {\n            await AutoLoadSteamWads();\n        }\n\n        private async void resyncToolStripMenuItem_Click(object sender, EventArgs e) =>\n            await HandleResync(true);\n\n        private async void resyncIgnoreTitlepicToolStripMenuItem_Click(object sender, EventArgs e) =>\n            await HandleResync(false);\n\n        private void manualUpdateToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            OpenFileDialog dialog = new OpenFileDialog();\n            dialog.Filter = \"Zip (*.zip)|*.zip|All Files (*.*)|*.*\";\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                string copyFilePath = Path.Combine(AppConfiguration.TempDirectory.GetFullPath(), UpdateControl.AppUpdateFileName);\n                File.Copy(dialog.FileName, copyFilePath, true);\n                ApplicationUpdater applicationUpdater = new ApplicationUpdater(dialog.FileName, AppDomain.CurrentDomain.BaseDirectory);\n                if (!applicationUpdater.Execute())\n                    UpdateControl.CreateUpdateFailureForm(applicationUpdater).ShowDialog(this);\n            }\n        }\n\n        private void btnMainMenu_Click(object sender, EventArgs e)\n        {\n            Stylizer.StylizeControl(toolStripDropDownButton1, DesignMode);\n            toolStripDropDownButton1.ShowDropDown();\n        }\n\n        private AppConfiguration AppConfiguration => DataCache.Instance.AppConfiguration;\n        private IDataSourceAdapter DataSourceAdapter => DataCache.Instance.DataSourceAdapter;\n        private IGameFileDataSourceAdapter DirectoryDataSourceAdapter { get; set; }\n        private IGameFileDataSourceAdapter IdGamesDataSourceAdapter { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/MainForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"mnuLocal.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"toolStrip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>434, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"toolStripDropDownButton1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB/SURBVEhL7ZS5CgAhDET9cPForDw+OctgwEIrNbuL+GAI\n        BB3QHOryH1JKpLUmay0ZY6aEu/CAF9tWOLFVMUbESs65O7CqUgpiA4kQwhZ15meAQjvnyHu/JHi80kXc\n        OBWJLhq+QuyLzgB1GA3NjLpBE18VvJi2athFYuv68iFKPYzcxuepFjI+AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"toolTip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>116, 17</value>\n  </metadata>\n  <metadata name=\"mnuIdGames.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>213, 17</value>\n  </metadata>\n  <metadata name=\"toolTip2.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>337, 17</value>\n  </metadata>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>45</value>\n  </metadata>\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/MainForm_Config.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class MainForm\n    {\n        private void HandleFormClosing()\n        {\n            if (DataSourceAdapter == null || !m_writeConfigOnClose)\n                return;\n            \n            IEnumerable<IConfigurationData> config = DataSourceAdapter.GetConfiguration();\n            if (WindowState != FormWindowState.Minimized)\n            {\n                // Too many problems when the form is minimized, not supported\n                if (splitTopBottom.SplitterDistance > 0)\n                    DataCache.Instance.UpdateConfig(config, AppConfiguration.SplitTopBottomName, GetSplitterPercent(splitTopBottom, Height).ToString(AppConfiguration.Culture));\n                if (splitLeftRight.SplitterDistance > 0)\n                    DataCache.Instance.UpdateConfig(config, AppConfiguration.SplitLeftRightName, GetSplitterPercent(splitLeftRight, Width).ToString(AppConfiguration.Culture));\n                if (splitTagSelect.SplitterDistance > 0)\n                    DataCache.Instance.UpdateConfig(config, AppConfiguration.SplitTagSelectName, GetSplitterPercent(splitTagSelect, Width).ToString(AppConfiguration.Culture));\n\n                DataCache.Instance.UpdateConfig(config, AppConfiguration.AppWidthName, Size.Width.ToString());\n                DataCache.Instance.UpdateConfig(config, AppConfiguration.AppHeightName, Size.Height.ToString());\n                DataCache.Instance.UpdateConfig(config, AppConfiguration.AppXName, Location.X.ToString());\n                DataCache.Instance.UpdateConfig(config, AppConfiguration.AppYName, Location.Y.ToString());\n                DataCache.Instance.UpdateConfig(config, AppConfiguration.WindowStateName, WindowState.ToString());\n            }\n\n            DataCache.Instance.UpdateConfig(config, AppConfiguration.ColumnConfigName, BuildColumnConfig());\n            DataCache.Instance.UpdateConfig(config, AppConfiguration.ItemsPerPageName, AppConfiguration.ItemsPerPage.ToString());\n            DataCache.Instance.UpdateConfig(config, AppConfiguration.LastSelectedTabIndexName, tabControl.SelectedIndex.ToString());\n            DataCache.Instance.UpdateConfig(config, AppConfiguration.TagSelectPinnedName, m_tagSelectControl.Pinned.ToString());\n        }\n\n        private static double GetSplitterPercent(SplitContainer splitter, int windowDimension)\n        {\n            if (windowDimension <= 0)\n                return 0.1;\n\n            return splitter.SplitterDistance / (double)windowDimension;\n        }\n\n        private void UpdateColumnConfig()\n        {\n            IEnumerable<IConfigurationData> config = DataSourceAdapter.GetConfiguration();\n            DataCache.Instance.UpdateConfig(config, AppConfiguration.ColumnConfigName, BuildColumnConfig());\n        }      \n\n        private string BuildColumnConfig()\n        {\n            List<ColumnConfig> columnViewConfig = new List<ColumnConfig>();\n            List<ColumnConfig> tileViewConfig = new List<ColumnConfig>();\n            HashSet<string> tileViewKeys = new HashSet<string>();\n\n            foreach (ITabView tab in m_tabHandler.TabViews)\n            {\n                if (tab.GameFileViewControl is IGameFileColumnView)\n                {\n                    columnViewConfig.AddRange(tab.GetColumnConfig());\n                }\n                else\n                {\n                    tileViewConfig.AddRange(tab.GetColumnConfig());\n                    tileViewKeys.Add(tab.Key.ToString());\n                }\n            }\n\n            // Only select columns from views that are tile views\n            List<ColumnConfig> config = DataCache.Instance.GetColumnConfig().Where(x => tileViewKeys.Contains(x.Parent)).ToList();\n            // Tile views use IGameFileSortableView which only stores the single column that is sorted, so clear all sorting on all columns\n            config.ForEach(x => x.Sort = SortOrder.None);\n\n            foreach (ColumnConfig viewColumn in tileViewConfig)\n            {\n                ColumnConfig existingColumn = config.FirstOrDefault(x => x.Parent == viewColumn.Parent && x.Column == viewColumn.Column);\n                if (existingColumn != null)\n                    existingColumn.Sort = viewColumn.Sort;\n                else\n                    config.Add(viewColumn);\n            }\n\n            config.AddRange(columnViewConfig);\n\n            return SerializeColumnConfig(config);\n        }\n\n        private string SerializeColumnConfig(List<ColumnConfig> config)\n        {\n            try\n            {\n                return DataCache.SerializeColumnConfig(config);\n            }\n            catch (Exception ex)\n            {\n                Util.DisplayUnexpectedException(this, ex);\n            }\n\n            return string.Empty;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/MainForm_Init.cs",
    "content": "﻿using DoomLauncher.Controls;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Forms;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.GameStores;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class MainForm\n    {\n        private void SetupTabBase(ITabView tabView, ColumnField[] columnTextFields, ColumnConfig[] colConfig, ContextMenuStrip menu, bool dragDrop)\n        {\n            tabView.SetColumnConfig(columnTextFields, colConfig);\n            tabView.GameFileViewControl.SetContextMenuStrip(menu);\n            tabView.GameFileViewControl.AllowDrop = dragDrop;\n            tabView.DataSourceChanging += TabView_DataSourceChanging;\n            tabView.DataSourceChanged += TabView_DataSourceChanged;\n            SetGameFileViewEvents(tabView.GameFileViewControl, dragDrop);\n        }\n\n        private void SetupTabs()\n        {\n            SetShowTabHeaders();\n\n            List<ITabView> tabViews = new List<ITabView>();\n            ColumnConfig[] colConfig = DataCache.Instance.GetColumnConfig();\n            GameFileViewFactory = new GameFileViewFactory(this, AppConfiguration.GameFileViewType);\n            GameFileTileManager.Instance.Init(GameFileViewFactory);\n\n            if (AppConfiguration.VisibleViews.Contains(TabKeys.RecentKey))\n                tabViews.Add(CreateTabViewRecent(colConfig));\n\n            // User can't remove local\n            tabViews.Add(CreateTabViewLocal(colConfig));\n\n            if (AppConfiguration.VisibleViews.Contains(TabKeys.UntaggedKey))\n                tabViews.Add(CreateTabViewUntagged(colConfig));\n            if (AppConfiguration.VisibleViews.Contains(TabKeys.IWadsKey))\n                tabViews.Add(CreateTabViewIwad(colConfig));\n            if (AppConfiguration.VisibleViews.Contains(TabKeys.IdGamesKey))\n                tabViews.Add(CreateTabViewIdGames(colConfig));\n\n            tabViews.AddRange(CreateTagTabs(GameFileViewFactory.DefaultColumnTextFields, colConfig));\n\n            m_tabHandler = new TabHandler(tabControl);\n            m_tabHandler.SetTabs(tabViews);\n        }\n\n        private void SetShowTabHeaders()\n        {\n            tabControl.SetShowHeaders(AppConfiguration.ShowTabHeaders);\n        }\n\n        private IdGamesTabViewCtrl CreateTabViewIdGames(ColumnConfig[] colConfig)\n        {\n            ColumnField[] columnTextFields = new ColumnField[]\n            {\n                new ColumnField(\"Title\", \"Title\"),\n                new ColumnField(\"Author\", \"Author\"),\n                new ColumnField(\"ReleaseDate\", \"Release Date\"),\n                new ColumnField(\"Description\", \"Description\"),\n                new ColumnField(\"Rating\", \"Rating\"),\n            };\n\n            IdGamesDataSourceAdapter = new IdGamesDataAdapater(AppConfiguration.IdGamesUrl, AppConfiguration.ApiPage, AppConfiguration.MirrorUrl);\n            var factory = new GameFileViewFactory(this, GameFileViewType.GridView);\n            IdGamesTabViewCtrl tabViewIdGames = new IdGamesTabViewCtrl(TabKeys.IdGamesKey, StaticTagData.GetFavoriteName(TabKeys.IdGamesKey), IdGamesDataSourceAdapter, DefaultGameFileSelectFields, factory);\n            SetupTabBase(tabViewIdGames, columnTextFields, colConfig, mnuIdGames, false);\n            return tabViewIdGames;\n        }\n\n        private IWadTabViewCtrl CreateTabViewIwad(ColumnConfig[] colConfig)\n        {\n            ColumnField[] columnTextFields = new ColumnField[]\n            {\n                new ColumnField(\"FileNameNoPath\", \"File\"),\n                new ColumnField(\"LastDirectory\", \"Directory\"),\n                new ColumnField(\"Title\", \"Title\"),\n                new ColumnField(\"LastPlayed\", \"Last Played\"),\n            };\n\n            IWadTabViewCtrl tabViewIwads = new IWadTabViewCtrl(TabKeys.IWadsKey, StaticTagData.GetFavoriteName(TabKeys.IWadsKey), DataSourceAdapter, DefaultGameFileSelectFields, DataCache.Instance.TagMapLookup, GameFileViewFactory);\n            SetupTabBase(tabViewIwads, columnTextFields, colConfig, mnuLocal, true);\n            return tabViewIwads;\n        }\n\n        private LocalTabViewCtrl CreateTabViewUntagged(ColumnConfig[] colConfig)\n        {\n            LocalTabViewCtrl tabViewUntagged = new UntaggedTabView(TabKeys.UntaggedKey, StaticTagData.GetFavoriteName(TabKeys.UntaggedKey), DataSourceAdapter, DefaultGameFileSelectFields, DataCache.Instance.TagMapLookup, GameFileViewFactory);\n            SetupTabBase(tabViewUntagged, GameFileViewFactory.DefaultColumnTextFields, colConfig, mnuLocal, true);\n            return tabViewUntagged;\n        }\n\n        private LocalTabViewCtrl CreateTabViewLocal(ColumnConfig[] colConfig)\n        {\n            LocalTabViewCtrl tabViewLocal = new LocalTabViewCtrl(TabKeys.LocalKey, StaticTagData.GetFavoriteName(TabKeys.LocalKey), DataSourceAdapter, DefaultGameFileSelectFields, DataCache.Instance.TagMapLookup, GameFileViewFactory);\n            SetupTabBase(tabViewLocal, GameFileViewFactory.DefaultColumnTextFields, colConfig, mnuLocal, true);\n            return tabViewLocal;\n        }\n\n        private OptionsTabViewCtrl CreateTabViewRecent(ColumnConfig[] colConfig)\n        {\n            OptionsTabViewCtrl tabViewRecent = new OptionsTabViewCtrl(TabKeys.RecentKey, StaticTagData.GetFavoriteName(TabKeys.RecentKey), DataSourceAdapter, DefaultGameFileSelectFields, DataCache.Instance.TagMapLookup, GameFileViewFactory);\n            SetupTabBase(tabViewRecent, GameFileViewFactory.DefaultColumnTextFields, colConfig, mnuLocal, true);\n            tabViewRecent.Options = new GameFileGetOptions();\n            tabViewRecent.Options.Limit = 10;\n            tabViewRecent.Options.OrderBy = OrderType.Desc;\n            tabViewRecent.Options.OrderField = GameFileFieldType.Downloaded;\n            return tabViewRecent;\n        }\n\n        private List<ITabView> CreateTagTabs(ColumnField[] columnTextFields, ColumnConfig[] colConfig)\n        {\n            List<ITabView> ret = new List<ITabView>();\n            DataCache.Instance.UpdateTags();\n            IEnumerable<ITagData> tags = DataCache.Instance.Tags.Where(x => x.HasTab);\n\n            foreach (ITagData tag in tags)\n                ret.Add(CreateTagTab(columnTextFields, colConfig, tag.FavoriteName, tag, false));\n\n            return ret;\n        }\n\n        private TagTabView CreateTagTab(ColumnField[] columnTextFields, ColumnConfig[] colConfig, string name, ITagData tag, bool isNew)\n        {\n            //use the local tab configuration for new tabs\n            if (isNew)\n            {\n                colConfig = colConfig.Where(x => x.Parent == \"Local\").ToArray();\n                Array.ForEach(colConfig, x => x.Parent = tag.Name);\n            }\n\n            TagTabView tabView = new TagTabView(tag.TagID, name, DataSourceAdapter, DefaultGameFileSelectFields, tag, GameFileViewFactory);\n            SetupTabBase(tabView, columnTextFields, colConfig, mnuLocal, true);\n\n            if (tabView.GameFileViewControl is IGameFileColumnView columnView)\n            {\n                columnView.SetColumnFormat(\"ReleaseDate\", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\n                columnView.SetColumnFormat(\"Downloaded\", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\n                columnView.SetColumnFormat(\"LastPlayed\", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\n            }\n\n            return tabView;\n        }\n\n        private void RebuildUtilityToolStrip()\n        {\n            var utilities = DataSourceAdapter.GetUtilities();\n            ToolStripMenuItem utilityToolStrip = mnuLocal.Items.Cast<ToolStripItem>().FirstOrDefault(x => x.Text == \"Utility\") as ToolStripMenuItem;\n\n            while (utilityToolStrip.DropDownItems.Count > 2)\n                utilityToolStrip.DropDownItems.RemoveAt(utilityToolStrip.DropDownItems.Count - 1);\n\n            foreach (var utility in utilities)\n                utilityToolStrip.DropDownItems.Add(utility.Name, null, utilityToolStripItem_Click);\n        }\n\n        private void RebuildTagToolStrip()\n        {\n            IGameFileView currentControl = GetCurrentViewControl();\n            if (currentControl != null)\n            {\n                DataCache.Instance.UpdateTags();\n\n                var selectedGameFiles = SelectedItems(currentControl);\n                var selectedGameFileTags = selectedGameFiles.SelectMany(DataCache.Instance.TagMapLookup.GetTags);\n\n                ToolStripMenuItem tagToolStrip = mnuLocal.Items.Cast<ToolStripItem>().FirstOrDefault(x => x.Text == \"Tag\") as ToolStripMenuItem;\n\n                if (tagToolStrip != null)\n                {\n                    BuildTagToolStrip(tagToolStrip, selectedGameFileTags, tagToolStripItem_Click);\n                }\n            }\n        }\n\n        private void BuildTagToolStrip(ToolStripMenuItem tagToolStrip, IEnumerable<ITagData> myTags, EventHandler handler)\n        {\n            while (tagToolStrip.DropDownItems.Count > 2)\n                tagToolStrip.DropDownItems.RemoveAt(tagToolStrip.DropDownItems.Count - 1);\n\n            var allTags = DataCache.Instance.Tags;\n\n            foreach (ITagData tag in allTags)\n            {\n                var tagItem = new ToolStripMenuItem();\n                tagItem.Text = tag.FavoriteName;\n                tagItem.CheckOnClick = true;\n                tagItem.Checked = myTags.Any(t => t.TagID == tag.TagID);\n                tagItem.Click += handler;\n                tagItem.Tag = tag.TagID;\n\n                tagToolStrip.DropDownItems.Add(tagItem);\n            }\n        }\n\n        private void SetGameFileViewEvents(IGameFileView ctrl, bool dragDrop)\n        {\n            ctrl.ItemDoubleClick += ctrlView_RowDoubleClicked;\n            ctrl.SelectionChange += ctrlView_SelectionChange;\n            ctrl.ViewKeyPress += ctrlView_GridKeyPress;\n\n            if (dragDrop)\n            {\n                ctrl.DragDrop += ctrlView_DragDrop;\n                ctrl.DragEnter += ctrlView_DragEnter;\n                ctrl.ViewKeyDown += ctrlView_GridKeyDown;\n            }\n        }\n\n        private void ctrlView_GridKeyDown(object sender, KeyEventArgs e)\n        {\n            if (e.KeyCode == Keys.Delete)\n                HandleDelete();\n        }\n\n        private async Task Initialize()\n        {\n            string dataSource = Path.Combine(LauncherPath.GetDataDirectory(), DbDataSourceAdapter.DatabaseFileName);\n            DataAccess access = new DataAccess(new SqliteDatabaseAdapter(), DbDataSourceAdapter.CreateConnectionString(dataSource));\n\n            m_versionHandler = new VersionHandler(access, DbDataSourceAdapter.CreateAdapter(true), AppConfiguration);\n\n            if (m_versionHandler.UpdateRequired())\n            {\n                m_versionHandler.UpdateProgress += handler_UpdateProgress;\n                ProgressBarStart(ProgressBarType.Update);\n\n                await Task.Run(() => ExecuteVersionUpdate());\n\n                ProgressBarEnd(ProgressBarType.Update);\n\n                AppConfiguration.Refresh(); //We have to refresh here because a column may have been added to the Configuration table\n            }\n\n            if (AppConfiguration.CleanTemp)\n                CleanTempDirectory();\n\n            DirectoryDataSourceAdapter = new DirectoryDataSourceAdapter(AppConfiguration.GameFileDirectory);\n            DataCache.Instance.AppConfiguration.GameFileViewTypeChanged += AppConfiguration_GameFileViewTypeChanged;\n            DataCache.Instance.AppConfiguration.VisibleViewsChanged += AppConfiguration_VisibleViewsChanged;\n            DataCache.Instance.AppConfiguration.ColorThemeChanged += AppConfiguration_ColorThemeChanged;\n            DataCache.Instance.TagMapLookup.TagMappingChanged += TagMapLookup_TagMappingChanged;\n            DataCache.Instance.TagsChanged += DataCache_TagsChanged;\n\n            CleanUpFiles();\n\n            SetupTabs();\n            RebuildUtilityToolStrip();\n            BuildUtilityToolStrip();\n\n            InitTagSelectControl();\n            InitDownloadView();\n\n            ctrlAssociationView.Initialize(DataSourceAdapter, AppConfiguration);\n            ctrlAssociationView.FileAdded += ctrlAssociationView_FileAdded;\n            ctrlAssociationView.FileDeleted += ctrlAssociationView_FileDeleted;\n            ctrlAssociationView.FileOrderChanged += ctrlAssociationView_FileOrderChanged;\n            ctrlAssociationView.RequestScreenshots += CtrlAssociationView_RequestScreenshots;\n            ctrlAssociationView.FileDetailsChanged += CtrlAssociationView_FileDetailsChanged;\n        }\n\n        private async Task AutoLoadSteamWads()\n        {\n            var gameStoreCheck = new AutomaticGameStoreCheck(StoreGameLoader.LoadAllStoreGamesFromRegistry, DbDataSourceAdapter.CreateAdapter());\n            await gameStoreCheck.LoadGamesFromGameStores(\n                async iwads => await HandleAddGameFiles(AddFileType.IWad, iwads.ToArray(), null, FileManagement.Managed),\n                async pwads => await HandleAddGameFiles(AddFileType.GameFile, pwads.ToArray(), null, FileManagement.Managed),\n                HandleAddDoom64);\n        }\n\n        private async Task HandleAddDoom64(string doom64Exe)\n        {\n            await Task.Run(() => \n            {\n                var existingDoom64 = DataSourceAdapter.GetDoom64().FirstOrDefault();\n                if (existingDoom64 == null)\n                {\n                    var extensions = new List<string> { \".wad\" };\n                    extensions.AddRange(Util.GetExtraDoom64Extensions());\n                    var extensionString = string.Join(\",\", extensions);\n\n                    SourcePortData newDoom64 = new SourcePortData()\n                    {\n                        Executable = Path.GetFileName(doom64Exe),\n                        Name = \"Doom 64\",\n                        LaunchType = SourcePortLaunchType.Doom64,\n                        SupportedExtensions = extensionString,\n                        Directory = new LauncherPath(Path.GetDirectoryName(doom64Exe)),\n                        FileOption = \"-file\"\n                    };\n                    DataSourceAdapter.InsertSourcePort(newDoom64);\n                }\n            });\n        }\n\n        private void CleanUpFiles()\n        {\n            var cleanupFiles = DataSourceAdapter.GetCleanupFiles();\n            foreach (var cleanupFile in cleanupFiles)\n            {\n                try\n                {\n                    File.Delete(cleanupFile.FileName);\n                    DataSourceAdapter.DeleteCleanupFile(cleanupFile);\n                }\n                catch\n                {\n                    // Try again next time...\n                }\n            }\n        }\n\n        private void InitDownloadView()\n        {\n            m_downloadView = new DownloadView();\n            m_downloadView.UserPlay += DownloadView_UserPlay;\n            m_downloadHandler = new DownloadHandler(AppConfiguration.TempDirectory, m_downloadView);\n        }\n\n        private void InitTagSelectControl()\n        {\n            m_tagSelectControl.BorderStyle = BorderStyle.FixedSingle;\n            m_tagSelectControl.TagSelectionChanged += TagSelectCtrl_TagSelectionChanged;\n            m_tagSelectControl.StaticSelectionChanged += TagSelectCtrl_StaticSelectionChanged;\n            m_tagSelectControl.PinChanged += TagSelectControl_PinChanged;\n            m_tagSelectControl.ManageTags += TagSelectControl_ManageTags;\n            m_tagSelectControl.Init(new TagSelectOptions() { HasTabOnly = true, ShowStatic = true, AllowRowSelect = true, \n                ShowPin = true, ShowMenu = true });\n            m_tagSelectControl.SetPinned(AppConfiguration.TagSelectPinned);\n\n            if (AppConfiguration.TagSelectPinned)\n                SetTagControlPinned();\n        }\n\n        private void TagSelectControl_ManageTags(object sender, EventArgs e)\n        {\n            HandleManageTags();\n        }\n\n        private void TagSelectControl_PinChanged(object sender, EventArgs e)\n        {\n            if (m_tagPopup != null)\n            {\n                m_tagPopup.Hide();\n                // For some reason the Popup messes with Min/Max Size...\n                m_tagSelectControl.MaximumSize = new Size(0, 0);\n                m_tagSelectControl.MinimumSize = new Size(0, 0);\n            }\n\n            if (m_tagSelectControl.Pinned)\n            {\n                SetTagControlPinned();\n            }\n            else\n            {\n                splitTagSelect.Panel1Collapsed = true;\n                splitTagSelect.Panel1.Controls.Remove(m_tagSelectControl);\n                DisplayTags();\n            }\n        }\n\n        private void SetTagControlPinned()\n        {\n            splitTagSelect.Panel1Collapsed = false;\n            splitTagSelect.Panel1.Controls.Add(m_tagSelectControl);\n            m_tagSelectControl.Dock = DockStyle.Fill;\n        }\n\n        private void TagMapLookup_TagMappingChanged(object sender, ITagData[] tags)\n        {\n            if (InvokeRequired)\n                Invoke(new Action<ITagData[]>(HandleTagMappingChanged), new object[] { tags });\n            else\n                HandleTagMappingChanged(tags);\n        }\n\n        private void HandleTagMappingChanged(ITagData[] tags)\n        {\n            Array.ForEach(tags, x => UpdateTagTabData(x.TagID));\n            if (tags.Any(x => x.ExcludeFromOtherTabs))\n                UpdateLocal();\n        }\n\n        private void DataCache_TagsChanged(object sender, EventArgs e)\n        {\n            if (m_tabHandler == null)\n                return;\n\n            foreach (var tabView in m_tabHandler.TabViews)\n            {\n                if (tabView is TagTabView tagTabView)\n                {\n                    ITagData findTag = DataCache.Instance.Tags.FirstOrDefault(x => x.TagID == tagTabView.TagDataSource.TagID);\n                    if (findTag != null)\n                        tagTabView.TagDataSource = findTag;\n                }\n            }\n        }\n\n        private void TagSelectCtrl_StaticSelectionChanged(object sender, string name)\n        {\n            m_tabHandler.SelectTabFromKey(name);\n        }\n\n        private void TagSelectCtrl_TagSelectionChanged(object sender, ITagData tag)\n        {\n            ITabView tagView = m_tabHandler.TabViewForTag(tag);\n            if (tagView != null)\n                m_tabHandler.SelectTabView(tagView);\n        }\n\n        private void AppConfiguration_GameFileViewTypeChanged(object sender, EventArgs e)\n        {\n            if (GameFileViewFactory.IsBaseViewTypeChange(GameFileViewFactory.DefaultType, AppConfiguration.GameFileViewType))\n            {\n                Restart();\n                return;\n            }\n\n            GameFileViewFactory.UpdateDefaultType(AppConfiguration.GameFileViewType);\n            GameFileTileManager.Instance.Init(GameFileViewFactory);\n        }\n\n        private void AppConfiguration_VisibleViewsChanged(object sender, EventArgs e)\n        {\n            Restart();\n        }\n\n        private void AppConfiguration_ColorThemeChanged(object sender, EventArgs e)\n        {\n            Restart();\n        }\n\n        private void Restart(bool writeConfigChanges = true)\n        {\n            // Write any settings the user may have changed before the application is killed\n            m_writeConfigOnClose = writeConfigChanges;\n            if (writeConfigChanges)\n                HandleFormClosing();\n            Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Util.GetExecutableNoPath()));\n        }\n\n        private void BuildUtilityToolStrip()\n        {\n            ToolStripMenuItem sortToolStrip = GetSortByToolStrip();\n\n            foreach (var col in GameFileViewFactory.DefaultColumnTextFields)\n                sortToolStrip.DropDownItems.Add(col.Title, null, sortToolStripItem_Click);\n        }\n\n        private ToolStripMenuItem GetSortByToolStrip()\n        {\n            return mnuLocal.Items.Cast<ToolStripItem>().FirstOrDefault(x => x.Text == \"Sort By\") as ToolStripMenuItem;\n        }\n\n        private async Task CheckForAppUpdate()\n        {\n            try\n            {\n                ApplicationUpdate applicationUpdate = new ApplicationUpdate(TimeSpan.FromSeconds(30));\n                ApplicationUpdateInfo info = await applicationUpdate.GetUpdateApplicationInfo(Assembly.GetExecutingAssembly().GetName().Version);\n\n                if (info != null)\n                    SetUpdateAvailable(info);\n                else\n                    ApplicationUpdater.CleanupUpdateFiles(AppDomain.CurrentDomain.BaseDirectory);\n            }\n            catch\n            {\n                // no internet connection or bad connection, try again next time\n            }\n        }\n\n        private void SetUpdateAvailable(ApplicationUpdateInfo info)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(new Action<ApplicationUpdateInfo>(SetUpdateAvailable), new object[] { info });\n            }\n            else\n            {\n                btnUpdate.Visible = true;\n                btnUpdate.GlowOnce();\n                m_updateControl.Initialize(AppConfiguration, info);\n            }\n        }\n\n        private async Task CheckFirstInit()\n        {\n            if (!DataSourceAdapter.GetSourcePorts().Any()) //If no source ports setup then it's the first time setup, display welcome/setup info\n            {\n                titleBar.SetNormal();\n                InvokeHideSplashScreen();\n                DisplayWelcome();\n                HandleEditSourcePorts(true);\n            }\n            if (!DataSourceAdapter.GetIWads().Any()) //If no iwads then get them from Steam\n            {\n                await AutoLoadSteamWads();\n            }\n\n            if (!DataSourceAdapter.GetIWads().Any()) //If still no iwads then prompt to add iwads\n            {\n                InvokeHideSplashScreen();\n                await HandleAddIWads();\n                Invoke((MethodInvoker)delegate { tabControl.SelectedIndex = 3; }); //the user has only added iwads on setup, so set the tab to iwads on first launch so there is something to see\n                DisplayInitSettings(); //give user the change set default port, iwad, skill\n            }\n            else\n            {\n                Invoke((MethodInvoker)delegate { tabControl.SelectedIndex = AppConfiguration.LastSelectedTabIndex; });\n            }\n        }\n\n        private void DisplayInitSettings()\n        {\n            SettingsForm settings = new SettingsForm(DataSourceAdapter, AppConfiguration);\n            settings.SetToLaunchSettingsTab();\n            settings.StartPosition = FormStartPosition.CenterParent;\n            settings.ShowDialog();\n\n            AppConfiguration.Refresh();\n        }\n\n        private void DisplayWelcome()\n        {\n            Welcome welcome = new Welcome();\n            welcome.StartPosition = FormStartPosition.CenterParent;\n            welcome.ShowDialog();\n        }\n\n        private async void MainForm_Shown(object sender, EventArgs e)\n        {\n            if (m_launchFile != null)\n            {\n                string addFile = m_launchFile;\n\n                IGameFile launchFile = DataSourceAdapter.GetGameFile(m_launchFile);\n                m_launchFile = null;\n\n                if (launchFile == null && File.Exists(addFile))\n                    await HandleAddGameFiles(AddFileType.GameFile, new string[] { addFile });\n                else\n                    HandlePlay(new IGameFile[] { launchFile });\n\n                return;\n            }\n\n            if (m_launchArgs.LaunchGameFileID != null)\n            {\n                GameFileGetOptions options = new GameFileGetOptions();\n                options.SearchField = new GameFileSearchField(GameFileFieldType.GameFileID, m_launchArgs.LaunchGameFileID.ToString());\n                var gameFile = DataSourceAdapter.GetGameFiles(options).FirstOrDefault();\n                if (gameFile == null)\n                {\n                    MessageBox.Show(this, $\"Failed to find game file by id: {m_launchArgs.LaunchGameFileID}\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                    return;\n                }\n\n                HandlePlay(new IGameFile[] { gameFile }, playOptions: PlayOptions.AutoPlay);\n            }\n        }\n\n        private static bool ValidatePosition(AppConfiguration config)\n        {\n            if (config.WindowState == FormWindowState.Maximized)\n            {\n                //Maximized goes outside the bounds to hide the border, bring the rectangle in a more than safe amount to check if the monitor is still there\n                //Windows 7 can be -4, later version are -6, could change based on DPI\n                int offs = 32;\n                Rectangle formRectangle = new Rectangle(config.AppX + offs, config.AppY + offs, config.AppWidth - offs * 2, config.AppHeight - offs * 2);\n                return Screen.AllScreens.Any(x => x.WorkingArea.Contains(formRectangle));\n            }\n            else if (config.WindowState != FormWindowState.Minimized)\n            {\n                Point formPt = new Point(config.AppX, config.AppY);\n                return Screen.AllScreens.Any(x => x.WorkingArea.Contains(formPt));\n            }\n\n            return true;\n        }\n\n        private void ExecuteVersionUpdate()\n        {\n            var results = m_versionHandler.HandleVersionUpdate();\n            if (results.RestartRequired)\n            {\n                Invoke(new Action(() =>\n                {\n                    MessageBox.Show(this, \"Update was successful. Doom Launcher requires a restart for this update.\", \"Restart Required\",\n                        MessageBoxButtons.OK, MessageBoxIcon.Information);\n                }));\n\n                Restart(false);\n                Invoke(new Action(() =>\n                {\n                    Close();\n                }));\n            }\n        }\n\n        void handler_UpdateProgress(object sender, EventArgs e)\n        {\n            if (InvokeRequired)\n                Invoke(new Action(UpdateVersionProgress));\n            else\n                UpdateVersionProgress();\n        }\n\n        void UpdateVersionProgress()\n        {\n            if (m_progressBars.TryGetValue(ProgressBarType.Update, out var progressBar))\n                progressBar.Value = m_versionHandler.ProgressPercent;\n        }\n\n        private void SetupSearchFilters()\n        {\n            ctrlSearch.SearchTextChanged += CtrlSearch_SearchTextChanged;\n            ctrlSearch.SearchTextChangedNoDebounce += CtrlSearch_SearchTextChangedNoDebounce;\n            Util.SetDefaultSearchFields(ctrlSearch);\n        }\n\n        private void CtrlSearch_SearchTextChangedNoDebounce(object sender, EventArgs e)\n        {\n            var ctrl = GetCurrentViewControl();\n            if (ctrl == null)\n                return;\n\n            ITabView tabView = m_tabHandler.TabViewForControl(ctrl);\n            if (tabView == null)\n                return;\n\n            m_searchByTab[tabView.Key.ToString()] = ctrlSearch.SearchText;\n        }\n\n        void CtrlSearch_SearchTextChanged(object sender, EventArgs e)\n        {\n            if (GetCurrentTabView() != null)\n                HandleSearch();\n        }\n\n        private GameFileFieldType[] DefaultGameFileSelectFields\n        {\n            get\n            {\n                return new GameFileFieldType[]\n                {\n                    GameFileFieldType.GameFileID,\n                    GameFileFieldType.Filename,\n                    GameFileFieldType.Author,\n                    GameFileFieldType.Title,\n                    GameFileFieldType.Description,\n                    GameFileFieldType.Downloaded,\n                    GameFileFieldType.LastPlayed,\n                    GameFileFieldType.ReleaseDate,\n                    GameFileFieldType.Comments,\n                    GameFileFieldType.Rating,\n                    GameFileFieldType.MapCount,\n                    GameFileFieldType.MinutesPlayed,\n                    GameFileFieldType.IWadID\n                };\n            }\n        }\n\n        private GameFileViewFactory GameFileViewFactory { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/MainForm_Meta.cs",
    "content": "﻿using DoomLauncher.Forms;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class MainForm\n    {\n        private bool m_cancelMetaUpdate;\n\n        private async void updateMetadataToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            IdGamesDataAdapater adapter = new IdGamesDataAdapater(AppConfiguration.IdGamesUrl, AppConfiguration.ApiPage, AppConfiguration.MirrorUrl);\n            IGameFile[] localFiles = SelectedItems(GetCurrentViewControl());\n            if (localFiles.Length == 0)\n                return;\n\n            bool showForm = true, showError = true, updateView = false;\n            m_cancelMetaUpdate = false;\n            DialogResult result = DialogResult.Cancel;\n            MetaDataForm form = CreateMetaForm();\n            ProgressBarForm progress = InitMetaProgressBar();\n            List<string> iwadWarn = new List<string>();\n            HashSet<int> iwads = new HashSet<int>(DataSourceAdapter.GetGameFileIWads().Select(x => x.GameFileID.Value));\n\n            foreach (IGameFile localFile in localFiles)\n            {\n                if (iwads.Contains(localFile.GameFileID.Value))\n                {\n                    IWadInfo info = IWadInfo.GetIWadInfo(localFile.FileNameNoPath);\n                    if (info != null && !info.HasMetadata)\n                    {\n                        iwadWarn.Add(localFile.FileNameNoPath);\n                        continue;\n                    }\n                }\n\n                try\n                {\n\n                    Enabled = false;\n                    progress.DisplayText = string.Format(\"Searching for {0}...\", localFile.FileNameNoPath);\n                    progress.Show(this);\n\n                    IEnumerable<IGameFile> remoteFiles = await Task.Run(() => GetMetaFiles(adapter, localFile.FileNameNoPath));\n\n                    Enabled = true;\n                    progress.Hide();\n\n                    if (remoteFiles == null || m_cancelMetaUpdate)\n                        break;\n\n                    if (!remoteFiles.Any())\n                    {\n                        if (showError)\n                            showError = HandleMetaError(localFile);\n                    }\n                    else\n                    {\n                        IGameFile remoteFile = HandleMultipleMetaFilesFound(localFile, remoteFiles);\n\n                        if (remoteFile != null)\n                        {\n                            form.GameFileEdit.SetDataSource(remoteFile, new ITagData[] { });\n\n                            if (showForm) //OK = Accept current file, Yes = Accept All files\n                                result = form.ShowDialog(this);\n\n                            if (result != DialogResult.Cancel)\n                            {\n                                List<GameFileFieldType> fields = form.GameFileEdit.UpdateDataSource(localFile);\n                                showForm = (result == DialogResult.OK);\n\n                                if (fields.Count > 0)\n                                    updateView = HandleUpdateMetaFields(localFile, fields);\n                            }\n                        }\n                    }\n                }\n                catch\n                {\n                    Enabled = true;\n                    progress.Hide();\n\n                    MessageBox.Show(this, \"Failed to fetch metadata from the id games mirror.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                    break; //not expected, break from loop\n                }\n            }\n\n            if (updateView)\n                HandleSelectionChange(GetCurrentViewControl(), true);\n\n            if (iwadWarn.Count > 0)\n            {\n                MessageBox.Show(this, \"The following are IWADs and will not exist in idgames: \" + string.Join(\", \", iwadWarn), \n                    \"IWAD Files\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n            }\n        }\n\n        private IEnumerable<IGameFile> GetMetaFiles(IdGamesDataAdapater adapter, string metaFileName)\n        {\n            return adapter.GetGameFilesByName(metaFileName);\n        }\n\n        private ProgressBarForm InitMetaProgressBar()\n        {\n            ProgressBarForm progress = new ProgressBarForm\n            {\n                Title = \"Fetching data...\",\n                Minimum = 0,\n                Maximum = 0\n            };\n            progress.SetCancelAllowed(false);\n            return progress;\n        }\n\n        private IGameFile HandleMultipleMetaFilesFound(IGameFile localFile, IEnumerable<IGameFile> remoteFiles)\n        {\n            if (remoteFiles.Count() == 1)\n                return remoteFiles.First();\n\n            FillFileSize(localFile);\n            IEnumerable<IGameFile> check = remoteFiles.Where(x => x.FileSizeBytes == localFile.FileSizeBytes);\n\n            if (check.Count() == 1)\n                return check.First();\n\n            FileSelectForm form = new FileSelectForm();\n            form.Initialize(DataSourceAdapter, m_tabHandler.TabViews.First(x => x.Key.Equals(TabKeys.IdGamesKey)), remoteFiles);\n            form.ShowSearchControl(false);\n            string display = localFile.FileName;\n            if (!string.IsNullOrEmpty(localFile.Title))\n                display = string.Format(\"{0}({1})\", localFile.Title, localFile.FileNameNoPath);\n            form.SetDisplayText(string.Format(\"Multiple files found for {0}. Please select intended file.\", display));\n            form.MultiSelect = false;\n            form.StartPosition = FormStartPosition.CenterParent;\n\n            if (form.ShowDialog() != DialogResult.Cancel)\n            {\n                IGameFile[] selectedFiles = form.SelectedFiles;\n\n                if (selectedFiles.Length > 0)\n                    return selectedFiles.First();\n            }\n\n            return null;\n        }\n\n        private void FillFileSize(IGameFile localFile)\n        {\n            FileInfo fi = new FileInfo(Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), localFile.FileName));\n\n            if (fi.Exists)\n                localFile.FileSizeBytes = Convert.ToInt32(fi.Length);\n        }\n\n        private MetaDataForm CreateMetaForm()\n        {\n            MetaDataForm form = new MetaDataForm();\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.GameFileEdit.SetCheckBoxesChecked(true);\n            form.GameFileEdit.CommentsChecked = false;\n            form.GameFileEdit.MapsChecked = false;\n            return form;\n        }\n\n        private bool HandleUpdateMetaFields(IGameFile localFile, List<GameFileFieldType> fields)\n        {\n            DataSourceAdapter.UpdateGameFile(localFile, fields.ToArray());\n            UpdateDataSourceViews(localFile);\n            return true;\n        }\n\n        private bool HandleMetaError(IGameFile localFile)\n        {\n            MessageCheckBox errorForm = new MessageCheckBox(\"Meta\", \n                string.Format(\"Failed to find {0} from the id games mirror.\\n\\nIf you are sure this file should exist try changing your mirror in the Settings menu.\", localFile.FileNameNoPath),\n                \"Don't show this error again\", SystemIcons.Error);\n            errorForm.StartPosition = FormStartPosition.CenterParent;\n            errorForm.ShowDialog(this);\n            return !errorForm.Checked;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/MainForm_Play.cs",
    "content": "﻿using DoomLauncher.Adapters;\nusing DoomLauncher.Adapters.Launch;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Forms;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing DoomLauncher.Stylize;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing static DoomLauncher.GameLauncher;\n\nnamespace DoomLauncher\n{\n    public partial class MainForm\n    {\n        private readonly List<PlaySession> m_activeSessions = new List<PlaySession>();\n\n        private FilterForm m_filterForm;\n\n        private void HandlePlay(PlayOptions playOptions = PlayOptions.None)\n        {\n            if (GetCurrentViewControl() != null)\n                HandlePlay(SelectedItems(GetCurrentViewControl()), playOptions: playOptions);\n        }\n\n        private bool AssertFile(string file)\n        {\n            bool exists;\n            if (Util.IsDirectory(file))\n                exists = Directory.Exists(file);\n            else\n                exists = File.Exists(file);\n\n            if (!exists)\n                MessageBox.Show(this, string.Format(\"The file {0} does not exist.\", file), \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n\n            return exists;\n        }\n\n        [Flags]\n        private enum PlayOptions\n        {\n            None,\n            AutoPlay,\n            ForceDialog\n        }\n\n        private void HandlePlay(IEnumerable<IGameFile> gameFiles, ISourcePortData sourcePort = null, string map = null, \n            PlayOptions playOptions = PlayOptions.None)\n        {\n            LaunchData launchData = GetLaunchFiles(gameFiles, checkActiveSessions: true);\n\n            if (!launchData.Success)\n            {\n                if (!string.IsNullOrEmpty(launchData.ErrorTitle))\n                    MessageBox.Show(this, launchData.ErrorDescription, launchData.ErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            if (launchData.GameFile == null)\n            {\n                var iwad = DataSourceAdapter.GetIWad((int)AppConfiguration.GetTypedConfigValue(ConfigType.DefaultIWad, typeof(int)));\n                if (iwad != null)\n                {\n                    GameFileGetOptions options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.GameFileID, iwad.GameFileID.Value.ToString()));\n                    launchData.GameFile = DataSourceAdapter.GetGameFiles(options).FirstOrDefault();\n                }\n            }\n\n            if (launchData.GameFile == null)\n                return;\n\n            SetupPlayForm(launchData.GameFile);\n            if (sourcePort != null) \n                m_currentPlayForm.SelectedSourcePort = sourcePort;\n            if (map != null)\n                m_currentPlayForm.SelectedMap = map;\n\n            bool autoPlay = (playOptions.HasFlag(PlayOptions.AutoPlay) || !AppConfiguration.ShowPlayDialog) && !playOptions.HasFlag(PlayOptions.ForceDialog);\n\n            if (autoPlay || m_currentPlayForm.ShowDialog(this) == DialogResult.OK)\n            {\n                try\n                {\n                    HandlePlaySettings(m_currentPlayForm, m_currentPlayForm.SelectedGameProfile);\n                    if (m_currentPlayForm.SelectedSourcePort == null)\n                        return;\n\n                    if (!StartPlay(launchData.GameFile, launchData.AdditionalGameFiles, m_currentPlayForm.SelectedSourcePort,\n                            m_currentPlayForm.ScreenFilter))\n                        return;\n                    \n                    ctrlSummary.PauseSlideshow();\n                    ShouldShowToolTip = false;\n                }\n                catch (IOException)\n                {\n                    MessageBox.Show(this, \"The file is in use and cannot be launched. Please close any programs that may be using the file and try again.\", \"File In Use\",\n                        MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n            }\n            else\n            {\n                HandleSelectionChange(GetCurrentViewControl(), true);\n            }\n        }\n\n        private LaunchData GetLaunchFiles(IEnumerable<IGameFile> gameFiles, bool checkActiveSessions)\n        {\n            IGameFile gameFile = null;\n            if (gameFiles != null)\n            {\n                if (gameFiles.Count() > 1)\n                {\n                    gameFile = PromptUserMainFile(gameFiles, out bool accepted);  //ask user which file to tie all stats to\n                    if (!accepted)\n                        return new LaunchData(string.Empty, string.Empty);\n                }\n                else\n                {\n                    gameFile = gameFiles.FirstOrDefault();\n                }\n            }\n\n            if (checkActiveSessions && m_activeSessions.Any() && !AppConfiguration.AllowMultiplePlaySessions)\n                return new LaunchData(\"Already Playing\", \"There is already a game in progress. Please exit that game first.\\n\\nCheck the 'Allow Multiple Play Sessions' in the settings to enable this feature.\");\n\n            if (!DataSourceAdapter.GetSourcePorts().Any())\n                return new LaunchData(\"No Source Ports\", \"You must have at least one source port configured to play! Click the settings menu on the top left and select Source Ports to configure.\");\n\n            if (!DataSourceAdapter.GetIWads().Any())\n                return new LaunchData(\"No IWADs\", \"You must have at least one IWAD configured to play! Click the settings menu on the top left and select IWads to configure.\");\n\n            if (gameFile != null && GetCurrentViewControl() != null)\n            {\n                ITabView tabView = m_tabHandler.TabViewForControl(GetCurrentViewControl());\n                if (tabView != null)\n                    gameFile = DataSourceAdapter.GetGameFile(gameFile.FileName); //this file came from the grid, which does not have all info populated to save performance\n\n                if (gameFiles.Count() > 1) //for when the user selected more than one file\n                {\n                    HandleMultiSelectPlay(gameFile, gameFiles.Except(new IGameFile[] { gameFile })); //sets SettingsFiles with all the other game files\n                    List<IGameFile> gameFilesList = new List<IGameFile>() { gameFile };\n                    Array.ForEach(gameFiles.Skip(1).ToArray(), x => gameFilesList.Add(x));\n                    gameFiles = gameFilesList;\n                }\n            }\n\n            return new LaunchData(gameFile, (GameFile)gameFile, gameFiles);\n        }\n\n        private IGameFile PromptUserMainFile(IEnumerable<IGameFile> gameFiles, out bool accepted)\n        {\n            accepted = false;\n\n            FileSelectForm form = new FileSelectForm();\n            ITabView tabView = m_tabHandler.TabViews.FirstOrDefault(x => x.Key.Equals(TabKeys.LocalKey));\n            form.Initialize(DataSourceAdapter, tabView, gameFiles);\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.SetDisplayText(\"Please select the main file that all data will be associated with. (Screenshots, demos, save games, etc.)\");\n            form.MultiSelect = false;\n            form.ShowSearchControl(false);\n\n            if (form.ShowDialog(this) == DialogResult.OK && form.SelectedFiles.Length > 0)\n            {\n                accepted = true;\n                return form.SelectedFiles[0];\n            }\n\n            return gameFiles.First();\n        }\n\n        private void HandleMultiSelectPlay(IGameFile firstGameFile, IEnumerable<IGameFile> gameFiles)\n        {\n            //If the user selected multiple files\n            //Take all the files after the first and set them as additional files to the first\n\n            StringBuilder sbAdditionalFiles = new StringBuilder();\n\n            foreach(IGameFile gameFile in gameFiles)\n            {\n                sbAdditionalFiles.Append(gameFile.FileName);\n                sbAdditionalFiles.Append(';');\n            }\n\n            firstGameFile.SettingsFiles = sbAdditionalFiles.ToString();\n        }\n\n        private void HandlePlaySettings(PlayForm form, IGameProfile gameProfile)\n        {\n            if (!form.RememberSettings || gameProfile == null)\n                return;\n            \n            form.UpdateGameProfile(gameProfile);\n            form.GameFile.SettingsGameProfileID = form.SelectedGameProfile.GameProfileID;\n            DataSourceAdapter.UpdateGameFile(form.GameFile, new [] { GameFileFieldType.SettingsGameProfileID });\n\n            if (gameProfile is IGameFile gameFile)\n            {\n                DataSourceAdapter.UpdateGameFile(gameFile, new [] { GameFileFieldType.SourcePortID, GameFileFieldType.IWadID, GameFileFieldType.SettingsMap,\n                GameFileFieldType.SettingsSkill, GameFileFieldType.SettingsFiles, GameFileFieldType.SettingsExtraParams, GameFileFieldType.SettingsSpecificFiles, GameFileFieldType.SettingsStat,\n                GameFileFieldType.SettingsFilesIWAD, GameFileFieldType.SettingsFilesSourcePort, GameFileFieldType.SettingsSaved, GameFileFieldType.SettingsLoadLatestSave, \n                    GameFileFieldType.SettingsExtraParamsOnly });\n                return;\n            }\n            \n            DataSourceAdapter.UpdateGameProfile(gameProfile);\n        }\n\n        private void SetupPlayForm(IGameFile gameFile)\n        {\n            m_currentPlayForm = new PlayForm(AppConfiguration, DataSourceAdapter);\n            m_currentPlayForm.SaveSettings += m_currentPlayForm_SaveSettings;\n            m_currentPlayForm.OnPreviewLaunchParameters += m_currentPlayForm_OnPreviewLaunchParameters;\n            m_currentPlayForm.StartPosition = FormStartPosition.CenterParent;\n\n            m_currentPlayForm.Initialize(GetAdditionalTabViews(), gameFile, m_activeSessions.Any());\n            m_currentPlayForm.SetGameProfile(GetGameProfile(gameFile));\n        }\n\n        private IGameProfile GetGameProfile(IGameFile gameFile)\n        {\n            if (gameFile.SettingsGameProfileID.HasValue)\n            {\n                var profile = DataSourceAdapter.GetGameProfiles(gameFile.GameFileID.Value).FirstOrDefault(x => x.GameProfileID == gameFile.SettingsGameProfileID.Value);\n                if (profile != null)\n                    return profile;\n\n                profile = DataSourceAdapter.GetGlobalGameProfiles()\n                    .FirstOrDefault(x => x.GameProfileID == gameFile.SettingsGameProfileID.Value);\n                if (profile != null) \n                    return profile;\n            }\n\n            return (GameFile)gameFile;\n        }\n\n        private void m_currentPlayForm_OnPreviewLaunchParameters(object sender, EventArgs e)\n        {\n            GameLauncher playAdapter = CreateGameLauncher(m_currentPlayForm, playAdapter_ProcessExited, AppConfiguration, false);\n            if (m_currentPlayForm.SettingsValid(out string err))\n                ShowLaunchParameters(playAdapter, m_currentPlayForm.GameFile, m_currentPlayForm.GetAdditionalFiles(), m_currentPlayForm.SelectedSourcePort);\n            else\n                MessageBox.Show(this, err, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n\n        void m_currentPlayForm_SaveSettings(object sender, EventArgs e)\n        {\n            HandlePlaySettings(m_currentPlayForm, m_currentPlayForm.SelectedGameProfile);\n            if (m_currentPlayForm.GameFile != null)\n            {\n                UpdateDataSourceViews(m_currentPlayForm.GameFile);\n                HandleSelectionChange(GetCurrentViewControl(), true);\n            }\n        }\n\n        private List<ITabView> GetAdditionalTabViews()\n        {\n            List<ITabView> views = new List<ITabView>();\n            views.AddRange(m_tabHandler.TabViews.Where(x => TabKeys.LocalKey.Equals(x.Key)));\n            views.AddRange(m_tabHandler.TabViews.Where(x => x is TagTabView));\n            return views;\n        }\n\n        private bool StartPlay(IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort, bool screenFilter)\n        {\n            GameLauncher playAdapter = CreateGameLauncher(m_currentPlayForm, playAdapter_ProcessExited, AppConfiguration, true);\n            m_saveGames = Array.Empty<IFileData>();\n\n            if (AppConfiguration.CopySaveFiles)\n                CopySaveGames(gameFile, sourcePort);\n            CreateFileDetectors(sourcePort);\n\n            bool isGameFileIwad = IsGameFileIwad(gameFile);\n\n            IStatisticsReader statisticsReader = null;\n            if (m_currentPlayForm.SaveStatistics)\n                statisticsReader = SetupStatsReader(sourcePort, gameFile);\n\n            var launchResult = playAdapter.Launch(gameFile, addFiles, sourcePort, isGameFileIwad);\n\n            if (!launchResult.Failed)\n            {\n                m_activeSessions.Add(new PlaySession(launchResult.GameLaunchInfo, statisticsReader, DateTime.Now));\n\n                if (gameFile != null)\n                {\n                    gameFile.LastPlayed = DateTime.Now;\n                    DataSourceAdapter.UpdateGameFile(gameFile, new GameFileFieldType[] { GameFileFieldType.LastPlayed });\n                    UpdateDataSourceViews(gameFile);\n                    HandleSelectionChange(GetCurrentViewControl(), true);\n                }\n            }\n            else\n            {\n                UpdateDataSourceViews(gameFile);\n                HandleSelectionChange(GetCurrentViewControl(), true);\n                StyledMessageBox.Show(this, launchResult.ErrorMessage, \"Launch Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return false;\n            }\n\n            if (screenFilter)\n            {\n                m_filterForm = new FilterForm(Screen.FromControl(this), m_currentPlayForm.GetFilterSettings());\n                m_filterForm.Show(this);\n            }\n\n            return true;\n        }\n\n        private void CopySaveGames(IGameFile gameFile, ISourcePortData sourcePort)\n        {\n            if (gameFile != null)\n            {\n                HandleCopySaveGames(gameFile, sourcePort);\n            }\n            else if (IsGameFileIwad(gameFile))\n            {\n                gameFile = GetGameFileForIWad(gameFile);\n                HandleCopySaveGames(gameFile, sourcePort);\n            }\n        }\n\n        private void HandleCopySaveGames(IGameFile gameFile, ISourcePortData sourcePort)\n        {\n            m_saveGames = DataSourceAdapter.GetFiles(gameFile, FileType.SaveGame).Where(x => x.SourcePortID == sourcePort.SourcePortID).ToArray();\n            SaveGameHandler saveGameHandler = new SaveGameHandler(DataSourceAdapter, AppConfiguration.SaveGameDirectory);\n            saveGameHandler.CopySaveGamesToSourcePort(sourcePort, m_saveGames);\n        }\n\n        private void ShowLaunchParameters(GameLauncher launcher, IGameFile gameFile, IEnumerable<IGameFile> addFiles, ISourcePortData sourcePort)\n        {\n            TextBoxForm form = new TextBoxForm\n            {\n                Title = \"Launch Parameters\",\n                StartPosition = FormStartPosition.CenterParent\n            };\n\n            LaunchParameters launchParameters = launcher.GetLaunchParameters(gameFile, addFiles, sourcePort, IsGameFileIwad(gameFile));\n\n            if (!launchParameters.Failed)\n            {\n                var paramString = launchParameters.LaunchString;\n                paramString = paramString.Replace(@\" -\", string.Concat(Environment.NewLine, \" -\"));\n                paramString = paramString.Replace(\"\\\" \\\"\", string.Concat(\"\\\"\", Environment.NewLine, \" \\\"\"));\n                if (paramString.StartsWith(Environment.NewLine))\n                    paramString = paramString.Substring(Environment.NewLine.Length);\n                string individualFiles = string.Empty;\n\n                if (m_currentPlayForm.SpecificFiles != null && m_currentPlayForm.SpecificFiles.Length > 0)\n                    individualFiles = Environment.NewLine + string.Format(\"Selected Files: {0}\", string.Join(\", \", m_currentPlayForm.SpecificFiles));\n\n                string sourcePortParams = string.Empty;\n                if (!string.IsNullOrEmpty(sourcePort.ExtraParameters))\n                    sourcePortParams = string.Concat(Environment.NewLine, Environment.NewLine, \"Parameters from source port: \", sourcePort.ExtraParameters);\n\n                form.DisplayText = string.Concat(paramString, Environment.NewLine, Environment.NewLine, \n                    string.Format(\"Supported Extensions: {0}\", sourcePort.SupportedExtensions),\n                    individualFiles,\n                    sourcePortParams,\n                    Environment.NewLine, Environment.NewLine,\n                    \"*** If files appear to be missing check the 'Select Individual Files' option and supported extensions options in the Source Port form of the selected source port.\");\n            }\n            else\n            {\n                form.DisplayText = $\"Failed to generate launch parameters: {launchParameters.ErrorMessage}\";\n            }\n\n            form.SelectDisplayText(0, 0);\n            form.ShowDialog(this);\n        }\n\n        private IStatisticsReader SetupStatsReader(ISourcePortData sourcePort, IGameFile gameFile)\n        {\n            IStatisticsReader statisticsReader = CreateStatisticsReader(sourcePort, gameFile);\n\n            if (statisticsReader != null)\n            {\n                statisticsReader.NewStastics += m_statsReader_NewStastics;\n                statisticsReader.Start();\n            }\n\n            return statisticsReader;\n        }\n\n        private void CreateFileDetectors(ISourcePortData sourcePortData)\n        {\n            ISourcePortFlavor sourcePortFlavor = sourcePortData.GetFlavor();\n            CreateScreenshotDetectors(sourcePortData, sourcePortFlavor);\n            CreateSaveGameDetectors(sourcePortData, sourcePortFlavor);\n        }\n\n        private void CreateSaveGameDetectors(ISourcePortData sourcePortData, ISourcePortFlavor sourcePort)\n        {\n            m_saveFileDetectors = CreateDefaultSaveGameDetectors();\n            m_saveFileDetectors.Add(CreateSaveGameDetector(sourcePortData.GetReadSavePath().GetFullPath()));\n\n            foreach (var saveDir in sourcePort.GetSaveGameDirectories())\n            {\n                if (!string.IsNullOrEmpty(saveDir) && Directory.Exists(saveDir))\n                    m_saveFileDetectors.Add(CreateSaveGameDetector(saveDir));\n            }\n\n            Array.ForEach(m_saveFileDetectors.ToArray(), x => x.StartDetection());\n        }\n\n        private void CreateScreenshotDetectors(ISourcePortData sourcePortData, ISourcePortFlavor sourcePort)\n        {\n            if (!AppConfiguration.ImportScreenshots)\n            {\n                m_screenshotDetectors = new List<INewFileDetector>();\n                return;\n            }\n\n            m_screenshotDetectors = CreateDefaultScreenshotDetectors();\n            m_screenshotDetectors.Add(CreateScreenshotDetector(sourcePortData.Directory.GetFullPath()));\n\n            foreach (var screenshotDir in sourcePort.GetScreenshotDirectories())\n            {\n                if (!string.IsNullOrEmpty(screenshotDir) && Directory.Exists(screenshotDir))\n                    m_screenshotDetectors.Add(CreateScreenshotDetector(screenshotDir));\n            }\n\n            Array.ForEach(m_screenshotDetectors.ToArray(), x => x.StartDetection());\n        }\n\n        private GameLauncher CreateGameLauncher(PlayForm form, GameLaunchExitHandler processExited, AppConfiguration appConfig, bool extractFiles)\n        {\n            var features = new List<ILaunchFeature>();\n\n            if (form.SelectedIWad != null)\n                features.Add(new IWadLaunchFeature(form.SelectedIWad, extractFiles));\n\n            features.AddRange(new List<ILaunchFeature>() {\n                new MapSkillLaunchFeature(form.SelectedMap, form.SelectedSkill),\n                new GameFilesLaunchFeature(form.GetAdditionalFiles(), form.SpecificFiles?.ToList<string>(), extractFiles),\n                new ExtraParametersLaunchFeature(form.ExtraParameters, form.ExtraParametersOnly),\n                new SourcePortExtraParametersLaunchFeature()\n            });\n\n            if (form.Record)\n                features.Add(new RecordLaunchFeature());\n\n            if (form.PlayDemo && form.SelectedDemo != null)\n            {\n                var demoFile = Path.Combine(appConfig.DemoDirectory.GetFullPath(), form.SelectedDemo.FileName);\n                features.Add(new PlayDemoLaunchFeature(demoFile));\n            }\n\n            if (form.SaveStatistics)\n                features.Add(new StatisticsReaderLaunchFeature());\n\n            if (form.LoadLatestSave)\n                features.Add(new LoadSaveLaunchFeature(GetLoadLatestSave(form.GameFile, form.SelectedSourcePort)));\n\n            GameLauncher playAdapter = new GameLauncher(appConfig, features);\n            playAdapter.ProcessExited += processExited;\n            return playAdapter;\n        }\n\n        private string GetLoadLatestSave(IGameFile gameFile, ISourcePortData sourcePortData)\n        {\n            var saveFile = DataSourceAdapter.GetFiles(gameFile, FileType.SaveGame).Where(x => x.SourcePortID == sourcePortData.SourcePortID)\n                .OrderByDescending(x => x.DateCreated).FirstOrDefault();\n            if (saveFile != null)\n                return Path.Combine(sourcePortData.GetLoadSavePath().GetFullPath(), saveFile.OriginalFileName);\n\n            return string.Empty;\n        }\n\n        private IStatisticsReader CreateStatisticsReader(ISourcePortData sourcePort, IGameFile gameFile)\n        {\n            List<IStatsData> existingStats = new List<IStatsData>();\n            if (gameFile != null && gameFile.GameFileID.HasValue)\n                existingStats = DataSourceAdapter.GetStats(gameFile.GameFileID.Value).ToList();\n\n            return sourcePort.GetFlavor().CreateStatisticsReader(gameFile, existingStats);\n        }\n\n        void m_statsReader_NewStastics(object sender, NewStatisticsEventArgs e)\n        {\n            if (e.Statistics == null || !(sender is IStatisticsReader statisticsReader))\n                return;\n\n            PlaySession session = m_activeSessions.FirstOrDefault(x => statisticsReader.Equals(x.StatisticsReader));\n            if (session == null || session.GameLaunchInfo.GameFile == null)\n                return;\n\n            e.Statistics.MapName = e.Statistics.MapName.ToUpper();\n            e.Statistics.GameFileID = session.GameLaunchInfo.GameFile.GameFileID.Value;\n            e.Statistics.SourcePortID = m_currentPlayForm.SelectedSourcePort.SourcePortID;\n\n            if (e.Update)\n            {\n                IStatsData stats = DataSourceAdapter.GetStats(e.Statistics.GameFileID).LastOrDefault(x => x.MapName == e.Statistics.MapName);\n                if (stats != null)\n                    DataSourceAdapter.DeleteStats(stats.StatID);\n            }\n\n            DataSourceAdapter.InsertStats(e.Statistics);\n        }\n\n        private bool IsGameFileIwad(IGameFile gameFile)\n        {\n            return DataSourceAdapter.GetGameFileIWads().Any(x => x.GameFileID.Value == gameFile.GameFileID.Value);\n        }\n\n        void playAdapter_ProcessExited(GameLaunchInfo launchInfo)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(new Action<GameLaunchInfo>(HandleProcessExited), new object[] { launchInfo });\n            }\n            else\n            {\n                HandleProcessExited(launchInfo);\n            }\n        }\n\n        private void HandleProcessExited(GameLaunchInfo gameLaunchInfo)\n        {\n            if (m_filterForm != null)\n            {\n                m_filterForm.Close();\n                m_filterForm = null;\n            }\n\n            PlaySession session = m_activeSessions.FirstOrDefault(x => x.GameLaunchInfo.Equals(gameLaunchInfo));\n            DateTime dtExit = DateTime.Now;\n            Directory.SetCurrentDirectory(m_workingDirectory);\n\n            if (gameLaunchInfo.SourcePort != null)\n            {\n                IGameFile gameFile = gameLaunchInfo.GameFile;\n\n                if (gameFile != null && session != null)\n                    SetMinutesPlayed(session, dtExit);\n\n                if (!string.IsNullOrEmpty(gameLaunchInfo.RecordedFileName))\n                    HandleRecordedDemo(gameLaunchInfo, gameFile);\n\n                HandleDetectorFiles(gameLaunchInfo.SourcePort, gameFile);\n\n                if (session != null && session.StatisticsReader != null)\n                {\n                    IStatisticsReader statsReader = session.StatisticsReader;\n                    statsReader.Stop();\n\n                    if (statsReader.ReadOnClose)\n                        statsReader.ReadNow();\n\n                    if (statsReader.Errors.Length > 0)\n                        HandleStatReaderErrors(statsReader);\n                }\n            }\n\n            if (session != null)\n                m_activeSessions.Remove(session);\n\n            if (m_launchArgs.AutoClose)\n            {\n                m_writeConfigOnClose = false;\n                Close();\n                return;\n            }\n\n            IGameFileView view = GetCurrentViewControl();\n            view.UpdateGameFile(gameLaunchInfo.GameFile);\n            HandleSelectionChange(view, true);\n            ShouldShowToolTip = true;\n        }\n\n        private IGameFile GetGameFileForIWad(IGameFile gameFile)\n        {\n            return DataSourceAdapter.GetGameFileIWads().FirstOrDefault(x => x.GameFileID.Value == gameFile.GameFileID.Value);\n        }\n\n        private void SetMinutesPlayed(PlaySession session, DateTime dtExit)\n        {\n            IGameFile gameFile = session.GameLaunchInfo.GameFile;\n            gameFile.MinutesPlayed += Convert.ToInt32(dtExit.Subtract(session.Start).TotalMinutes);\n            DataSourceAdapter.UpdateGameFile(gameFile, new GameFileFieldType[] { GameFileFieldType.MinutesPlayed });\n            UpdateDataSourceViews(gameFile);\n        }\n\n        private void HandleStatReaderErrors(IStatisticsReader m_statsReader)\n        {\n            TextBoxForm form = new TextBoxForm();\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.Title = \"Statistic Reader Errors\";\n            form.HeaderText = string.Concat(\"The following errors were reported by the statistics reader.\", \n                Environment.NewLine, \"The statistics may be incomplete or missing.\");\n\n            StringBuilder sb = new StringBuilder();\n            foreach(string error in m_statsReader.Errors)\n            {\n                sb.Append(error);\n                sb.Append(Environment.NewLine);\n            }\n\n            form.DisplayText = sb.ToString();\n            form.ShowDialog(this);\n        }\n\n        private void HandleDetectorFiles(ISourcePortData sourcePort, IGameFile gameFile)\n        {\n            ScreenshotHandler.HandleNewScreenshots(sourcePort, gameFile, GetNewScreenshots());\n            SaveGameHandler savegameHandler = new SaveGameHandler(DataSourceAdapter, AppConfiguration.SaveGameDirectory);\n\n            savegameHandler.HandleNewSaveGames(sourcePort, gameFile, GetNewSaveGames(m_saveFileDetectors, m_saveGames));\n            savegameHandler.HandleUpdateSaveGames(sourcePort, gameFile, m_saveGames);\n            savegameHandler.HandleDeleteSaveGames(GetDeletedSaveGames(m_saveFileDetectors), m_saveGames);\n        }\n\n        private void HandleRecordedDemo(GameLaunchInfo gameLaunchInfo, IGameFile gameFile)\n        {\n            DirectoryInfo di = new DirectoryInfo(AppConfiguration.TempDirectory.GetFullPath());\n            FileInfo fiTemp = new FileInfo(gameLaunchInfo.RecordedFileName);\n            FileInfo fi = di.GetFiles().FirstOrDefault(x => x.Name.Contains(fiTemp.Name));\n\n            if (fi != null && fi.Exists)\n            {\n                DemoHandler demoHandler = new DemoHandler(DataSourceAdapter, AppConfiguration.DemoDirectory);\n                demoHandler.HandleNewDemo(gameLaunchInfo.SourcePort, gameFile, fi.FullName,\n                    m_currentPlayForm.RecordDescriptionText);\n            }\n            else\n            {\n                MessageBox.Show(this, \"Could not find the demo file. Does this source port support recording?\", \"Demo Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n\n        private List<INewFileDetector> CreateDefaultScreenshotDetectors()\n        {\n            List<INewFileDetector> ret = new List<INewFileDetector>();\n\n            foreach (string dir in AppConfiguration.ScreenshotCaptureDirectories)\n            {\n                if (Directory.Exists(dir))\n                    ret.Add(CreateScreenshotDetector(dir));\n            }\n\n            return ret;\n        }\n\n        private List<INewFileDetector> CreateDefaultSaveGameDetectors()\n        {\n            return new List<INewFileDetector>();\n        }\n\n        private INewFileDetector CreateScreenshotDetector(string dir)\n        {\n            return new NewFileDetector(new string[] { \".png\", \".jpg\", \".bmp\" }, dir, true); //future - should be configurable\n        }\n\n        private INewFileDetector CreateSaveGameDetector(string dir)\n        {\n            return new NewFileDetector(new string[] { \".zds\", \".dsg\", \".esg\", \".hsg\" }, dir, true); //future - should be configurable\n        }\n\n        private string[] GetNewScreenshots()\n        {\n            IEnumerable<string> newFiles = new string[] { };\n            m_screenshotDetectors.ForEach(x => newFiles = newFiles.Union(x.GetNewFiles()));\n            return newFiles.ToArray();\n        }\n\n        private static string[] GetNewSaveGames(List<INewFileDetector> saveFileDetectors, IFileData[] existingSaves)\n        {\n            IEnumerable<string> newFiles = new string[] { };\n            saveFileDetectors.ForEach(x => newFiles = newFiles.Union(x.GetNewFiles()));\n\n            IEnumerable<string> modifiedFiles = new string[] { };\n            saveFileDetectors.ForEach(x => modifiedFiles = modifiedFiles.Union(x.GetModifiedFiles()));\n\n            //modified files uses full path, m_saveGames does not. This section checks for modified files that were not part of the gamefile's save games\n            //e.g save0.zds was a save game for this gamefile. User overwrites save1.zds for this gamefile. We now need to keep track of save1.zds as well.\n            IEnumerable<string> saveFiles = existingSaves.Select(x => x.OriginalFileName);\n            List<string> ret = newFiles.ToList();\n            foreach(string modifiedFile in modifiedFiles)\n            {\n                FileInfo fi = new FileInfo(modifiedFile);\n                if (!saveFiles.Contains(fi.Name) && !ret.Contains(fi.Name))\n                    ret.Add(modifiedFile);\n            }\n\n            return ret.ToArray();\n        }\n\n        private static string[] GetDeletedSaveGames(List<INewFileDetector> saveFileDetectors)\n        {\n            IEnumerable<string> deletedFiles = new string[] { };\n            saveFileDetectors.ForEach(x => deletedFiles = deletedFiles.Union(x.GetDeletedFiles()));\n            return deletedFiles.ToArray();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/MainForm_Sync.cs",
    "content": "﻿using DoomLauncher.Handlers.Sync;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class MainForm\n    {\n        private async Task<SyncResult> SyncLocalDatabase(string[] fileNames, FileManagement fileManagement, bool updateViews, ITagData tag = null)\n        {\n            var pg = ProgressBarStart(ProgressBarType.Sync);\n            pg.Text = $\"Syncing {fileNames.Count()} files...\";\n            SyncResult syncResult =  await Task.Run(() => ExecuteSyncHandler(fileNames, fileManagement, tag));\n            ProgressBarEnd(ProgressBarType.Sync);\n            SyncLocalDatabaseComplete(syncResult, updateViews);\n            return syncResult;\n        }\n\n        void SyncLocalDatabaseComplete(SyncResult syncResult, bool updateViews)\n        {\n            if (updateViews)\n            {\n                UpdateLocal();\n                HandleTabSelectionChange();\n\n                foreach (IGameFile updateGameFile in syncResult.UpdatedGameFiles)\n                    UpdateDataSourceViews(updateGameFile);\n\n                IGameFileView view = GetCurrentViewControl();\n                IGameFile selectedFile = view.SelectedItem;\n                if (selectedFile != null && syncResult.UpdatedGameFiles.Contains(selectedFile))\n                    HandleSelectionChange(view, true);\n            }\n\n            if (syncResult != null && syncResult.FailedTitlePicFiles.Count > 0)\n            {\n                StringBuilder sb = new StringBuilder(\"The following files had title images but failed to convert to a valid image:\");\n                sb.AppendLine();\n                sb.AppendLine();\n                foreach (IGameFile gameFile in syncResult.FailedTitlePicFiles)\n                    sb.Append(gameFile.FileNameNoPath);\n\n                MessageBox.Show(this, sb.ToString(), \"Image Conversion Failure\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n\n            if (syncResult != null &&\n                (syncResult.InvalidFiles.Count > 0 || m_zdlInvalidFiles.Count > 0))\n            {\n                DisplayInvalidFilesError(syncResult.InvalidFiles.Union(m_zdlInvalidFiles));\n            }\n            else if (m_launchFile != null)\n            {\n                IGameFile launchFile = DataSourceAdapter.GetGameFile(Path.GetFileName(m_launchFile));\n                m_launchFile = null;\n                if (launchFile != null)\n                    HandlePlay(new IGameFile[] { launchFile });\n            }\n        }\n\n        private void DisplayInvalidFilesError(IEnumerable<InvalidFile> invalidFiles)\n        {\n            StringBuilder sb = new StringBuilder();\n\n            foreach (InvalidFile file in invalidFiles)\n            {\n                sb.Append(file.FileName);\n                sb.Append(\": \");\n                sb.Append(file.Reason);\n                sb.Append(Environment.NewLine);\n            }\n\n            ShowTextBoxForm(\"Processing Errors\",\n                \"The information on these files may be incomplete.\\n\\nFor ZDL files adding the missing Source Port/IWAD name and re-adding will update the information.\\n\\nFor zip archive/pk3 errors: Doom Launcher uses a zip library that has very strict zip rules that not all applications respect.\\n\\nVerify the zip by opening it with your favorite zip application. Create a new zip file and extract the files from the original zip into the newly created one. Then add the newly created zip to Doom Launcher.\",\n                sb.ToString(), false);\n        }\n\n        private SyncResult ExecuteSyncHandler(string[] files, FileManagement fileManagement, ITagData tag = null)\n        {\n            SyncLibraryHandler handler = null;\n            SyncResult syncResult = SyncResult.EMPTY;\n\n            try\n            {\n                var syncActions = new List<ISyncAction>()\n                {\n                    // Lower on the list is higher priority\n                    new TextFileSyncAction(new IdGamesTextFileParser(AppConfiguration.DateParseFormats).Parse),\n                    new Doom64SyncAction(DataSourceAdapter),\n                    new MapStringSyncAction(AppConfiguration.TempDirectory),\n                    new GameInfoSyncAction(),\n                    new StartupImageSyncAction(),\n                    new TitlePicSyncAction(DataSourceAdapter, \n                                            DataCache.Instance.DefaultPalette,\n                                            DataCache.Instance.HexenPalette,\n                                            DataCache.Instance.HereticPalette).OnlyIf(AppConfiguration.AutomaticallyPullTitlpic),\n                    new Doom64TitlePicSyncAction(),\n                    new IWadTitlesSyncAction(),\n                    new GameConfSyncAction(DataSourceAdapter),\n                    new KnownWadsSyncAction(DataSourceAdapter)\n                };\n\n                handler = new SyncLibraryHandler(DataSourceAdapter, DirectoryDataSourceAdapter, AppConfiguration, \n                    fileManagement, syncActions);\n\n                handler.SyncFileChanged += syncHandler_SyncFileChanged;\n                handler.GameFileDataNeeded += syncHandler_GameFileDataNeeded;\n\n                syncResult = handler.SyncManyFiles(files);\n                SyncTitlePics(syncResult);\n\n                if (m_pendingZdlFiles != null)\n                {\n                    SyncPendingZdlFiles();\n                    m_pendingZdlFiles = null;\n                }\n\n                if (tag != null)\n                    TagSyncFiles(syncResult, tag);\n            }\n            catch (Exception ex)\n            {\n                Util.DisplayUnexpectedException(this, ex);\n            }\n\n            return syncResult;\n        }\n\n        private void SyncTitlePics(SyncResult syncResult)\n        {\n            foreach (IGameFile gameFile in syncResult.AddedOrUpdatedFiles)\n            {\n                if (!syncResult.GetTitlePic(gameFile, out Image image))\n                    continue;\n\n                image = image.ScaleDoomImage();\n\n                var screenshots = DataSourceAdapter.GetFiles(gameFile, FileType.Screenshot);\n                if (ScreenshotHandler.FindScreenshot(screenshots, image, out MemoryStream imageStream))\n                    continue;\n\n                if (imageStream == null)\n                    continue;\n\n                ScreenshotHandler.InsertScreenshot(gameFile, imageStream, screenshots, out _);\n                imageStream?.Dispose();\n            }\n        }\n\n        private void TagSyncFiles(SyncResult syncResult, ITagData tag)\n        {\n            DataCache.Instance.AddGameFileTag(syncResult.AddedGameFiles, tag, out _);\n            DataCache.Instance.AddGameFileTag(syncResult.UpdatedGameFiles, tag, out _);\n            DataCache.Instance.TagMapLookup.Refresh(new ITagData[] { tag });\n        }\n\n        private void SyncPendingZdlFiles()\n        {\n            foreach(IGameFile gameFile in m_pendingZdlFiles)\n            {\n                IGameFile libraryGameFile = DataSourceAdapter.GetGameFile(gameFile.FileName);\n\n                if (libraryGameFile != null)\n                {\n                    libraryGameFile.SettingsSkill = gameFile.SettingsSkill;\n                    libraryGameFile.SettingsMap = gameFile.SettingsMap;\n                    libraryGameFile.SettingsExtraParams = gameFile.SettingsExtraParams;\n                    libraryGameFile.SourcePortID = gameFile.SourcePortID;\n                    libraryGameFile.IWadID = gameFile.IWadID;\n                    libraryGameFile.SettingsSkill = gameFile.SettingsSkill;\n                    libraryGameFile.SettingsFiles = gameFile.SettingsFiles;\n\n                    if (string.IsNullOrEmpty(libraryGameFile.Comments))\n                        libraryGameFile.Comments = gameFile.Comments;\n\n                    DataSourceAdapter.UpdateGameFile(libraryGameFile);\n                }\n            }\n        }\n\n        void syncHandler_SyncFileChanged(SyncLibraryHandler.SyncProgressEvent e)\n        {\n            if (InvokeRequired)\n                Invoke(new Action<SyncLibraryHandler.SyncProgressEvent>(ProgressBarUpdate), new object[] { e });\n            else\n                ProgressBarUpdate(e);\n        }\n\n        void syncHandler_GameFileDataNeeded(SyncLibraryHandler.GameFileDataNeededEvent e)\n        {\n            if (InvokeRequired)\n                Invoke(new Action<SyncLibraryHandler.GameFileDataNeededEvent>(HandleGameFileDataNeeded), new object[] { e });\n            else\n                HandleGameFileDataNeeded(e);\n        }\n\n        void HandleGameFileDataNeeded(SyncLibraryHandler.GameFileDataNeededEvent e)\n        {\n            if (CurrentDownloadFile != null && CurrentDownloadFile.FileName == e.CurrentGameFile.FileName)\n            {\n                e.CurrentGameFile.Title = CurrentDownloadFile.Title;\n                e.CurrentGameFile.Author = CurrentDownloadFile.Author;\n                e.CurrentGameFile.ReleaseDate = CurrentDownloadFile.ReleaseDate;\n            }\n        }\n\n        void ProgressBarUpdate(SyncLibraryHandler.SyncProgressEvent e)\n        {\n            if (m_progressBars.TryGetValue(ProgressBarType.Sync, out var progressBar))\n            {\n                progressBar.Maximum = e.SyncFileCount;\n                progressBar.Value = e.SyncFileCurrent;\n                progressBar.DisplayText = string.Format(\"Reading {0}...\", e.CurrentSyncFileName);\n            }\n        }\n\n        void ProgressBarForm_Cancelled(object sender, EventArgs e)\n        {\n            Enabled = true;\n            BringToFront();\n        }\n\n        private void SyncIWads(IEnumerable<IGameFile> gameFiles)\n        {\n            foreach (var gameFile in gameFiles)\n            {\n                DataSourceAdapter.InsertIWad(new IWadData() { GameFileID = gameFile.GameFileID.Value, FileName = gameFile.FileName, Name = gameFile.FileName });\n                var iwad = DataSourceAdapter.GetIWads().OrderBy(x => x.IWadID).LastOrDefault();\n\n                IWadInfo wadInfo = IWadInfo.GetIWadInfo(gameFile.FileName);\n                gameFile.Title = wadInfo == null ? Path.GetFileNameWithoutExtension(gameFile.FileName).ToUpper() : wadInfo.Title;\n                DataSourceAdapter.UpdateGameFile(gameFile, new GameFileFieldType[] { GameFileFieldType.Title });\n\n                if (iwad != null)\n                {\n                    gameFile.IWadID = iwad.IWadID;\n                    DataSourceAdapter.UpdateGameFile(gameFile, new[] { GameFileFieldType.IWadID });\n                }\n                \n            }\n\n            ThumbnailManager.SetIWads(DataSourceAdapter.GetGameFileIWads().ToList());\n\n            UpdateLocal();\n            HandleTabSelectionChange();\n        }\n\n        private async void HandleSyncStatus()\n        {\n            IEnumerable<string> dsFiles = DirectoryDataSourceAdapter.GetGameFileNames();\n            IEnumerable<string> dbFiles = DataSourceAdapter.GetGameFileNames();\n            IEnumerable<string> diff = dsFiles.Except(dbFiles);\n\n            SyncStatusForm form = ShowSyncStatusForm(\"Sync Status\", \"Files that exist in the GameFiles directory but not the Database:\", diff,\n                new string[] { \"Do Nothing\", \"Add to Library\", \"Delete\" });\n            Task task = HandleSyncStatusGameFilesOption((SyncFileOption)form.SelectedOptionIndex, form.GetSelectedFiles());\n            await task;\n\n            diff = dbFiles.Except(dsFiles);\n\n            form = ShowSyncStatusForm(\"Sync Status\", \"Files that exist in the Database but not the GameFiles directory:\", diff,\n                new string[] { \"Do Nothing\", \"Find in idgames\", \"Delete\" });\n            task = HandleSyncStatusLibraryOptions((SyncFileOption)form.SelectedOptionIndex, form.GetSelectedFiles());\n            await task;\n        }\n\n        private async Task HandleSyncStatusGameFilesOption(SyncFileOption option, IEnumerable<string> files)\n        {\n            switch (option)\n            {\n                case SyncFileOption.Add:\n                    ProgressBarStart(ProgressBarType.Sync);\n\n                    SyncResult syncResult = await Task.Run(() => ExecuteSyncHandler(files.ToArray(), FileManagement.Managed));\n\n                    ProgressBarEnd(ProgressBarType.Sync);\n                    SyncLocalDatabaseComplete(syncResult, true);\n                    break;\n\n                case SyncFileOption.Delete:\n                    ProgressBarStart(ProgressBarType.Delete);\n\n                    await Task.Run(() => DeleteLocalGameFiles(files));\n\n                    ProgressBarEnd(ProgressBarType.Delete);\n                    break;\n\n                default:\n                    break;\n            }\n        }\n\n        private void DeleteLocalGameFiles(IEnumerable<string> files)\n        {\n            foreach (string file in files)\n            {\n                try\n                {\n                    File.Delete(Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), file));\n                }\n                catch\n                {\n                    //failed, nothing to do\n                }\n            }\n        }\n\n        private async Task HandleSyncStatusLibraryOptions(SyncFileOption option, IEnumerable<string> files)\n        {\n            switch (option)\n            {\n                case SyncFileOption.Add:\n                    ProgressBarStart(ProgressBarType.Search);\n\n                    List<IGameFile> gameFiles = await Task.Run(() => FindIdGamesFiles(files));\n                    if (gameFiles == null)\n                    {\n                        MessageBox.Show(this, \"Failed to connect to id games.\", \"Connection Failure\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                    }\n                    else\n                    {\n                        foreach (IGameFile gameFile in gameFiles)\n                            m_downloadHandler.Download(IdGamesDataSourceAdapter, gameFile as IGameFileDownloadable);\n                    }\n\n                    ProgressBarEnd(ProgressBarType.Search);\n\n                    if (gameFiles != null)\n                    {\n                        DisplayFilesNotFound(files, gameFiles);\n\n                        if (gameFiles.Count > 0)\n                            DisplayDownloads();\n                    }\n\n                    break;\n\n                case SyncFileOption.Delete:\n                    ProgressBarStart(ProgressBarType.Delete);\n\n                    await Task.Run(() => DeleteLibraryGameFiles(files));\n\n                    ProgressBarEnd(ProgressBarType.Delete);\n                    UpdateLocal();\n                    break;\n\n                default:\n                    break;\n            }\n        }\n\n        private void DisplayFilesNotFound(IEnumerable<string> files, List<IGameFile> gameFiles)\n        {\n            IEnumerable<string> filesNotFound = files.Except(gameFiles.Select(x => x.FileName));\n\n            if (filesNotFound.Any())\n            {\n                StringBuilder sb = new StringBuilder();\n                foreach (string file in filesNotFound)\n                {\n                    sb.Append(file);\n                    sb.Append(Environment.NewLine);\n                }\n\n                TextBoxForm form = new TextBoxForm(true, MessageBoxButtons.OK);\n                form.Title = \"Files Not Found\";\n                form.HeaderText = \"The following files were not found in the idgames database:\";\n                form.DisplayText = sb.ToString();\n                form.ShowDialog(this);\n            }\n        }\n\n        private List<IGameFile> FindIdGamesFiles(IEnumerable<string> files)\n        {\n            List<IGameFile> gameFiles = new List<IGameFile>();\n\n            try\n            {\n                foreach (string file in files)\n                {\n                    IGameFile gameFile = IdGamesDataSourceAdapter.GetGameFile(file);\n                    if (gameFile != null)\n                        gameFiles.Add(gameFile);\n                }\n            }\n            catch\n            {\n                return null;\n            }\n\n            return gameFiles;\n        }\n\n        private void DeleteLibraryGameFiles(IEnumerable<string> files)\n        {\n            foreach (string file in files)\n            {\n                IGameFile gameFile = DataSourceAdapter.GetGameFile(file);\n                if (gameFile != null && gameFile.GameFileID.HasValue)\n                    DeleteGameFileAndAssociations(gameFile);\n            }\n        }\n\n        private SyncStatusForm ShowSyncStatusForm(string title, string header, IEnumerable<string> files, IEnumerable<string> dropDownOptions)\n        {\n            SyncStatusForm form = new SyncStatusForm();\n            form.Text = title;\n            form.SetHeaderText(header);\n            form.SetData(files, dropDownOptions);\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.ShowDialog(this);\n            return form;\n        }\n\n        private async Task HandleResync(bool pullTitlepic)\n        {\n            IGameFileView view = GetCurrentViewControl();\n            if (view == null)\n                return;\n\n            bool? setPullTitlepic = null;\n            if (!pullTitlepic)\n                setPullTitlepic = false;\n            var allGameFiles = SelectedItems(view);\n\n            AddFileType addFileType = view.DoomLauncherParent is IWadTabViewCtrl ? AddFileType.IWad : AddFileType.GameFile;\n\n            var managed = allGameFiles.Where(x => !x.IsUnmanaged()).Select(x => Path.Combine(AppConfiguration.GameFileDirectory.GetFullPath(), x.FileName)).ToArray();\n            if (managed.Length > 0)\n                await HandleAddGameFiles(addFileType, managed, overrideManagement: FileManagement.Managed,\n                    overridePullTitlepic: setPullTitlepic);\n\n            var unmanaged = allGameFiles.Where(x => x.IsUnmanaged()).Select(x => x.FileName).ToArray();\n            if (unmanaged.Length > 0)\n                await HandleAddGameFiles(addFileType, unmanaged, overrideManagement: FileManagement.Unmanaged,\n                    overridePullTitlepic: setPullTitlepic);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/MessageCheckBox.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class MessageCheckBox\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MessageCheckBox));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.checkBox1 = new System.Windows.Forms.CheckBox();\n            this.tblMessage = new System.Windows.Forms.TableLayoutPanel();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.lblText = new DoomLauncher.GrowLabel();\n            this.tblMain.SuspendLayout();\n            this.tblMessage.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.checkBox1, 0, 2);\n            this.tblMain.Controls.Add(this.tblMessage, 0, 0);\n            this.tblMain.Controls.Add(this.flpButtons, 0, 1);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 79F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.Size = new System.Drawing.Size(533, 156);\n            this.tblMain.TabIndex = 0;\n            // \n            // checkBox1\n            // \n            this.checkBox1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.checkBox1.AutoSize = true;\n            this.checkBox1.Location = new System.Drawing.Point(4, 127);\n            this.checkBox1.Margin = new System.Windows.Forms.Padding(4);\n            this.checkBox1.Name = \"checkBox1\";\n            this.checkBox1.Size = new System.Drawing.Size(185, 20);\n            this.checkBox1.TabIndex = 0;\n            this.checkBox1.Text = \"Don\\'t show this error again\";\n            this.checkBox1.UseVisualStyleBackColor = true;\n            // \n            // tblMessage\n            // \n            this.tblMessage.ColumnCount = 2;\n            this.tblMessage.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 64F));\n            this.tblMessage.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMessage.Controls.Add(this.lblText, 1, 0);\n            this.tblMessage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMessage.Location = new System.Drawing.Point(0, 0);\n            this.tblMessage.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMessage.Name = \"tblMessage\";\n            this.tblMessage.RowCount = 1;\n            this.tblMessage.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMessage.Size = new System.Drawing.Size(533, 79);\n            this.tblMessage.TabIndex = 2;\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnCancel);\n            this.flpButtons.Controls.Add(this.btnOK);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpButtons.Location = new System.Drawing.Point(0, 79);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(533, 39);\n            this.flpButtons.TabIndex = 3;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(429, 7);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 7, 4, 4);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(100, 28);\n            this.btnCancel.TabIndex = 2;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(321, 7);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4, 7, 4, 4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(100, 28);\n            this.btnOK.TabIndex = 1;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            // \n            // lblText\n            // \n            this.lblText.AutoSize = true;\n            this.lblText.IsPath = false;\n            this.lblText.Location = new System.Drawing.Point(68, 0);\n            this.lblText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblText.Name = \"lblText\";\n            this.lblText.Size = new System.Drawing.Size(0, 0);\n            this.lblText.TabIndex = 0;\n            // \n            // MessageCheckBox\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(533, 156);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"MessageCheckBox\";\n            this.Text = \"MessageCheckBox\";\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.tblMessage.ResumeLayout(false);\n            this.tblMessage.PerformLayout();\n            this.flpButtons.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.CheckBox checkBox1;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.TableLayoutPanel tblMessage;\n        private GrowLabel lblText;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private System.Windows.Forms.Button btnCancel;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/MessageCheckBox.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class MessageCheckBox : Form\n    {\n        private readonly Icon m_icon;\n        private readonly int m_height;\n\n        public MessageCheckBox(string title, string text, string checkBoxText, Icon icon)\n            : this(title, text, checkBoxText, icon, MessageBoxButtons.OK)\n        {\n            \n        }\n\n        public MessageCheckBox(string title, string text, string checkBoxText, Icon icon, MessageBoxButtons buttons, \n            MessageBoxDefaultButton defaultButton = MessageBoxDefaultButton.Button1)\n        {\n            InitializeComponent();\n\n            StartPosition = FormStartPosition.CenterParent;\n\n            if (buttons == MessageBoxButtons.OK)\n                btnCancel.Visible = false;\n\n            if (buttons == MessageBoxButtons.YesNo || buttons == MessageBoxButtons.YesNoCancel)\n            {\n                btnOK.Text = \"Yes\";\n                btnCancel.Text = \"No\";\n                btnOK.DialogResult = DialogResult.Yes;\n                btnCancel.DialogResult = DialogResult.No;\n            }\n\n            if (buttons == MessageBoxButtons.RetryCancel)\n            {\n                btnOK.Text = \"Retry\";\n                btnCancel.Text = \"Cancel\";\n                btnOK.DialogResult = DialogResult.Retry;\n                btnCancel.DialogResult = DialogResult.Cancel;\n            }\n\n            if (defaultButton == MessageBoxDefaultButton.Button1)\n            {\n                TabIndex = 0;\n                AcceptButton = btnOK;\n            }\n            else\n            {\n                TabIndex = 1;\n                AcceptButton = btnCancel;\n            }\n\n            Text = title;\n            lblText.Text = text;\n            checkBox1.Text = checkBoxText;\n            m_icon = icon;\n\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            int textHeight = lblText.Height + dpiScale.ScaleIntY(16);\n            int textRowHeight = (int)tblMain.RowStyles[0].Height;\n            if (textHeight > textRowHeight)\n            {\n                int addHeight = textHeight - textRowHeight;\n                Height += addHeight;\n                tblMain.RowStyles[0].Height += addHeight;\n            }\n\n            tblMessage.Paint += tblMessage_Paint;\n            lblText.Anchor = AnchorStyles.Left;\n\n            m_height = Height;\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public void SetShowCheckBox(bool set)\n        {            \n            checkBox1.Visible = set;\n\n            if (set)\n            {\n                Height = m_height;\n                return;\n            }\n\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            Height -= dpiScale.ScaleIntY(28);\n        }\n\n        void tblMessage_Paint(object sender, PaintEventArgs e)\n        {\n            int height = (int)tblMain.RowStyles[0].Height;\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            Rectangle rect = new Rectangle(dpiScale.ScaleIntX(14), (height - dpiScale.ScaleIntY(32)) / 2, \n                dpiScale.ScaleIntX(32), dpiScale.ScaleIntY(32));\n            e.Graphics.DrawIcon(m_icon, rect);\n        }\n\n        public bool Checked => checkBox1.Checked;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/MessageCheckBox.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/MetaDataForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class MetaDataForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MetaDataForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.gameFileEdit1 = new DoomLauncher.GameFileEdit();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.button1 = new System.Windows.Forms.Button();\n            this.btnAccept = new System.Windows.Forms.Button();\n            this.label1 = new System.Windows.Forms.Label();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.gameFileEdit1, 0, 1);\n            this.tblMain.Controls.Add(this.flowLayoutPanel1, 0, 3);\n            this.tblMain.Controls.Add(this.label1, 0, 2);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 4;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 62F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.Size = new System.Drawing.Size(645, 878);\n            this.tblMain.TabIndex = 2;\n            // \n            // gameFileEdit1\n            // \n            this.gameFileEdit1.AuthorChecked = false;\n            this.gameFileEdit1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.gameFileEdit1.CommentsChecked = true;\n            this.gameFileEdit1.DescriptionChecked = false;\n            this.gameFileEdit1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gameFileEdit1.ForeColor = System.Drawing.Color.White;\n            this.gameFileEdit1.Location = new System.Drawing.Point(0, 40);\n            this.gameFileEdit1.MapsChecked = true;\n            this.gameFileEdit1.Margin = new System.Windows.Forms.Padding(0);\n            this.gameFileEdit1.Name = \"gameFileEdit1\";\n            this.gameFileEdit1.RatingChecked = false;\n            this.gameFileEdit1.ReleaseDateChecked = false;\n            this.gameFileEdit1.Size = new System.Drawing.Size(645, 727);\n            this.gameFileEdit1.TabIndex = 0;\n            this.gameFileEdit1.TagsChecked = true;\n            this.gameFileEdit1.TitleChecked = false;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.btnCancel);\n            this.flowLayoutPanel1.Controls.Add(this.button1);\n            this.flowLayoutPanel1.Controls.Add(this.btnAccept);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 829);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(645, 49);\n            this.flowLayoutPanel1.TabIndex = 1;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(529, 5);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(112, 35);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // button1\n            // \n            this.button1.DialogResult = System.Windows.Forms.DialogResult.Yes;\n            this.button1.Location = new System.Drawing.Point(409, 5);\n            this.button1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.button1.Name = \"button1\";\n            this.button1.Size = new System.Drawing.Size(112, 35);\n            this.button1.TabIndex = 2;\n            this.button1.Text = \"Accept All\";\n            this.button1.UseVisualStyleBackColor = true;\n            // \n            // btnAccept\n            // \n            this.btnAccept.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnAccept.Location = new System.Drawing.Point(289, 5);\n            this.btnAccept.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnAccept.Name = \"btnAccept\";\n            this.btnAccept.Size = new System.Drawing.Size(112, 35);\n            this.btnAccept.TabIndex = 1;\n            this.btnAccept.Text = \"Accept\";\n            this.btnAccept.UseVisualStyleBackColor = true;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.label1.Location = new System.Drawing.Point(4, 778);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(626, 40);\n            this.label1.TabIndex = 2;\n            this.label1.Text = \"The fields from id games are displayed above. To accept meta changes, check the b\" +\n    \"ox next to the items you wish to update and click accept.\";\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(645, 40);\n            this.titleBar.TabIndex = 3;\n            this.titleBar.Title = \"Metadata\";\n            // \n            // MetaDataForm\n            // \n            this.AcceptButton = this.btnAccept;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(645, 878);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"MetaDataForm\";\n            this.Text = \"Metadata\";\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private GameFileEdit gameFileEdit1;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnAccept;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Button button1;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/MetaDataForm.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class MetaDataForm : Form\n    {\n        public MetaDataForm()\n        {\n            InitializeComponent();\n            gameFileEdit1.SetShowCheckBoxes(true);\n            gameFileEdit1.SetShowMaps(false);\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public GameFileEdit GameFileEdit\n        {\n            get { return gameFileEdit1; }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/MetaDataForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/PlayForm.Designer.cs",
    "content": "﻿using DoomLauncher.Controls;\n\nnamespace DoomLauncher\n{\n    partial class PlayForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlayForm));\n            this.cmbSourcePorts = new System.Windows.Forms.ComboBox();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.cmbIwad = new System.Windows.Forms.ComboBox();\n            this.groupBox1 = new System.Windows.Forms.GroupBox();\n            this.tblProfile = new System.Windows.Forms.TableLayoutPanel();\n            this.lblProfile = new System.Windows.Forms.Label();\n            this.cmbProfiles = new DoomLauncher.Controls.CComboBox();\n            this.panel2 = new System.Windows.Forms.Panel();\n            this.profileToolStrip = new System.Windows.Forms.ToolStrip();\n            this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton();\n            this.newProfileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.newGlobalProfileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.editProfileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.deleteProfileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.btnProfileMenu = new DoomLauncher.FormButton();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label1 = new System.Windows.Forms.Label();\n            this.cmbMap = new System.Windows.Forms.ComboBox();\n            this.label4 = new System.Windows.Forms.Label();\n            this.cmbSkill = new System.Windows.Forms.ComboBox();\n            this.txtDescription = new System.Windows.Forms.TextBox();\n            this.cmbDemo = new System.Windows.Forms.ComboBox();\n            this.groupBox2 = new System.Windows.Forms.GroupBox();\n            this.lnkOpenDemo = new System.Windows.Forms.LinkLabel();\n            this.label3 = new System.Windows.Forms.Label();\n            this.txtParameters = new System.Windows.Forms.TextBox();\n            this.chkMap = new DoomLauncher.CCheckBox();\n            this.chkDemo = new DoomLauncher.CCheckBox();\n            this.chkRecord = new DoomLauncher.CCheckBox();\n            this.lnkMore = new System.Windows.Forms.LinkLabel();\n            this.groupBox4 = new System.Windows.Forms.GroupBox();\n            this.lnkLoadSaveMore = new System.Windows.Forms.LinkLabel();\n            this.chkLoadLatestSave = new DoomLauncher.CCheckBox();\n            this.lnkFilterSettings = new System.Windows.Forms.LinkLabel();\n            this.chkScreenFilter = new DoomLauncher.CCheckBox();\n            this.lnkPreviewLaunchParameters = new System.Windows.Forms.LinkLabel();\n            this.chkExtraParamsOnly = new DoomLauncher.CCheckBox();\n            this.chkSaveStats = new DoomLauncher.CCheckBox();\n            this.groupBox3 = new System.Windows.Forms.GroupBox();\n            this.tblFiles = new DoomLauncher.TableLayoutPanelDB();\n            this.ctrlFiles = new DoomLauncher.FilesCtrl();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.lblInfo = new System.Windows.Forms.Label();\n            this.pbInfo = new System.Windows.Forms.PictureBox();\n            this.flp1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.lnkSpecific = new System.Windows.Forms.LinkLabel();\n            this.lnkCustomParameters = new System.Windows.Forms.LinkLabel();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.tblInner = new DoomLauncher.TableLayoutPanelDB();\n            this.pnlLeft = new System.Windows.Forms.Panel();\n            this.pnlBottom = new System.Windows.Forms.Panel();\n            this.btnSaveSettings = new System.Windows.Forms.Button();\n            this.flpButtons = new DoomLauncher.FlowLayoutPanelDB();\n            this.chkRemember = new DoomLauncher.CCheckBox();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.groupBox1.SuspendLayout();\n            this.tblProfile.SuspendLayout();\n            this.panel2.SuspendLayout();\n            this.profileToolStrip.SuspendLayout();\n            this.groupBox2.SuspendLayout();\n            this.groupBox4.SuspendLayout();\n            this.groupBox3.SuspendLayout();\n            this.tblFiles.SuspendLayout();\n            this.panel1.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).BeginInit();\n            this.flp1.SuspendLayout();\n            this.tblMain.SuspendLayout();\n            this.tblInner.SuspendLayout();\n            this.pnlLeft.SuspendLayout();\n            this.pnlBottom.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // cmbSourcePorts\n            // \n            this.cmbSourcePorts.DisplayMember = \"Name\";\n            this.cmbSourcePorts.FormattingEnabled = true;\n            this.cmbSourcePorts.Location = new System.Drawing.Point(51, 46);\n            this.cmbSourcePorts.Name = \"cmbSourcePorts\";\n            this.cmbSourcePorts.Size = new System.Drawing.Size(193, 21);\n            this.cmbSourcePorts.TabIndex = 0;\n            this.cmbSourcePorts.TabStop = false;\n            // \n            // btnOK\n            // \n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(41, 4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(75, 23);\n            this.btnOK.TabIndex = 1;\n            this.btnOK.TabStop = false;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(122, 4);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 2;\n            this.btnCancel.TabStop = false;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // cmbIwad\n            // \n            this.cmbIwad.DisplayMember = \"FileName\";\n            this.cmbIwad.FormattingEnabled = true;\n            this.cmbIwad.Location = new System.Drawing.Point(51, 74);\n            this.cmbIwad.Name = \"cmbIwad\";\n            this.cmbIwad.Size = new System.Drawing.Size(193, 21);\n            this.cmbIwad.TabIndex = 3;\n            this.cmbIwad.TabStop = false;\n            this.cmbIwad.ValueMember = \"GameFileID\";\n            // \n            // groupBox1\n            // \n            this.groupBox1.Controls.Add(this.tblProfile);\n            this.groupBox1.Controls.Add(this.label2);\n            this.groupBox1.Controls.Add(this.label1);\n            this.groupBox1.Controls.Add(this.cmbSourcePorts);\n            this.groupBox1.Controls.Add(this.cmbIwad);\n            this.groupBox1.Location = new System.Drawing.Point(3, 3);\n            this.groupBox1.Name = \"groupBox1\";\n            this.groupBox1.Size = new System.Drawing.Size(256, 107);\n            this.groupBox1.TabIndex = 5;\n            this.groupBox1.TabStop = false;\n            // \n            // tblProfile\n            // \n            this.tblProfile.ColumnCount = 3;\n            this.tblProfile.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 45F));\n            this.tblProfile.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblProfile.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 27F));\n            this.tblProfile.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 15F));\n            this.tblProfile.Controls.Add(this.lblProfile, 0, 0);\n            this.tblProfile.Controls.Add(this.cmbProfiles, 1, 0);\n            this.tblProfile.Controls.Add(this.panel2, 2, 0);\n            this.tblProfile.Location = new System.Drawing.Point(3, 16);\n            this.tblProfile.Margin = new System.Windows.Forms.Padding(0);\n            this.tblProfile.Name = \"tblProfile\";\n            this.tblProfile.RowCount = 1;\n            this.tblProfile.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblProfile.Size = new System.Drawing.Size(241, 25);\n            this.tblProfile.TabIndex = 9;\n            // \n            // lblProfile\n            // \n            this.lblProfile.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblProfile.AutoSize = true;\n            this.lblProfile.Location = new System.Drawing.Point(3, 6);\n            this.lblProfile.Name = \"lblProfile\";\n            this.lblProfile.Size = new System.Drawing.Size(36, 13);\n            this.lblProfile.TabIndex = 10;\n            this.lblProfile.Text = \"Profile\";\n            // \n            // cmbProfiles\n            // \n            this.cmbProfiles.BackColor = System.Drawing.Color.White;\n            this.cmbProfiles.DisplayMember = \"Name\";\n            this.cmbProfiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbProfiles.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cmbProfiles.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\n            this.cmbProfiles.ForeColor = System.Drawing.SystemColors.WindowText;\n            this.cmbProfiles.FormattingEnabled = true;\n            this.cmbProfiles.Location = new System.Drawing.Point(48, 3);\n            this.cmbProfiles.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3);\n            this.cmbProfiles.Name = \"cmbProfiles\";\n            this.cmbProfiles.Size = new System.Drawing.Size(166, 21);\n            this.cmbProfiles.TabIndex = 9;\n            this.cmbProfiles.TabStop = false;\n            this.cmbProfiles.ValueMember = \"GameProfileID\";\n            // \n            // panel2\n            // \n            this.panel2.Controls.Add(this.profileToolStrip);\n            this.panel2.Controls.Add(this.btnProfileMenu);\n            this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panel2.Location = new System.Drawing.Point(214, 0);\n            this.panel2.Margin = new System.Windows.Forms.Padding(0);\n            this.panel2.Name = \"panel2\";\n            this.panel2.Size = new System.Drawing.Size(27, 25);\n            this.panel2.TabIndex = 14;\n            // \n            // profileToolStrip\n            // \n            this.profileToolStrip.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.profileToolStrip.Dock = System.Windows.Forms.DockStyle.None;\n            this.profileToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.profileToolStrip.ImageScalingSize = new System.Drawing.Size(20, 20);\n            this.profileToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.toolStripDropDownButton1});\n            this.profileToolStrip.Location = new System.Drawing.Point(0, 3);\n            this.profileToolStrip.Margin = new System.Windows.Forms.Padding(0, 1, 0, 0);\n            this.profileToolStrip.Name = \"profileToolStrip\";\n            this.profileToolStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;\n            this.profileToolStrip.Size = new System.Drawing.Size(38, 26);\n            this.profileToolStrip.TabIndex = 12;\n            this.profileToolStrip.Text = \"Options\";\n            // \n            // toolStripDropDownButton1\n            // \n            this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.newProfileToolStripMenuItem,\n            this.newGlobalProfileToolStripMenuItem,\n            this.editProfileToolStripMenuItem,\n            this.deleteProfileToolStripMenuItem});\n            this.toolStripDropDownButton1.Image = global::DoomLauncher.Properties.Resources.Bars;\n            this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.toolStripDropDownButton1.Margin = new System.Windows.Forms.Padding(2, 0, 0, 2);\n            this.toolStripDropDownButton1.Name = \"toolStripDropDownButton1\";\n            this.toolStripDropDownButton1.Size = new System.Drawing.Size(33, 24);\n            this.toolStripDropDownButton1.Text = \"Options\";\n            // \n            // newProfileToolStripMenuItem\n            // \n            this.newProfileToolStripMenuItem.Image = global::DoomLauncher.Properties.Resources.File;\n            this.newProfileToolStripMenuItem.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\n            this.newProfileToolStripMenuItem.Name = \"newProfileToolStripMenuItem\";\n            this.newProfileToolStripMenuItem.Size = new System.Drawing.Size(183, 24);\n            this.newProfileToolStripMenuItem.Text = \"New Profile...\";\n            this.newProfileToolStripMenuItem.Click += new System.EventHandler(this.newProfileToolStripMenuItem_Click);\n            // \n            // newGlobalProfileToolStripMenuItem\n            // \n            this.newGlobalProfileToolStripMenuItem.Image = global::DoomLauncher.Properties.Resources.File;\n            this.newGlobalProfileToolStripMenuItem.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\n            this.newGlobalProfileToolStripMenuItem.Name = \"newGlobalProfileToolStripMenuItem\";\n            this.newGlobalProfileToolStripMenuItem.Size = new System.Drawing.Size(183, 24);\n            this.newGlobalProfileToolStripMenuItem.Text = \"New Global Profile...\";\n            this.newGlobalProfileToolStripMenuItem.Click += new System.EventHandler(this.newGlobalProfileToolStripMenuItem_Click);\n            // \n            // editProfileToolStripMenuItem\n            // \n            this.editProfileToolStripMenuItem.Image = global::DoomLauncher.Properties.Resources.Edit;\n            this.editProfileToolStripMenuItem.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\n            this.editProfileToolStripMenuItem.Name = \"editProfileToolStripMenuItem\";\n            this.editProfileToolStripMenuItem.Size = new System.Drawing.Size(183, 24);\n            this.editProfileToolStripMenuItem.Text = \"Rename Profile...\";\n            this.editProfileToolStripMenuItem.Click += new System.EventHandler(this.editProfileToolStripMenuItem_Click);\n            // \n            // deleteProfileToolStripMenuItem\n            // \n            this.deleteProfileToolStripMenuItem.Image = global::DoomLauncher.Properties.Resources.Delete;\n            this.deleteProfileToolStripMenuItem.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\n            this.deleteProfileToolStripMenuItem.Name = \"deleteProfileToolStripMenuItem\";\n            this.deleteProfileToolStripMenuItem.Size = new System.Drawing.Size(183, 24);\n            this.deleteProfileToolStripMenuItem.Text = \"Delete Profile\";\n            this.deleteProfileToolStripMenuItem.Click += new System.EventHandler(this.deleteProfileToolStripMenuItem_Click);\n            // \n            // btnProfileMenu\n            // \n            this.btnProfileMenu.Image = global::DoomLauncher.Properties.Resources.Bars;\n            this.btnProfileMenu.Location = new System.Drawing.Point(0, 5);\n            this.btnProfileMenu.Margin = new System.Windows.Forms.Padding(0);\n            this.btnProfileMenu.Name = \"btnProfileMenu\";\n            this.btnProfileMenu.Size = new System.Drawing.Size(23, 21);\n            this.btnProfileMenu.TabIndex = 13;\n            this.btnProfileMenu.UseVisualStyleBackColor = true;\n            this.btnProfileMenu.Click += new System.EventHandler(this.btnProfileMenu_Click);\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(6, 77);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(36, 13);\n            this.label2.TabIndex = 8;\n            this.label2.Text = \"IWAD\";\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(6, 49);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(26, 13);\n            this.label1.TabIndex = 7;\n            this.label1.Text = \"Port\";\n            // \n            // cmbMap\n            // \n            this.cmbMap.DisplayMember = \"Name\";\n            this.cmbMap.Enabled = false;\n            this.cmbMap.FormattingEnabled = true;\n            this.cmbMap.Location = new System.Drawing.Point(86, 19);\n            this.cmbMap.Name = \"cmbMap\";\n            this.cmbMap.Size = new System.Drawing.Size(160, 21);\n            this.cmbMap.TabIndex = 6;\n            this.cmbMap.TabStop = false;\n            // \n            // label4\n            // \n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(23, 49);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(26, 13);\n            this.label4.TabIndex = 11;\n            this.label4.Text = \"Skill\";\n            // \n            // cmbSkill\n            // \n            this.cmbSkill.DisplayMember = \"Name\";\n            this.cmbSkill.Enabled = false;\n            this.cmbSkill.FormattingEnabled = true;\n            this.cmbSkill.Location = new System.Drawing.Point(86, 46);\n            this.cmbSkill.Name = \"cmbSkill\";\n            this.cmbSkill.Size = new System.Drawing.Size(160, 21);\n            this.cmbSkill.TabIndex = 10;\n            this.cmbSkill.TabStop = false;\n            // \n            // txtDescription\n            // \n            this.txtDescription.Enabled = false;\n            this.txtDescription.Location = new System.Drawing.Point(86, 112);\n            this.txtDescription.Name = \"txtDescription\";\n            this.txtDescription.Size = new System.Drawing.Size(160, 20);\n            this.txtDescription.TabIndex = 13;\n            this.txtDescription.TabStop = false;\n            // \n            // cmbDemo\n            // \n            this.cmbDemo.DisplayMember = \"Description\";\n            this.cmbDemo.Enabled = false;\n            this.cmbDemo.FormattingEnabled = true;\n            this.cmbDemo.Location = new System.Drawing.Point(86, 73);\n            this.cmbDemo.Name = \"cmbDemo\";\n            this.cmbDemo.Size = new System.Drawing.Size(160, 21);\n            this.cmbDemo.TabIndex = 14;\n            this.cmbDemo.TabStop = false;\n            this.cmbDemo.ValueMember = \"FileID\";\n            // \n            // groupBox2\n            // \n            this.groupBox2.Controls.Add(this.lnkOpenDemo);\n            this.groupBox2.Controls.Add(this.label3);\n            this.groupBox2.Controls.Add(this.txtParameters);\n            this.groupBox2.Controls.Add(this.cmbMap);\n            this.groupBox2.Controls.Add(this.chkMap);\n            this.groupBox2.Controls.Add(this.cmbSkill);\n            this.groupBox2.Controls.Add(this.chkDemo);\n            this.groupBox2.Controls.Add(this.label4);\n            this.groupBox2.Controls.Add(this.cmbDemo);\n            this.groupBox2.Controls.Add(this.chkRecord);\n            this.groupBox2.Controls.Add(this.txtDescription);\n            this.groupBox2.Location = new System.Drawing.Point(3, 116);\n            this.groupBox2.Name = \"groupBox2\";\n            this.groupBox2.Size = new System.Drawing.Size(256, 173);\n            this.groupBox2.TabIndex = 17;\n            this.groupBox2.TabStop = false;\n            // \n            // lnkOpenDemo\n            // \n            this.lnkOpenDemo.AutoSize = true;\n            this.lnkOpenDemo.Location = new System.Drawing.Point(83, 97);\n            this.lnkOpenDemo.Name = \"lnkOpenDemo\";\n            this.lnkOpenDemo.Size = new System.Drawing.Size(92, 13);\n            this.lnkOpenDemo.TabIndex = 19;\n            this.lnkOpenDemo.TabStop = true;\n            this.lnkOpenDemo.Text = \"Open Demo File...\";\n            this.lnkOpenDemo.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkOpenDemo_LinkClicked);\n            // \n            // label3\n            // \n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(5, 142);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(69, 13);\n            this.label3.TabIndex = 18;\n            this.label3.Text = \"Extra Params\";\n            // \n            // txtParameters\n            // \n            this.txtParameters.Location = new System.Drawing.Point(86, 139);\n            this.txtParameters.Name = \"txtParameters\";\n            this.txtParameters.Size = new System.Drawing.Size(160, 20);\n            this.txtParameters.TabIndex = 17;\n            this.txtParameters.TabStop = false;\n            this.txtParameters.Click += new System.EventHandler(this.TxtParameters_Click);\n            // \n            // chkMap\n            // \n            this.chkMap.AutoSize = true;\n            this.chkMap.Location = new System.Drawing.Point(7, 21);\n            this.chkMap.Name = \"chkMap\";\n            this.chkMap.Size = new System.Drawing.Size(47, 17);\n            this.chkMap.TabIndex = 16;\n            this.chkMap.TabStop = false;\n            this.chkMap.Text = \"Map\";\n            this.chkMap.CheckedChanged += new System.EventHandler(this.chkMap_CheckedChanged);\n            // \n            // chkDemo\n            // \n            this.chkDemo.AutoSize = true;\n            this.chkDemo.Location = new System.Drawing.Point(7, 75);\n            this.chkDemo.Name = \"chkDemo\";\n            this.chkDemo.Size = new System.Drawing.Size(77, 17);\n            this.chkDemo.TabIndex = 15;\n            this.chkDemo.TabStop = false;\n            this.chkDemo.Text = \"Play Demo\";\n            this.chkDemo.CheckedChanged += new System.EventHandler(this.chkDemo_CheckedChanged);\n            // \n            // chkRecord\n            // \n            this.chkRecord.AutoSize = true;\n            this.chkRecord.Location = new System.Drawing.Point(6, 116);\n            this.chkRecord.Name = \"chkRecord\";\n            this.chkRecord.Size = new System.Drawing.Size(61, 17);\n            this.chkRecord.TabIndex = 12;\n            this.chkRecord.TabStop = false;\n            this.chkRecord.Text = \"Record\";\n            this.chkRecord.CheckedChanged += new System.EventHandler(this.chkRecord_CheckedChanged);\n            // \n            // lnkMore\n            // \n            this.lnkMore.AutoSize = true;\n            this.lnkMore.Location = new System.Drawing.Point(163, 21);\n            this.lnkMore.Name = \"lnkMore\";\n            this.lnkMore.Size = new System.Drawing.Size(61, 13);\n            this.lnkMore.TabIndex = 20;\n            this.lnkMore.TabStop = true;\n            this.lnkMore.Text = \"More Info...\";\n            this.lnkMore.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkMore_LinkClicked);\n            // \n            // groupBox4\n            // \n            this.groupBox4.Controls.Add(this.lnkLoadSaveMore);\n            this.groupBox4.Controls.Add(this.chkLoadLatestSave);\n            this.groupBox4.Controls.Add(this.lnkFilterSettings);\n            this.groupBox4.Controls.Add(this.chkScreenFilter);\n            this.groupBox4.Controls.Add(this.lnkPreviewLaunchParameters);\n            this.groupBox4.Controls.Add(this.chkExtraParamsOnly);\n            this.groupBox4.Controls.Add(this.chkSaveStats);\n            this.groupBox4.Controls.Add(this.lnkMore);\n            this.groupBox4.Location = new System.Drawing.Point(3, 294);\n            this.groupBox4.Name = \"groupBox4\";\n            this.groupBox4.Size = new System.Drawing.Size(256, 116);\n            this.groupBox4.TabIndex = 20;\n            this.groupBox4.TabStop = false;\n            // \n            // lnkLoadSaveMore\n            // \n            this.lnkLoadSaveMore.AutoSize = true;\n            this.lnkLoadSaveMore.Location = new System.Drawing.Point(163, 44);\n            this.lnkLoadSaveMore.Name = \"lnkLoadSaveMore\";\n            this.lnkLoadSaveMore.Size = new System.Drawing.Size(61, 13);\n            this.lnkLoadSaveMore.TabIndex = 26;\n            this.lnkLoadSaveMore.TabStop = true;\n            this.lnkLoadSaveMore.Text = \"More Info...\";\n            this.lnkLoadSaveMore.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkLoadSaveMore_LinkClicked);\n            // \n            // chkLoadLatestSave\n            // \n            this.chkLoadLatestSave.AutoSize = true;\n            this.chkLoadLatestSave.Location = new System.Drawing.Point(6, 43);\n            this.chkLoadLatestSave.Name = \"chkLoadLatestSave\";\n            this.chkLoadLatestSave.Size = new System.Drawing.Size(110, 17);\n            this.chkLoadLatestSave.TabIndex = 25;\n            this.chkLoadLatestSave.TabStop = false;\n            this.chkLoadLatestSave.Text = \"Load Latest Save\";\n            // \n            // lnkFilterSettings\n            // \n            this.lnkFilterSettings.AutoSize = true;\n            this.lnkFilterSettings.Location = new System.Drawing.Point(163, 66);\n            this.lnkFilterSettings.Name = \"lnkFilterSettings\";\n            this.lnkFilterSettings.Size = new System.Drawing.Size(45, 13);\n            this.lnkFilterSettings.TabIndex = 24;\n            this.lnkFilterSettings.TabStop = true;\n            this.lnkFilterSettings.Text = \"Settings\";\n            this.lnkFilterSettings.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkFilterSettings_LinkClicked);\n            // \n            // chkScreenFilter\n            // \n            this.chkScreenFilter.AutoSize = true;\n            this.chkScreenFilter.Location = new System.Drawing.Point(6, 66);\n            this.chkScreenFilter.Name = \"chkScreenFilter\";\n            this.chkScreenFilter.Size = new System.Drawing.Size(85, 17);\n            this.chkScreenFilter.TabIndex = 23;\n            this.chkScreenFilter.TabStop = false;\n            this.chkScreenFilter.Text = \"Screen Filter\";\n            this.chkScreenFilter.CheckedChanged += new System.EventHandler(this.chkScreenFilter_CheckedChanged);\n            // \n            // lnkPreviewLaunchParameters\n            // \n            this.lnkPreviewLaunchParameters.AutoSize = true;\n            this.lnkPreviewLaunchParameters.Location = new System.Drawing.Point(163, 88);\n            this.lnkPreviewLaunchParameters.Name = \"lnkPreviewLaunchParameters\";\n            this.lnkPreviewLaunchParameters.Size = new System.Drawing.Size(90, 13);\n            this.lnkPreviewLaunchParameters.TabIndex = 22;\n            this.lnkPreviewLaunchParameters.TabStop = true;\n            this.lnkPreviewLaunchParameters.Text = \"Show Parameters\";\n            this.lnkPreviewLaunchParameters.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkPreviewLaunchParameters_LinkClicked);\n            // \n            // chkExtraParamsOnly\n            // \n            this.chkExtraParamsOnly.AutoSize = true;\n            this.chkExtraParamsOnly.Location = new System.Drawing.Point(6, 88);\n            this.chkExtraParamsOnly.Name = \"chkExtraParamsOnly\";\n            this.chkExtraParamsOnly.Size = new System.Drawing.Size(112, 17);\n            this.chkExtraParamsOnly.TabIndex = 21;\n            this.chkExtraParamsOnly.TabStop = false;\n            this.chkExtraParamsOnly.Text = \"Extra Params Only\";\n            // \n            // chkSaveStats\n            // \n            this.chkSaveStats.AutoSize = true;\n            this.chkSaveStats.Checked = true;\n            this.chkSaveStats.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkSaveStats.Location = new System.Drawing.Point(6, 20);\n            this.chkSaveStats.Name = \"chkSaveStats\";\n            this.chkSaveStats.Size = new System.Drawing.Size(96, 17);\n            this.chkSaveStats.TabIndex = 19;\n            this.chkSaveStats.TabStop = false;\n            this.chkSaveStats.Text = \"Save Statistics\";\n            // \n            // groupBox3\n            // \n            this.groupBox3.Controls.Add(this.tblFiles);\n            this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.groupBox3.Location = new System.Drawing.Point(265, 3);\n            this.groupBox3.Name = \"groupBox3\";\n            this.groupBox3.Size = new System.Drawing.Size(236, 407);\n            this.groupBox3.TabIndex = 18;\n            this.groupBox3.TabStop = false;\n            this.groupBox3.Text = \"Additional Files / Load Order\";\n            // \n            // tblFiles\n            // \n            this.tblFiles.ColumnCount = 1;\n            this.tblFiles.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblFiles.Controls.Add(this.ctrlFiles, 0, 1);\n            this.tblFiles.Controls.Add(this.panel1, 0, 0);\n            this.tblFiles.Controls.Add(this.flp1, 0, 2);\n            this.tblFiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblFiles.Location = new System.Drawing.Point(3, 16);\n            this.tblFiles.Margin = new System.Windows.Forms.Padding(0);\n            this.tblFiles.Name = \"tblFiles\";\n            this.tblFiles.RowCount = 3;\n            this.tblFiles.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblFiles.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblFiles.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));\n            this.tblFiles.Size = new System.Drawing.Size(230, 388);\n            this.tblFiles.TabIndex = 0;\n            // \n            // ctrlFiles\n            // \n            this.ctrlFiles.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.ctrlFiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ctrlFiles.ForeColor = System.Drawing.Color.White;\n            this.ctrlFiles.Location = new System.Drawing.Point(4, 44);\n            this.ctrlFiles.Margin = new System.Windows.Forms.Padding(4);\n            this.ctrlFiles.Name = \"ctrlFiles\";\n            this.ctrlFiles.Size = new System.Drawing.Size(222, 315);\n            this.ctrlFiles.TabIndex = 20;\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.lblInfo);\n            this.panel1.Controls.Add(this.pbInfo);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panel1.Location = new System.Drawing.Point(0, 0);\n            this.panel1.Margin = new System.Windows.Forms.Padding(0);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(230, 40);\n            this.panel1.TabIndex = 21;\n            // \n            // lblInfo\n            // \n            this.lblInfo.AutoSize = true;\n            this.lblInfo.Location = new System.Drawing.Point(25, 7);\n            this.lblInfo.Name = \"lblInfo\";\n            this.lblInfo.Size = new System.Drawing.Size(29, 13);\n            this.lblInfo.TabIndex = 25;\n            this.lblInfo.Text = \"label\";\n            // \n            // pbInfo\n            // \n            this.pbInfo.Location = new System.Drawing.Point(3, 7);\n            this.pbInfo.Name = \"pbInfo\";\n            this.pbInfo.Size = new System.Drawing.Size(16, 16);\n            this.pbInfo.TabIndex = 24;\n            this.pbInfo.TabStop = false;\n            // \n            // flp1\n            // \n            this.flp1.Controls.Add(this.lnkSpecific);\n            this.flp1.Controls.Add(this.lnkCustomParameters);\n            this.flp1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flp1.Location = new System.Drawing.Point(0, 363);\n            this.flp1.Margin = new System.Windows.Forms.Padding(0);\n            this.flp1.Name = \"flp1\";\n            this.flp1.Size = new System.Drawing.Size(230, 25);\n            this.flp1.TabIndex = 22;\n            // \n            // lnkSpecific\n            // \n            this.lnkSpecific.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lnkSpecific.AutoSize = true;\n            this.lnkSpecific.Location = new System.Drawing.Point(3, 3);\n            this.lnkSpecific.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);\n            this.lnkSpecific.Name = \"lnkSpecific\";\n            this.lnkSpecific.Size = new System.Drawing.Size(118, 13);\n            this.lnkSpecific.TabIndex = 20;\n            this.lnkSpecific.TabStop = true;\n            this.lnkSpecific.Text = \"Select Individual Files...\";\n            this.lnkSpecific.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkSpecific_LinkClicked);\n            // \n            // lnkCustomParameters\n            // \n            this.lnkCustomParameters.AutoSize = true;\n            this.lnkCustomParameters.Location = new System.Drawing.Point(127, 3);\n            this.lnkCustomParameters.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);\n            this.lnkCustomParameters.Name = \"lnkCustomParameters\";\n            this.lnkCustomParameters.Size = new System.Drawing.Size(89, 13);\n            this.lnkCustomParameters.TabIndex = 21;\n            this.lnkCustomParameters.TabStop = true;\n            this.lnkCustomParameters.Text = \"Custom Params...\";\n            this.lnkCustomParameters.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkCustomParameters_LinkClicked);\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.tblInner, 0, 1);\n            this.tblMain.Controls.Add(this.pnlBottom, 0, 2);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.Size = new System.Drawing.Size(504, 471);\n            this.tblMain.TabIndex = 21;\n            // \n            // tblInner\n            // \n            this.tblInner.ColumnCount = 2;\n            this.tblInner.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 262F));\n            this.tblInner.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInner.Controls.Add(this.pnlLeft, 0, 0);\n            this.tblInner.Controls.Add(this.groupBox3, 1, 0);\n            this.tblInner.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblInner.Location = new System.Drawing.Point(0, 26);\n            this.tblInner.Margin = new System.Windows.Forms.Padding(0);\n            this.tblInner.Name = \"tblInner\";\n            this.tblInner.RowCount = 1;\n            this.tblInner.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInner.Size = new System.Drawing.Size(504, 413);\n            this.tblInner.TabIndex = 0;\n            // \n            // pnlLeft\n            // \n            this.pnlLeft.Controls.Add(this.groupBox1);\n            this.pnlLeft.Controls.Add(this.groupBox4);\n            this.pnlLeft.Controls.Add(this.groupBox2);\n            this.pnlLeft.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlLeft.Location = new System.Drawing.Point(0, 0);\n            this.pnlLeft.Margin = new System.Windows.Forms.Padding(0);\n            this.pnlLeft.Name = \"pnlLeft\";\n            this.pnlLeft.Size = new System.Drawing.Size(262, 413);\n            this.pnlLeft.TabIndex = 0;\n            // \n            // pnlBottom\n            // \n            this.pnlBottom.Controls.Add(this.btnSaveSettings);\n            this.pnlBottom.Controls.Add(this.flpButtons);\n            this.pnlBottom.Controls.Add(this.chkRemember);\n            this.pnlBottom.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlBottom.Location = new System.Drawing.Point(0, 439);\n            this.pnlBottom.Margin = new System.Windows.Forms.Padding(0);\n            this.pnlBottom.Name = \"pnlBottom\";\n            this.pnlBottom.Size = new System.Drawing.Size(504, 32);\n            this.pnlBottom.TabIndex = 1;\n            // \n            // btnSaveSettings\n            // \n            this.btnSaveSettings.Location = new System.Drawing.Point(133, 5);\n            this.btnSaveSettings.Name = \"btnSaveSettings\";\n            this.btnSaveSettings.Size = new System.Drawing.Size(82, 23);\n            this.btnSaveSettings.TabIndex = 6;\n            this.btnSaveSettings.TabStop = false;\n            this.btnSaveSettings.Text = \"Save Settings\";\n            this.btnSaveSettings.UseVisualStyleBackColor = true;\n            this.btnSaveSettings.Click += new System.EventHandler(this.btnSaveSettings_Click);\n            // \n            // flpButtons\n            // \n            this.flpButtons.CaptureArrowKeys = false;\n            this.flpButtons.Controls.Add(this.btnCancel);\n            this.flpButtons.Controls.Add(this.btnOK);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Right;\n            this.flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpButtons.Location = new System.Drawing.Point(304, 0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Padding = new System.Windows.Forms.Padding(0, 1, 0, 0);\n            this.flpButtons.Size = new System.Drawing.Size(200, 32);\n            this.flpButtons.TabIndex = 5;\n            // \n            // chkRemember\n            // \n            this.chkRemember.AutoSize = true;\n            this.chkRemember.Checked = true;\n            this.chkRemember.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkRemember.Location = new System.Drawing.Point(9, 9);\n            this.chkRemember.Name = \"chkRemember\";\n            this.chkRemember.Size = new System.Drawing.Size(118, 17);\n            this.chkRemember.TabIndex = 4;\n            this.chkRemember.TabStop = false;\n            this.chkRemember.Text = \"Remember Settings\";\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(504, 26);\n            this.titleBar.TabIndex = 2;\n            this.titleBar.Title = \"Launch\";\n            // \n            // PlayForm\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(504, 471);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Name = \"PlayForm\";\n            this.Text = \"Launch\";\n            this.groupBox1.ResumeLayout(false);\n            this.groupBox1.PerformLayout();\n            this.tblProfile.ResumeLayout(false);\n            this.tblProfile.PerformLayout();\n            this.panel2.ResumeLayout(false);\n            this.panel2.PerformLayout();\n            this.profileToolStrip.ResumeLayout(false);\n            this.profileToolStrip.PerformLayout();\n            this.groupBox2.ResumeLayout(false);\n            this.groupBox2.PerformLayout();\n            this.groupBox4.ResumeLayout(false);\n            this.groupBox4.PerformLayout();\n            this.groupBox3.ResumeLayout(false);\n            this.tblFiles.ResumeLayout(false);\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).EndInit();\n            this.flp1.ResumeLayout(false);\n            this.flp1.PerformLayout();\n            this.tblMain.ResumeLayout(false);\n            this.tblInner.ResumeLayout(false);\n            this.pnlLeft.ResumeLayout(false);\n            this.pnlBottom.ResumeLayout(false);\n            this.pnlBottom.PerformLayout();\n            this.flpButtons.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ComboBox cmbSourcePorts;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.ComboBox cmbIwad;\n        private System.Windows.Forms.GroupBox groupBox1;\n        private System.Windows.Forms.ComboBox cmbMap;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.ComboBox cmbSkill;\n        private System.Windows.Forms.TextBox txtDescription;\n        private System.Windows.Forms.ComboBox cmbDemo;\n        private System.Windows.Forms.GroupBox groupBox2;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.TextBox txtParameters;\n        private System.Windows.Forms.LinkLabel lnkMore;\n        private System.Windows.Forms.GroupBox groupBox4;\n        private System.Windows.Forms.GroupBox groupBox3;\n        private FilesCtrl ctrlFiles;\n        private System.Windows.Forms.Panel pnlLeft;\n        private System.Windows.Forms.Panel pnlBottom;\n        private System.Windows.Forms.Panel panel1;\n        private System.Windows.Forms.Label lblInfo;\n        private System.Windows.Forms.PictureBox pbInfo;\n        private System.Windows.Forms.Button btnSaveSettings;\n        private System.Windows.Forms.LinkLabel lnkOpenDemo;\n        private System.Windows.Forms.LinkLabel lnkPreviewLaunchParameters;\n        private System.Windows.Forms.FlowLayoutPanel flp1;\n        private System.Windows.Forms.LinkLabel lnkSpecific;\n        private System.Windows.Forms.LinkLabel lnkCustomParameters;\n        private System.Windows.Forms.LinkLabel lnkFilterSettings;\n        private System.Windows.Forms.Label lblProfile;\n        private CComboBox cmbProfiles;\n        private System.Windows.Forms.TableLayoutPanel tblProfile;\n        private System.Windows.Forms.ToolStrip profileToolStrip;\n        private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton1;\n        private System.Windows.Forms.ToolStripMenuItem newProfileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem newGlobalProfileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem editProfileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem deleteProfileToolStripMenuItem;\n        private System.Windows.Forms.LinkLabel lnkLoadSaveMore;\n        private Controls.TitleBarControl titleBar;\n        private FormButton btnProfileMenu;\n        private System.Windows.Forms.Panel panel2;\n        private CCheckBox chkRemember;\n        private CCheckBox chkRecord;\n        private CCheckBox chkDemo;\n        private CCheckBox chkMap;\n        private CCheckBox chkSaveStats;\n        private CCheckBox chkExtraParamsOnly;\n        private CCheckBox chkScreenFilter;\n        private CCheckBox chkLoadLatestSave;\n        private TableLayoutPanelDB tblMain;\n        private TableLayoutPanelDB tblInner;\n        private FlowLayoutPanelDB flpButtons;\n        private TableLayoutPanelDB tblFiles;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/PlayForm.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Demo;\nusing DoomLauncher.Forms;\nusing DoomLauncher.Handlers;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing System.Xml.Serialization;\n\nnamespace DoomLauncher\n{\n    public partial class PlayForm : Form\n    {\n        private ITabView[] m_additionalFileViews;\n        private bool m_demoChangedAdditionalFiles;\n        private ISourcePortData m_lastSourcePort;\n        private IGameFile m_lastIwad;\n\n        public event EventHandler SaveSettings;\n        public event EventHandler OnPreviewLaunchParameters;\n\n        private FileLoadHandler m_handler;\n\n        private readonly AppConfiguration m_appConfig;\n        private readonly IDataSourceAdapter m_adapter;\n        private ScreenFilter m_filterSettings;\n        private bool m_playSessionInProgress;\n        private IList<IGameProfile> m_globalProfiles;\n\n        private readonly Control[] m_tabControls;\n\n        private AppConfiguration AppConfiguration => DataCache.Instance.AppConfiguration;\n\n        public PlayForm(AppConfiguration appConfig, IDataSourceAdapter adapter)\n        {\n            InitializeComponent();\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n            Stylizer.StylizeControl(toolStripDropDownButton1, DesignMode);\n            ctrlFiles.Initialize(\"GameFileID\", \"FileNameNoPath\");\n            ctrlFiles.CellFormatting += ctrlFiles_CellFormatting;\n            ctrlFiles.NewItemNeeded += ctrlFiles_NewItemNeeded;\n            ctrlFiles.ItemAdded += CtrlFiles_ItemAdded;\n            ctrlFiles.ItemRemoving += CtrlFiles_ItemRemoving;\n            ctrlFiles.ItemRemoved += CtrlFiles_ItemRemoved;\n            Load += PlayForm_Load;\n\n            lnkCustomParameters.Visible = false;\n\n            m_appConfig = appConfig;\n            m_adapter = adapter;\n\n            m_filterSettings = GetFilterSettings();\n            chkScreenFilter.Checked = m_filterSettings.Enabled;\n            Icons.DpiScale = new DpiScale(CreateGraphics());\n            newProfileToolStripMenuItem.Image = Icons.File;\n            deleteProfileToolStripMenuItem.Image = Icons.Delete;\n            editProfileToolStripMenuItem.Image = Icons.Edit;\n            toolStripDropDownButton1.Image = Icons.Bars;\n\n            m_tabControls = new Control[]\n            {\n                cmbProfiles,\n                cmbSourcePorts,\n                cmbIwad,\n                chkMap,\n                cmbMap,\n                cmbSkill,\n                chkDemo,\n                cmbDemo,\n                chkRecord,\n                txtDescription,\n                txtParameters,\n                chkSaveStats,\n                chkLoadLatestSave,\n                chkScreenFilter,\n                chkExtraParamsOnly,\n                chkRemember,\n                btnSaveSettings,\n                ctrlFiles,\n                lnkSpecific,\n                lnkCustomParameters,\n                btnOK,\n                btnCancel\n            };\n\n            InitTabIndicies();\n            profileToolStrip.Visible = false;\n            toolStripDropDownButton1.Visible = false;\n            int padTop = Icons.DpiScale.ScaleIntY(1);\n            btnProfileMenu.Location = new Point(0, padTop);\n            btnProfileMenu.Image = Icons.Bars;\n\n            m_globalProfiles = Array.Empty<IGameProfile>();\n            cmbProfiles.StyleItem += CmbProfiles_StyleItem;\n        }\n\n        private void CmbProfiles_StyleItem(object sender, Controls.ComboBoxItemStyle e)\n        {\n            if (!int.TryParse(e.ValueMember, out int gameProfileId))\n                return;\n\n            if (!m_globalProfiles.Any(x => x.GameProfileID == gameProfileId))\n                return;\n            \n            e.Text = \"● \" + e.Text;\n\n            if (m_globalProfiles.Count > 0 && gameProfileId == m_globalProfiles.Last().GameProfileID)\n            {\n                var bottomLeft = new Point(e.DrawItem.Bounds.X, e.DrawItem.Bounds.Bottom - 1);\n                var bottomRight = new Point(e.DrawItem.Bounds.Right, e.DrawItem.Bounds.Bottom - 1);\n                e.DrawItem.Graphics.DrawLine(new Pen(cmbProfiles.ForeColor), bottomLeft, bottomRight);\n            }\n        }\n\n        private void InitTabIndicies()\n        {\n            foreach (var control in this.GetChildElements<Control>())\n                control.TabStop = false;\n\n            // Another user had an issue with tab indicies starting 0\n            // Starting at 100 mostly fixes it... ugh\n            // This still isn't 100% but it's way better than it was\n            // The built in functionality for this is very screwed up, about ready to entirely write a custom one\n            int index = 100;\n            foreach (var control in m_tabControls)\n            {\n                control.TabStop = true;\n                control.TabIndex = index++;\n            }\n        }\n\n        private void PlayForm_Load(object sender, EventArgs e)\n        {\n            if (m_tabControls.Length > 0)\n            {\n                ActiveControl = m_tabControls[0];\n                m_tabControls[0].Focus();\n            }\n        }\n\n        public void Initialize(IEnumerable<ITabView> additionalFileViews, IGameFile gameFile, bool playSessionInProgress)\n        {\n            m_playSessionInProgress = playSessionInProgress;\n            m_additionalFileViews = additionalFileViews.ToArray();\n\n            GameFile = gameFile;\n\n            AutoCompleteCombo.SetAutoCompleteCustomSource(cmbSourcePorts, GetSourcePortsForComboBox(gameFile), typeof(ISourcePortData), \"Name\");\n            AutoCompleteCombo.SetAutoCompleteCustomSource(cmbIwad, GetIWadsForComboBox(gameFile, m_adapter), typeof(IIWadData), \"FileName\");\n\n            if (gameFile != null)\n            {\n                Text = \"Launch - \" + (string.IsNullOrEmpty(gameFile.Title) ? gameFile.FileName : gameFile.Title);\n                if (!string.IsNullOrEmpty(gameFile.Map))\n                    AutoCompleteCombo.SetAutoCompleteCustomSource(cmbMap, MapSplit(gameFile), null, null);\n            }\n\n            AutoCompleteCombo.SetAutoCompleteCustomSource(cmbSkill, Util.GetSkills().ToList(), null, null);\n            cmbSkill.SelectedItem = \"3\";\n\n            LoadProfiles();\n        }\n\n        private IEnumerable<ISourcePortData> GetSourcePortsForComboBox(IGameFile gameFile)\n        {\n            return gameFile.IsDoom64 ? m_adapter.GetDoom64() : m_adapter.GetSourcePorts();\n        }\n\n        private IEnumerable<IIWadData> GetIWadsForComboBox(IGameFile gameFile, IDataSourceAdapter adapter)\n        {\n            return gameFile.IsDoom64 ? new List<IIWadData>() :  Util.GetIWadsDataSource(adapter);\n        }\n\n\n        public void SetGameProfile(IGameProfile gameProfile)\n        {\n            SetIwadInfoLabel();\n\n            UnregisterEvents();\n            m_handler = new FileLoadHandler(m_adapter, GameFile, gameProfile);\n\n            SetDefaultSelections();\n            GameProfile.ApplyDefaultsToProfile(gameProfile, m_appConfig);\n            cmbProfiles.SelectedValue = gameProfile.GameProfileID;\n\n            if (GameFile != null)\n            {\n                chkSaveStats.Checked = gameProfile.SettingsStat;\n                chkLoadLatestSave.Checked = gameProfile.SettingsLoadLatestSave;\n                chkExtraParamsOnly.Checked = gameProfile.SettingsExtraParamsOnly;\n\n                if (gameProfile.SourcePortID.HasValue)\n                    SelectedSourcePort = m_adapter.GetSourcePort(gameProfile.SourcePortID.Value);\n\n                var isDoom64 = GameFile.IsDoom64;\n                isDoom64 = false;\n\n                \n                if (isDoom64)\n                {\n                    SelectedSourcePort = m_adapter.GetDoom64().FirstOrDefault();\n                    cmbSourcePorts.Enabled = false;\n                    groupBox4.Visible = false;\n                    cmbIwad.Visible = false;\n                    label2.Visible = false; // IWAD label\n                    chkDemo.Visible = false;\n                    cmbDemo.Visible = false;\n                    chkRecord.Visible = false;\n                    txtDescription.Visible = false;\n                    lnkOpenDemo.Visible = false;\n                }\n\n                // Selected GameFile is an IWAD so lock the IWAD selection\n                if (IsIwad(GameFile))\n                {\n                    cmbIwad.Enabled = false;\n                    SelectedIWad = GameFile;\n                }\n                else if (gameProfile.IWadID.HasValue)\n                {\n                    SelectedIWad = m_adapter.GetGameFileIWads().FirstOrDefault(x => x.IWadID == gameProfile.IWadID);\n                }\n\n                if (!string.IsNullOrEmpty(gameProfile.SettingsMap))\n                    SelectedMap = gameProfile.SettingsMap;\n                if (!string.IsNullOrEmpty(gameProfile.SettingsSkill))\n                    SelectedSkill = gameProfile.SettingsSkill;\n                if (!string.IsNullOrEmpty(gameProfile.SettingsExtraParams))\n                    ExtraParameters = gameProfile.SettingsExtraParams;\n\n                SpecificFiles = GetSpecificFilesFromProfile(gameProfile);\n            }\n\n            bool reset = ShouldRecalculateAdditionalFiles();\n            HandleSourcePortSelectionChange(reset);\n            HandleIwadSelectionChanged(reset);\n            SetAdditionalFiles(reset);\n            HandleDemoChange();\n            RegisterEvents();\n\n            lnkSpecific.Enabled = !gameProfile.IsGlobal;\n            if (gameProfile.IsGlobal)\n                lnkSpecific.Text = \"Individual files not supported with global profiles\";\n            else\n                lnkSpecific.Text = \"Select Individual Files...\";\n        }\n\n        private string[] GetSpecificFilesFromProfile(IGameProfile gameProfile)\n        {\n            // Not yet supported\n            if (gameProfile.IsGlobal || string.IsNullOrEmpty(gameProfile.SettingsSpecificFiles))\n                return null;\n            \n            return Util.SplitString(gameProfile.SettingsSpecificFiles);\n        }\n\n        private void SetIwadInfoLabel()\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            float infoHeight = dpiScale.ScaleFloatY(40);\n            lblInfo.BackColor = ColorTheme.Current.Window;\n            lblInfo.ForeColor = ColorTheme.Current.Text;\n\n            if (m_playSessionInProgress)\n            {\n                tblFiles.RowStyles[0].Height = infoHeight;\n                pbInfo.Image = Properties.Resources.bon2b;\n                lblInfo.BackColor = ColorTheme.Current.Window;\n                lblInfo.ForeColor = ColorTheme.Current.HighlightText;\n                lblInfo.Text = string.Format(\"Play session already in progress. Features{0}like statistics tracking may not function.\", Environment.NewLine);\n                return;\n            }\n\n            if (GameFile != null && IsIwad(GameFile) && SelectedGameProfile is GameFile)\n            {\n                tblFiles.RowStyles[0].Height = infoHeight;\n                pbInfo.Image = Properties.Resources.bon2b;\n                lblInfo.Text = string.Format(\"These files will automatically be added{0} when this IWAD is selected for play.\", Environment.NewLine);\n            }\n            else\n            {\n                tblFiles.RowStyles[0].Height = 0;\n            }\n        }\n\n        private void SetDefaultSelections()\n        {\n            if (cmbMap.Items.Count > 0)\n                cmbMap.SelectedIndex = 0;\n            else\n                cmbMap.SelectedIndex = -1;\n\n            chkMap.Checked = false;\n\n            txtParameters.Text = string.Empty;\n            SpecificFiles = null;\n\n            ctrlFiles.SetDataSource(new List<IGameFile>());\n        }\n\n        private void RegisterEvents()\n        {\n            cmbProfiles.SelectedIndexChanged += CmbProfiles_SelectedIndexChanged;\n            cmbSourcePorts.SelectedIndexChanged += cmbSourcePorts_SelectedIndexChanged;\n            cmbIwad.SelectedIndexChanged += cmbIwad_SelectedIndexChanged;\n            cmbDemo.SelectedIndexChanged += cmbDemo_SelectedIndexChanged;\n\n            chkRecord.CheckedChanged += chkRecord_CheckedChanged;\n            chkDemo.CheckedChanged += chkDemo_CheckedChanged;\n        }\n\n        private void UnregisterEvents()\n        {\n            cmbProfiles.SelectedIndexChanged -= CmbProfiles_SelectedIndexChanged;\n            cmbSourcePorts.SelectedIndexChanged -= cmbSourcePorts_SelectedIndexChanged;\n            cmbIwad.SelectedIndexChanged -= cmbIwad_SelectedIndexChanged;\n            cmbDemo.SelectedIndexChanged -= cmbDemo_SelectedIndexChanged;\n\n            chkRecord.CheckedChanged -= chkRecord_CheckedChanged;\n            chkDemo.CheckedChanged -= chkDemo_CheckedChanged;\n        }\n\n        private IList<IGameProfile> LoadProfiles()\n        {\n            var profiles = GameProfileUtil.GetAllProfiles(m_adapter, (GameFile)GameFile, out m_globalProfiles);\n            AutoCompleteCombo.SetAutoCompleteCustomSource(cmbProfiles, profiles, typeof(IGameProfile), \"Name\");\n            return profiles;\n        }\n\n        private static string[] MapSplit(IGameFile gameFile) => DataSources.GameFile.GetMaps(gameFile);\n\n        private bool IsIwad(IGameFile gameFile)\n        {\n            if (gameFile.GameFileID.HasValue)\n                return m_adapter.GetIWad(gameFile.GameFileID.Value) != null;\n\n            return false;\n        }\n\n        public IGameFile GameFile { get; private set; }\n        public IGameProfile SelectedGameProfile => (IGameProfile)cmbProfiles.SelectedItem;\n\n        public ISourcePortData SelectedSourcePort\n        {\n            get => cmbSourcePorts.SelectedItem as ISourcePortData; \n            set => cmbSourcePorts.SelectedItem = value;\n        }\n\n        public IGameFile SelectedIWad\n        {\n            get\n            {\n                if (cmbIwad.SelectedItem != null)\n                    return m_adapter.GetGameFileIWads().FirstOrDefault(x => x.GameFileID == ((IIWadData)cmbIwad.SelectedItem).GameFileID);\n\n                return null;\n            }\n            set\n            {\n                if (value == null)\n                    cmbIwad.SelectedIndex = 0;\n                else\n                    cmbIwad.SelectedItem = Util.GetIWadsDataSource(m_adapter).FirstOrDefault(x => x.IWadID == value.IWadID);\n            }\n        }\n\n        public IFileData SelectedDemo\n        {\n            get => cmbDemo.SelectedItem as IFileData; \n            set => cmbDemo.SelectedItem = value;\n        }\n\n        public List<IGameFile> GetAdditionalFiles()\n        {\n            //return all the files in order, the user can determine the order of any file, whether it was added by source port or iwad selection\n            return ctrlFiles.GetFiles().Cast<IGameFile>().ToList();\n        }\n\n        public List<IGameFile> GetIWadAdditionalFiles()\n        {\n            return GetAdditionalFiles().Intersect(m_handler.GetIWadFiles()).ToList();\n        }\n\n        public List<IGameFile> GetSourcePortAdditionalFiles()\n        {\n            return GetAdditionalFiles().Intersect(m_handler.GetSourcePortFiles()).ToList();\n        }\n\n        public string SelectedMap\n        {\n            get\n            {\n                if (!chkMap.Checked) return null;\n                return cmbMap.SelectedItem as string;\n            }\n            set\n            {\n                if (value == null)\n                {\n                    chkMap.Checked = false;\n                }\n                else\n                {\n                    chkMap.Checked = true;\n                    cmbMap.SelectedItem = value;\n                }\n            }\n        }\n\n        public string SelectedSkill\n        {\n            get => cmbSkill.SelectedItem as string;\n            set => cmbSkill.SelectedItem = value;\n        }\n        public bool RememberSettings => chkRemember.Checked;\n        public bool Record => chkRecord.Checked;\n        public bool PlayDemo => chkDemo.Checked;\n        public string RecordDescriptionText => txtDescription.Text;\n        public string ExtraParameters\n        {\n            get => txtParameters.Text;\n            set => txtParameters.Text = value;\n        }\n        public string[] SpecificFiles { get; set; }\n        public bool SaveStatistics => chkSaveStats.Enabled && chkSaveStats.Checked;\n        public bool LoadLatestSave => chkLoadLatestSave.Enabled && chkLoadLatestSave.Checked;\n        public bool ExtraParametersOnly => chkExtraParamsOnly.Checked;\n        public bool ScreenFilter => chkScreenFilter.Checked;\n\n        public bool ShouldSaveAdditionalFiles()\n        {\n            return !m_demoChangedAdditionalFiles;\n        }\n\n        private void chkRecord_CheckedChanged(object sender, EventArgs e)\n        {\n            txtDescription.Enabled = chkRecord.Checked;\n            cmbDemo.Enabled = false;\n            chkDemo.CheckedChanged -= chkDemo_CheckedChanged;\n            chkDemo.Checked = false;\n            chkDemo.CheckedChanged += chkDemo_CheckedChanged;\n        }\n\n        private void chkDemo_CheckedChanged(object sender, EventArgs e)\n        {\n            txtDescription.Enabled = false;\n            cmbDemo.Enabled = chkDemo.Checked;\n            chkRecord.CheckedChanged -= chkRecord_CheckedChanged;\n            chkRecord.Checked = false;\n            chkRecord.CheckedChanged += chkRecord_CheckedChanged;\n            HandleDemoChange();\n        }\n\n        private void cmbSourcePorts_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            HandleSourcePortSelectionChange();\n        }\n\n        private void HandleSourcePortSelectionChange(bool resetAdditionalFiles = true)\n        {\n            if (cmbSourcePorts.SelectedItem != null && GameFile != null)\n            {\n                ISourcePortData sourcePort = cmbSourcePorts.SelectedItem as ISourcePortData;\n                chkSaveStats.Enabled = SaveStatisticsSupported(sourcePort);\n                chkLoadLatestSave.Enabled = LoadLatestSaveSupported(sourcePort);\n                SetAdditionalFiles(resetAdditionalFiles);\n                PopulateDemos();\n            }\n\n            m_lastSourcePort = SelectedSourcePort;\n        }\n\n        private void PopulateDemos()\n        {\n            ISourcePortData sourcePort = cmbSourcePorts.SelectedItem as ISourcePortData;\n\n            if (GameFile.GameFileID.HasValue)\n            {\n                IEnumerable<IFileData> demoFiles = m_adapter.GetFiles(GameFile, FileType.Demo)\n                    .Where(x => x.SourcePortID == sourcePort.SourcePortID);\n\n                AutoCompleteCombo.SetAutoCompleteCustomSource(cmbDemo, demoFiles.ToList(), typeof(IFileData), \"Description\");\n            }\n        }\n\n        private bool SaveStatisticsSupported(ISourcePortData sourcePort)\n        {\n            return sourcePort.GetFlavor().StatisticsSupported();\n        }\n\n        private bool LoadLatestSaveSupported(ISourcePortData sourcePort)\n        {\n            return sourcePort.GetFlavor().LoadSaveGameSupported();\n        }\n\n        private void chkMap_CheckedChanged(object sender, EventArgs e)\n        {\n            cmbMap.Enabled = cmbSkill.Enabled = chkMap.Checked;\n        }\n\n        private void ctrlFiles_NewItemNeeded(object sender, AdditionalFilesEventArgs e)\n        {\n            using (FileSelectForm fileSelect = new FileSelectForm())\n            {\n                fileSelect.Initialize(m_adapter, m_additionalFileViews);\n                fileSelect.MultiSelect = true;\n                fileSelect.StartPosition = FormStartPosition.CenterParent;\n\n                if (fileSelect.ShowDialog(this) == DialogResult.OK)\n                {\n                    IGameFile[] selectedFiles = fileSelect.SelectedFiles.Except(new [] { GameFile }).Union(GetAdditionalFiles()).ToArray();\n\n                    if (selectedFiles.Length > 0)\n                    {\n                        e.NewItems = selectedFiles.Cast<object>().ToList();\n\n                        try\n                        {\n                            ResetSpecificFilesSelections(selectedFiles);\n                        }\n                        catch (FileNotFoundException ex)\n                        {\n                            MessageBox.Show(this, string.Format(\"The Game File {0} is missing from the library.\", ex.FileName), \"File Not Found\");\n                        }\n                        catch (Exception ex)\n                        {\n                            Util.DisplayUnexpectedException(this, ex);\n                        }\n                    }\n                }\n\n                SetColumnConfigToMain(fileSelect.TabViews);\n            }\n        }\n\n        private void SetColumnConfigToMain(ITabView[] tabViews)\n        {\n            foreach (ITabView tabFrom in tabViews)\n            {\n                var tabTo = m_additionalFileViews.FirstOrDefault(x => x.Title == tabFrom.Title);\n\n                if (tabTo != null && tabTo.GameFileViewControl is IGameFileColumnView columnView)\n                    tabTo.SetColumnConfig(columnView.ColumnFields, tabFrom.GetColumnConfig().ToArray());\n            }\n        }\n\n        private void CtrlFiles_ItemRemoving(object sender, AdditionalFilesEventArgs e)\n        {\n            if (e.Item.Equals(GameFile))\n            {\n                MessageBox.Show(this, string.Format(\"Cannot remove {0}. This is the file you will be launching!\", GameFile.FileName), \n                    \"Cannot Remove\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                e.Cancel = true;\n            }\n            else\n            {\n                if (SpecificFiles != null)\n                    SpecificFiles = SpecificFiles.Except(GetSupportedFiles((IGameFile)e.Item)).ToArray();\n            }\n        }\n\n        private void CtrlFiles_ItemAdded(object sender, AdditionalFilesEventArgs e)\n        {\n        }\n\n        private void CtrlFiles_ItemRemoved(object sender, AdditionalFilesEventArgs e)\n        {\n        }\n\n        private void ResetSpecificFilesSelections(IGameFile[] selectedFiles)\n        {\n            foreach (IGameFile gameFile in selectedFiles)\n            {\n                if (SpecificFiles == null)\n                    SpecificFiles = GetSupportedFiles(GameFile);\n\n                SpecificFiles = SpecificFiles.Union(GetSupportedFiles(gameFile)).ToArray();\n            }\n        }\n\n        private string[] GetSupportedFiles(IGameFile gameFile)\n        {\n            return SpecificFilesForm.GetSupportedFiles(m_appConfig.GameFileDirectory.GetFullPath(), gameFile, SourcePortData.GetSupportedExtensions(SelectedSourcePort));\n        }\n\n        private void cmbIwad_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            HandleIwadSelectionChanged();\n        }\n\n        private void HandleIwadSelectionChanged(bool resetAdditionalFiles = true)\n        {\n            SetAdditionalFiles(resetAdditionalFiles);\n\n            if (GameFile == null || (GameFile != null && string.IsNullOrEmpty(GameFile.Map)))\n                SetMapsFromIwad();\n\n            m_lastIwad = SelectedIWad;\n        }\n\n        private void SetMapsFromIwad()\n        {\n            if (SelectedIWad == null)\n                return;\n\n            var gameFileIwad = m_adapter.GetGameFileIWads().FirstOrDefault(x => x.GameFileID == SelectedIWad.GameFileID);\n            if (gameFileIwad != null)\n                AutoCompleteCombo.SetAutoCompleteCustomSource(cmbMap, MapSplit(gameFileIwad), null, null);\n        }\n\n        private void SetAdditionalFiles(bool reset)\n        {\n            if (m_handler == null)\n                return;\n\n            if (reset && m_lastIwad != null && m_lastSourcePort != null)\n            {\n                m_handler.CalculateAdditionalFiles(m_lastIwad, m_lastSourcePort);\n                m_handler.CalculateAdditionalFiles(SelectedIWad, cmbSourcePorts.SelectedItem as ISourcePortData);\n                ResetSpecificFilesSelections(m_handler.GetCurrentAdditionalNewFiles().ToArray());\n            }\n\n            ctrlFiles.SetDataSource(m_handler.GetCurrentAdditionalFiles());\n            ctrlFiles.Refresh(); //the port or iwad in () may have changed so invalidate to force update\n        }\n\n        private bool ShouldRecalculateAdditionalFiles()\n        {\n            //For files that have been launcned before: Selected index changed fires a lot on init, so ignore those\n            //If the file has never been launched, then we need to set the additional files on init\n            return SelectedGameProfile != null && !SelectedGameProfile.SettingsSaved;\n        }\n\n        private void lnkSpecific_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            SpecificFilesForm form = new SpecificFilesForm();\n            form.StartPosition = FormStartPosition.CenterParent;\n\n            List<IGameFile> gameFiles = new List<IGameFile>();\n            gameFiles.AddRange(GetAdditionalFiles());\n\n            form.Initialize(m_appConfig.GameFileDirectory, gameFiles, SourcePortData.GetSupportedExtensions(SelectedSourcePort), SpecificFiles);\n\n            if (form.ShowDialog(this) == DialogResult.OK)\n            {\n                SpecificFiles = form.GetSpecificFiles();\n            }\n        }\n\n        private void lnkMore_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            StatsInfo form = new StatsInfo();\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.ShowDialog(this);\n        }\n\n        private void lnkLoadSaveMore_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            SaveInfo form = new SaveInfo();\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.ShowDialog(this);\n        }\n\n        public bool SettingsValid(out string error)\n        {\n            error = null;\n\n            if (chkRecord.Checked && string.IsNullOrEmpty(txtDescription.Text))\n                error = \"Please enter a description for the demo to record.\";\n            else if (SelectedSourcePort == null)\n                error = \"A source port must be selected.\";\n            else if (chkMap.Checked && SelectedMap == null)\n                error = \"A map must be selected.\";\n            else if (chkMap.Checked && SelectedSkill == null)\n                error = \"A skill must be selected\";\n            else if (chkDemo.Checked && SelectedDemo == null)\n                error = \"A demo must be selected.\";\n            else if (SelectedGameProfile == null)\n                error = \"A profile must be selected.\";\n\n            return error == null;\n        }\n\n        private void btnOK_Click(object sender, EventArgs e)\n        {\n            Accept();\n        }\n\n        public void Accept()\n        {\n            if (SettingsValid(out string err))\n            {\n                DialogResult = DialogResult.OK;\n            }\n            else\n            {\n                MessageBox.Show(this, err, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                DialogResult = DialogResult.None;\n            }\n        }\n\n        private void ctrlFiles_CellFormatting(object sender, AdditionalFilesEventArgs e)\n        {\n            IGameFile gameFile = e.Item as IGameFile;\n            IGameFile iwad = SelectedIWad;\n            ISourcePortData port = SelectedSourcePort;\n            if (iwad != null && m_handler.IsIWadFile(gameFile))\n                e.DisplayText = string.Format(\"{0} ({1})\", gameFile.FileName, Path.GetFileNameWithoutExtension(iwad.FileName));\n            if (port != null && m_handler.IsSourcePortFile(gameFile))\n                e.DisplayText = string.Format(\"{0} ({1})\", gameFile.FileName, port.Name);\n        }\n\n        private void btnSaveSettings_Click(object sender, EventArgs e)\n        {\n            if (SelectedGameProfile == null)\n                MessageBox.Show(this, \"A profile must be selected to save.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            else\n                SaveSettings?.Invoke(this, EventArgs.Empty);\n        }\n\n        private void lnkOpenDemo_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            GenericFileView genericFileView = new GenericFileView();\n            List<IFileData> demoFiles = genericFileView.CreateFileAssociation(this, m_adapter, m_appConfig.DemoDirectory, FileType.Demo, GameFile,\n                cmbSourcePorts.SelectedItem as ISourcePortData);\n\n            if (demoFiles.Count > 0)\n            {\n                PopulateDemos();\n                SelectedSourcePort = m_adapter.GetSourcePort(demoFiles.First().SourcePortID);\n                cmbDemo.SelectedValue = demoFiles.First().FileID;\n                chkDemo.Checked = true; //will trigger HandleDemoChange\n            }\n        }\n\n        private void cmbDemo_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            HandleDemoChange();\n        }\n\n        private void HandleDemoChange()\n        {\n            if (chkDemo.Checked && cmbDemo.SelectedItem != null)\n            {\n                var file = cmbDemo.SelectedItem as IFileData;\n                var parser = DemoUtil.GetDemoParser(Path.Combine(m_appConfig.DemoDirectory.GetFullPath(), file.FileName));\n\n                if (parser != null)\n                {\n                    m_handler.Reset();\n                    SetAdditionalFiles(true);\n\n                    string[] requiredFiles = parser.GetRequiredFiles();\n                    List<string> unavailable = new List<string>();\n                    List<IGameFile> iwads = new List<IGameFile>();\n                    List<IGameFile> gameFiles = GetGameFiles(requiredFiles, unavailable, iwads);\n                    ctrlFiles.SetDataSource(gameFiles);\n                    if (iwads.Count > 0)\n                        SelectedIWad = iwads.First();\n\n                    if (unavailable.Count > 0)\n                    {\n                        TextBoxForm form = new TextBoxForm(true, MessageBoxButtons.OK)\n                        {\n                            StartPosition = FormStartPosition.CenterParent,\n                            Title = \"Not Found\",\n                            HeaderText = \"The following required files were not found:\",\n                            DisplayText = string.Join(Environment.NewLine, unavailable.ToArray())\n                        };\n                        form.ShowDialog(this);\n                    }\n\n                    m_demoChangedAdditionalFiles = true;\n                    ResetSpecificFilesSelections(ctrlFiles.GetFiles().Cast<IGameFile>().ToArray()); //don't use the handler in this case, we are overriding it\n                }\n            }\n            else\n            {\n                m_demoChangedAdditionalFiles = false;\n            }\n        }\n\n        private void lnkPreviewLaunchParameters_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            OnPreviewLaunchParameters?.Invoke(this, new EventArgs());\n        }\n\n        private void lnkCustomParameters_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            throw new NotImplementedException();\n        }\n\n        private void lnkFilterSettings_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            FilterSettingsForm form;\n\n            try\n            {\n                form = new FilterSettingsForm(m_filterSettings);\n            }\n            catch\n            {\n                m_filterSettings = CreateDefaultFilterSettings(); //this can happen due to an update and the xml not having the property, reset to default\n                form = new FilterSettingsForm(m_filterSettings);\n            }\n\n            form.StartPosition = FormStartPosition.CenterParent;\n\n            if (form.ShowDialog(this) == DialogResult.OK)\n            {\n                m_filterSettings = form.GetFilterSettings();\n                m_filterSettings.Enabled = chkScreenFilter.Checked;\n                WriteFilterSettings(m_filterSettings);\n            }\n        }\n\n        private static readonly string s_filterFile = \"FilterSettings.xml\";\n\n        private static string GetFilterFile()\n        {\n            return Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), s_filterFile);\n        }\n\n        private void WriteFilterSettings(ScreenFilter settings)\n        {\n            try\n            {\n                XmlSerializer x = new XmlSerializer(typeof(ScreenFilter));\n                using (FileStream fs = new FileStream(GetFilterFile(), FileMode.Create))\n                    x.Serialize(fs, settings);\n            }\n            catch\n            {\n                //oh well, at least we tried\n            }\n        }\n\n        public ScreenFilter GetFilterSettings()\n        {\n            try\n            {\n                XmlSerializer x = new XmlSerializer(typeof(ScreenFilter));\n               \n                using (FileStream fs = new FileStream(GetFilterFile(), FileMode.Open))\n                    return (ScreenFilter)x.Deserialize(fs);\n            }\n            catch\n            {\n                if (File.Exists(GetFilterFile()))\n                    File.Delete(GetFilterFile());\n                return CreateDefaultFilterSettings();\n            }\n        }\n\n        private ScreenFilter CreateDefaultFilterSettings()\n        {\n            return new ScreenFilter()\n            {\n                Type = ScreenFilterType.Ellipse,\n                Opacity = 0.5f,\n                LineThickness = 1,\n                BlockSize = 4,\n                SpacingX = 0,\n                SpacingY = 0,\n                Stagger = true,\n                ScanlineSpacing = 4,\n                VerticalScanlines = true,\n                HorizontalScanlines = true,\n                Enabled = chkScreenFilter.Checked\n            };\n        }\n\n        private void chkScreenFilter_CheckedChanged(object sender, EventArgs e)\n        {\n            m_filterSettings = GetFilterSettings();\n            m_filterSettings.Enabled = chkScreenFilter.Checked;\n            WriteFilterSettings(m_filterSettings);\n        }\n\n        private bool RenameGameProfile(int gameProfileID, string name)\n        {\n            if (!GameProfileUtil.IsValidProfileName(m_adapter, GameFile, m_globalProfiles, gameProfileID, name, out var error))\n            {\n                MessageBox.Show(this, error, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return false;\n            }\n\n            SelectedGameProfile.Name = name;\n            m_adapter.UpdateGameProfile(SelectedGameProfile);\n            cmbProfiles.SelectedIndexChanged -= CmbProfiles_SelectedIndexChanged;\n            LoadProfiles();\n            cmbProfiles.SelectedValue = gameProfileID;\n            cmbProfiles.SelectedIndexChanged += CmbProfiles_SelectedIndexChanged;\n\n            return true;\n        }\n\n        private static TextBoxForm CreateProfileTextBoxForm(string displayText, bool showCheckBox)\n        {\n            TextBoxForm form = new TextBoxForm(false, MessageBoxButtons.OKCancel);\n            form.SetMaxLength(48);\n            form.DisplayText = displayText;\n            form.StartPosition = FormStartPosition.CenterParent;\n            form.Title = \"Enter Profile Name\";\n            form.SelectDisplayText(0, form.DisplayText.Length);\n            if (showCheckBox)\n                form.SetCheckBox(\"Copy current profile\");\n            return form;\n        }\n\n        public void UpdateGameProfile(IGameProfile gameProfile)\n        {\n            gameProfile.SettingsSaved = true;\n            gameProfile.SourcePortID = gameProfile.IWadID = null;\n\n            if (SelectedSourcePort != null) gameProfile.SourcePortID = SelectedSourcePort.SourcePortID;\n            if (SelectedIWad != null) gameProfile.IWadID = SelectedIWad.IWadID;\n\n            if (SelectedMap != null) gameProfile.SettingsMap = SelectedMap;\n            else gameProfile.SettingsMap = string.Empty; //this setting can be turned off\n\n            if (SelectedSkill != null) gameProfile.SettingsSkill = SelectedSkill;\n            if (ExtraParameters != null) gameProfile.SettingsExtraParams = ExtraParameters;\n\n            gameProfile.SettingsStat = SaveStatistics;\n            gameProfile.SettingsLoadLatestSave = LoadLatestSave;\n            gameProfile.SettingsExtraParamsOnly = ExtraParametersOnly;\n\n            if (!ShouldSaveAdditionalFiles())\n                return;\n            \n            var additionalGameFiles = GetAdditionalFiles();\n            if (gameProfile.IsGlobal)\n                additionalGameFiles = additionalGameFiles\n                    .Where(x => x.GameFileID != GameFile.GameFileID).ToList();\n            gameProfile.SettingsFiles = string.Join(\";\", additionalGameFiles.Select(x => x.FileName).ToArray());\n            gameProfile.SettingsFilesIWAD = string.Join(\";\", GetIWadAdditionalFiles().Select(x => x.FileName).ToArray());\n            gameProfile.SettingsFilesSourcePort = string.Join(\";\", GetSourcePortAdditionalFiles().Select(x => x.FileName).ToArray());\n\n            if (SpecificFiles != null)\n                gameProfile.SettingsSpecificFiles = string.Join(\";\", SpecificFiles);\n            else\n                gameProfile.SettingsSpecificFiles = string.Empty; //this setting can be turned off\n        }\n\n        private void CmbProfiles_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            SetGameProfile(SelectedGameProfile);\n        }\n\n        private void newGlobalProfileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            CreateNewProfile(true);\n        }\n\n        private void newProfileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            CreateNewProfile(false);\n        }\n\n        private void CreateNewProfile(bool global)\n        {\n            TextBoxForm form = CreateProfileTextBoxForm(global ? \"New Global Profile\" :\"New Profile\", true);\n            bool success = false;\n\n            while (!success && form.ShowDialog(this) == DialogResult.OK)\n            {\n                success = GameProfileUtil.IsValidProfileName(m_adapter, GameFile, m_globalProfiles, -1, \n                    form.DisplayText.Trim(), out var error);\n\n                if (success)\n                {\n                    GameProfile gameProfile;\n                    if (global)\n                        gameProfile = GameProfile.CreateGlobalProfile(form.DisplayText);\n                    else\n                        gameProfile = new GameProfile(GameFile.GameFileID.Value, form.DisplayText);\n\n                    GameProfile.ApplyDefaultsToProfile(gameProfile, m_appConfig);\n                    if (GameFile != null && IsIwad(GameFile))\n                        gameProfile.IWadID = GameFile.IWadID.Value;\n\n                    if (form.CheckBoxChecked)\n                        UpdateGameProfile(gameProfile);\n\n                    m_adapter.InsertGameProfile(gameProfile);\n\n                    cmbProfiles.SelectedIndexChanged -= CmbProfiles_SelectedIndexChanged;\n                    var profiles = LoadProfiles();\n                    cmbProfiles.SelectedIndexChanged += CmbProfiles_SelectedIndexChanged;\n                    cmbProfiles.SelectedValue = profiles.Max(x => x.GameProfileID);\n                }\n                else\n                {\n                    MessageBox.Show(this, error, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n            }\n        }\n\n        private void editProfileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            if (SelectedGameProfile is GameFile)\n            {\n                MessageBox.Show(this, \"The default profile cannot be renamed.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            TextBoxForm form = CreateProfileTextBoxForm(SelectedGameProfile.Name, false);\n            int gameProfileID = SelectedGameProfile.GameProfileID;\n            bool success = false;\n\n            while (!success && form.ShowDialog(this) == DialogResult.OK)\n            {\n                success = RenameGameProfile(gameProfileID, form.DisplayText.Trim());\n            }\n        }\n\n        private void deleteProfileToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            if (SelectedGameProfile == null)\n                return;\n            \n            if (SelectedGameProfile is GameFile)\n            {\n                MessageBox.Show(this, \"The default profile cannot be deleted.\", \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            if (MessageBox.Show(this, $\"Are you sure you want to delete {SelectedGameProfile.Name}?\",\n                    \"Confirm\", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)\n                return;\n\n            m_adapter.DeleteGameProfile(SelectedGameProfile.GameProfileID);\n            var profiles = LoadProfiles();\n            if (profiles.Count == 0)\n                return;\n\n            cmbProfiles.SelectedItem = GameFile;\n        }\n\n        private List<IGameFile> GetGameFiles(string[] fileNames, List<string> unavailable, List<IGameFile> iwads)\n        {        \n            List<IGameFile> gameFiles = new List<IGameFile>();\n            var knowniwads = m_adapter.GetGameFileIWads();\n\n            foreach (string file in fileNames)\n            {\n                // This currently doesn't work for unmanaged files\n                var gameFile = m_adapter.GetGameFile(file.Replace(Path.GetExtension(file), \".zip\"));\n                if (gameFile == null)\n                {\n                    unavailable.Add(file);\n                    continue;\n                }\n\n                if (knowniwads.Any(x => x.FileName.Equals(gameFile.FileName, StringComparison.InvariantCultureIgnoreCase)))\n                    iwads.Add(gameFile);\n                else\n                    gameFiles.Add(gameFile);\n            }\n\n            return gameFiles;\n        }\n\n        private void TxtParameters_Click(object sender, EventArgs e)\n        {\n            TextBoxForm form = new TextBoxForm(true, MessageBoxButtons.OKCancel)\n            {\n                Title = \"Extra Parameters\",\n                DisplayText = txtParameters.Text,\n                StartPosition = FormStartPosition.CenterParent,\n                AcceptButton = null\n            };\n\n            form.SelectDisplayText(0, 0);\n            if (form.ShowDialog(this) == DialogResult.OK)\n                txtParameters.Text = form.DisplayText;\n        }\n\n        private void btnProfileMenu_Click(object sender, EventArgs e)\n        {\n            Stylizer.StylizeControl(toolStripDropDownButton1.DropDown, DesignMode);\n            toolStripDropDownButton1.ShowDropDown();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/PlayForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"profileToolStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>539, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/PlayRandomForm.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class PlayRandomForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlayRandomForm));\n            this.cmbType = new System.Windows.Forms.ComboBox();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnGenerate = new System.Windows.Forms.Button();\n            this.lblText = new System.Windows.Forms.Label();\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.chkShowPlayDialog = new DoomLauncher.CCheckBox();\n            this.chkRandomMap = new DoomLauncher.CCheckBox();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.panel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // cmbType\n            // \n            this.cmbType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbType.FormattingEnabled = true;\n            this.cmbType.Location = new System.Drawing.Point(19, 18);\n            this.cmbType.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.cmbType.Name = \"cmbType\";\n            this.cmbType.Size = new System.Drawing.Size(256, 28);\n            this.cmbType.TabIndex = 0;\n            // \n            // btnOK\n            // \n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(262, 240);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(88, 35);\n            this.btnOK.TabIndex = 2;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(357, 240);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(82, 35);\n            this.btnCancel.TabIndex = 3;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnGenerate\n            // \n            this.btnGenerate.Location = new System.Drawing.Point(284, 18);\n            this.btnGenerate.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.btnGenerate.Name = \"btnGenerate\";\n            this.btnGenerate.Size = new System.Drawing.Size(158, 30);\n            this.btnGenerate.TabIndex = 4;\n            this.btnGenerate.Text = \"Generate\";\n            this.btnGenerate.UseVisualStyleBackColor = true;\n            this.btnGenerate.Click += new System.EventHandler(this.btnGenerate_Click);\n            // \n            // lblText\n            // \n            this.lblText.AutoSize = true;\n            this.lblText.Location = new System.Drawing.Point(19, 96);\n            this.lblText.Name = \"lblText\";\n            this.lblText.Size = new System.Drawing.Size(58, 20);\n            this.lblText.TabIndex = 5;\n            this.lblText.Text = \"Output\";\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Controls.Add(this.panel1, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(454, 323);\n            this.tblMain.TabIndex = 6;\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.chkShowPlayDialog);\n            this.panel1.Controls.Add(this.cmbType);\n            this.panel1.Controls.Add(this.lblText);\n            this.panel1.Controls.Add(this.chkRandomMap);\n            this.panel1.Controls.Add(this.btnGenerate);\n            this.panel1.Controls.Add(this.btnOK);\n            this.panel1.Controls.Add(this.btnCancel);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panel1.Location = new System.Drawing.Point(0, 40);\n            this.panel1.Margin = new System.Windows.Forms.Padding(0);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(454, 283);\n            this.panel1.TabIndex = 0;\n            // \n            // chkShowPlayDialog\n            // \n            this.chkShowPlayDialog.AutoSize = true;\n            this.chkShowPlayDialog.Location = new System.Drawing.Point(197, 62);\n            this.chkShowPlayDialog.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.chkShowPlayDialog.Name = \"chkShowPlayDialog\";\n            this.chkShowPlayDialog.Size = new System.Drawing.Size(157, 24);\n            this.chkShowPlayDialog.TabIndex = 6;\n            this.chkShowPlayDialog.Text = \"Show Play Dialog\";\n            // \n            // chkRandomMap\n            // \n            this.chkRandomMap.AutoSize = true;\n            this.chkRandomMap.Checked = true;\n            this.chkRandomMap.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.chkRandomMap.Location = new System.Drawing.Point(19, 62);\n            this.chkRandomMap.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.chkRandomMap.Name = \"chkRandomMap\";\n            this.chkRandomMap.Size = new System.Drawing.Size(180, 24);\n            this.chkRandomMap.TabIndex = 1;\n            this.chkRandomMap.Text = \"Select Random Map\";\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(454, 40);\n            this.titleBar.TabIndex = 1;\n            this.titleBar.Title = \"Play Random\";\n            // \n            // PlayRandomForm\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(454, 323);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.Name = \"PlayRandomForm\";\n            this.Text = \"Play Random\";\n            this.tblMain.ResumeLayout(false);\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ComboBox cmbType;\n        private CCheckBox chkRandomMap;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnGenerate;\n        private System.Windows.Forms.Label lblText;\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.Panel panel1;\n        private Controls.TitleBarControl titleBar;\n        private CCheckBox chkShowPlayDialog;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/PlayRandomForm.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Linq;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing System.Collections.Generic;\nusing DoomLauncher.DataSources;\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement.Rebar;\n\nnamespace DoomLauncher.Forms\n{\n    public enum PlayRandomType\n    {\n        [Description(\"Any\")]\n        Any,\n        [Description(\"Unplayed\")]\n        Unplayed,\n        [Description(\"Unrated\")]\n        Unrated,\n        [Description(\"Current Tab\")]\n        CurrentTab,\n    }\n\n    public partial class PlayRandomForm : Form\n    {\n        public IGameFile GeneratedGameFile { get; private set; }\n        public string GeneratedMap { get; private set; }\n        public PlayRandomType SelectedType => (PlayRandomType)cmbType.SelectedIndex;\n        public bool ShowPlayDialog => chkShowPlayDialog.Checked;\n\n        private ITabView m_tabView;\n\n        public PlayRandomForm()\n        {\n            InitializeComponent();\n\n            lblText.Text = string.Empty;\n\n            List<string> items = new List<string>();\n            foreach (var item in Enum.GetValues(typeof(PlayRandomType)))\n                items.Add(((PlayRandomType)item).GetDescription());\n\n            cmbType.DataSource = items;\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public void Initialize(ITabView tabView, AppConfiguration config, IGameFile initGameFile = null, string initMap = null)\n        {\n            GeneratedGameFile = initGameFile;\n            GeneratedMap = initMap;\n            m_tabView = tabView;\n            if (config.ShowPlayDialog)\n                chkShowPlayDialog.Visible = false;\n\n            chkShowPlayDialog.Checked = config.ShowPlayDialog;\n            if (GeneratedGameFile != null)\n                SetData();\n        }\n\n        private void btnGenerate_Click(object sender, EventArgs e)\n        {\n            GeneratedRandom();\n        }\n\n        private void btnOK_Click(object sender, EventArgs e)\n        {\n            if (GeneratedGameFile != null)\n                return;\n\n            GeneratedRandom();\n        }\n\n        private void GeneratedRandom()\n        {\n            IEnumerable<IGameFile> gameFiles = GetGameFilesBySelectedType();\n            if (!gameFiles.Any())\n            {\n                lblText.Text = \"No files found.\";\n                return;\n            }\n\n            Random rand = new Random(DateTime.Now.Millisecond);\n            int index = rand.Next() % gameFiles.Count();\n            GeneratedGameFile = gameFiles.ElementAt(index);\n\n            GameFileGetOptions options = new GameFileGetOptions();\n            options.SearchField = new GameFileSearchField(GameFileFieldType.GameFileID, GeneratedGameFile.GameFileID.ToString());\n            GeneratedGameFile = DataCache.Instance.DataSourceAdapter.GetGameFiles(options).FirstOrDefault();\n\n            GeneratedMap = null;\n            if (chkRandomMap.Checked && GetRandomMap(rand, GeneratedGameFile, out string map))\n                GeneratedMap = map;\n\n            SetData();\n        }\n\n        private void SetData()\n        {\n            if (GeneratedGameFile == null)\n            {\n                lblText.Text = $\"Current tab ({m_tabView.Key}) is not supported in this context.\";\n                return;\n            }\n\n            if (GeneratedMap != null)\n            {\n                lblText.Text = $\"{GeneratedGameFile.FileNameNoPath} - {GeneratedMap}\";\n                return;\n            }\n\n            lblText.Text = $\"{GeneratedGameFile.FileNameNoPath}\";\n        }\n\n        private IEnumerable<IGameFile> GetGameFilesBySelectedType()\n        {\n            switch (SelectedType)\n            {\n                case PlayRandomType.Any:\n                    return GetGameFiles(null);\n\n                case PlayRandomType.Unplayed:\n                    return GetGameFiles(GameFileFieldType.LastPlayed);\n\n                case PlayRandomType.Unrated:\n                    return GetGameFiles(GameFileFieldType.Rating);\n\n                case PlayRandomType.CurrentTab:\n                    return m_tabView.GameFileViewControl.DataSource;\n\n                default:\n                    break;\n            }\n\n            return Array.Empty<IGameFile>();\n        }\n\n        private IEnumerable<IGameFile> GetGameFiles(GameFileFieldType? field)\n        {\n            IDataSourceAdapter adapter = DataCache.Instance.DataSourceAdapter;\n            IGameFileGetOptions options = new GameFileGetOptions(new GameFileFieldType[] { GameFileFieldType.GameFileID, GameFileFieldType.LastPlayed, GameFileFieldType.Rating });\n            IEnumerable<IGameFile> gameFiles = adapter.GetGameFiles(options);\n\n            if (field != null)\n            {\n                if (field.Value == GameFileFieldType.LastPlayed)\n                    gameFiles = gameFiles.Where(x => !x.LastPlayed.HasValue);\n                else if (field.Value == GameFileFieldType.Rating)\n                    gameFiles = gameFiles.Where(x => !x.Rating.HasValue);\n            }\n\n            return gameFiles;\n        }\n\n        private bool GetRandomMap(Random rand, IGameFile gameFile, out string map)\n        {\n            map = string.Empty;\n            string[] maps = GameFile.GetMaps(gameFile);\n            if (maps.Length == 0)\n                return false;\n\n            map = maps[rand.Next() % maps.Length];\n            return true;\n        }\n\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/PlayRandomForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/ProgressBarForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class ProgressBarForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProgressBarForm));\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.lblProcess = new System.Windows.Forms.Label();\n            this.progressBar1 = new DoomLauncher.CProgressBar();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.panel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.btnCancel, 0, 2);\n            this.tblMain.Controls.Add(this.panel1, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.Size = new System.Drawing.Size(482, 141);\n            this.tblMain.TabIndex = 0;\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.btnCancel.Location = new System.Drawing.Point(378, 107);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(100, 28);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.lblProcess);\n            this.panel1.Controls.Add(this.progressBar1);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panel1.Location = new System.Drawing.Point(0, 32);\n            this.panel1.Margin = new System.Windows.Forms.Padding(0);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(482, 70);\n            this.panel1.TabIndex = 1;\n            // \n            // lblProcess\n            // \n            this.lblProcess.AutoSize = true;\n            this.lblProcess.Location = new System.Drawing.Point(16, 9);\n            this.lblProcess.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblProcess.Name = \"lblProcess\";\n            this.lblProcess.Size = new System.Drawing.Size(84, 16);\n            this.lblProcess.TabIndex = 1;\n            this.lblProcess.Text = \"Processing...\";\n            // \n            // progressBar1\n            // \n            this.progressBar1.Location = new System.Drawing.Point(16, 28);\n            this.progressBar1.Margin = new System.Windows.Forms.Padding(4);\n            this.progressBar1.Name = \"progressBar1\";\n            this.progressBar1.Size = new System.Drawing.Size(453, 28);\n            this.progressBar1.TabIndex = 0;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(482, 32);\n            this.titleBar.TabIndex = 2;\n            this.titleBar.Title = \"Progress\";\n            // \n            // ProgressBarForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(482, 141);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.Name = \"ProgressBarForm\";\n            this.ShowIcon = false;\n            this.Text = \"Progress\";\n            this.tblMain.ResumeLayout(false);\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Panel panel1;\n        private System.Windows.Forms.Label lblProcess;\n        private Controls.TitleBarControl titleBar;\n        private TableLayoutPanelDB tblMain;\n        private CProgressBar progressBar1;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/ProgressBarForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class ProgressBarForm : Form\n    {\n        public event EventHandler Cancelled;\n\n        public ProgressBarForm()\n        {\n            InitializeComponent();\n\n            Load += ProgressBarForm_Load;\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        void ProgressBarForm_Load(object sender, EventArgs e)\n        {\n            if (Owner != null)\n            {\n                Location = new Point(Owner.Location.X + Owner.Width / 2 - Width / 2,\n                    Owner.Location.Y + Owner.Height / 2 - Height / 2);\n            }\n        }\n\n        public void SetCancelAllowed(bool set)\n        {\n            btnCancel.Visible = set;\n            titleBar.CanClose = set;\n        }\n\n        public ProgressBarStyle ProgressBarStyle\n        {\n            get { return progressBar1.Style; }\n            set { progressBar1.Style = value; }\n        }\n\n        public int Value\n        {\n            get { return progressBar1.Value; }\n            set { progressBar1.Value = value; }\n        }\n\n        public int Minimum\n        {\n            get { return progressBar1.Minimum; }\n            set { progressBar1.Minimum = value; }\n        }\n\n        public int Maximum\n        {\n            get { return progressBar1.Maximum; }\n            set { progressBar1.Maximum = value; }\n        }\n\n        public string DisplayText\n        {\n            get { return lblProcess.Text; }\n            set { lblProcess.Text = value; }\n        }\n\n        public string Title\n        {\n            get { return titleBar.Title; }\n            set { titleBar.Title = value; }\n        }\n\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            Cancelled?.Invoke(this, new EventArgs());\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/ProgressBarForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAyOUWYBgwU8xceKOu/vbzqwsLB6q+vruqysrHqsrKx6rKyseqysrHqr6+u6sLCweq9vbrqFRcc6xAY\n        IvNATmCXQExd/zI7Rf8aIi7/hoSE/8rJyP+5ubn/t7e3/7e3t/+3t7f/t7e3/7m5uf/KyMj/iIaH/wQF\n        CP8eJCn/ICcw/yAnLusuNDz/Jiw0/wYIDP+npqX/0dHQ/7u7u/+8vLz/vLy8/7u7u//Qz8//qKen/xUb\n        I/8dISf/KCwx/yUqMesvNDrqISIk/w0MDP8tLzL/3N3c/8TEw//BwcH/wMDA/8DAwP/BwcH/wsLB/93b\n        2v8+R1H/Iys1/zI4P/8pLDHqMzg/6i4wNP8jIyT/Gx4i/6Oio//k4+L/v7++/83NzP/NzMz/v7++/+Xk\n        4v+hoaH/HCIp/y83QP8wNkH/MTY86jA0N+o7RE3/O0JM/x0iKv8pKiv/9vTx/+Tk5P++vr//wMDA/+jn\n        5//19PP/Ki0x/w4QFP82PUb/Tltp/0JLVuo2OT3qTlll/1Rfb/9JUlv/GiIp/1tiaP/U1NT/sK+u/7Kx\n        sP/Ly8v/U1hd/xofJf8vMjj/Z3qO/3iMoP8+SFTqNzk86lxodP+QobT/Xmp4/zk9Qv8gKTL/LTQ9/2Rs\n        dv9YXWH/Ki80/x8kK/84ODr/RlBb/2J0hv9DS1b/O0JL6klMUepVYG3/coCO/1JYYf8tMjf/QERI/0dO\n        WP8/R1H/Nz5H/0hPWP88Qkn/LC8y/0dMUv84PkX/O0BG/0FGTupMUVjqU15r/z9HUf9SWF//S09T/y01\n        QP8uMjf/QUhP/zxFTv8uMzr/R05X/11fYf83ODr/UVpm/01YYv9AQkXqVV1m6k9WYf9JUFn/QUhP/+Hh\n        4f+EiY//XmBk/3Z9hf+Lk53/TlRZ/3l3d/+sr7T/Slln/1ZeZ/9GS1L/PT5B6lpgZ+pPU1r/RkhK/z0/\n        Qv/DxMT/7Ovp/9HR0P/Gxsb/z87O/83Ozv/m5OL/rLK5/zlBSf9APTv/SElL/256iepZX2bqUlZZ/0ZH\n        Sf9SUU//l5iY/9HQ0P+wsLH/vr28/5mcnv/R0tP//////6+xtP8uNT3/S0tM/0RFR/94hJLqYmhv61da\n        XP9OTlD/TExP/76+vv/b29z/zc3O/8nLzf/O0NL/xsbG/9XV0/+xt77/SVJe/1VYXv9ZX2X/T1RZ611g\n        ZP9hY2j/bHN7/3J9iv+FkJz/TlBU/2ZtdP9veof/iZWl/3F8iP9KUVf/e4iW/252gP9YXGH/VldZ/2Bl\n        bf9iZ2+VXV9n83R+jOx6g4/qZmlv6oqZqep0gpHqW2Jt6mZxgOpiaHHqZm536mRsd+psdH/qYmhy611h\n        Z/NiZmuUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/SaveInfo.Designer.cs",
    "content": "﻿\nnamespace DoomLauncher.Forms\n{\n    partial class SaveInfo\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SaveInfo));\n            this.tblInfo = new System.Windows.Forms.TableLayoutPanel();\n            this.lblSave = new System.Windows.Forms.Label();\n            this.pbInfo1 = new System.Windows.Forms.PictureBox();\n            this.label3 = new System.Windows.Forms.Label();\n            this.tblContainer = new System.Windows.Forms.TableLayoutPanel();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblInfo.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo1)).BeginInit();\n            this.tblContainer.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblInfo\n            // \n            this.tblInfo.ColumnCount = 2;\n            this.tblInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInfo.Controls.Add(this.lblSave, 1, 1);\n            this.tblInfo.Controls.Add(this.pbInfo1, 0, 0);\n            this.tblInfo.Controls.Add(this.label3, 1, 0);\n            this.tblInfo.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblInfo.Location = new System.Drawing.Point(0, 26);\n            this.tblInfo.Margin = new System.Windows.Forms.Padding(0);\n            this.tblInfo.Name = \"tblInfo\";\n            this.tblInfo.RowCount = 2;\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInfo.Size = new System.Drawing.Size(384, 85);\n            this.tblInfo.TabIndex = 4;\n            // \n            // lblSave\n            // \n            this.lblSave.AutoSize = true;\n            this.lblSave.Location = new System.Drawing.Point(35, 40);\n            this.lblSave.Name = \"lblSave\";\n            this.lblSave.Size = new System.Drawing.Size(322, 26);\n            this.lblSave.TabIndex = 3;\n            this.lblSave.Text = \"Loading a save file is supported for all ports, except the Doomsday Engine.\";\n            // \n            // pbInfo1\n            // \n            this.pbInfo1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbInfo1.InitialImage = null;\n            this.pbInfo1.Location = new System.Drawing.Point(0, 0);\n            this.pbInfo1.Margin = new System.Windows.Forms.Padding(0);\n            this.pbInfo1.Name = \"pbInfo1\";\n            this.pbInfo1.Size = new System.Drawing.Size(32, 40);\n            this.pbInfo1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbInfo1.TabIndex = 0;\n            this.pbInfo1.TabStop = false;\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(35, 7);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(343, 26);\n            this.label3.TabIndex = 2;\n            this.label3.Text = \"The \\'Load Latest Save\\' option will become available when a supported source port \" +\n    \"is selected.\";\n            // \n            // tblContainer\n            // \n            this.tblContainer.ColumnCount = 1;\n            this.tblContainer.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblContainer.Controls.Add(this.titleBar, 0, 0);\n            this.tblContainer.Controls.Add(this.tblInfo, 0, 1);\n            this.tblContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblContainer.Location = new System.Drawing.Point(0, 0);\n            this.tblContainer.Margin = new System.Windows.Forms.Padding(0);\n            this.tblContainer.Name = \"tblContainer\";\n            this.tblContainer.RowCount = 2;\n            this.tblContainer.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblContainer.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblContainer.Size = new System.Drawing.Size(384, 111);\n            this.tblContainer.TabIndex = 5;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(384, 26);\n            this.titleBar.TabIndex = 0;\n            this.titleBar.Title = \"Load Latest Save\";\n            // \n            // SaveInfo\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(384, 111);\n            this.Controls.Add(this.tblContainer);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Name = \"SaveInfo\";\n            this.Text = \"Load Latest Save\";\n            this.tblInfo.ResumeLayout(false);\n            this.tblInfo.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo1)).EndInit();\n            this.tblContainer.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblInfo;\n        private System.Windows.Forms.Label lblSave;\n        private System.Windows.Forms.PictureBox pbInfo1;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.TableLayoutPanel tblContainer;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/SaveInfo.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class SaveInfo : Form\n    {\n        public SaveInfo()\n        {\n            InitializeComponent();\n\n            pbInfo1.Image = DoomLauncher.Properties.Resources.bon2b;\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/SaveInfo.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/ScreenshotEditForm.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class ScreenshotEditForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScreenshotEditForm));\n            this.tblData = new DoomLauncher.TableLayoutPanelDB();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.txtDescription = new System.Windows.Forms.TextBox();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.button1 = new System.Windows.Forms.Button();\n            this.btnSave = new System.Windows.Forms.Button();\n            this.label3 = new System.Windows.Forms.Label();\n            this.cmbMap = new System.Windows.Forms.ComboBox();\n            this.txtTitle = new System.Windows.Forms.TextBox();\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.chkMap = new DoomLauncher.CCheckBox();\n            this.tblData.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.tblMain.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblData\n            // \n            this.tblData.ColumnCount = 3;\n            this.tblData.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100F));\n            this.tblData.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblData.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblData.Controls.Add(this.label1, 0, 0);\n            this.tblData.Controls.Add(this.chkMap, 1, 1);\n            this.tblData.Controls.Add(this.label2, 0, 2);\n            this.tblData.Controls.Add(this.txtDescription, 2, 2);\n            this.tblData.Controls.Add(this.flowLayoutPanel1, 2, 3);\n            this.tblData.Controls.Add(this.label3, 0, 1);\n            this.tblData.Controls.Add(this.txtTitle, 2, 0);\n            this.tblData.Controls.Add(this.cmbMap, 2, 1);\n            this.tblData.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblData.Location = new System.Drawing.Point(4, 36);\n            this.tblData.Margin = new System.Windows.Forms.Padding(4);\n            this.tblData.Name = \"tblData\";\n            this.tblData.RowCount = 4;\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblData.Size = new System.Drawing.Size(703, 487);\n            this.tblData.TabIndex = 1;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(4, 11);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(33, 16);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Title\";\n            // \n            // label2\n            // \n            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(4, 255);\n            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(75, 16);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"Description\";\n            // \n            // txtDescription\n            // \n            this.txtDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtDescription.Location = new System.Drawing.Point(136, 82);\n            this.txtDescription.Margin = new System.Windows.Forms.Padding(4);\n            this.txtDescription.Multiline = true;\n            this.txtDescription.Name = \"txtDescription\";\n            this.txtDescription.Size = new System.Drawing.Size(563, 362);\n            this.txtDescription.TabIndex = 2;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.button1);\n            this.flowLayoutPanel1.Controls.Add(this.btnSave);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(132, 448);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(571, 39);\n            this.flowLayoutPanel1.TabIndex = 4;\n            // \n            // button1\n            // \n            this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.button1.Location = new System.Drawing.Point(467, 4);\n            this.button1.Margin = new System.Windows.Forms.Padding(4);\n            this.button1.Name = \"button1\";\n            this.button1.Size = new System.Drawing.Size(100, 28);\n            this.button1.TabIndex = 0;\n            this.button1.Text = \"Cancel\";\n            this.button1.UseVisualStyleBackColor = true;\n            // \n            // btnSave\n            // \n            this.btnSave.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnSave.Location = new System.Drawing.Point(359, 4);\n            this.btnSave.Margin = new System.Windows.Forms.Padding(4);\n            this.btnSave.Name = \"btnSave\";\n            this.btnSave.Size = new System.Drawing.Size(100, 28);\n            this.btnSave.TabIndex = 1;\n            this.btnSave.Text = \"Save\";\n            this.btnSave.UseVisualStyleBackColor = true;\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(3, 50);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(34, 16);\n            this.label3.TabIndex = 6;\n            this.label3.Text = \"Map\";\n            // \n            // cmbMap\n            // \n            this.cmbMap.DisplayMember = \"Name\";\n            this.cmbMap.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbMap.Enabled = false;\n            this.cmbMap.FormattingEnabled = true;\n            this.cmbMap.Location = new System.Drawing.Point(136, 47);\n            this.cmbMap.Margin = new System.Windows.Forms.Padding(4, 8, 4, 4);\n            this.cmbMap.Name = \"cmbMap\";\n            this.cmbMap.Size = new System.Drawing.Size(563, 24);\n            this.cmbMap.TabIndex = 7;\n            this.cmbMap.TabStop = false;\n            // \n            // txtTitle\n            // \n            this.txtTitle.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtTitle.Location = new System.Drawing.Point(135, 8);\n            this.txtTitle.Margin = new System.Windows.Forms.Padding(3, 8, 3, 2);\n            this.txtTitle.Name = \"txtTitle\";\n            this.txtTitle.Size = new System.Drawing.Size(565, 22);\n            this.txtTitle.TabIndex = 5;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 18F));\n            this.tblMain.Controls.Add(this.tblData, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(711, 527);\n            this.tblMain.TabIndex = 2;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(711, 32);\n            this.titleBar.TabIndex = 2;\n            this.titleBar.Title = \"Edit\";\n            // \n            // chkMap\n            // \n            this.chkMap.AutoSize = true;\n            this.chkMap.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.chkMap.Location = new System.Drawing.Point(103, 51);\n            this.chkMap.Margin = new System.Windows.Forms.Padding(3, 12, 3, 3);\n            this.chkMap.Name = \"chkMap\";\n            this.chkMap.Size = new System.Drawing.Size(26, 24);\n            this.chkMap.TabIndex = 8;\n            this.chkMap.CheckedChanged += new System.EventHandler(this.chkMap_CheckedChanged);\n            // \n            // ScreenshotEditForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(711, 527);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.Name = \"ScreenshotEditForm\";\n            this.Text = \"Edit\";\n            this.tblData.ResumeLayout(false);\n            this.tblData.PerformLayout();\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.tblMain.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblData;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.TextBox txtDescription;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button button1;\n        private System.Windows.Forms.Button btnSave;\n        private System.Windows.Forms.TextBox txtTitle;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.ComboBox cmbMap;\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private Controls.TitleBarControl titleBar;\n        private CCheckBox chkMap;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/ScreenshotEditForm.cs",
    "content": "﻿using DoomLauncher.Handlers;\nusing DoomLauncher.Interfaces;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class ScreenshotEditForm : Form\n    {\n        public ScreenshotEditForm()\n        {\n            InitializeComponent();\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public static bool ShowDialogAndUpdate(IWin32Window owner, IDataSourceAdapter adapter, IGameFile gameFile, IFileData fileData)\n        {\n            ScreenshotEditForm screenshotEditForm = new ScreenshotEditForm();\n            screenshotEditForm.StartPosition = FormStartPosition.CenterParent;\n            screenshotEditForm.SetData(gameFile, fileData);\n\n            if (screenshotEditForm.ShowDialog(owner) == DialogResult.OK)\n            {\n                fileData.UserTitle = screenshotEditForm.Title;\n                fileData.UserDescription = screenshotEditForm.Description;\n                fileData.Map = screenshotEditForm.Map;\n                if (!screenshotEditForm.HasMap)\n                    fileData.Map = null;\n\n                adapter.UpdateFile(fileData);\n                return true;\n            }\n\n            return false;\n        }\n\n        public void SetData(IGameFile gameFile, IFileData fileData)\n        {\n            SetMaps(gameFile);\n\n            if (fileData == null)\n            {\n                cmbMap.Enabled = chkMap.Checked = false;\n                return;\n            }\n\n            TrySetMapData(fileData);\n\n            txtTitle.Text = fileData.UserTitle;\n            txtDescription.Text = fileData.UserDescription;\n        }\n\n        private void SetMaps(IGameFile gameFile)\n        {\n            if (!string.IsNullOrEmpty(gameFile.Map))\n            {\n                AutoCompleteCombo.SetAutoCompleteCustomSource(cmbMap, DataSources.GameFile.GetMaps(gameFile), null, null);\n                return;\n            }\n\n            int iwadId = -1;\n            if (gameFile.IWadID.HasValue)\n                iwadId = gameFile.IWadID.Value;\n            else\n                iwadId = (int)DataCache.Instance.AppConfiguration.GetTypedConfigValue(ConfigType.DefaultIWad, typeof(int));\n\n            var iwad = DataCache.Instance.DataSourceAdapter.GetGameFileIWads().FirstOrDefault(x => x.IWadID == iwadId);\n            if (iwad == null)\n                return;\n\n            AutoCompleteCombo.SetAutoCompleteCustomSource(cmbMap, DataSources.GameFile.GetMaps(iwad), null, null);\n        }\n\n        private void TrySetMapData(IFileData fileData)\n        {\n            if (cmbMap.DataSource == null || cmbMap.Items.Count == 0)\n            {\n                cmbMap.Enabled = false;\n                chkMap.Checked = false;\n                return;\n            }\n\n            try\n            {\n                if (!string.IsNullOrEmpty(fileData.Map))\n                    cmbMap.SelectedItem = fileData.Map;\n                else\n                    cmbMap.SelectedIndex = 0;\n\n                cmbMap.Enabled = chkMap.Checked;\n                chkMap.Checked = !string.IsNullOrEmpty(fileData.Map);\n            }\n            catch\n            {\n                cmbMap.Enabled = false;\n                chkMap.Checked = false;\n            }\n        }\n\n        public bool HasMap => chkMap.Checked;\n\n        public string Map => chkMap.Checked ? cmbMap.SelectedItem as string : null;\n\n        public string Title\n        {\n            get => txtTitle.Text;\n        }\n\n        public string Description\n        {\n            get => txtDescription.Text;\n        }\n\n        private void chkMap_CheckedChanged(object sender, System.EventArgs e)\n        {\n            cmbMap.Enabled = chkMap.Checked;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/ScreenshotEditForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/ScreenshotViewerForm.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class ScreenshotViewerForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScreenshotViewerForm));\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.tblContainer = new System.Windows.Forms.TableLayoutPanel();\n            this.tblData = new System.Windows.Forms.TableLayoutPanel();\n            this.statisticsView = new DoomLauncher.StatisticsView();\n            this.statsControl = new DoomLauncher.StatsControl();\n            this.lblTitle = new DoomLauncher.GrowLabel();\n            this.flpData = new System.Windows.Forms.FlowLayoutPanel();\n            this.lblDescription = new DoomLauncher.GrowLabel();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblButtons = new System.Windows.Forms.TableLayoutPanel();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnSave = new DoomLauncher.FormButton();\n            this.btnSlideshow = new DoomLauncher.FormButton();\n            this.btnEdit = new DoomLauncher.FormButton();\n            this.btnPrev = new System.Windows.Forms.Button();\n            this.btnNext = new System.Windows.Forms.Button();\n            this.tblMain.SuspendLayout();\n            this.tblContainer.SuspendLayout();\n            this.tblData.SuspendLayout();\n            this.flpData.SuspendLayout();\n            this.tblButtons.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.tblContainer, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Controls.Add(this.tblButtons, 0, 2);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Size = new System.Drawing.Size(1378, 844);\n            this.tblMain.TabIndex = 1;\n            // \n            // tblContainer\n            // \n            this.tblContainer.AutoScroll = true;\n            this.tblContainer.ColumnCount = 2;\n            this.tblContainer.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblContainer.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblContainer.Controls.Add(this.tblData, 1, 0);\n            this.tblContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblContainer.Location = new System.Drawing.Point(0, 40);\n            this.tblContainer.Margin = new System.Windows.Forms.Padding(0);\n            this.tblContainer.Name = \"tblContainer\";\n            this.tblContainer.RowCount = 1;\n            this.tblContainer.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblContainer.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblContainer.Size = new System.Drawing.Size(1378, 760);\n            this.tblContainer.TabIndex = 2;\n            // \n            // tblData\n            // \n            this.tblData.ColumnCount = 1;\n            this.tblData.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblData.Controls.Add(this.statisticsView, 0, 2);\n            this.tblData.Controls.Add(this.statsControl, 0, 1);\n            this.tblData.Controls.Add(this.lblTitle, 0, 0);\n            this.tblData.Controls.Add(this.flpData, 0, 3);\n            this.tblData.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblData.Location = new System.Drawing.Point(689, 0);\n            this.tblData.Margin = new System.Windows.Forms.Padding(0);\n            this.tblData.Name = \"tblData\";\n            this.tblData.RowCount = 4;\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 60F));\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 120F));\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 200F));\n            this.tblData.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblData.Size = new System.Drawing.Size(689, 760);\n            this.tblData.TabIndex = 0;\n            // \n            // statisticsView\n            // \n            this.statisticsView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.statisticsView.DataSourceAdapter = null;\n            this.statisticsView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.statisticsView.ForeColor = System.Drawing.Color.White;\n            this.statisticsView.GameFile = null;\n            this.statisticsView.Location = new System.Drawing.Point(4, 190);\n            this.statisticsView.Margin = new System.Windows.Forms.Padding(4, 10, 4, 5);\n            this.statisticsView.Name = \"statisticsView\";\n            this.statisticsView.Size = new System.Drawing.Size(681, 185);\n            this.statisticsView.TabIndex = 2;\n            // \n            // statsControl\n            // \n            this.statsControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.statsControl.Location = new System.Drawing.Point(4, 65);\n            this.statsControl.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.statsControl.Name = \"statsControl\";\n            this.statsControl.Size = new System.Drawing.Size(681, 110);\n            this.statsControl.TabIndex = 3;\n            // \n            // lblTitle\n            // \n            this.lblTitle.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.lblTitle.AutoSize = true;\n            this.lblTitle.Font = new System.Drawing.Font(\"Arial\", 12F, System.Drawing.FontStyle.Bold);\n            this.lblTitle.IsPath = false;\n            this.lblTitle.Location = new System.Drawing.Point(313, 15);\n            this.lblTitle.Name = \"lblTitle\";\n            this.lblTitle.Size = new System.Drawing.Size(63, 29);\n            this.lblTitle.TabIndex = 0;\n            this.lblTitle.Text = \"Title\";\n            this.lblTitle.UseMnemonic = false;\n            // \n            // flpData\n            // \n            this.flpData.Controls.Add(this.lblDescription);\n            this.flpData.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpData.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.flpData.Location = new System.Drawing.Point(0, 380);\n            this.flpData.Margin = new System.Windows.Forms.Padding(0);\n            this.flpData.Name = \"flpData\";\n            this.flpData.Size = new System.Drawing.Size(689, 380);\n            this.flpData.TabIndex = 2;\n            // \n            // lblDescription\n            // \n            this.lblDescription.AutoSize = true;\n            this.lblDescription.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lblDescription.IsPath = false;\n            this.lblDescription.Location = new System.Drawing.Point(6, 20);\n            this.lblDescription.Margin = new System.Windows.Forms.Padding(6, 20, 6, 0);\n            this.lblDescription.Name = \"lblDescription\";\n            this.lblDescription.Size = new System.Drawing.Size(109, 25);\n            this.lblDescription.TabIndex = 1;\n            this.lblDescription.Text = \"Description\";\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(1378, 40);\n            this.titleBar.TabIndex = 3;\n            this.titleBar.Title = \"Screenshot\";\n            // \n            // tblButtons\n            // \n            this.tblButtons.ColumnCount = 4;\n            this.tblButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80F));\n            this.tblButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80F));\n            this.tblButtons.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblButtons.Controls.Add(this.flpButtons, 0, 0);\n            this.tblButtons.Controls.Add(this.btnPrev, 1, 0);\n            this.tblButtons.Controls.Add(this.btnNext, 2, 0);\n            this.tblButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblButtons.Location = new System.Drawing.Point(0, 800);\n            this.tblButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.tblButtons.Name = \"tblButtons\";\n            this.tblButtons.RowCount = 1;\n            this.tblButtons.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblButtons.Size = new System.Drawing.Size(1378, 44);\n            this.tblButtons.TabIndex = 4;\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnSave);\n            this.flpButtons.Controls.Add(this.btnSlideshow);\n            this.flpButtons.Controls.Add(this.btnEdit);\n            this.flpButtons.Location = new System.Drawing.Point(0, 0);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(134, 40);\n            this.flpButtons.TabIndex = 4;\n            // \n            // btnSave\n            // \n            this.btnSave.Image = global::DoomLauncher.Properties.Resources.Save;\n            this.btnSave.Location = new System.Drawing.Point(0, 0);\n            this.btnSave.Margin = new System.Windows.Forms.Padding(0);\n            this.btnSave.Name = \"btnSave\";\n            this.btnSave.Size = new System.Drawing.Size(40, 40);\n            this.btnSave.TabIndex = 0;\n            this.btnSave.UseVisualStyleBackColor = true;\n            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);\n            // \n            // btnSlideshow\n            // \n            this.btnSlideshow.Image = global::DoomLauncher.Properties.Resources.Video;\n            this.btnSlideshow.Location = new System.Drawing.Point(40, 0);\n            this.btnSlideshow.Margin = new System.Windows.Forms.Padding(0);\n            this.btnSlideshow.Name = \"btnSlideshow\";\n            this.btnSlideshow.Size = new System.Drawing.Size(40, 40);\n            this.btnSlideshow.TabIndex = 1;\n            this.btnSlideshow.UseVisualStyleBackColor = true;\n            this.btnSlideshow.Click += new System.EventHandler(this.btnSlideshow_Click);\n            // \n            // btnEdit\n            // \n            this.btnEdit.Image = global::DoomLauncher.Properties.Resources.Edit;\n            this.btnEdit.Location = new System.Drawing.Point(80, 0);\n            this.btnEdit.Margin = new System.Windows.Forms.Padding(0);\n            this.btnEdit.Name = \"btnEdit\";\n            this.btnEdit.Size = new System.Drawing.Size(40, 40);\n            this.btnEdit.TabIndex = 2;\n            this.btnEdit.UseVisualStyleBackColor = true;\n            this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);\n            // \n            // btnPrev\n            // \n            this.btnPrev.BackColor = System.Drawing.SystemColors.Control;\n            this.btnPrev.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.btnPrev.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\n            this.btnPrev.Font = new System.Drawing.Font(\"MS Gothic\", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.btnPrev.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.btnPrev.Location = new System.Drawing.Point(609, 0);\n            this.btnPrev.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.btnPrev.Name = \"btnPrev\";\n            this.btnPrev.Size = new System.Drawing.Size(77, 44);\n            this.btnPrev.TabIndex = 1;\n            this.btnPrev.Text = \"⇦\";\n            this.btnPrev.UseVisualStyleBackColor = false;\n            this.btnPrev.Click += new System.EventHandler(this.btnPrev_Click);\n            // \n            // btnNext\n            // \n            this.btnNext.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.btnNext.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\n            this.btnNext.Font = new System.Drawing.Font(\"MS Gothic\", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.btnNext.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.btnNext.Location = new System.Drawing.Point(692, 0);\n            this.btnNext.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.btnNext.Name = \"btnNext\";\n            this.btnNext.Size = new System.Drawing.Size(77, 44);\n            this.btnNext.TabIndex = 0;\n            this.btnNext.Text = \"⇨\";\n            this.btnNext.TextImageRelation = System.Windows.Forms.TextImageRelation.TextAboveImage;\n            this.btnNext.UseVisualStyleBackColor = true;\n            this.btnNext.Click += new System.EventHandler(this.btnNext_Click);\n            // \n            // ScreenshotViewerForm\n            // \n            this.ClientSize = new System.Drawing.Size(1378, 844);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Name = \"ScreenshotViewerForm\";\n            this.tblMain.ResumeLayout(false);\n            this.tblContainer.ResumeLayout(false);\n            this.tblData.ResumeLayout(false);\n            this.tblData.PerformLayout();\n            this.flpData.ResumeLayout(false);\n            this.flpData.PerformLayout();\n            this.tblButtons.ResumeLayout(false);\n            this.flpButtons.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.Button btnNext;\n        private System.Windows.Forms.Button btnPrev;\n        private System.Windows.Forms.TableLayoutPanel tblContainer;\n        private System.Windows.Forms.TableLayoutPanel tblData;\n        private GrowLabel lblDescription;\n        private GrowLabel lblTitle;\n        private System.Windows.Forms.FlowLayoutPanel flpData;\n        private StatisticsView statisticsView;\n        private StatsControl statsControl;\n        private Controls.TitleBarControl titleBar;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private FormButton btnSave;\n        private FormButton btnSlideshow;\n        private FormButton btnEdit;\n        private System.Windows.Forms.TableLayoutPanel tblButtons;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/ScreenshotViewerForm.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class ScreenshotViewerForm : Form\n    {\n        private string[] m_images = Array.Empty<string>();\n        private IList<IFileData> m_files = Array.Empty<IFileData>();\n        private int m_index;\n        private bool m_slideshow;\n        private IGameFile m_gameFile;\n        private IDataSourceAdapter m_adapter;\n\n        private readonly SlideShowPictureBox pbMain = new SlideShowPictureBox();\n\n        public ScreenshotViewerForm()\n        {\n            InitializeComponent();\n            pbMain.Dock = DockStyle.Fill;\n            tblContainer.Controls.Add(pbMain, 0, 0);\n\n            statsControl.SetMapsVisible(false);\n            statisticsView.SetMapsVisible(false);\n\n            Icons.DpiScale = new DpiScale(CreateGraphics());\n            btnSave.Image = Icons.Save;\n            btnSlideshow.Image = Icons.Video;\n            btnEdit.Image = Icons.Edit;\n            btnPrev.ForeColor = ColorTheme.Current.Text;\n            btnNext.ForeColor = ColorTheme.Current.Text;\n\n            KeyPreview = true;\n            KeyUp += ScreenshotViewerForm_KeyUp;\n            MouseWheel += ScreenshotViewerForm_MouseWheel;\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        private void ScreenshotViewerForm_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (e.Delta < 0)\n                SetNextImage();\n            else if (e.Delta > 0)\n                SetPreviousImage();       \n        }\n\n        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)\n        {\n            //this is to set the focus of the left/right buttons\n            if (!msg.HWnd.Equals(this.Handle) && (keyData == Keys.Left || keyData == Keys.Right))\n            {\n                if (keyData == Keys.Right)\n                    btnNext.Focus();\n                else if (keyData == Keys.Left)\n                    btnPrev.Focus();\n\n                return true;\n            }\n\n            return base.ProcessCmdKey(ref msg, keyData);\n        }\n\n        private void ScreenshotViewerForm_KeyUp(object sender, KeyEventArgs e)\n        {\n            switch (e.KeyCode)\n            {\n                case Keys.Right:\n                    SetNextImage();\n                    break;\n                case Keys.Left:\n                    SetPreviousImage();\n                    break;\n                case Keys.Home:\n                    SetFirst();\n                    break;\n                case Keys.End:\n                    SetEnd();\n                    break;\n                default:\n                    break;\n            }\n        }\n\n        private void SetEnd()\n        {\n            if (m_images.Length > 0)\n                m_index = m_images.Length - 1;\n            SetImage();\n        }\n\n        private void SetFirst()\n        {\n            m_index = 0;\n            SetImage();\n        }\n\n        public void SetImageFileData(IDataSourceAdapter adapter, IGameFile gameFile, \n            string[] imagePaths, IList<IFileData> screenshots)\n        {\n            m_adapter = adapter;\n            m_gameFile = gameFile;\n            m_images = imagePaths;\n            m_files = screenshots;\n            statisticsView.DataSourceAdapter = adapter;\n        }\n\n        public void SetImage(string filename)\n        {\n            for (int i = 0; i < m_images.Length; i++)\n            {\n                if (m_images[i] == filename)\n                {\n                    m_index = i;\n                    SetImage();\n                    break;\n                }\n            }\n        }\n\n        private void SetImage()\n        {\n            SetSlideshow(false);\n\n            if (m_images.Length > 0)\n            {\n                Image image = pbMain.GetImage();\n                pbMain.SetImage(ImageExtensions.FromFileOrDefault(GetImageFilename()));\n                image?.Dispose();\n                Text = string.Format(\"Screenshot Viewer - {0}/{1}\", m_index + 1, m_images.Length);\n\n                SetUserDescription(GetFileData());\n            }\n        }\n\n        private void SetUserDescription(IFileData fileData)\n        {\n            if (string.IsNullOrEmpty(fileData.UserTitle) && string.IsNullOrEmpty(fileData.UserDescription) && string.IsNullOrEmpty(fileData.Map))\n            {\n                ShowImageUserData(false);\n                return;\n            }\n\n            ShowImageUserData(true);\n            lblTitle.Text = GetTitle(fileData);\n            lblDescription.Text = string.IsNullOrEmpty(fileData.UserDescription) ? string.Empty : fileData.UserDescription;\n\n            if (string.IsNullOrEmpty(fileData.Map))\n            {\n                statsControl.Visible = false;\n                statisticsView.Visible = false;\n                UpdateStatsHeights();\n                return;\n            }\n\n            statsControl.Visible = true;\n            statisticsView.Visible = true;\n            var stats = statisticsView.SetDataByMap(m_gameFile, fileData.Map);\n            statsControl.Visible = stats.Any();\n            statsControl.SetStatistics(m_gameFile, stats);\n            UpdateStatsHeights();\n        }\n\n        private string GetTitle(IFileData fileData)\n        {\n            string title = FileData.GetTitle(fileData);\n            return string.IsNullOrEmpty(title) ? \"N/A\" : fileData.UserTitle;\n        }\n\n        private void UpdateStatsHeights()\n        {\n            if (statsControl.Visible)\n                tblData.RowStyles[1].Height = 120;\n            else\n                tblData.RowStyles[1].Height = 0;\n\n            if (statisticsView.Visible)\n                tblData.RowStyles[2].Height = 200;\n            else\n                tblData.RowStyles[2].Height = 0;\n        }\n\n        private void ShowImageUserData(bool set)\n        {\n            if (set)\n                tblContainer.ColumnStyles[1].Width = 50;\n            else\n                tblContainer.ColumnStyles[1].Width = 0;\n        }\n\n        private string GetImageFilename()\n        {\n            return m_images[m_index];\n        }\n\n        private IFileData GetFileData()\n        {\n            return m_files[m_index];\n        }\n\n        private void btnPrev_Click(object sender, EventArgs e)\n        {\n            SetPreviousImage();\n        }\n\n        private void SetPreviousImage()\n        {\n            m_index = (m_images.Length + --m_index) % m_images.Length;\n            SetImage();\n        }\n\n        private void btnNext_Click(object sender, EventArgs e)\n        {\n            SetNextImage();\n        }\n\n        private void SetNextImage()\n        {\n            m_index = ++m_index % m_images.Length;\n            SetImage();\n        }\n\n        private void btnSave_Click(object sender, EventArgs e)\n        {\n            SaveFileDialog dialog = new SaveFileDialog();\n            string ext = Path.GetExtension(GetImageFilename());\n            if (!string.IsNullOrEmpty(ext))\n                dialog.Filter = string.Format(\"{0}|*{0}\", ext);\n\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                try\n                {\n                    File.Copy(GetImageFilename(), dialog.FileName, true);\n                }\n                catch\n                {\n                    MessageBox.Show(this, \"Unable to save file.\", \"Unable to Save\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n            }\n        }\n\n        private void btnSlideshow_Click(object sender, EventArgs e)\n        {\n            SetSlideshow(!m_slideshow);\n\n            if (m_slideshow)\n            {\n                Text = \"Slideshow\";\n                pbMain.SetImages(m_images.ToList(), m_index);\n            }\n            else\n            {\n                SetImage();\n            }\n        }\n\n        private void btnEdit_Click(object sender, EventArgs e)\n        {\n            if (!ScreenshotEditForm.ShowDialogAndUpdate(this, m_adapter, m_gameFile, GetFileData()))\n                return;\n\n            SetImage();\n        }\n\n        private void SetSlideshow(bool set)\n        {\n            ShowImageUserData(!set);\n            m_slideshow = set;\n\n            if (set)\n                btnSlideshow.BackColor = ColorTheme.Current.Highlight;\n            else\n                btnSlideshow.BackColor = ColorTheme.Current.Window;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/ScreenshotViewerForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>25</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/SettingsForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SettingsForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SettingsForm));\n            this.tblOuter = new DoomLauncher.TableLayoutPanelDB();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnSave = new System.Windows.Forms.Button();\n            this.tabControl = new DoomLauncher.CTabControl();\n            this.tabPageConfig = new System.Windows.Forms.TabPage();\n            this.tabPageDefault = new System.Windows.Forms.TabPage();\n            this.pictureBox1 = new System.Windows.Forms.PictureBox();\n            this.lblLaunchSettings = new System.Windows.Forms.Label();\n            this.cmbSkill = new System.Windows.Forms.ComboBox();\n            this.label4 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label1 = new System.Windows.Forms.Label();\n            this.cmbSourcePorts = new System.Windows.Forms.ComboBox();\n            this.cmbIwad = new System.Windows.Forms.ComboBox();\n            this.tabPageFileManagement = new System.Windows.Forms.TabPage();\n            this.pictureBox2 = new System.Windows.Forms.PictureBox();\n            this.tblFileOptions = new DoomLauncher.TableLayoutPanelDB();\n            this.label9 = new System.Windows.Forms.Label();\n            this.label8 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label5 = new System.Windows.Forms.Label();\n            this.label6 = new System.Windows.Forms.Label();\n            this.label7 = new System.Windows.Forms.Label();\n            this.cmbFileManagement = new System.Windows.Forms.ComboBox();\n            this.label10 = new System.Windows.Forms.Label();\n            this.tabPageView = new System.Windows.Forms.TabPage();\n            this.cmbTheme = new System.Windows.Forms.ComboBox();\n            this.label14 = new System.Windows.Forms.Label();\n            this.label13 = new System.Windows.Forms.Label();\n            this.chkListViews = new DoomLauncher.Controls.CheckBoxList();\n            this.pnlViewRestart = new System.Windows.Forms.Panel();\n            this.label12 = new System.Windows.Forms.Label();\n            this.label11 = new System.Windows.Forms.Label();\n            this.cmbViewType = new System.Windows.Forms.ComboBox();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblOuter.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.tabControl.SuspendLayout();\n            this.tabPageDefault.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\n            this.tabPageFileManagement.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();\n            this.tblFileOptions.SuspendLayout();\n            this.tabPageView.SuspendLayout();\n            this.pnlViewRestart.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblOuter\n            // \n            this.tblOuter.ColumnCount = 1;\n            this.tblOuter.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblOuter.Controls.Add(this.flowLayoutPanel1, 0, 2);\n            this.tblOuter.Controls.Add(this.tabControl, 0, 1);\n            this.tblOuter.Controls.Add(this.titleBar, 0, 0);\n            this.tblOuter.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblOuter.Location = new System.Drawing.Point(0, 0);\n            this.tblOuter.Margin = new System.Windows.Forms.Padding(4);\n            this.tblOuter.Name = \"tblOuter\";\n            this.tblOuter.RowCount = 3;\n            this.tblOuter.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblOuter.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblOuter.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblOuter.Size = new System.Drawing.Size(540, 413);\n            this.tblOuter.TabIndex = 0;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.btnCancel);\n            this.flowLayoutPanel1.Controls.Add(this.btnSave);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 374);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(540, 39);\n            this.flowLayoutPanel1.TabIndex = 0;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(436, 4);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(100, 28);\n            this.btnCancel.TabIndex = 1;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnSave\n            // \n            this.btnSave.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnSave.Location = new System.Drawing.Point(328, 4);\n            this.btnSave.Margin = new System.Windows.Forms.Padding(4);\n            this.btnSave.Name = \"btnSave\";\n            this.btnSave.Size = new System.Drawing.Size(100, 28);\n            this.btnSave.TabIndex = 0;\n            this.btnSave.Text = \"Save\";\n            this.btnSave.UseVisualStyleBackColor = true;\n            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);\n            // \n            // tabControl\n            // \n            this.tabControl.Controls.Add(this.tabPageConfig);\n            this.tabControl.Controls.Add(this.tabPageDefault);\n            this.tabControl.Controls.Add(this.tabPageFileManagement);\n            this.tabControl.Controls.Add(this.tabPageView);\n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;\n            this.tabControl.Location = new System.Drawing.Point(4, 36);\n            this.tabControl.Margin = new System.Windows.Forms.Padding(4);\n            this.tabControl.Multiline = true;\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(532, 334);\n            this.tabControl.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;\n            this.tabControl.TabIndex = 1;\n            // \n            // tabPageConfig\n            // \n            this.tabPageConfig.BackColor = System.Drawing.SystemColors.Control;\n            this.tabPageConfig.Location = new System.Drawing.Point(4, 29);\n            this.tabPageConfig.Margin = new System.Windows.Forms.Padding(4);\n            this.tabPageConfig.Name = \"tabPageConfig\";\n            this.tabPageConfig.Padding = new System.Windows.Forms.Padding(4);\n            this.tabPageConfig.Size = new System.Drawing.Size(524, 301);\n            this.tabPageConfig.TabIndex = 0;\n            this.tabPageConfig.Text = \"Configuration\";\n            // \n            // tabPageDefault\n            // \n            this.tabPageDefault.BackColor = System.Drawing.SystemColors.Control;\n            this.tabPageDefault.Controls.Add(this.pictureBox1);\n            this.tabPageDefault.Controls.Add(this.lblLaunchSettings);\n            this.tabPageDefault.Controls.Add(this.cmbSkill);\n            this.tabPageDefault.Controls.Add(this.label4);\n            this.tabPageDefault.Controls.Add(this.label2);\n            this.tabPageDefault.Controls.Add(this.label1);\n            this.tabPageDefault.Controls.Add(this.cmbSourcePorts);\n            this.tabPageDefault.Controls.Add(this.cmbIwad);\n            this.tabPageDefault.Location = new System.Drawing.Point(4, 29);\n            this.tabPageDefault.Margin = new System.Windows.Forms.Padding(0);\n            this.tabPageDefault.Name = \"tabPageDefault\";\n            this.tabPageDefault.Padding = new System.Windows.Forms.Padding(4);\n            this.tabPageDefault.Size = new System.Drawing.Size(524, 301);\n            this.tabPageDefault.TabIndex = 1;\n            this.tabPageDefault.Text = \"Launch Settings\";\n            // \n            // pictureBox1\n            // \n            this.pictureBox1.Image = global::DoomLauncher.Properties.Resources.bon2b;\n            this.pictureBox1.Location = new System.Drawing.Point(13, 124);\n            this.pictureBox1.Margin = new System.Windows.Forms.Padding(4);\n            this.pictureBox1.Name = \"pictureBox1\";\n            this.pictureBox1.Size = new System.Drawing.Size(28, 22);\n            this.pictureBox1.TabIndex = 16;\n            this.pictureBox1.TabStop = false;\n            // \n            // lblLaunchSettings\n            // \n            this.lblLaunchSettings.AutoSize = true;\n            this.lblLaunchSettings.Location = new System.Drawing.Point(49, 124);\n            this.lblLaunchSettings.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblLaunchSettings.Name = \"lblLaunchSettings\";\n            this.lblLaunchSettings.Size = new System.Drawing.Size(33, 16);\n            this.lblLaunchSettings.TabIndex = 15;\n            this.lblLaunchSettings.Text = \"Text\";\n            // \n            // cmbSkill\n            // \n            this.cmbSkill.DisplayMember = \"Name\";\n            this.cmbSkill.FormattingEnabled = true;\n            this.cmbSkill.Location = new System.Drawing.Point(64, 82);\n            this.cmbSkill.Margin = new System.Windows.Forms.Padding(4);\n            this.cmbSkill.Name = \"cmbSkill\";\n            this.cmbSkill.Size = new System.Drawing.Size(261, 24);\n            this.cmbSkill.TabIndex = 13;\n            // \n            // label4\n            // \n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(11, 86);\n            this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(32, 16);\n            this.label4.TabIndex = 14;\n            this.label4.Text = \"Skill\";\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(9, 53);\n            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(42, 16);\n            this.label2.TabIndex = 12;\n            this.label2.Text = \"IWAD\";\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(9, 20);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(31, 16);\n            this.label1.TabIndex = 11;\n            this.label1.Text = \"Port\";\n            // \n            // cmbSourcePorts\n            // \n            this.cmbSourcePorts.DisplayMember = \"Name\";\n            this.cmbSourcePorts.FormattingEnabled = true;\n            this.cmbSourcePorts.Location = new System.Drawing.Point(64, 16);\n            this.cmbSourcePorts.Margin = new System.Windows.Forms.Padding(4);\n            this.cmbSourcePorts.Name = \"cmbSourcePorts\";\n            this.cmbSourcePorts.Size = new System.Drawing.Size(261, 24);\n            this.cmbSourcePorts.TabIndex = 9;\n            this.cmbSourcePorts.ValueMember = \"SourcePortID\";\n            // \n            // cmbIwad\n            // \n            this.cmbIwad.DisplayMember = \"FileName\";\n            this.cmbIwad.FormattingEnabled = true;\n            this.cmbIwad.Location = new System.Drawing.Point(64, 49);\n            this.cmbIwad.Margin = new System.Windows.Forms.Padding(4);\n            this.cmbIwad.Name = \"cmbIwad\";\n            this.cmbIwad.Size = new System.Drawing.Size(261, 24);\n            this.cmbIwad.TabIndex = 10;\n            this.cmbIwad.ValueMember = \"IWadID\";\n            // \n            // tabPageFileManagement\n            // \n            this.tabPageFileManagement.BackColor = System.Drawing.SystemColors.Control;\n            this.tabPageFileManagement.Controls.Add(this.pictureBox2);\n            this.tabPageFileManagement.Controls.Add(this.tblFileOptions);\n            this.tabPageFileManagement.Controls.Add(this.cmbFileManagement);\n            this.tabPageFileManagement.Controls.Add(this.label10);\n            this.tabPageFileManagement.Location = new System.Drawing.Point(4, 29);\n            this.tabPageFileManagement.Margin = new System.Windows.Forms.Padding(4);\n            this.tabPageFileManagement.Name = \"tabPageFileManagement\";\n            this.tabPageFileManagement.Size = new System.Drawing.Size(524, 301);\n            this.tabPageFileManagement.TabIndex = 2;\n            this.tabPageFileManagement.Text = \"File Management\";\n            // \n            // pictureBox2\n            // \n            this.pictureBox2.Image = global::DoomLauncher.Properties.Resources.bon2b;\n            this.pictureBox2.Location = new System.Drawing.Point(19, 217);\n            this.pictureBox2.Margin = new System.Windows.Forms.Padding(4);\n            this.pictureBox2.Name = \"pictureBox2\";\n            this.pictureBox2.Size = new System.Drawing.Size(28, 22);\n            this.pictureBox2.TabIndex = 20;\n            this.pictureBox2.TabStop = false;\n            // \n            // tblFileOptions\n            // \n            this.tblFileOptions.ColumnCount = 2;\n            this.tblFileOptions.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 120F));\n            this.tblFileOptions.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblFileOptions.Controls.Add(this.label9, 1, 2);\n            this.tblFileOptions.Controls.Add(this.label8, 1, 1);\n            this.tblFileOptions.Controls.Add(this.label3, 0, 0);\n            this.tblFileOptions.Controls.Add(this.label5, 0, 1);\n            this.tblFileOptions.Controls.Add(this.label6, 0, 2);\n            this.tblFileOptions.Controls.Add(this.label7, 1, 0);\n            this.tblFileOptions.Location = new System.Drawing.Point(19, 68);\n            this.tblFileOptions.Margin = new System.Windows.Forms.Padding(4);\n            this.tblFileOptions.Name = \"tblFileOptions\";\n            this.tblFileOptions.RowCount = 4;\n            this.tblFileOptions.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblFileOptions.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblFileOptions.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblFileOptions.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 10F));\n            this.tblFileOptions.Size = new System.Drawing.Size(488, 142);\n            this.tblFileOptions.TabIndex = 19;\n            // \n            // label9\n            // \n            this.label9.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label9.AutoSize = true;\n            this.label9.Location = new System.Drawing.Point(124, 89);\n            this.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label9.Name = \"label9\";\n            this.label9.Size = new System.Drawing.Size(266, 16);\n            this.label9.TabIndex = 5;\n            this.label9.Text = \"Prompted to choose when file(s) are added.\";\n            // \n            // label8\n            // \n            this.label8.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label8.AutoSize = true;\n            this.label8.Location = new System.Drawing.Point(124, 42);\n            this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label8.Name = \"label8\";\n            this.label8.Size = new System.Drawing.Size(360, 32);\n            this.label8.TabIndex = 4;\n            this.label8.Text = \"Files are referenced by their original path and not managed by Doom Launcher.\";\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.label3.Location = new System.Drawing.Point(4, 11);\n            this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(74, 17);\n            this.label3.TabIndex = 0;\n            this.label3.Text = \"Managed\";\n            // \n            // label5\n            // \n            this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label5.AutoSize = true;\n            this.label5.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.label5.Location = new System.Drawing.Point(4, 50);\n            this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(94, 17);\n            this.label5.TabIndex = 1;\n            this.label5.Text = \"Unmanaged\";\n            // \n            // label6\n            // \n            this.label6.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label6.AutoSize = true;\n            this.label6.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.label6.Location = new System.Drawing.Point(4, 89);\n            this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(59, 17);\n            this.label6.TabIndex = 2;\n            this.label6.Text = \"Prompt\";\n            // \n            // label7\n            // \n            this.label7.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label7.AutoSize = true;\n            this.label7.Location = new System.Drawing.Point(124, 3);\n            this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label7.Name = \"label7\";\n            this.label7.Size = new System.Drawing.Size(330, 32);\n            this.label7.TabIndex = 3;\n            this.label7.Text = \"Doom Launcher manages and compresses files in the GameFiles directory for you.\";\n            // \n            // cmbFileManagement\n            // \n            this.cmbFileManagement.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbFileManagement.FormattingEnabled = true;\n            this.cmbFileManagement.Location = new System.Drawing.Point(19, 17);\n            this.cmbFileManagement.Margin = new System.Windows.Forms.Padding(4);\n            this.cmbFileManagement.Name = \"cmbFileManagement\";\n            this.cmbFileManagement.Size = new System.Drawing.Size(261, 24);\n            this.cmbFileManagement.TabIndex = 10;\n            // \n            // label10\n            // \n            this.label10.AutoSize = true;\n            this.label10.Location = new System.Drawing.Point(55, 220);\n            this.label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label10.Name = \"label10\";\n            this.label10.Size = new System.Drawing.Size(359, 16);\n            this.label10.TabIndex = 6;\n            this.label10.Text = \"Downloaded files are always managed by Doom Launcher.\";\n            // \n            // tabPageView\n            // \n            this.tabPageView.BackColor = System.Drawing.SystemColors.Control;\n            this.tabPageView.Controls.Add(this.cmbTheme);\n            this.tabPageView.Controls.Add(this.label14);\n            this.tabPageView.Controls.Add(this.label13);\n            this.tabPageView.Controls.Add(this.chkListViews);\n            this.tabPageView.Controls.Add(this.pnlViewRestart);\n            this.tabPageView.Controls.Add(this.label11);\n            this.tabPageView.Controls.Add(this.cmbViewType);\n            this.tabPageView.Location = new System.Drawing.Point(4, 29);\n            this.tabPageView.Margin = new System.Windows.Forms.Padding(4);\n            this.tabPageView.Name = \"tabPageView\";\n            this.tabPageView.Size = new System.Drawing.Size(524, 301);\n            this.tabPageView.TabIndex = 3;\n            this.tabPageView.Text = \"View\";\n            // \n            // cmbTheme\n            // \n            this.cmbTheme.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbTheme.FormattingEnabled = true;\n            this.cmbTheme.Location = new System.Drawing.Point(120, 17);\n            this.cmbTheme.Margin = new System.Windows.Forms.Padding(4);\n            this.cmbTheme.Name = \"cmbTheme\";\n            this.cmbTheme.Size = new System.Drawing.Size(261, 24);\n            this.cmbTheme.TabIndex = 17;\n            this.cmbTheme.SelectedIndexChanged += new System.EventHandler(this.cmbTheme_SelectedIndexChanged);\n            // \n            // label14\n            // \n            this.label14.AutoSize = true;\n            this.label14.Location = new System.Drawing.Point(10, 20);\n            this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label14.Name = \"label14\";\n            this.label14.Size = new System.Drawing.Size(50, 16);\n            this.label14.TabIndex = 16;\n            this.label14.Text = \"Theme\";\n            // \n            // label13\n            // \n            this.label13.AutoSize = true;\n            this.label13.Location = new System.Drawing.Point(10, 100);\n            this.label13.Name = \"label13\";\n            this.label13.Size = new System.Drawing.Size(87, 16);\n            this.label13.TabIndex = 15;\n            this.label13.Text = \"Visible Views\";\n            // \n            // chkListViews\n            // \n            this.chkListViews.Location = new System.Drawing.Point(13, 119);\n            this.chkListViews.Name = \"chkListViews\";\n            this.chkListViews.Size = new System.Drawing.Size(374, 116);\n            this.chkListViews.TabIndex = 14;\n            // \n            // pnlViewRestart\n            // \n            this.pnlViewRestart.Controls.Add(this.label12);\n            this.pnlViewRestart.Location = new System.Drawing.Point(1, 222);\n            this.pnlViewRestart.Location = new System.Drawing.Point(1, 235);\n            this.pnlViewRestart.Margin = new System.Windows.Forms.Padding(4);\n            this.pnlViewRestart.Name = \"pnlViewRestart\";\n            this.pnlViewRestart.Size = new System.Drawing.Size(519, 75);\n            this.pnlViewRestart.TabIndex = 13;\n            this.pnlViewRestart.Visible = false;\n            // \n            // label12\n            // \n            this.label12.AutoSize = true;\n            this.label12.Location = new System.Drawing.Point(63, 22);\n            this.label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label12.Name = \"label12\";\n            this.label12.Size = new System.Drawing.Size(305, 16);\n            this.label12.TabIndex = 0;\n            this.label12.Text = \"Changing view settings will restart Doom Launcher.\";\n            // \n            // label11\n            // \n            this.label11.AutoSize = true;\n            this.label11.Location = new System.Drawing.Point(10, 54);\n            this.label11.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label11.Name = \"label11\";\n            this.label11.Size = new System.Drawing.Size(71, 16);\n            this.label11.TabIndex = 12;\n            this.label11.Text = \"View Type\";\n            // \n            // cmbViewType\n            // \n            this.cmbViewType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbViewType.FormattingEnabled = true;\n            this.cmbViewType.Location = new System.Drawing.Point(120, 51);\n            this.cmbViewType.Margin = new System.Windows.Forms.Padding(4);\n            this.cmbViewType.Name = \"cmbViewType\";\n            this.cmbViewType.Size = new System.Drawing.Size(261, 24);\n            this.cmbViewType.TabIndex = 11;\n            this.cmbViewType.SelectedIndexChanged += new System.EventHandler(this.CmbViewType_SelectedIndexChanged);\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(540, 32);\n            this.titleBar.TabIndex = 2;\n            this.titleBar.Title = \"Settings\";\n            // \n            // SettingsForm\n            // \n            this.AcceptButton = this.btnSave;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(540, 413);\n            this.Controls.Add(this.tblOuter);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.Name = \"SettingsForm\";\n            this.Text = \"Settings\";\n            this.tblOuter.ResumeLayout(false);\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.tabControl.ResumeLayout(false);\n            this.tabPageDefault.ResumeLayout(false);\n            this.tabPageDefault.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\n            this.tabPageFileManagement.ResumeLayout(false);\n            this.tabPageFileManagement.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();\n            this.tblFileOptions.ResumeLayout(false);\n            this.tblFileOptions.PerformLayout();\n            this.tabPageView.ResumeLayout(false);\n            this.tabPageView.PerformLayout();\n            this.pnlViewRestart.ResumeLayout(false);\n            this.pnlViewRestart.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private DoomLauncher.TableLayoutPanelDB tblOuter;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnSave;\n        private CTabControl tabControl;\n        private System.Windows.Forms.TabPage tabPageConfig;\n        private System.Windows.Forms.TabPage tabPageDefault;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.ComboBox cmbSourcePorts;\n        private System.Windows.Forms.ComboBox cmbIwad;\n        private System.Windows.Forms.ComboBox cmbSkill;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.PictureBox pictureBox1;\n        private System.Windows.Forms.Label lblLaunchSettings;\n        private System.Windows.Forms.TabPage tabPageFileManagement;\n        private System.Windows.Forms.ComboBox cmbFileManagement;\n        private DoomLauncher.TableLayoutPanelDB tblFileOptions;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.Label label8;\n        private System.Windows.Forms.Label label9;\n        private System.Windows.Forms.Label label10;\n        private System.Windows.Forms.PictureBox pictureBox2;\n        private System.Windows.Forms.TabPage tabPageView;\n        private System.Windows.Forms.Label label11;\n        private System.Windows.Forms.ComboBox cmbViewType;\n        private System.Windows.Forms.Panel pnlViewRestart;\n        private System.Windows.Forms.Label label12;\n        private System.Windows.Forms.Label label13;\n        private Controls.CheckBoxList chkListViews;\n        private Controls.TitleBarControl titleBar;\n        private System.Windows.Forms.ComboBox cmbTheme;\n        private System.Windows.Forms.Label label14;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/SettingsForm.cs",
    "content": "﻿using DoomLauncher.Config;\nusing DoomLauncher.Controls;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Forms;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class SettingsForm : Form\n    {\n        private const int TrackBarStep = 20;\n        private readonly List<Tuple<IConfigurationData, object>> m_configValues = new List<Tuple<IConfigurationData, object>>();\n        private TextBox m_gameFileDirectory, m_screenshotDirectories;\n\n        private readonly Dictionary<TrackBar, Label> m_trackBarToLabel = new Dictionary<TrackBar, Label>();\n\n        private readonly IDataSourceAdapter m_adapter;\n        private readonly AppConfiguration m_appConfig;\n        private Padding m_controlMargin = new Padding(4, 0, 0, 0);\n\n        private static readonly int TextBoxWidth = 190;\n        private static readonly int FullControlWidth = 270;\n\n        public SettingsForm(IDataSourceAdapter adapter, AppConfiguration appConfig)\n        {\n            InitializeComponent();\n\n            lblLaunchSettings.Text = string.Concat(\"These are the default settings for a game file\", Environment.NewLine, \n                \" that does not have a specific configuration saved.\");\n\n            m_adapter = adapter;\n            m_appConfig = appConfig;\n\n            pnlViewRestart.Paint += PnlViewRestart_Paint;\n\n            PopulateDefaultSettings(m_adapter);\n            PopulateConfiguration();\n            chkListViews.BorderStyle = BorderStyle.FixedSingle;\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n            PopulateViews();\n        }\n\n        private void PopulateViews()\n        {\n            HashSet<string> visibleViews = DataCache.Instance.AppConfiguration.VisibleViews;\n            chkListViews.SetItems(TabKeys.KeyNames.Except(new string[] { TabKeys.LocalKey }));\n            foreach (var view in visibleViews)\n                chkListViews.SetChecked(view, true);\n            chkListViews.ItemCheck += chkListViews_ItemCheck;\n        }\n\n        private void PnlViewRestart_Paint(object sender, PaintEventArgs e)\n        {\n            e.Graphics.DrawIcon(SystemIcons.Warning, 8, 8);\n        }\n\n        public void SetToLaunchSettingsTab()\n        {\n            tabControl.SelectedIndex = 1;\n        }\n\n        public void SetCancelAllowed(bool set)\n        {\n            btnCancel.Visible = set;\n            titleBar.SetControlBox(set);\n        }\n\n        private int GetDefaultControlWidth()\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            return dpiScale.ScaleIntX(FullControlWidth);\n        }\n\n        private void PopulateConfiguration()\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            m_controlMargin = new Padding(dpiScale.ScaleIntX(4), 0, 0, 0);\n            IEnumerable<IConfigurationData> configItems = m_adapter.GetConfiguration().Where(x => x.UserCanModify);\n\n            TableLayoutPanel tblMain = new TableLayoutPanel\n            {\n                Dock = DockStyle.Top,\n                CellBorderStyle = TableLayoutPanelCellBorderStyle.Single,\n            };\n\n            int height = dpiScale.ScaleIntY(8);\n            int labelWidth = dpiScale.ScaleIntX(134);\n            tblMain.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, labelWidth));\n\n            int height32 = dpiScale.ScaleIntY(32);\n            int rowPadding = dpiScale.ScaleIntX(1);\n\n            foreach (IConfigurationData config in configItems)\n            {\n                GrowLabel lbl = new GrowLabel\n                {\n                    Anchor = AnchorStyles.Left,\n                    Text = AddSpaceBetweenWords(config.Name),\n                    Width = labelWidth\n                };\n\n                tblMain.RowStyles.Add(new RowStyle(SizeType.Absolute, lbl.Height < height32 ? height32 : lbl.Height));\n                tblMain.Controls.Add(lbl, 0, tblMain.RowStyles.Count - 1);\n\n                if (!string.IsNullOrEmpty(config.AvailableValues))\n                    HandleComboBox(tblMain, config);\n                else if (config.Name == AppConfiguration.ScreenshotPreviewSizeName)\n                    AddTrackBar(tblMain, config, dpiScale);\n                else if (config.Name == AppConfiguration.TileImageSizeName)\n                    AddTrackBar(tblMain, config, dpiScale);\n                else\n                    HandleTextBox(tblMain, config);\n\n                height += height32 + rowPadding;\n            }\n\n            tblMain.RowStyles.Add(new RowStyle(SizeType.Percent, 100));\n            tblMain.Height = height + dpiScale.ScaleIntY(8);\n\n            tabControl.TabPages[0].Controls.Add(tblMain);\n            Height = tblMain.Height + dpiScale.ScaleIntY(108+32);\n            Width = dpiScale.ScaleIntX(452);\n        }\n\n        private void HandleTextBox(TableLayoutPanel tblMain, IConfigurationData config)\n        {\n            TextBox txt = new TextBox\n            {\n                Anchor = AnchorStyles.Left,\n                Text = config.Value,\n                Width = GetDefaultControlWidth(),\n                Margin = m_controlMargin\n            };\n            m_configValues.Add(new Tuple<IConfigurationData, object>(config, txt));\n\n            if (config.Name == \"GameFileDirectory\")\n                HandleGameFileDirectory(tblMain, txt);\n            else if (config.Name == \"ScreenshotCaptureDirectories\")\n                HandleScreenshotCaptureDirectories(tblMain, txt);\n            else\n                tblMain.Controls.Add(txt, 1, tblMain.RowStyles.Count - 1);\n        }\n\n        private void HandleComboBox(TableLayoutPanel tblMain, IConfigurationData config)\n        {\n            ComboBox cmb = new ComboBox\n            {\n                Anchor = AnchorStyles.Left,\n                Width = GetDefaultControlWidth(),\n                Margin = m_controlMargin\n            };\n\n            string[] items = Util.SplitString(config.AvailableValues);\n            List<Tuple<string, string>> cmbDataSource = new List<Tuple<string, string>>();\n\n            for (int i = 0; i < items.Length - 1; i += 2)\n                cmbDataSource.Add(new Tuple<string, string>(items[i], items[i + 1]));\n\n            cmb.ValueMember = \"Item1\";\n            cmb.DataSource = cmbDataSource;\n            cmb.BindingContext = new BindingContext();\n            cmb.SelectedItem = cmbDataSource.FirstOrDefault(x => x.Item2 == config.Value);\n\n            tblMain.Controls.Add(cmb, 1, tblMain.RowStyles.Count - 1);\n            m_configValues.Add(new Tuple<IConfigurationData, object>(config, cmb));\n        }\n\n        private void AddTrackBar(TableLayoutPanel tblMain, IConfigurationData config, DpiScale dpiScale)\n        {\n            var label = new Label\n            {\n                Width = dpiScale.ScaleIntX(68),\n                Height = dpiScale.ScaleIntY(16),\n                Margin = new Padding(dpiScale.ScaleIntX(0), dpiScale.ScaleIntY(8), 0, 0)\n            };\n\n            var trackbar = new TrackBar\n            {\n                Minimum = 100,\n                Maximum = 600,\n                LargeChange = TrackBarStep,\n                SmallChange = TrackBarStep,\n                TickFrequency = TrackBarStep,\n                Value = Math.Max(100, Convert.ToInt32(config.Value)),\n                Width = dpiScale.ScaleIntX(200)\n            };\n            trackbar.ValueChanged += Trk_ValueChanged;\n\n            FlowLayoutPanel flp = new FlowLayoutPanel\n            {\n                Dock = DockStyle.Fill\n            };\n\n            flp.Controls.Add(trackbar);\n            flp.Controls.Add(label);\n\n            m_trackBarToLabel[trackbar] = label;\n\n            tblMain.Controls.Add(flp, 1, tblMain.RowStyles.Count - 1);\n            m_configValues.Add(new Tuple<IConfigurationData, object>(config, trackbar));\n\n            UpdateTrackBar(trackbar);\n        }\n\n        private void Trk_ValueChanged(object sender, EventArgs e)\n        {\n            UpdateTrackBar((TrackBar)sender);\n        }\n\n        private void UpdateTrackBar(TrackBar trackBar)\n        {\n            trackBar.ValueChanged -= Trk_ValueChanged;\n            int remainder = trackBar.Value % TrackBarStep;\n            int amount = trackBar.Value / TrackBarStep;\n            trackBar.Value = (amount * TrackBarStep) + (remainder > TrackBarStep / 2 ? TrackBarStep : 0);\n            trackBar.ValueChanged += Trk_ValueChanged;\n\n            if (trackBar == null || !m_trackBarToLabel.TryGetValue(trackBar, out var label))\n                return;\n\n            label.Text = string.Concat(\"Width: \", trackBar.Value);\n        }\n\n        private void HandleScreenshotCaptureDirectories(TableLayoutPanel tblMain, TextBox txt)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            m_screenshotDirectories = txt;\n            m_screenshotDirectories.Width = dpiScale.ScaleIntX(TextBoxWidth);\n            m_screenshotDirectories.Enabled = false;\n            FlowLayoutPanel flp = new FlowLayoutPanel\n            {\n                Dock = DockStyle.Fill,\n                Margin = new Padding(0)\n            };\n            flp.Controls.Add(txt);\n\n            Button changeButton = new Button\n            {\n                Text = \"Change...\"\n            };\n\n            changeButton.Width = dpiScale.ScaleIntX(changeButton.Width);\n            changeButton.Height = dpiScale.ScaleIntY(changeButton.Height);\n            changeButton.Click += ChangeButton_Click;\n            flp.Controls.Add(changeButton);\n            tblMain.Controls.Add(flp, 1, tblMain.RowStyles.Count - 1);\n        }\n\n        private void HandleGameFileDirectory(TableLayoutPanel tblMain, TextBox txt)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            m_gameFileDirectory = txt;\n            m_gameFileDirectory.Width = dpiScale.ScaleIntX(TextBoxWidth);\n            FlowLayoutPanel flp = new FlowLayoutPanel\n            {\n                Dock = DockStyle.Fill,\n                Margin = new Padding(0)\n            };\n            flp.Controls.Add(m_gameFileDirectory);\n\n            Button browseButton = new Button\n            {\n                Text = \"Browse...\"\n            };\n\n            browseButton.Width = dpiScale.ScaleIntX(browseButton.Width);\n            browseButton.Height = dpiScale.ScaleIntY(browseButton.Height);\n            browseButton.Click += browseButton_Click;\n            flp.Controls.Add(browseButton);\n            tblMain.Controls.Add(flp, 1, tblMain.RowStyles.Count - 1);\n        }\n\n        void browseButton_Click(object sender, EventArgs e)\n        {\n            LauncherPath path = new LauncherPath(m_gameFileDirectory.Text);\n            FolderBrowserDialog dialog = new FolderBrowserDialog\n            {\n                SelectedPath = path.GetFullPath()\n            };\n\n            if (dialog.ShowDialog(this) == DialogResult.OK)\n            {\n                path = new LauncherPath(dialog.SelectedPath);\n                m_gameFileDirectory.Text = path.GetPossiblyRelativePath();\n            }\n        }\n\n        private void ChangeButton_Click(object sender, EventArgs e)\n        {\n            DirectoriesForm form = new DirectoriesForm();\n            form.SetDirectories(Util.SplitString(m_screenshotDirectories.Text));\n            form.StartPosition = FormStartPosition.CenterParent;\n\n            if (form.ShowDialog(this) == DialogResult.OK)\n                m_screenshotDirectories.Text = string.Join(\";\", form.GetDirectories());\n        }\n\n        private void PopulateDefaultSettings(IDataSourceAdapter adapter)\n        {\n            cmbSourcePorts.DataSource = adapter.GetSourcePorts();\n            cmbIwad.DataSource = Util.GetIWadsDataSource(adapter);\n            cmbSkill.DataSource = Util.GetSkills();\n            cmbFileManagement.DataSource = Enum.GetValues(typeof(FileManagement));\n            cmbViewType.DataSource = new [] { \"Grid\", \"Tile Large\", \"Tile Small\" };\n            cmbTheme.DataSource = new [] { \"Default\", \"Dark\", \"System\" };\n\n            cmbSourcePorts.SelectedValue = m_appConfig.GetTypedConfigValue(ConfigType.DefaultSourcePort, typeof(int));\n            cmbIwad.SelectedValue = m_appConfig.GetTypedConfigValue(ConfigType.DefaultIWad, typeof(int));\n            cmbSkill.SelectedItem = m_appConfig.GetTypedConfigValue(ConfigType.DefaultSkill, typeof(string));\n            cmbFileManagement.SelectedIndex = (int)Enum.Parse(typeof(FileManagement), (string)m_appConfig.GetTypedConfigValue(ConfigType.FileManagement, typeof(string)));\n            cmbViewType.SelectedIndex = (int)Enum.Parse(typeof(GameFileViewType), (string)m_appConfig.GetTypedConfigValue(ConfigType.GameFileViewType, typeof(string)));\n            cmbTheme.SelectedIndex = (int)Enum.Parse(typeof(ColorThemeType), (string)m_appConfig.GetTypedConfigValue(ConfigType.ColorThemeType, typeof(string)));\n        }\n\n        private void btnSave_Click(object sender, EventArgs e)\n        {\n            foreach (Tuple<IConfigurationData, object> config in m_configValues)\n            {\n                config.Item1.Value = GetValue(config.Item1, config.Item2);\n                m_adapter.UpdateConfiguration(config.Item1);\n            }\n\n            HandleLaunchSettings();\n            Close();\n        }\n\n        private void HandleLaunchSettings()\n        { \n            string[] configNames = new string[]\n            {  \n                ConfigType.DefaultSourcePort.ToString(\"g\"), \n                ConfigType.DefaultIWad.ToString(\"g\"), \n                ConfigType.DefaultSkill.ToString(\"g\"),\n                ConfigType.FileManagement.ToString(\"g\"),\n                ConfigType.GameFileViewType.ToString(\"g\"),\n                ConfigType.VisibleViews.ToString(\"g\"),\n                ConfigType.ColorThemeType.ToString(\"g\"),\n            };\n            string[] configValues = new string[]\n            {\n                cmbSourcePorts.SelectedItem == null ? null : ((ISourcePortData)cmbSourcePorts.SelectedItem).SourcePortID.ToString(),\n                cmbIwad.SelectedItem == null ? null : ((IIWadData)cmbIwad.SelectedItem).IWadID.ToString(),\n                cmbSkill.SelectedItem?.ToString(),\n                cmbFileManagement.SelectedValue.ToString(),\n                ((GameFileViewType)cmbViewType.SelectedIndex).ToString(),\n                string.Join(\";\", chkListViews.GetCheckedItems()),\n                ((ColorThemeType)cmbTheme.SelectedIndex).ToString(),\n            };\n\n            IEnumerable<IConfigurationData> configuration = m_adapter.GetConfiguration().Where(x => configNames.Contains(x.Name));\n\n            for (int i = 0; i < configNames.Length; i++)\n            {\n                string configName = configNames[i];\n                string configValue = configValues[i];\n                IConfigurationData config = configuration.FirstOrDefault(x => x.Name == configName);\n\n                if (configValue != null)\n                {\n                    if (config == null)\n                    {\n                        config = CreateConfig(configName, configValue);\n                        m_adapter.InsertConfiguration(config);\n                    }\n                    else\n                    {\n                        config.Value = configValue;\n                        m_adapter.UpdateConfiguration(config);\n                    }\n                }\n            }\n        }\n\n        private static IConfigurationData CreateConfig(string configName, string configValue)\n        {\n            return new ConfigurationData\n            {\n                Name = configName,\n                Value = configValue,\n                UserCanModify = false,\n                AvailableValues = string.Empty\n            };\n        }\n\n        private string GetValue(IConfigurationData config, object value)\n        {\n            if (!string.IsNullOrEmpty(config.AvailableValues) && value is ComboBox cmb && cmb.SelectedItem != null)\n            {\n                Tuple<string, string> item = cmb.SelectedItem as Tuple<string, string>;\n                return item.Item2;\n            }\n            else if (value is TrackBar trk)\n            {\n                return trk.Value.ToString();\n            }\n            else if (value is TextBox txt)\n            {\n                return txt.Text;\n            }\n\n            return string.Empty;\n        }\n\n        private void CmbViewType_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            pnlViewRestart.Visible = GameFileViewFactory.IsBaseViewTypeChange(m_appConfig.GameFileViewType, (GameFileViewType)cmbViewType.SelectedIndex);         \n        }\n\n        private void cmbTheme_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            pnlViewRestart.Visible = true;\n        }\n\n        private void chkListViews_ItemCheck(object sender, CheckListBoxEventArgs e)\n        {\n            pnlViewRestart.Visible = true;\n        }\n\n        private static string AddSpaceBetweenWords(string item)\n        {\n            for (int i = 0; i < item.Length; i++)\n            {\n                if (char.IsUpper(item[i]) && i != 0)\n                {\n                    item = item.Insert(i, \" \");\n                    i++;\n                }\n            }\n\n            return item;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/SettingsForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/SimpleFileSelectForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SimpleFileSelectForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SimpleFileSelectForm));\n            this.btnOK = new System.Windows.Forms.Button();\n            this.lstFiles = new System.Windows.Forms.ListBox();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.tblMain.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(270, 311);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(100, 28);\n            this.btnOK.TabIndex = 1;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            // \n            // lstFiles\n            // \n            this.lstFiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lstFiles.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lstFiles.FormattingEnabled = true;\n            this.lstFiles.ItemHeight = 20;\n            this.lstFiles.Location = new System.Drawing.Point(4, 4);\n            this.lstFiles.Margin = new System.Windows.Forms.Padding(4);\n            this.lstFiles.Name = \"lstFiles\";\n            this.lstFiles.Size = new System.Drawing.Size(366, 297);\n            this.lstFiles.TabIndex = 2;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Controls.Add(this.btnOK, 0, 1);\n            this.tblMain.Controls.Add(this.lstFiles, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.Size = new System.Drawing.Size(374, 345);\n            this.tblMain.TabIndex = 3;\n            // \n            // SimpleFileSelectForm\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(374, 345);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.Name = \"SimpleFileSelectForm\";\n            this.Text = \"Select File\";\n            this.tblMain.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.ListBox lstFiles;\n        private TableLayoutPanelDB tblMain;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/SimpleFileSelectForm.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class SimpleFileSelectForm : Form\n    {\n        public SimpleFileSelectForm()\n        {\n            InitializeComponent();\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public void Initialize(IEnumerable<string> files)\n        {\n            foreach (string file in files)\n                lstFiles.Items.Add(file);\n\n            if (files.Count() > 0)\n                lstFiles.SelectedItem = files.First();\n        }\n\n        public string SelectedFile\n        {\n            get\n            {\n                if (lstFiles.SelectedItems.Count > 0)\n                    return (string)lstFiles.SelectedItems[0];\n\n                return null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/SimpleFileSelectForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/SourcePortEditForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SourcePortEditForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SourcePortEditForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.button1 = new System.Windows.Forms.Button();\n            this.btnSave = new System.Windows.Forms.Button();\n            this.groupBox2 = new System.Windows.Forms.GroupBox();\n            this.sourcePortEdit1 = new DoomLauncher.SourcePortEdit();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.grpAdditionalFiles = new System.Windows.Forms.GroupBox();\n            this.lblInfo = new System.Windows.Forms.Label();\n            this.pbInfo = new System.Windows.Forms.PictureBox();\n            this.ctrlFiles = new DoomLauncher.FilesCtrl();\n            this.flpInfo = new System.Windows.Forms.FlowLayoutPanel();\n            this.pbInfo2 = new System.Windows.Forms.PictureBox();\n            this.table2 = new DoomLauncher.TableLayoutPanelDB();\n            this.lblReplacementInfo = new System.Windows.Forms.Label();\n            this.tblReplacementVars = new DoomLauncher.TableLayoutPanelDB();\n            this.label4 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label1 = new System.Windows.Forms.Label();\n            this.tblMain.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.groupBox2.SuspendLayout();\n            this.grpAdditionalFiles.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).BeginInit();\n            this.flpInfo.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo2)).BeginInit();\n            this.table2.SuspendLayout();\n            this.tblReplacementVars.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flowLayoutPanel1, 0, 4);\n            this.tblMain.Controls.Add(this.groupBox2, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Controls.Add(this.grpAdditionalFiles, 0, 3);\n            this.tblMain.Controls.Add(this.flpInfo, 0, 2);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 5;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 305F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 105F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 308F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.Size = new System.Drawing.Size(534, 822);\n            this.tblMain.TabIndex = 2;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.button1);\n            this.flowLayoutPanel1.Controls.Add(this.btnSave);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 763);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0, 5, 0, 0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(534, 59);\n            this.flowLayoutPanel1.TabIndex = 1;\n            // \n            // button1\n            // \n            this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.button1.Location = new System.Drawing.Point(418, 5);\n            this.button1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.button1.Name = \"button1\";\n            this.button1.Size = new System.Drawing.Size(112, 35);\n            this.button1.TabIndex = 1;\n            this.button1.Text = \"Cancel\";\n            this.button1.UseVisualStyleBackColor = true;\n            // \n            // btnSave\n            // \n            this.btnSave.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnSave.Location = new System.Drawing.Point(298, 5);\n            this.btnSave.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnSave.Name = \"btnSave\";\n            this.btnSave.Size = new System.Drawing.Size(112, 35);\n            this.btnSave.TabIndex = 0;\n            this.btnSave.Text = \"Save\";\n            this.btnSave.UseVisualStyleBackColor = true;\n            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);\n            // \n            // groupBox2\n            // \n            this.groupBox2.Controls.Add(this.sourcePortEdit1);\n            this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.groupBox2.Location = new System.Drawing.Point(4, 45);\n            this.groupBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.groupBox2.Name = \"groupBox2\";\n            this.groupBox2.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.groupBox2.Size = new System.Drawing.Size(526, 295);\n            this.groupBox2.TabIndex = 4;\n            this.groupBox2.TabStop = false;\n            this.groupBox2.Text = \"Properties\";\n            // \n            // sourcePortEdit1\n            // \n            this.sourcePortEdit1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.sourcePortEdit1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.sourcePortEdit1.ForeColor = System.Drawing.Color.White;\n            this.sourcePortEdit1.Location = new System.Drawing.Point(4, 24);\n            this.sourcePortEdit1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);\n            this.sourcePortEdit1.Name = \"sourcePortEdit1\";\n            this.sourcePortEdit1.Size = new System.Drawing.Size(518, 266);\n            this.sourcePortEdit1.TabIndex = 0;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(534, 40);\n            this.titleBar.TabIndex = 5;\n            this.titleBar.Title = \"Source Port\";\n            // \n            // grpAdditionalFiles\n            // \n            this.grpAdditionalFiles.Controls.Add(this.lblInfo);\n            this.grpAdditionalFiles.Controls.Add(this.pbInfo);\n            this.grpAdditionalFiles.Controls.Add(this.ctrlFiles);\n            this.grpAdditionalFiles.Location = new System.Drawing.Point(4, 455);\n            this.grpAdditionalFiles.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.grpAdditionalFiles.Name = \"grpAdditionalFiles\";\n            this.grpAdditionalFiles.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.grpAdditionalFiles.Size = new System.Drawing.Size(525, 298);\n            this.grpAdditionalFiles.TabIndex = 3;\n            this.grpAdditionalFiles.TabStop = false;\n            this.grpAdditionalFiles.Text = \"Additional Files\";\n            // \n            // lblInfo\n            // \n            this.lblInfo.AutoSize = true;\n            this.lblInfo.Location = new System.Drawing.Point(46, 29);\n            this.lblInfo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblInfo.Name = \"lblInfo\";\n            this.lblInfo.Size = new System.Drawing.Size(42, 20);\n            this.lblInfo.TabIndex = 23;\n            this.lblInfo.Text = \"label\";\n            // \n            // pbInfo\n            // \n            this.pbInfo.Location = new System.Drawing.Point(14, 29);\n            this.pbInfo.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.pbInfo.Name = \"pbInfo\";\n            this.pbInfo.Size = new System.Drawing.Size(24, 25);\n            this.pbInfo.TabIndex = 22;\n            this.pbInfo.TabStop = false;\n            // \n            // ctrlFiles\n            // \n            this.ctrlFiles.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.ctrlFiles.ForeColor = System.Drawing.Color.White;\n            this.ctrlFiles.Location = new System.Drawing.Point(14, 79);\n            this.ctrlFiles.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);\n            this.ctrlFiles.Name = \"ctrlFiles\";\n            this.ctrlFiles.Size = new System.Drawing.Size(498, 211);\n            this.ctrlFiles.TabIndex = 21;\n            // \n            // flpInfo\n            // \n            this.flpInfo.Controls.Add(this.pbInfo2);\n            this.flpInfo.Controls.Add(this.table2);\n            this.flpInfo.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpInfo.Location = new System.Drawing.Point(0, 345);\n            this.flpInfo.Margin = new System.Windows.Forms.Padding(0);\n            this.flpInfo.Name = \"flpInfo\";\n            this.flpInfo.Size = new System.Drawing.Size(534, 105);\n            this.flpInfo.TabIndex = 6;\n            // \n            // pbInfo2\n            // \n            this.pbInfo2.Location = new System.Drawing.Point(9, 10);\n            this.pbInfo2.Margin = new System.Windows.Forms.Padding(9, 10, 4, 5);\n            this.pbInfo2.Name = \"pbInfo2\";\n            this.pbInfo2.Size = new System.Drawing.Size(24, 25);\n            this.pbInfo2.TabIndex = 24;\n            this.pbInfo2.TabStop = false;\n            // \n            // table2\n            // \n            this.table2.ColumnCount = 1;\n            this.table2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.table2.Controls.Add(this.lblReplacementInfo, 0, 0);\n            this.table2.Controls.Add(this.tblReplacementVars, 0, 1);\n            this.table2.Location = new System.Drawing.Point(37, 0);\n            this.table2.Margin = new System.Windows.Forms.Padding(0);\n            this.table2.Name = \"table2\";\n            this.table2.Padding = new System.Windows.Forms.Padding(0, 0, 0, 5);\n            this.table2.RowCount = 2;\n            this.table2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.table2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.table2.Size = new System.Drawing.Size(497, 100);\n            this.table2.TabIndex = 25;\n            // \n            // lblReplacementInfo\n            // \n            this.lblReplacementInfo.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblReplacementInfo.AutoSize = true;\n            this.lblReplacementInfo.Location = new System.Drawing.Point(4, 10);\n            this.lblReplacementInfo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblReplacementInfo.Name = \"lblReplacementInfo\";\n            this.lblReplacementInfo.Size = new System.Drawing.Size(174, 20);\n            this.lblReplacementInfo.TabIndex = 26;\n            this.lblReplacementInfo.Text = \"Replacement Variables\";\n            // \n            // tblReplacementVars\n            // \n            this.tblReplacementVars.ColumnCount = 2;\n            this.tblReplacementVars.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 112F));\n            this.tblReplacementVars.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblReplacementVars.Controls.Add(this.label4, 1, 1);\n            this.tblReplacementVars.Controls.Add(this.label3, 0, 1);\n            this.tblReplacementVars.Controls.Add(this.label2, 1, 0);\n            this.tblReplacementVars.Controls.Add(this.label1, 0, 0);\n            this.tblReplacementVars.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblReplacementVars.Location = new System.Drawing.Point(0, 40);\n            this.tblReplacementVars.Margin = new System.Windows.Forms.Padding(0);\n            this.tblReplacementVars.Name = \"tblReplacementVars\";\n            this.tblReplacementVars.RowCount = 2;\n            this.tblReplacementVars.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));\n            this.tblReplacementVars.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));\n            this.tblReplacementVars.Size = new System.Drawing.Size(497, 55);\n            this.tblReplacementVars.TabIndex = 0;\n            // \n            // label4\n            // \n            this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(115, 35);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(120, 20);\n            this.label4.TabIndex = 3;\n            this.label4.Text = \"IWAD file name\";\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(3, 35);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(50, 20);\n            this.label3.TabIndex = 2;\n            this.label3.Text = \"$iwad\";\n            // \n            // label2\n            // \n            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(115, 5);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(218, 20);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"FIle name of the launched file\";\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(3, 5);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(78, 20);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"$filename\";\n            // \n            // SourcePortEditForm\n            // \n            this.AcceptButton = this.btnSave;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.button1;\n            this.ClientSize = new System.Drawing.Size(534, 822);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"SourcePortEditForm\";\n            this.Text = \"Source Port\";\n            this.tblMain.ResumeLayout(false);\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.groupBox2.ResumeLayout(false);\n            this.grpAdditionalFiles.ResumeLayout(false);\n            this.grpAdditionalFiles.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo)).EndInit();\n            this.flpInfo.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo2)).EndInit();\n            this.table2.ResumeLayout(false);\n            this.table2.PerformLayout();\n            this.tblReplacementVars.ResumeLayout(false);\n            this.tblReplacementVars.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button button1;\n        private System.Windows.Forms.Button btnSave;\n        private System.Windows.Forms.GroupBox grpAdditionalFiles;\n        private FilesCtrl ctrlFiles;\n        private System.Windows.Forms.GroupBox groupBox2;\n        private SourcePortEdit sourcePortEdit1;\n        private System.Windows.Forms.PictureBox pbInfo;\n        private System.Windows.Forms.Label lblInfo;\n        private Controls.TitleBarControl titleBar;\n        private System.Windows.Forms.FlowLayoutPanel flpInfo;\n        private System.Windows.Forms.PictureBox pbInfo2;\n        private TableLayoutPanelDB table2;\n        private System.Windows.Forms.Label lblReplacementInfo;\n        private TableLayoutPanelDB tblReplacementVars;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Label label3;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/SourcePortEditForm.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class SourcePortEditForm : Form\n    {\n        private readonly IDataSourceAdapter m_adapter;\n        private readonly ITabView[] m_additionalFileViews;\n        private readonly SourcePortLaunchType m_type;\n\n        private ISourcePortData m_sourcePort;\n\n        public SourcePortEditForm(IDataSourceAdapter adapter, ITabView[] additionalTabViews, SourcePortLaunchType type)\n        {\n            InitializeComponent();\n            pbInfo.Image = Properties.Resources.bon2b;\n            lblInfo.Text = string.Format(\"These files will automatically be added when this executable{0} is selected.\", Environment.NewLine);\n\n            pbInfo2.Image = Properties.Resources.bon2b;            \n\n            ctrlFiles.Initialize(\"GameFileID\", \"FileName\");\n            ctrlFiles.NewItemNeeded += ctrlFiles_NewItemNeeded;\n\n            m_adapter = adapter;\n            m_additionalFileViews = additionalTabViews;\n            m_type = type;\n\n            Text = m_type.ToString(\"g\");\n\n            sourcePortEdit1.ShowOptions(type == SourcePortLaunchType.Utility);\n\n            if (type == SourcePortLaunchType.Utility)\n            {\n                grpAdditionalFiles.Visible = false;\n                flpInfo.Visible = false;\n                tblMain.RowStyles[2].Height = 0;\n                tblMain.RowStyles[3].Height = 0;\n                var dpiScale = new DpiScale(CreateGraphics());\n                Height = (int)(tblMain.RowStyles[0].Height + tblMain.RowStyles[1].Height + tblMain.RowStyles[4].Height) + dpiScale.ScaleIntY(48);\n            }\n\n            IEnumerable<string> extensions = GetSourcePortExtensions(type);\n            sourcePortEdit1.SetSupportedExtensions(string.Join(\",\", extensions));\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        private static IEnumerable<string> GetSourcePortExtensions(SourcePortLaunchType launchType)\n        {\n            IEnumerable<string> extensions = new string[] { \".wad\" };\n            switch (launchType)\n            {\n                case SourcePortLaunchType.SourcePort:\n                    extensions = extensions.Union(Util.GetDehackedExtensions().Union(Util.GetSourcePortPkExtensions()));\n                    break;\n                case SourcePortLaunchType.Utility:\n                    extensions = extensions.Union(Util.GetSourcePortPkExtensions());\n                    break;\n                case SourcePortLaunchType.Doom64:\n                    extensions = extensions.Union(Util.GetExtraDoom64Extensions());\n                    break;\n            }\n            return extensions;\n        }\n\n        private void ctrlFiles_NewItemNeeded(object sender, AdditionalFilesEventArgs e)\n        {\n            using (FileSelectForm fileSelect = new FileSelectForm())\n            {\n                fileSelect.Initialize(m_adapter, m_additionalFileViews);\n                fileSelect.MultiSelect = true;\n                fileSelect.StartPosition = FormStartPosition.CenterParent;\n\n                if (fileSelect.ShowDialog(this) == DialogResult.OK)\n                {\n                    IGameFile[] selectedFiles = fileSelect.SelectedFiles;\n\n                    if (selectedFiles.Length > 0)\n                    {\n                        e.NewItems = selectedFiles.Cast<object>().ToList();\n                    }\n                }\n            }\n        }\n\n        public void SetDataSource(ISourcePortData sourcePort)\n        {\n            m_sourcePort = sourcePort;\n            sourcePortEdit1.SetDataSource(sourcePort);\n            ctrlFiles.SetDataSource(Util.GetAdditionalFiles(m_adapter, sourcePort));\n        }\n\n        public void UpdateDataSource(ISourcePortData sourcePort)\n        {\n            m_sourcePort = sourcePort;\n            sourcePortEdit1.UpdateDataSource(sourcePort);\n            sourcePort.SettingsFiles = ctrlFiles.GetAdditionalFilesString();\n        }\n\n        private void btnSave_Click(object sender, EventArgs e)\n        {\n            string err = null;\n            string type = GetTypeString();\n\n            if (string.IsNullOrEmpty(sourcePortEdit1.SourcePortName))\n                err = string.Format(\"Please enter a name for the {0}.\", type);\n            if (string.IsNullOrEmpty(sourcePortEdit1.SourcePortExec))\n                err = string.Format(\"Please select an executable for the {0}.\", type);\n\n            if (m_sourcePort == null)\n            {\n                IEnumerable<ISourcePortData> data;\n                if (m_type == SourcePortLaunchType.SourcePort)\n                    data = m_adapter.GetSourcePorts();\n                else\n                    data = m_adapter.GetUtilities();\n\n                if (data.Any(x => x.Executable == sourcePortEdit1.SourcePortExec && x.Directory.GetFullPath() == sourcePortEdit1.GetSourcePortDirectory().GetFullPath())\n                    && PromptUserSourcePortDuplicate())\n                {\n                    DialogResult = DialogResult.None;\n                    return;\n                }\n            }\n\n            if (!string.IsNullOrEmpty(err))\n            {\n                MessageBox.Show(this, err, \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                DialogResult = DialogResult.None;\n            }\n            else\n            {\n                DialogResult = DialogResult.OK;\n            }\n        }\n\n        private bool PromptUserSourcePortDuplicate()\n        {\n            return MessageBox.Show(this, $\"The {GetTypeString()} {sourcePortEdit1.SourcePortExec} already exists. Continue?\", \"Warning\",\n                                MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel;\n        }\n\n        private string GetTypeString()\n        {\n            if (m_type == SourcePortLaunchType.SourcePort)\n                return \"source port\";\n            else if (m_type == SourcePortLaunchType.Utility)\n                return \"utility\";\n            else // Doom64\n                return \"Doom 64 installation\";\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/SourcePortEditForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/SourcePortViewForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SourcePortViewForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SourcePortViewForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.dgvSourcePorts = new System.Windows.Forms.DataGridView();\n            this.ColName = new System.Windows.Forms.DataGridViewTextBoxColumn();\n            this.Executable = new System.Windows.Forms.DataGridViewTextBoxColumn();\n            this.Directory = new System.Windows.Forms.DataGridViewTextBoxColumn();\n            this.tableLayoutPanelDB1 = new DoomLauncher.TableLayoutPanelDB();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnNew = new System.Windows.Forms.Button();\n            this.btnEdit = new System.Windows.Forms.Button();\n            this.btnDelete = new System.Windows.Forms.Button();\n            this.btnNext = new System.Windows.Forms.Button();\n            this.flpTop = new System.Windows.Forms.FlowLayoutPanel();\n            this.chkShowArchived = new DoomLauncher.CCheckBox();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.ctrlSearch = new DoomLauncher.SearchControl();\n            this.tblMain.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.dgvSourcePorts)).BeginInit();\n            this.tableLayoutPanelDB1.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.flpTop.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.dgvSourcePorts, 0, 2);\n            this.tblMain.Controls.Add(this.tableLayoutPanelDB1, 0, 3);\n            this.tblMain.Controls.Add(this.flpTop, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 4;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.Size = new System.Drawing.Size(832, 544);\n            this.tblMain.TabIndex = 0;\n            // \n            // dgvSourcePorts\n            // \n            this.dgvSourcePorts.AllowUserToAddRows = false;\n            this.dgvSourcePorts.AllowUserToDeleteRows = false;\n            dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));\n            this.dgvSourcePorts.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;\n            this.dgvSourcePorts.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;\n            this.dgvSourcePorts.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal;\n            this.dgvSourcePorts.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\n            this.dgvSourcePorts.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\n            this.ColName,\n            this.Executable,\n            this.Directory});\n            this.dgvSourcePorts.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dgvSourcePorts.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;\n            this.dgvSourcePorts.GridColor = System.Drawing.SystemColors.ActiveBorder;\n            this.dgvSourcePorts.Location = new System.Drawing.Point(4, 66);\n            this.dgvSourcePorts.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.dgvSourcePorts.Name = \"dgvSourcePorts\";\n            this.dgvSourcePorts.RowHeadersWidth = 51;\n            this.dgvSourcePorts.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\n            this.dgvSourcePorts.Size = new System.Drawing.Size(824, 435);\n            this.dgvSourcePorts.TabIndex = 0;\n            this.dgvSourcePorts.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvSourcePorts_CellDoubleClick);\n            // \n            // ColName\n            // \n            this.ColName.DataPropertyName = \"Name\";\n            this.ColName.HeaderText = \"Name\";\n            this.ColName.MinimumWidth = 6;\n            this.ColName.Name = \"ColName\";\n            this.ColName.Width = 125;\n            // \n            // Executable\n            // \n            this.Executable.DataPropertyName = \"Executable\";\n            this.Executable.HeaderText = \"Executable\";\n            this.Executable.MinimumWidth = 6;\n            this.Executable.Name = \"Executable\";\n            this.Executable.Width = 125;\n            // \n            // Directory\n            // \n            this.Directory.DataPropertyName = \"Directory\";\n            this.Directory.HeaderText = \"Directory\";\n            this.Directory.MinimumWidth = 6;\n            this.Directory.Name = \"Directory\";\n            this.Directory.Width = 125;\n            // \n            // tableLayoutPanelDB1\n            // \n            this.tableLayoutPanelDB1.ColumnCount = 2;\n            this.tableLayoutPanelDB1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanelDB1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanelDB1.Controls.Add(this.flpButtons, 0, 0);\n            this.tableLayoutPanelDB1.Controls.Add(this.btnNext, 1, 0);\n            this.tableLayoutPanelDB1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tableLayoutPanelDB1.Location = new System.Drawing.Point(0, 505);\n            this.tableLayoutPanelDB1.Margin = new System.Windows.Forms.Padding(0);\n            this.tableLayoutPanelDB1.Name = \"tableLayoutPanelDB1\";\n            this.tableLayoutPanelDB1.RowCount = 1;\n            this.tableLayoutPanelDB1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanelDB1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tableLayoutPanelDB1.Size = new System.Drawing.Size(832, 39);\n            this.tableLayoutPanelDB1.TabIndex = 1;\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnNew);\n            this.flpButtons.Controls.Add(this.btnEdit);\n            this.flpButtons.Controls.Add(this.btnDelete);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.Location = new System.Drawing.Point(0, 0);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(416, 39);\n            this.flpButtons.TabIndex = 2;\n            // \n            // btnNew\n            // \n            this.btnNew.Location = new System.Drawing.Point(4, 4);\n            this.btnNew.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.btnNew.Name = \"btnNew\";\n            this.btnNew.Size = new System.Drawing.Size(100, 28);\n            this.btnNew.TabIndex = 2;\n            this.btnNew.Text = \"New\";\n            this.btnNew.UseVisualStyleBackColor = true;\n            this.btnNew.Click += new System.EventHandler(this.btnNew_Click);\n            // \n            // btnEdit\n            // \n            this.btnEdit.Location = new System.Drawing.Point(112, 4);\n            this.btnEdit.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.btnEdit.Name = \"btnEdit\";\n            this.btnEdit.Size = new System.Drawing.Size(100, 28);\n            this.btnEdit.TabIndex = 4;\n            this.btnEdit.Text = \"Edit\";\n            this.btnEdit.UseVisualStyleBackColor = true;\n            this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);\n            // \n            // btnDelete\n            // \n            this.btnDelete.Location = new System.Drawing.Point(220, 4);\n            this.btnDelete.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.btnDelete.Name = \"btnDelete\";\n            this.btnDelete.Size = new System.Drawing.Size(100, 28);\n            this.btnDelete.TabIndex = 3;\n            this.btnDelete.Text = \"Delete\";\n            this.btnDelete.UseVisualStyleBackColor = true;\n            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);\n            // \n            // btnNext\n            // \n            this.btnNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnNext.Location = new System.Drawing.Point(724, 4);\n            this.btnNext.Margin = new System.Windows.Forms.Padding(4, 4, 8, 4);\n            this.btnNext.Name = \"btnNext\";\n            this.btnNext.Size = new System.Drawing.Size(100, 28);\n            this.btnNext.TabIndex = 3;\n            this.btnNext.Text = \"Next\";\n            this.btnNext.UseVisualStyleBackColor = true;\n            this.btnNext.Visible = false;\n            this.btnNext.Click += new System.EventHandler(this.btnLaunch_Click);\n            // \n            // flpTop\n            // \n            this.flpTop.Controls.Add(this.ctrlSearch);\n            this.flpTop.Controls.Add(this.chkShowArchived);\n            this.flpTop.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpTop.Location = new System.Drawing.Point(3, 32);\n            this.flpTop.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.flpTop.Name = \"flpTop\";\n            this.flpTop.Size = new System.Drawing.Size(829, 30);\n            this.flpTop.TabIndex = 2;\n            // \n            // chkShowArchived\n            // \n            this.chkShowArchived.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.chkShowArchived.AutoSize = true;\n            this.chkShowArchived.Location = new System.Drawing.Point(278, 7);\n            this.chkShowArchived.Margin = new System.Windows.Forms.Padding(10, 6, 3, 3);\n            this.chkShowArchived.Name = \"chkShowArchived\";\n            this.chkShowArchived.Size = new System.Drawing.Size(118, 20);\n            this.chkShowArchived.TabIndex = 0;\n            this.chkShowArchived.Text = \"Show Archived\";\n            this.chkShowArchived.CheckedChanged += new System.EventHandler(this.chkShowArchived_CheckedChanged);\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(832, 32);\n            this.titleBar.TabIndex = 3;\n            this.titleBar.Title = \"Title\";\n            // \n            // ctrlSearch\n            // \n            this.ctrlSearch.Location = new System.Drawing.Point(4, 4);\n            this.ctrlSearch.Margin = new System.Windows.Forms.Padding(4);\n            this.ctrlSearch.Name = \"ctrlSearch\";\n            this.ctrlSearch.SearchText = \"\";\n            this.ctrlSearch.Size = new System.Drawing.Size(260, 23);\n            this.ctrlSearch.TabIndex = 1;\n            // \n            // SourcePortViewForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(832, 544);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.Name = \"SourcePortViewForm\";\n            this.Text = \"Source Ports\";\n            this.tblMain.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.dgvSourcePorts)).EndInit();\n            this.tableLayoutPanelDB1.ResumeLayout(false);\n            this.flpButtons.ResumeLayout(false);\n            this.flpTop.ResumeLayout(false);\n            this.flpTop.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.DataGridView dgvSourcePorts;\n        private System.Windows.Forms.DataGridViewTextBoxColumn ColName;\n        private System.Windows.Forms.DataGridViewTextBoxColumn Executable;\n        private System.Windows.Forms.DataGridViewTextBoxColumn Directory;\n        private TableLayoutPanelDB tableLayoutPanelDB1;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private System.Windows.Forms.Button btnNew;\n        private System.Windows.Forms.Button btnEdit;\n        private System.Windows.Forms.Button btnDelete;\n        private System.Windows.Forms.Button btnNext;\n        private System.Windows.Forms.FlowLayoutPanel flpTop;\n        private Controls.TitleBarControl titleBar;\n        private SearchControl ctrlSearch;\n        private CCheckBox chkShowArchived;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/SourcePortViewForm.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Forms;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Forms;\nusing System.Windows.Markup.Localizer;\n\nnamespace DoomLauncher\n{\n    public partial class SourcePortViewForm : Form\n    {\n        public event EventHandler SourcePortLaunched;\n\n        private readonly ITabView[] m_tabViews;\n        private readonly SourcePortLaunchType m_launchType;\n        private readonly IDataSourceAdapter m_adapter;\n        private readonly AppConfiguration m_appConfig;\n        private IEnumerable<ISourcePortData> m_sourcePorts = Array.Empty<ISourcePortData>();\n        private string m_searchText = string.Empty;\n\n        public SourcePortViewForm(IDataSourceAdapter adapter, AppConfiguration appConfig, ITabView[] tabViews, SourcePortLaunchType type)\n        {\n            InitializeComponent();\n\n            dgvSourcePorts.MultiSelect = false;\n\n            m_adapter = adapter;\n            m_appConfig = appConfig;\n            m_tabViews = tabViews;\n            m_launchType = type;\n\n            ctrlSearch.SearchTextChanged += CtrlSearch_SearchTextChanged;\n            ctrlSearch.SetShowDropDown(false);\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n\n            ResetData();\n            dgvSourcePorts.Columns[dgvSourcePorts.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;\n        }\n\n        private void CtrlSearch_SearchTextChanged(object sender, EventArgs e)\n        {\n            m_searchText = ctrlSearch.SearchText;\n            SetSourcePortsData();\n        }\n\n        public void DisplayInitSetupButton()\n        {\n            IsInitSetup = true;\n            \n            btnNext.Text = \"Next >>\";\n            btnNext.Visible = true;\n        }\n\n        private bool IsInitSetup { get; set; }\n        public void ShowPlayButton(bool set)\n        {\n            btnNext.Visible = set;\n        }\n\n        private void ResetData()\n        {\n            bool loadArchived = chkShowArchived.Checked;\n            IEnumerable<ISourcePortData> data;\n            if (m_launchType == SourcePortLaunchType.Utility)\n            {\n                this.Text = titleBar.Title = \"Utilities\";\n                data = m_adapter.GetUtilities(loadArchived);\n            }\n            else // SourcePortLaunchType.SourcePort (Doom64 not currently used for this screen)\n            {\n                this.Text = titleBar.Title = \"Source Ports\";\n                data = m_adapter.GetSourcePorts(loadArchived);\n            }\n\n            SetDataSource(data);\n        }\n\n        private void SetDataSource(IEnumerable<ISourcePortData> sourcePorts)\n        {\n            m_sourcePorts = sourcePorts;\n            SetSourcePortsData();\n        }\n\n        private void SetSourcePortsData()\n        {\n            var sourcePorts = m_sourcePorts;\n            if (!string.IsNullOrEmpty(m_searchText))\n                sourcePorts = m_sourcePorts.Where(x => x.Name.IndexOf(m_searchText, StringComparison.CurrentCultureIgnoreCase) >= 0);\n\n            dgvSourcePorts.DataSource =\n                (from item in sourcePorts\n                 select new { item.SourcePortID, item.Name, item.Executable, Directory = item.Directory.GetPossiblyRelativePath(), SourcePort = item }).ToList();\n        }\n\n        private ISourcePortData SelectedItem\n        {\n            get\n            {\n                if (dgvSourcePorts.SelectedRows.Count == 0)\n                    return null;\n\n                return GetSourcePortFromRow(dgvSourcePorts.SelectedRows[0]);\n            }\n        }\n\n        private ISourcePortData GetSourcePortFromRow(DataGridViewRow row)\n        {\n            object item = row.DataBoundItem;\n            PropertyInfo pi = item.GetType().GetProperty(\"SourcePort\");\n            return pi.GetValue(item) as ISourcePortData;\n        }\n\n        private void dgvSourcePorts_CellDoubleClick(object sender, DataGridViewCellEventArgs e)\n        {\n            HandleEdit();\n        }\n\n        private void btnEdit_Click(object sender, EventArgs e)\n        {\n            HandleEdit();\n        }\n\n        private void HandleEdit()\n        {\n            if (SelectedItem != null)\n            {\n                SourcePortEditForm editForm = new SourcePortEditForm(m_adapter, m_tabViews, m_launchType);\n                ISourcePortData sourcePort = SelectedItem;\n                editForm.SetDataSource(sourcePort);\n                editForm.StartPosition = FormStartPosition.CenterParent;\n\n                if (editForm.ShowDialog(this) == DialogResult.OK)\n                {\n                    editForm.UpdateDataSource(sourcePort);\n                    m_adapter.UpdateSourcePort(sourcePort);\n                    ResetData();\n                    SelectSourcePort(sourcePort);\n                }\n            }\n        }\n\n        private void btnNew_Click(object sender, EventArgs e)\n        {\n            SourcePortEditForm editForm = new SourcePortEditForm(m_adapter, m_tabViews, m_launchType);\n\n            editForm.StartPosition = FormStartPosition.CenterParent;\n\n            if (editForm.ShowDialog(this) == DialogResult.OK)\n            {\n                SourcePortData sourcePort = new SourcePortData();\n                editForm.UpdateDataSource(sourcePort);\n                sourcePort.LaunchType = m_launchType;\n                m_adapter.InsertSourcePort(sourcePort);\n                ResetData();\n\n                SelectSourcePort(sourcePort);\n            }\n\n        }\n\n        private void SelectSourcePort(ISourcePortData sourcePort)\n        {\n            // Source ports are ordered by name so we have to search for it\n            // The identity (SourcePortID) is saved after the insert so just use the name to find it when the ID is zero\n            foreach (DataGridViewRow row in dgvSourcePorts.Rows)\n            {\n                if (sourcePort.SourcePortID > 0)\n                {\n                    if (sourcePort.SourcePortID == GetSourcePortFromRow(row).SourcePortID)\n                    {\n                        row.Selected = true;\n                        break;\n                    }\n                }\n                else if (sourcePort.Executable == GetSourcePortFromRow(row).Executable)\n                {\n                    row.Selected = true;\n                    break;\n                }\n            }\n        }\n\n        private void btnDelete_Click(object sender, EventArgs e)\n        {\n            MessageCheckBox messageBox = new MessageCheckBox(\"Confirm\", GetDeleteConfirm(), \"Delete save games, demos, and statistics associated with this port\",\n                SystemIcons.Exclamation, MessageBoxButtons.OKCancel);\n\n            messageBox.SetShowCheckBox(m_launchType == SourcePortLaunchType.SourcePort);\n\n            if (SelectedItem != null && messageBox.ShowDialog(this) == DialogResult.OK)\n            {\n                int index = dgvSourcePorts.SelectedRows[0].Index;\n                try\n                {\n                    if (m_launchType == SourcePortLaunchType.SourcePort)\n                    {\n                        m_adapter.UpdateGameFiles(GameFileFieldType.SourcePortID, GameFileFieldType.SourcePortID, SelectedItem.SourcePortID, null);\n\n                        if (messageBox.Checked)\n                            DeleteSourcePortFiles();\n                        else\n                            UnlinkFilesFromSourcePort();\n                    }\n\n                    m_adapter.DeleteSourcePort(SelectedItem);\n                }\n                catch (IOException)\n                {\n                    MessageBox.Show(this, \"This file appears to be in use and cannot be deleted.\", \"Error\",\n                        MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n                catch (Exception ex)\n                {\n                    Util.DisplayUnexpectedException(this, ex);\n                }\n\n                ResetData();\n\n                if (index >= dgvSourcePorts.Rows.Count)\n                    index = dgvSourcePorts.Rows.Count - 1;\n\n                if (dgvSourcePorts.Rows.Count > 0)\n                    dgvSourcePorts.Rows[index].Selected = true;\n            }\n        }\n\n        private static FileType[] GetDeleteFileTypes()\n        {\n            return new FileType[] { FileType.SaveGame, FileType.Demo  };\n        }\n\n        private void DeleteSourcePortFiles()\n        {\n            var deleteFileTypes = GetDeleteFileTypes();\n            var files = m_adapter.GetFiles().Where(x => x.SourcePortID == SelectedItem.SourcePortID && deleteFileTypes.Contains(x.FileTypeID));\n\n            foreach(var fileType in deleteFileTypes)\n                m_adapter.DeleteFiles(SelectedItem, fileType);\n   \n            m_adapter.DeleteStats(SelectedItem);\n            m_adapter.UpdateFiles(SelectedItem.SourcePortID, -1); //Since we didn't delete screenshots unlink them\n\n            foreach(var file in files)\n            {\n                try\n                {\n                    string deleteFile = Path.Combine(m_appConfig.PathForFileType(file.FileTypeID).GetFullPath(), file.FileName);\n                    if (File.Exists(deleteFile))\n                        File.Delete(deleteFile);\n                }\n                catch\n                { \n                    //we tried \n                }\n            }\n        }\n\n        private void UnlinkFilesFromSourcePort()\n        {\n            m_adapter.UpdateFiles(SelectedItem.SourcePortID, -1);\n\n            var stats = m_adapter.GetStats().Where(x => x.SourcePortID == SelectedItem.SourcePortID);\n            foreach (var stat in stats)\n            {\n                stat.SourcePortID = -1;\n                m_adapter.UpdateStats(stat);\n            }\n        }\n\n        private string GetDeleteConfirm()\n        {\n            if (m_launchType == SourcePortLaunchType.SourcePort)\n                return \"Deleting this source port will orphan demo files and save games associated with it. Are you sure you want to continue?\\n\\nConsider archiving this port instead!\";\n            else\n                return \"Are you sure you want to delete this utility?\";\n        }\n\n        private void btnLaunch_Click(object sender, EventArgs e)\n        {\n            if (IsInitSetup)\n                Close();\n            else\n                SourcePortLaunched?.Invoke(this, new EventArgs());\n        }\n\n        public ISourcePortData GetSelectedSourcePort()\n        {\n             return SelectedItem;\n        }\n\n        private void chkShowArchived_CheckedChanged(object sender, EventArgs e)\n        {\n            ResetData();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/SourcePortViewForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ColName.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"Executable.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"Directory.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/SpecificFilesForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SpecificFilesForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SpecificFilesForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.clbFiles = new System.Windows.Forms.CheckedListBox();\n            this.tblInner = new System.Windows.Forms.TableLayoutPanel();\n            this.btnSearch = new System.Windows.Forms.Button();\n            this.txtSearch = new System.Windows.Forms.TextBox();\n            this.pnlLinks = new System.Windows.Forms.Panel();\n            this.chkPkContents = new DoomLauncher.CCheckBox();\n            this.chkSupported = new DoomLauncher.CCheckBox();\n            this.pnl = new System.Windows.Forms.Panel();\n            this.lblLoading = new System.Windows.Forms.Label();\n            this.lnkSelect = new System.Windows.Forms.LinkLabel();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.tblInner.SuspendLayout();\n            this.pnlLinks.SuspendLayout();\n            this.pnl.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flpButtons, 0, 3);\n            this.tblMain.Controls.Add(this.clbFiles, 0, 2);\n            this.tblMain.Controls.Add(this.tblInner, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 4;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 98F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.Size = new System.Drawing.Size(419, 444);\n            this.tblMain.TabIndex = 0;\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnCancel);\n            this.flpButtons.Controls.Add(this.btnOK);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpButtons.Location = new System.Drawing.Point(0, 405);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(419, 39);\n            this.flpButtons.TabIndex = 0;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(315, 4);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(100, 28);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnOK\n            // \n            this.btnOK.Location = new System.Drawing.Point(207, 4);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(100, 28);\n            this.btnOK.TabIndex = 1;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);\n            // \n            // clbFiles\n            // \n            this.clbFiles.CheckOnClick = true;\n            this.clbFiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.clbFiles.FormattingEnabled = true;\n            this.clbFiles.Location = new System.Drawing.Point(4, 134);\n            this.clbFiles.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.clbFiles.Name = \"clbFiles\";\n            this.clbFiles.Size = new System.Drawing.Size(411, 267);\n            this.clbFiles.TabIndex = 1;\n            // \n            // tblInner\n            // \n            this.tblInner.ColumnCount = 2;\n            this.tblInner.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInner.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 213F));\n            this.tblInner.Controls.Add(this.btnSearch, 1, 1);\n            this.tblInner.Controls.Add(this.txtSearch, 0, 1);\n            this.tblInner.Controls.Add(this.pnlLinks, 1, 0);\n            this.tblInner.Controls.Add(this.pnl, 0, 0);\n            this.tblInner.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblInner.Location = new System.Drawing.Point(0, 32);\n            this.tblInner.Margin = new System.Windows.Forms.Padding(0);\n            this.tblInner.Name = \"tblInner\";\n            this.tblInner.RowCount = 2;\n            this.tblInner.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 62F));\n            this.tblInner.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInner.Size = new System.Drawing.Size(419, 98);\n            this.tblInner.TabIndex = 5;\n            // \n            // btnSearch\n            // \n            this.btnSearch.Location = new System.Drawing.Point(210, 66);\n            this.btnSearch.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.btnSearch.Name = \"btnSearch\";\n            this.btnSearch.Size = new System.Drawing.Size(100, 27);\n            this.btnSearch.TabIndex = 6;\n            this.btnSearch.Text = \"Search\";\n            this.btnSearch.UseVisualStyleBackColor = true;\n            this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);\n            // \n            // txtSearch\n            // \n            this.txtSearch.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtSearch.Location = new System.Drawing.Point(4, 66);\n            this.txtSearch.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.txtSearch.Name = \"txtSearch\";\n            this.txtSearch.Size = new System.Drawing.Size(198, 22);\n            this.txtSearch.TabIndex = 7;\n            // \n            // pnlLinks\n            // \n            this.pnlLinks.Controls.Add(this.chkPkContents);\n            this.pnlLinks.Controls.Add(this.chkSupported);\n            this.pnlLinks.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlLinks.Location = new System.Drawing.Point(206, 0);\n            this.pnlLinks.Margin = new System.Windows.Forms.Padding(0);\n            this.pnlLinks.Name = \"pnlLinks\";\n            this.pnlLinks.Size = new System.Drawing.Size(213, 62);\n            this.pnlLinks.TabIndex = 4;\n            // \n            // chkPkContents\n            // \n            this.chkPkContents.AutoSize = true;\n            this.chkPkContents.Location = new System.Drawing.Point(4, 31);\n            this.chkPkContents.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.chkPkContents.Name = \"chkPkContents\";\n            this.chkPkContents.Size = new System.Drawing.Size(142, 20);\n            this.chkPkContents.TabIndex = 4;\n            this.chkPkContents.Text = \"Show pk3 Contents\";\n            this.chkPkContents.UseVisualStyleBackColor = true;\n            this.chkPkContents.CheckedChanged += new System.EventHandler(this.chkPkContents_CheckedChanged);\n            // \n            // chkSupported\n            // \n            this.chkSupported.AutoSize = true;\n            this.chkSupported.Location = new System.Drawing.Point(4, 6);\n            this.chkSupported.Margin = new System.Windows.Forms.Padding(32, 0, 0, 0);\n            this.chkSupported.Name = \"chkSupported\";\n            this.chkSupported.Size = new System.Drawing.Size(190, 20);\n            this.chkSupported.TabIndex = 3;\n            this.chkSupported.Text = \"Supported Extensions Only\";\n            this.chkSupported.UseVisualStyleBackColor = true;\n            this.chkSupported.CheckedChanged += new System.EventHandler(this.chkSupported_CheckedChanged);\n            // \n            // pnl\n            // \n            this.pnl.Controls.Add(this.lblLoading);\n            this.pnl.Controls.Add(this.lnkSelect);\n            this.pnl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnl.Location = new System.Drawing.Point(0, 0);\n            this.pnl.Margin = new System.Windows.Forms.Padding(0);\n            this.pnl.Name = \"pnl\";\n            this.pnl.Size = new System.Drawing.Size(206, 62);\n            this.pnl.TabIndex = 8;\n            // \n            // lblLoading\n            // \n            this.lblLoading.AutoSize = true;\n            this.lblLoading.Location = new System.Drawing.Point(4, 32);\n            this.lblLoading.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblLoading.Name = \"lblLoading\";\n            this.lblLoading.Size = new System.Drawing.Size(65, 16);\n            this.lblLoading.TabIndex = 3;\n            this.lblLoading.Text = \"Loading...\";\n            // \n            // lnkSelect\n            // \n            this.lnkSelect.AutoSize = true;\n            this.lnkSelect.Location = new System.Drawing.Point(4, 7);\n            this.lnkSelect.Margin = new System.Windows.Forms.Padding(4, 7, 4, 0);\n            this.lnkSelect.Name = \"lnkSelect\";\n            this.lnkSelect.Size = new System.Drawing.Size(120, 16);\n            this.lnkSelect.TabIndex = 2;\n            this.lnkSelect.TabStop = true;\n            this.lnkSelect.Text = \"Select/Unselect All\";\n            this.lnkSelect.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkSelect_LinkClicked);\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(419, 32);\n            this.titleBar.TabIndex = 6;\n            this.titleBar.Title = \"Select Files\";\n            // \n            // SpecificFilesForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(419, 444);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);\n            this.MinimumSize = new System.Drawing.Size(393, 357);\n            this.Name = \"SpecificFilesForm\";\n            this.Text = \"Select Files\";\n            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SpecificFilesForm_FormClosing);\n            this.tblMain.ResumeLayout(false);\n            this.flpButtons.ResumeLayout(false);\n            this.tblInner.ResumeLayout(false);\n            this.tblInner.PerformLayout();\n            this.pnlLinks.ResumeLayout(false);\n            this.pnlLinks.PerformLayout();\n            this.pnl.ResumeLayout(false);\n            this.pnl.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.CheckedListBox clbFiles;\n        private System.Windows.Forms.LinkLabel lnkSelect;\n        private System.Windows.Forms.CheckBox chkSupported;\n        private System.Windows.Forms.Panel pnlLinks;\n        private System.Windows.Forms.CheckBox chkPkContents;\n        private System.Windows.Forms.Button btnSearch;\n        private System.Windows.Forms.TextBox txtSearch;\n        private System.Windows.Forms.TableLayoutPanel tblInner;\n        private System.Windows.Forms.Panel pnl;\n        private System.Windows.Forms.Label lblLoading;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/SpecificFilesForm.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class SpecificFilesForm : Form\n    {\n        public class SpecificFilePath\n        {\n            public string ExtractedFile { get; set; }\n            public string InternalFilePath { get; set; }\n        }\n\n        private bool m_select, m_autoSelect, m_loading, m_closing;\n        private string[] m_specificFiles = new string[] { };\n        private string[] m_supportedExtensions = new string[] { };\n        private List<IGameFile> m_gameFiles;\n        private LauncherPath m_directory, m_temp;\n        private readonly List<SpecificFilePath> m_filePaths = new List<SpecificFilePath>();\n        private CancellationTokenSource m_ct;\n        private List<string> m_items = new List<string>();\n        private List<int> m_checkedItems = new List<int>();\n\n        public SpecificFilesForm()\n        {\n            InitializeComponent();\n\n            AutoCheckSupportedExtensions(true);\n            ShowPkContentsCheckBox(false);\n            lblLoading.Text = string.Empty;\n            txtSearch.PreviewKeyDown += TxtSearch_PreviewKeyDown;\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        private void TxtSearch_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)\n        {\n            if (e.KeyCode == Keys.Enter)\n                HandleSearch();\n        }\n\n        public void AutoCheckSupportedExtensions(bool set)\n        {\n            m_autoSelect = set;\n        }\n\n        public void ShowPkContentsCheckBox(bool set)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            chkPkContents.Visible = set;\n            tblMain.RowStyles[0].Height = (set ? dpiScale.ScaleIntY(80) : dpiScale.ScaleIntY(24));\n        }\n\n        public void Initialize(LauncherPath gameFileDirectory, IEnumerable<IGameFile> gameFiles, string[] supportedExtensions, string[] specificFiles)\n        {\n            Initialize(gameFileDirectory, gameFiles, supportedExtensions, specificFiles, null);\n        }\n\n        public void Initialize(LauncherPath gameFileDirectory, IEnumerable<IGameFile> gameFiles, string[] supportedExtensions, string[] specificFiles, LauncherPath tempDirectory)\n        {\n            if (specificFiles != null)\n                m_specificFiles = specificFiles.ToArray();\n            m_supportedExtensions = supportedExtensions.ToArray();\n            m_gameFiles = gameFiles.ToList();\n            m_directory = gameFileDirectory;\n            m_temp = tempDirectory;\n\n            try\n            {\n                SetGrid();\n            }\n            catch(Exception ex)\n            {\n                Util.DisplayUnexpectedException(this, ex);\n            }\n        }\n\n        private async void SetGrid()\n        {\n            if (!m_loading)\n            {\n                chkPkContents.Enabled = btnSearch.Enabled = false;\n                m_loading = true;\n                lblLoading.Text = \"Loading...\";\n                clbFiles.Items.Clear();\n                m_items = new List<string>();\n                m_checkedItems = new List<int>();\n\n                m_ct = new CancellationTokenSource();\n                await Task.Run(() => SetGridTask());\n\n                clbFiles.Items.AddRange(m_items.ToArray());\n                m_checkedItems.ForEach(x => clbFiles.SetItemChecked(x, true));\n\n                if (!m_closing)\n                {\n                    lblLoading.Text = string.Empty;\n                    m_loading = false;\n                    chkPkContents.Enabled = btnSearch.Enabled = true;\n                }\n            }\n        }\n\n        private void SetGridTask()\n        {\n            m_filePaths.Clear();\n\n            foreach (IGameFile gameFile in m_gameFiles)\n            {\n                string path = Path.Combine(m_directory.GetFullPath(), gameFile.FileName);\n                using (IArchiveReader reader = CreateArchiveReader(gameFile, path))\n                {\n                    if (m_ct.IsCancellationRequested)\n                        break;\n\n                    try\n                    {\n                        if (m_specificFiles == null || m_specificFiles.Length == 0)\n                        {\n                            HandleDefaultSelection(path, reader);\n                            continue;\n                        }\n\n                        foreach (IArchiveEntry entry in reader.Entries)\n                        {\n                            if (string.IsNullOrEmpty(entry.Name) || entry.IsDirectory)\n                                continue;\n\n                            if (m_ct.IsCancellationRequested)\n                                break;\n\n                            HandleAddItem(path, entry.FullName, entry.Name, m_specificFiles.Contains(entry.FullName));\n                        }\n                    }\n                    catch\n                    {\n                        //this is laziness, sometimes it throws an exception when the form is closing in the middle of loading. But were closing the form so who cares\n                    }\n                }\n            }\n        }\n\n        private static IArchiveReader CreateArchiveReader(IGameFile gameFile, string path)\n        {\n            // this ignored pk3 files specifically for some reason\n            if (!File.Exists(path) && !Directory.Exists(path))\n                return ArchiveReader.EmptyArchiveReader;\n\n            bool isPackagedArchive = ArchiveUtil.ShouldReadPackagedArchive(path);\n            if (gameFile.IsUnmanaged() && !isPackagedArchive)\n                return new FileArchiveReader(path);\n\n            // TODO IsPk necessary?\n            if (isPackagedArchive)\n                return ArchiveReader.Create(path);\n\n            if (ArchiveReader.IsPk(Path.GetExtension(path)))\n                return new ZipArchiveReader(path);\n\n            return ArchiveReader.EmptyArchiveReader;\n        }\n\n        private void HandleDefaultSelection(string file, IArchiveReader reader)\n        {\n            IEnumerable<IArchiveEntry> filteredEntries;\n            \n            if (reader is FileArchiveReader)\n                filteredEntries = reader.Entries;\n            else\n                filteredEntries = reader.Entries.Where(x => !string.IsNullOrEmpty(x.Name) && !x.Name.EndsWith(Path.PathSeparator.ToString()) &&\n                    m_supportedExtensions.Any(y => y.Equals(Path.GetExtension(x.Name), StringComparison.OrdinalIgnoreCase)))\n                    .OrderBy(x => x.Name, StringComparer.OrdinalIgnoreCase).ToList();\n\n            if (chkPkContents.Checked)\n            {\n                IEnumerable<IArchiveEntry> pk3Entries = Util.GetEntriesByExtension(reader, Util.GetPkExtenstions()); //should check for MAPINFO (e.g. joyofmapping)\n\n                foreach (IArchiveEntry entry in pk3Entries)\n                {\n                    string extractedFile = Util.ExtractTempFile(m_temp.GetFullPath(), entry);\n                    using (IArchiveReader zaInner = ArchiveReader.Create(extractedFile))\n                        HandleDefaultSelection(extractedFile, zaInner);\n                }\n            }\n\n            foreach (IArchiveEntry entry in reader.Entries)\n            {\n                if (string.IsNullOrEmpty(entry.Name) || entry.IsDirectory)\n                    continue;\n\n                if (m_ct.IsCancellationRequested)\n                    break;\n\n                HandleAddItem(file, entry.FullName, entry.Name, filteredEntries.Contains(entry));\n            }\n        }\n\n        private void HandleAddItem(string file, string fullname, string name, bool isChecked)\n        {\n            isChecked = isChecked && m_autoSelect;\n\n            try\n            {\n                if (chkSupported.Checked)\n                {\n                    if (m_supportedExtensions.Any(x => x.Equals(Path.GetExtension(name), StringComparison.OrdinalIgnoreCase)))\n                    {\n                        if (isChecked)\n                            m_checkedItems.Add(m_items.Count);\n                        m_items.Add(fullname);\n                        m_filePaths.Add(new SpecificFilePath { ExtractedFile = file, InternalFilePath = fullname });\n                    }\n                }\n                else\n                {\n                    if (isChecked)\n                        m_checkedItems.Add(m_items.Count);\n                    m_items.Add(fullname);\n                    m_filePaths.Add(new SpecificFilePath { ExtractedFile = file, InternalFilePath = fullname });\n                }\n            }\n            catch\n            {\n                //i dunno\n            }\n        }\n\n        public static string[] GetSupportedFiles(string gameFileDirectory, IGameFile gameFile, string[] supportedExtensions)\n        {\n            List<string> files = new List<string>();\n            string path = Path.Combine(gameFileDirectory, gameFile.FileName);\n\n            // Directories do not have extensions, always add it\n            // Unmanaged pk3s should not be extracted\n            if (gameFile.IsDirectory() || (gameFile.IsUnmanaged() && !ArchiveUtil.ShouldReadPackagedArchive(gameFile.FileName)))\n            {\n                files.Add(gameFile.FileName);\n                return files.ToArray();\n            }\n\n            using (IArchiveReader reader = CreateArchiveReader(gameFile, path))\n            {\n                foreach (IArchiveEntry entry in reader.Entries)\n                {\n                    if (string.IsNullOrEmpty(entry.Name))\n                        continue;\n\n                    if (!supportedExtensions.Any(x => x.Equals(Path.GetExtension(entry.Name), StringComparison.OrdinalIgnoreCase)))\n                        continue;\n                    \n                    files.Add(entry.FullName);\n                }\n            }\n\n            return files.ToArray();\n        }\n\n        public string[] GetSpecificFiles()\n        {\n            return clbFiles.CheckedItems.Cast<string>().ToArray();\n        }\n\n        public List<SpecificFilePath> GetPathedSpecificFiles()\n        {\n            List<SpecificFilePath> ret = new List<SpecificFilePath>();\n            for (int i = 0; i < clbFiles.Items.Count; i++)\n            {\n                if (clbFiles.GetItemChecked(i))\n                    ret.Add(m_filePaths.First(x => x.InternalFilePath.Equals(clbFiles.Items[i])));\n            }\n\n            return ret;\n        }\n\n        private void btnSearch_Click(object sender, EventArgs e)\n        {\n            HandleSearch();\n        }\n\n        private void HandleSearch()\n        {\n            if (!string.IsNullOrEmpty(txtSearch.Text))\n            {\n                var items = m_items.Where(x => x.IndexOf(txtSearch.Text, StringComparison.OrdinalIgnoreCase) != -1);\n                clbFiles.Items.Clear();\n                clbFiles.Items.AddRange(items.ToArray());\n            }\n            else\n            {\n                clbFiles.Items.AddRange(m_items.ToArray());\n            }\n        }\n\n        private void btnOK_Click(object sender, EventArgs e)\n        {\n            if (chkPkContents.Visible && GetSpecificFiles().Length == 0) //really only need to validate if selecting a file to open w/utility\n            {\n                MessageBox.Show(this, \"At least one file must be selected.\", \"No Files Selected\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n            else\n            {\n                DialogResult = DialogResult.OK;\n                Close();\n            }\n        }\n\n        private void SpecificFilesForm_FormClosing(object sender, FormClosingEventArgs e)\n        {\n            if (m_ct != null)\n            {\n                m_closing = true;\n                m_ct.Cancel();\n            }\n        }\n\n        private void chkPkContents_CheckedChanged(object sender, EventArgs e)\n        {\n            SetGrid();\n        }\n\n        private void lnkSelect_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            for(int i = 0; i < clbFiles.Items.Count; i++)\n                clbFiles.SetItemChecked(i, m_select);\n\n            m_select = !m_select;\n        }\n\n        private void chkSupported_CheckedChanged(object sender, EventArgs e)\n        {\n            SetGrid();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/SpecificFilesForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/SplashScreen.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SplashScreen\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SplashScreen));\n            this.SuspendLayout();\n            // \n            // SplashScreen\n            // \n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;\n            this.BackColor = System.Drawing.Color.Magenta;\n            this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject(\"$this.BackgroundImage\")));\n            this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\n            this.ClientSize = new System.Drawing.Size(256, 256);\n            this.ControlBox = false;\n            this.DoubleBuffered = true;\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;\n            this.Name = \"SplashScreen\";\n            this.ShowIcon = false;\n            this.ShowInTaskbar = false;\n            this.Text = \"SplashScreen\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/SplashScreen.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class SplashScreen : Form\n    {\n        public SplashScreen()\n        {\n            SetStyle(ControlStyles.SupportsTransparentBackColor, true);\n            BackColor = Color.Transparent;\n            TransparencyKey = Color.Magenta;\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/SplashScreen.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.BackgroundImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        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\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/StatsInfo.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class StatsInfo\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(StatsInfo));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.tblInfoOuter = new System.Windows.Forms.TableLayoutPanel();\n            this.tblInner = new System.Windows.Forms.TableLayoutPanel();\n            this.label6 = new System.Windows.Forms.Label();\n            this.lblBoom = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label1 = new System.Windows.Forms.Label();\n            this.lblZdoom = new System.Windows.Forms.Label();\n            this.lblChocolate = new System.Windows.Forms.Label();\n            this.tblInfo = new System.Windows.Forms.TableLayoutPanel();\n            this.label4 = new System.Windows.Forms.Label();\n            this.pbInfo1 = new System.Windows.Forms.PictureBox();\n            this.label3 = new System.Windows.Forms.Label();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.tblInfoOuter.SuspendLayout();\n            this.tblInner.SuspendLayout();\n            this.tblInfo.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo1)).BeginInit();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.btnOK, 0, 2);\n            this.tblMain.Controls.Add(this.tblInfoOuter, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.Size = new System.Drawing.Size(400, 441);\n            this.tblMain.TabIndex = 0;\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.btnOK.Location = new System.Drawing.Point(322, 413);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(75, 23);\n            this.btnOK.TabIndex = 0;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);\n            // \n            // tblInfoOuter\n            // \n            this.tblInfoOuter.ColumnCount = 1;\n            this.tblInfoOuter.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInfoOuter.Controls.Add(this.tblInner, 0, 1);\n            this.tblInfoOuter.Controls.Add(this.tblInfo, 0, 0);\n            this.tblInfoOuter.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblInfoOuter.Location = new System.Drawing.Point(0, 26);\n            this.tblInfoOuter.Margin = new System.Windows.Forms.Padding(0);\n            this.tblInfoOuter.Name = \"tblInfoOuter\";\n            this.tblInfoOuter.RowCount = 2;\n            this.tblInfoOuter.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 80F));\n            this.tblInfoOuter.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInfoOuter.Size = new System.Drawing.Size(400, 383);\n            this.tblInfoOuter.TabIndex = 1;\n            // \n            // tblInner\n            // \n            this.tblInner.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single;\n            this.tblInner.ColumnCount = 2;\n            this.tblInner.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 100F));\n            this.tblInner.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInner.Controls.Add(this.label6, 0, 2);\n            this.tblInner.Controls.Add(this.lblBoom, 1, 1);\n            this.tblInner.Controls.Add(this.label2, 0, 1);\n            this.tblInner.Controls.Add(this.label1, 0, 0);\n            this.tblInner.Controls.Add(this.lblZdoom, 1, 0);\n            this.tblInner.Controls.Add(this.lblChocolate, 1, 2);\n            this.tblInner.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblInner.Location = new System.Drawing.Point(3, 83);\n            this.tblInner.Name = \"tblInner\";\n            this.tblInner.RowCount = 3;\n            this.tblInner.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F));\n            this.tblInner.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F));\n            this.tblInner.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F));\n            this.tblInner.Size = new System.Drawing.Size(394, 297);\n            this.tblInner.TabIndex = 2;\n            // \n            // label6\n            // \n            this.label6.AutoSize = true;\n            this.label6.Location = new System.Drawing.Point(4, 207);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(92, 39);\n            this.label6.TabIndex = 6;\n            this.label6.Text = \"Chocolate Doom, CNDoom, CRL, Inter-Doom\";\n            // \n            // lblBoom\n            // \n            this.lblBoom.AutoSize = true;\n            this.lblBoom.Location = new System.Drawing.Point(105, 119);\n            this.lblBoom.Name = \"lblBoom\";\n            this.lblBoom.Size = new System.Drawing.Size(0, 13);\n            this.lblBoom.TabIndex = 3;\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(4, 119);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(74, 52);\n            this.label2.TabIndex = 2;\n            this.label2.Text = \"Crispy Doom, PrBoom+, DSDA-Doom, Nyan Doom, Helion, Woof!\";\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(4, 1);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(42, 13);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"ZDoom\";\n            // \n            // lblZdoom\n            // \n            this.lblZdoom.AutoSize = true;\n            this.lblZdoom.Location = new System.Drawing.Point(105, 1);\n            this.lblZdoom.Name = \"lblZdoom\";\n            this.lblZdoom.Size = new System.Drawing.Size(0, 13);\n            this.lblZdoom.TabIndex = 1;\n            // \n            // lblChocolate\n            // \n            this.lblChocolate.AutoSize = true;\n            this.lblChocolate.Location = new System.Drawing.Point(105, 207);\n            this.lblChocolate.Name = \"lblChocolate\";\n            this.lblChocolate.Size = new System.Drawing.Size(0, 13);\n            this.lblChocolate.TabIndex = 7;\n            // \n            // tblInfo\n            // \n            this.tblInfo.ColumnCount = 2;\n            this.tblInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblInfo.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblInfo.Controls.Add(this.label4, 1, 1);\n            this.tblInfo.Controls.Add(this.pbInfo1, 0, 0);\n            this.tblInfo.Controls.Add(this.label3, 1, 0);\n            this.tblInfo.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblInfo.Location = new System.Drawing.Point(0, 0);\n            this.tblInfo.Margin = new System.Windows.Forms.Padding(0);\n            this.tblInfo.Name = \"tblInfo\";\n            this.tblInfo.RowCount = 2;\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblInfo.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tblInfo.Size = new System.Drawing.Size(400, 80);\n            this.tblInfo.TabIndex = 3;\n            // \n            // label4\n            // \n            this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(35, 53);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(262, 13);\n            this.label4.TabIndex = 3;\n            this.label4.Text = \"Statistics recording is supported for the following ports:\";\n            // \n            // pbInfo1\n            // \n            this.pbInfo1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbInfo1.InitialImage = null;\n            this.pbInfo1.Location = new System.Drawing.Point(0, 0);\n            this.pbInfo1.Margin = new System.Windows.Forms.Padding(0);\n            this.pbInfo1.Name = \"pbInfo1\";\n            this.pbInfo1.Size = new System.Drawing.Size(32, 40);\n            this.pbInfo1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbInfo1.TabIndex = 0;\n            this.pbInfo1.TabStop = false;\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(35, 7);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(361, 26);\n            this.label3.TabIndex = 2;\n            this.label3.Text = \"The \\'Save Statistics\\' option will become available when a supported source port i\" +\n    \"s selected\";\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(400, 26);\n            this.titleBar.TabIndex = 2;\n            this.titleBar.Title = \"Save Statistics\";\n            // \n            // StatsInfo\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(400, 441);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Name = \"StatsInfo\";\n            this.Text = \"Save Statistics\";\n            this.tblMain.ResumeLayout(false);\n            this.tblInfoOuter.ResumeLayout(false);\n            this.tblInner.ResumeLayout(false);\n            this.tblInner.PerformLayout();\n            this.tblInfo.ResumeLayout(false);\n            this.tblInfo.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbInfo1)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.TableLayoutPanel tblInfoOuter;\n        private System.Windows.Forms.TableLayoutPanel tblInner;\n        private System.Windows.Forms.Label lblBoom;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label lblZdoom;\n        private System.Windows.Forms.TableLayoutPanel tblInfo;\n        private System.Windows.Forms.PictureBox pbInfo1;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.Label lblChocolate;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/StatsInfo.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class StatsInfo : Form\n    {\n        public StatsInfo()\n        {\n            InitializeComponent();\n\n            pbInfo1.Image = DoomLauncher.Properties.Resources.bon2b;\n\n            lblZdoom.Text = \"For all ZDoom based ports. Uses save games to parse statistics. This means statistics cannot be read for the last level of an episode. \" +\n                \"Items and skill level are not available for ZDoom, Zandronum, and GZDoom pre-3.5.0. Statistics will be recorded when the game is saved or when an auto save is generated.\";\n            lblBoom.Text = \"Uses the -levelstat parameter and parses the generated levelstat.txt. All statistics will be recorded when the game has exited.\";\n            lblChocolate.Text = \"Uses the -statdump parameter and parses the generated stats.txt. All statistics will be recorded when the game has exited. ExM8 maps are only generated by CNDoom.\";\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        private void btnOK_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/StatsInfo.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/SyncStatusForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class SyncStatusForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SyncStatusForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.dgvFiles = new DoomLauncher.CDataGridView();\n            this.FileName = new System.Windows.Forms.DataGridViewTextBoxColumn();\n            this.Selected = new System.Windows.Forms.DataGridViewCheckBoxColumn();\n            this.btnSelectAll = new System.Windows.Forms.Button();\n            this.flpBottom = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnContinue = new System.Windows.Forms.Button();\n            this.cmbOptions = new System.Windows.Forms.ComboBox();\n            this.lblHeader = new System.Windows.Forms.Label();\n            this.tblMain.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.dgvFiles)).BeginInit();\n            this.flpBottom.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.dgvFiles, 0, 1);\n            this.tblMain.Controls.Add(this.btnSelectAll, 0, 2);\n            this.tblMain.Controls.Add(this.flpBottom, 0, 3);\n            this.tblMain.Controls.Add(this.lblHeader, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 4;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.Size = new System.Drawing.Size(365, 311);\n            this.tblMain.TabIndex = 0;\n            // \n            // dgvFiles\n            // \n            this.dgvFiles.AllowUserToAddRows = false;\n            this.dgvFiles.AllowUserToDeleteRows = false;\n            this.dgvFiles.AllowUserToOrderColumns = true;\n            dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));\n            this.dgvFiles.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;\n            this.dgvFiles.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;\n            this.dgvFiles.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal;\n            this.dgvFiles.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\n            this.dgvFiles.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\n            this.FileName,\n            this.Selected});\n            this.dgvFiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dgvFiles.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter;\n            this.dgvFiles.GridColor = System.Drawing.SystemColors.ActiveBorder;\n            this.dgvFiles.Location = new System.Drawing.Point(3, 35);\n            this.dgvFiles.Name = \"dgvFiles\";\n            this.dgvFiles.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\n            this.dgvFiles.Size = new System.Drawing.Size(359, 209);\n            this.dgvFiles.TabIndex = 2;\n            // \n            // FileName\n            // \n            this.FileName.DataPropertyName = \"FileName\";\n            this.FileName.HeaderText = \"FileName\";\n            this.FileName.Name = \"FileName\";\n            this.FileName.ReadOnly = true;\n            // \n            // Selected\n            // \n            this.Selected.DataPropertyName = \"Selected\";\n            this.Selected.HeaderText = \"\";\n            this.Selected.Name = \"Selected\";\n            // \n            // btnSelectAll\n            // \n            this.btnSelectAll.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.btnSelectAll.Location = new System.Drawing.Point(287, 251);\n            this.btnSelectAll.Name = \"btnSelectAll\";\n            this.btnSelectAll.Size = new System.Drawing.Size(75, 23);\n            this.btnSelectAll.TabIndex = 3;\n            this.btnSelectAll.Text = \"Select All\";\n            this.btnSelectAll.UseVisualStyleBackColor = true;\n            this.btnSelectAll.Click += new System.EventHandler(this.btnSelectAll_Click);\n            // \n            // flpBottom\n            // \n            this.flpBottom.Controls.Add(this.btnContinue);\n            this.flpBottom.Controls.Add(this.cmbOptions);\n            this.flpBottom.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpBottom.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpBottom.Location = new System.Drawing.Point(0, 279);\n            this.flpBottom.Margin = new System.Windows.Forms.Padding(0);\n            this.flpBottom.Name = \"flpBottom\";\n            this.flpBottom.Size = new System.Drawing.Size(365, 32);\n            this.flpBottom.TabIndex = 4;\n            // \n            // btnContinue\n            // \n            this.btnContinue.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnContinue.Location = new System.Drawing.Point(287, 3);\n            this.btnContinue.Name = \"btnContinue\";\n            this.btnContinue.Size = new System.Drawing.Size(75, 23);\n            this.btnContinue.TabIndex = 1;\n            this.btnContinue.Text = \"Continue\";\n            this.btnContinue.UseVisualStyleBackColor = true;\n            // \n            // cmbOptions\n            // \n            this.cmbOptions.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.cmbOptions.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbOptions.FormattingEnabled = true;\n            this.cmbOptions.Location = new System.Drawing.Point(157, 4);\n            this.cmbOptions.Margin = new System.Windows.Forms.Padding(3, 3, 6, 3);\n            this.cmbOptions.Name = \"cmbOptions\";\n            this.cmbOptions.Size = new System.Drawing.Size(121, 21);\n            this.cmbOptions.TabIndex = 0;\n            // \n            // lblHeader\n            // \n            this.lblHeader.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lblHeader.AutoSize = true;\n            this.lblHeader.Location = new System.Drawing.Point(3, 9);\n            this.lblHeader.Name = \"lblHeader\";\n            this.lblHeader.Size = new System.Drawing.Size(13, 13);\n            this.lblHeader.TabIndex = 5;\n            this.lblHeader.Text = \"  \";\n            // \n            // SyncStatusForm\n            // \n            this.AcceptButton = this.btnContinue;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(365, 311);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Name = \"SyncStatusForm\";\n            this.Text = \"SyncStatusFile\";\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.dgvFiles)).EndInit();\n            this.flpBottom.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private CDataGridView dgvFiles;\n        private System.Windows.Forms.DataGridViewTextBoxColumn FileName;\n        private System.Windows.Forms.DataGridViewCheckBoxColumn Selected;\n        private System.Windows.Forms.Button btnSelectAll;\n        private System.Windows.Forms.FlowLayoutPanel flpBottom;\n        private System.Windows.Forms.ComboBox cmbOptions;\n        private System.Windows.Forms.Button btnContinue;\n        private System.Windows.Forms.Label lblHeader;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/SyncStatusForm.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class SyncStatusForm : Form\n    {\n        public SyncStatusForm()\n        {\n            InitializeComponent();\n\n            dgvFiles.Columns[dgvFiles.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public void SetHeaderText(string text)\n        {\n            lblHeader.Text = text;\n        }\n\n        public void SetData(IEnumerable<string> files, IEnumerable<string> dropDownOptions)\n        {\n            List<SyncFileData> syncFiles = files.Select(x => new SyncFileData(x)).OrderBy(x => x.FileName).ToList();\n            dgvFiles.DataSource = syncFiles;\n\n            cmbOptions.DataSource = dropDownOptions.ToList();\n        }\n\n        public List<string> GetSelectedFiles()\n        {\n            List<SyncFileData> syncFiles = dgvFiles.DataSource as List<SyncFileData>;\n            return syncFiles.Where(x => x.Selected).Select(x => x.FileName).ToList();\n        }\n\n        public int SelectedOptionIndex\n        {\n            get { return cmbOptions.SelectedIndex; }\n        }\n\n        private void btnSelectAll_Click(object sender, EventArgs e)\n        {\n            List<SyncFileData> syncFiles = dgvFiles.DataSource as List<SyncFileData>;\n\n            if (syncFiles.Count > 0)\n            {\n                bool select = !syncFiles[0].Selected;\n\n                foreach (SyncFileData file in syncFiles)\n                    file.Selected = select;\n\n                dgvFiles.DataSource = null;\n                dgvFiles.DataSource = syncFiles;\n\n                dgvFiles.Columns[dgvFiles.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;\n                dgvFiles.Columns[dgvFiles.Columns.Count - 1].HeaderText = string.Empty;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/SyncStatusForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"FileName.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"Selected.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/TagEditForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TagEditForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TagEditForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flowLayoutPanel1, 0, 2);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.Size = new System.Drawing.Size(382, 277);\n            this.tblMain.TabIndex = 0;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.Controls.Add(this.btnCancel);\n            this.flowLayoutPanel1.Controls.Add(this.btnOK);\n            this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 238);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(382, 39);\n            this.flowLayoutPanel1.TabIndex = 0;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(278, 4);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(100, 28);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnOK\n            // \n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(170, 4);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(100, 28);\n            this.btnOK.TabIndex = 1;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(3, 2);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.RememberNormalSize = true;\n            this.titleBar.Size = new System.Drawing.Size(376, 28);\n            this.titleBar.TabIndex = 1;\n            this.titleBar.Title = \"Tag\";\n            // \n            // TagEditForm\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(382, 277);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.Name = \"TagEditForm\";\n            this.ShowInTaskbar = false;\n            this.Text = \"Tag\";\n            this.tblMain.ResumeLayout(false);\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/TagEditForm.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class TagEditForm : Form\n    {\n        private TagEdit m_tagEdit;\n\n        public TagEditForm()\n        {\n            InitializeComponent();\n\n            m_tagEdit = new TagEdit();\n            m_tagEdit.Dock = DockStyle.Fill;\n            tblMain.Controls.Add(m_tagEdit, 0, 1);\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public TagEdit TagEditControl\n        {\n            get { return m_tagEdit; }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/TagEditForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/TagForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TagForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TagForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(0);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 2;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Size = new System.Drawing.Size(936, 678);\n            this.tblMain.TabIndex = 0;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(936, 40);\n            this.titleBar.TabIndex = 0;\n            this.titleBar.Title = \"Manage Tags\";\n            // \n            // TagForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(936, 678);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"TagForm\";\n            this.ShowInTaskbar = false;\n            this.Text = \"Manage Tags\";\n            this.tblMain.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/TagForm.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class TagForm : Form\n    {\n        private readonly TagControl m_tabCtrl;\n\n        public TagForm()\n        {\n            InitializeComponent();\n\n            m_tabCtrl = new TagControl();\n            m_tabCtrl.Dock = DockStyle.Fill;\n            tblMain.Controls.Add(m_tabCtrl, 0, 1);\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public void Init(IDataSourceAdapter adapter)\n        {\n            m_tabCtrl.Init(adapter);\n        }\n\n        public TagControl TagControl\n        {\n            get { return m_tabCtrl; }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/TagForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/TagSelectForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TagSelectForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TagSelectForm));\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.tagSelectControl = new DoomLauncher.Controls.TagSelectControl();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flpButtons, 0, 2);\n            this.tblMain.Controls.Add(this.tagSelectControl, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.Size = new System.Drawing.Size(486, 925);\n            this.tblMain.TabIndex = 1;\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnCancel);\n            this.flpButtons.Controls.Add(this.btnOK);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpButtons.Location = new System.Drawing.Point(0, 876);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(486, 49);\n            this.flpButtons.TabIndex = 3;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(370, 5);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(112, 35);\n            this.btnCancel.TabIndex = 3;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(250, 5);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(112, 35);\n            this.btnOK.TabIndex = 2;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            // \n            // tagSelectControl\n            // \n            this.tagSelectControl.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.tagSelectControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tagSelectControl.ForeColor = System.Drawing.Color.White;\n            this.tagSelectControl.Location = new System.Drawing.Point(6, 48);\n            this.tagSelectControl.Margin = new System.Windows.Forms.Padding(6, 8, 6, 8);\n            this.tagSelectControl.Name = \"tagSelectControl\";\n            this.tagSelectControl.Size = new System.Drawing.Size(474, 820);\n            this.tagSelectControl.TabIndex = 4;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(3, 3);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(480, 34);\n            this.titleBar.TabIndex = 5;\n            this.titleBar.Title = \"Select Tags\";\n            // \n            // TagSelectForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(486, 925);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"TagSelectForm\";\n            this.Text = \"Select Tags\";\n            this.tblMain.ResumeLayout(false);\n            this.flpButtons.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private Controls.TagSelectControl tagSelectControl;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/TagSelectForm.cs",
    "content": "﻿using DoomLauncher.Controls;\nusing System;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class TagSelectForm : Form\n    {\n        public TagSelectForm()\n        {\n            InitializeComponent();\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public TagSelectControl TagSelectControl => tagSelectControl;\n\n        protected override void OnShown(EventArgs e)\n        {\n            // DataGridViews make no sense sometimes, the checks are being cleared between setting/show so reset the DataSource here\n            base.OnShown(e);\n            TagSelectControl.SetCheckedTags();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/TagSelectForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/TextBoxForm.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TextBoxForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TextBoxForm));\n            this.tblContainer = new System.Windows.Forms.TableLayoutPanel();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.txtText = new System.Windows.Forms.TextBox();\n            this.lblHeader = new DoomLauncher.GrowLabel();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.lnk = new System.Windows.Forms.LinkLabel();\n            this.chk = new DoomLauncher.CCheckBox();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblContainer.SuspendLayout();\n            this.tblMain.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tblContainer\n            // \n            this.tblContainer.ColumnCount = 1;\n            this.tblContainer.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblContainer.Controls.Add(this.tblMain, 0, 1);\n            this.tblContainer.Controls.Add(this.titleBar, 0, 0);\n            this.tblContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblContainer.Location = new System.Drawing.Point(0, 0);\n            this.tblContainer.Margin = new System.Windows.Forms.Padding(0);\n            this.tblContainer.Name = \"tblContainer\";\n            this.tblContainer.RowCount = 2;\n            this.tblContainer.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblContainer.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblContainer.Size = new System.Drawing.Size(800, 450);\n            this.tblContainer.TabIndex = 2;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.txtText, 0, 3);\n            this.tblMain.Controls.Add(this.lblHeader, 0, 0);\n            this.tblMain.Controls.Add(this.flpButtons, 0, 4);\n            this.tblMain.Controls.Add(this.lnk, 0, 2);\n            this.tblMain.Controls.Add(this.chk, 0, 1);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(4, 45);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 5;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.Size = new System.Drawing.Size(792, 400);\n            this.tblMain.TabIndex = 0;\n            // \n            // txtText\n            // \n            this.txtText.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtText.Location = new System.Drawing.Point(4, 152);\n            this.txtText.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtText.Multiline = true;\n            this.txtText.Name = \"txtText\";\n            this.txtText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.txtText.Size = new System.Drawing.Size(784, 194);\n            this.txtText.TabIndex = 0;\n            // \n            // lblHeader\n            // \n            this.lblHeader.AutoSize = true;\n            this.lblHeader.IsPath = false;\n            this.lblHeader.Location = new System.Drawing.Point(4, 5);\n            this.lblHeader.Margin = new System.Windows.Forms.Padding(4, 5, 0, 0);\n            this.lblHeader.Name = \"lblHeader\";\n            this.lblHeader.Size = new System.Drawing.Size(39, 20);\n            this.lblHeader.TabIndex = 2;\n            this.lblHeader.Text = \"Text\";\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnCancel);\n            this.flpButtons.Controls.Add(this.btnOK);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpButtons.Location = new System.Drawing.Point(0, 351);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(0);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(792, 49);\n            this.flpButtons.TabIndex = 3;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(676, 5);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(112, 35);\n            this.btnCancel.TabIndex = 3;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOK.Location = new System.Drawing.Point(556, 5);\n            this.btnOK.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(112, 35);\n            this.btnOK.TabIndex = 2;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.btnOK_Click_1);\n            // \n            // lnk\n            // \n            this.lnk.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lnk.AutoSize = true;\n            this.lnk.Location = new System.Drawing.Point(4, 112);\n            this.lnk.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lnk.Name = \"lnk\";\n            this.lnk.Size = new System.Drawing.Size(38, 20);\n            this.lnk.TabIndex = 4;\n            this.lnk.TabStop = true;\n            this.lnk.Text = \"Link\";\n            this.lnk.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnk_LinkClicked);\n            // \n            // chk\n            // \n            this.chk.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.chk.AutoSize = true;\n            this.chk.Location = new System.Drawing.Point(4, 61);\n            this.chk.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.chk.Name = \"chk\";\n            this.chk.Size = new System.Drawing.Size(107, 24);\n            this.chk.TabIndex = 5;\n            this.chk.Text = \"CheckBox\";\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.CanClose = true;\n            this.titleBar.ControlBox = true;\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(800, 40);\n            this.titleBar.TabIndex = 1;\n            this.titleBar.Title = \"Title\";\n            // \n            // TextBoxForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(800, 450);\n            this.Controls.Add(this.tblContainer);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Name = \"TextBoxForm\";\n            this.Text = \"TextBoxForm2\";\n            this.tblContainer.ResumeLayout(false);\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.flpButtons.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tblContainer;\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.TextBox txtText;\n        private GrowLabel lblHeader;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.LinkLabel lnk;\n        private CCheckBox chk;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/TextBoxForm.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class TextBoxForm : Form\n    {\n        private static readonly int s_headerRow = 0;\n        private static readonly int s_checkBoxRow = 1;\n        private static readonly int s_linkRow = 2;\n        private string m_url;\n\n        const int TitleBarHeight = 40;\n\n        public TextBoxForm()\n            : this(true, MessageBoxButtons.OK)\n        {\n\n        }\n\n        public TextBoxForm(bool multiline, MessageBoxButtons buttons)\n        {\n            InitializeComponent();\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n\n            if (buttons != MessageBoxButtons.OK && buttons != MessageBoxButtons.OKCancel)\n                throw new NotSupportedException(buttons.ToString() + \" not supported\");\n\n            btnCancel.Visible = buttons == MessageBoxButtons.OKCancel;\n\n            HeaderText = string.Empty;\n            txtText.Multiline = multiline;\n\n            if (!multiline)\n            {\n                Height = dpiScale.ScaleIntY(100 + TitleBarHeight);\n                Width = dpiScale.ScaleIntX(300);\n            }\n\n            tblMain.RowStyles[s_checkBoxRow].Height = 0;\n            tblMain.RowStyles[s_linkRow].Height = 0;\n            lnk.Visible = false;\n            chk.Visible = false;\n\n            AcceptButton = btnOK;\n            CancelButton = btnCancel;\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public string Title\n        {\n            get { return titleBar.Title; }\n            set\n            {\n                titleBar.Title = value;\n                Text = value;\n            }\n        }\n\n        public void SetCheckBox(string text)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            chk.Visible = true;\n            chk.Text = text;\n            tblMain.RowStyles[s_checkBoxRow].Height = dpiScale.ScaleIntY(32);\n            Height += dpiScale.ScaleIntY(32);\n        }\n\n        public void SetLink(string text, string url)\n        {\n            DpiScale dpiScale = new DpiScale(CreateGraphics());\n            lnk.Visible = true;\n            lnk.Text = text;\n            m_url = url;\n            tblMain.RowStyles[s_linkRow].Height = dpiScale.ScaleIntY(32);\n            Height += dpiScale.ScaleIntY(32);\n        }\n\n        public void SetMaxLength(int length)\n        {\n            txtText.MaxLength = length;\n        }\n\n        public void SelectDisplayText(int start, int length)\n        {\n            txtText.Select(start, length);\n        }\n\n        public string DisplayText\n        {\n            get { return txtText.Text; }\n            set { txtText.Text = value; }\n        }\n\n        public bool CheckBoxChecked\n        {\n            get { return chk.Checked; }\n            set { chk.Checked = value; }\n        }\n\n        public void AppendText(string text)\n        {\n            txtText.Text += text;\n        }\n\n        public string HeaderText\n        {\n            get { return lblHeader.Text; }\n            set\n            {\n                lblHeader.Text = value;\n                tblMain.RowStyles[s_headerRow].Height = lblHeader.Height + 3;\n            }\n        }\n\n        private void lnk_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Process.Start(m_url);\n        }\n\n        private void btnOK_Click_1(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/TextBoxForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/TxtGenerator.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TxtGenerator\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TxtGenerator));\n            this.btnGenerate = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.tblMain = new DoomLauncher.TableLayoutPanelDB();\n            this.flpButtons = new System.Windows.Forms.FlowLayoutPanel();\n            this.tabControl = new DoomLauncher.CTabControl();\n            this.tabPage1 = new System.Windows.Forms.TabPage();\n            this.tblLayout1 = new DoomLauncher.TableLayoutPanelDB();\n            this.cmbPrimaryPurpose = new System.Windows.Forms.ComboBox();\n            this.txtAdditionalCredits = new System.Windows.Forms.TextBox();\n            this.txtDescription = new System.Windows.Forms.TextBox();\n            this.txtMiscAuthor = new System.Windows.Forms.TextBox();\n            this.txtOtherFiles = new System.Windows.Forms.TextBox();\n            this.txtEmail = new System.Windows.Forms.TextBox();\n            this.txtAuthor = new System.Windows.Forms.TextBox();\n            this.txtFilename = new System.Windows.Forms.TextBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label4 = new System.Windows.Forms.Label();\n            this.label5 = new System.Windows.Forms.Label();\n            this.label6 = new System.Windows.Forms.Label();\n            this.label7 = new System.Windows.Forms.Label();\n            this.label8 = new System.Windows.Forms.Label();\n            this.label9 = new System.Windows.Forms.Label();\n            this.txtTile = new System.Windows.Forms.TextBox();\n            this.dtRelease = new System.Windows.Forms.DateTimePicker();\n            this.label35 = new System.Windows.Forms.Label();\n            this.cmbEngine = new System.Windows.Forms.ComboBox();\n            this.label34 = new System.Windows.Forms.Label();\n            this.tabPage2 = new System.Windows.Forms.TabPage();\n            this.tblLayout2 = new System.Windows.Forms.TableLayoutPanel();\n            this.chkGraphics = new System.Windows.Forms.CheckBox();\n            this.chkMusic = new System.Windows.Forms.CheckBox();\n            this.label12 = new System.Windows.Forms.Label();\n            this.label10 = new System.Windows.Forms.Label();\n            this.numLevels = new System.Windows.Forms.NumericUpDown();\n            this.label11 = new System.Windows.Forms.Label();\n            this.chkSounds = new System.Windows.Forms.CheckBox();\n            this.label13 = new System.Windows.Forms.Label();\n            this.label14 = new System.Windows.Forms.Label();\n            this.label15 = new System.Windows.Forms.Label();\n            this.label16 = new System.Windows.Forms.Label();\n            this.label17 = new System.Windows.Forms.Label();\n            this.chkDehacked = new System.Windows.Forms.CheckBox();\n            this.chkDemos = new System.Windows.Forms.CheckBox();\n            this.chkOther = new System.Windows.Forms.CheckBox();\n            this.txtOtherFilesRequired = new System.Windows.Forms.TextBox();\n            this.tabPage3 = new System.Windows.Forms.TabPage();\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.txtOtherGameStyles = new System.Windows.Forms.TextBox();\n            this.cmbDeathmatch = new System.Windows.Forms.ComboBox();\n            this.cmbCoop = new System.Windows.Forms.ComboBox();\n            this.cmbSingle = new System.Windows.Forms.ComboBox();\n            this.label18 = new System.Windows.Forms.Label();\n            this.label19 = new System.Windows.Forms.Label();\n            this.label20 = new System.Windows.Forms.Label();\n            this.label21 = new System.Windows.Forms.Label();\n            this.label22 = new System.Windows.Forms.Label();\n            this.label23 = new System.Windows.Forms.Label();\n            this.label24 = new System.Windows.Forms.Label();\n            this.cmbGame = new System.Windows.Forms.ComboBox();\n            this.txtMaps = new System.Windows.Forms.TextBox();\n            this.chkDifficulty = new System.Windows.Forms.CheckBox();\n            this.tabPage4 = new System.Windows.Forms.TabPage();\n            this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();\n            this.label26 = new System.Windows.Forms.Label();\n            this.label30 = new System.Windows.Forms.Label();\n            this.label29 = new System.Windows.Forms.Label();\n            this.label28 = new System.Windows.Forms.Label();\n            this.label25 = new System.Windows.Forms.Label();\n            this.label27 = new System.Windows.Forms.Label();\n            this.cmbBase = new System.Windows.Forms.ComboBox();\n            this.txtBuildTime = new System.Windows.Forms.TextBox();\n            this.txtEditorsUsed = new System.Windows.Forms.TextBox();\n            this.txtKnownBugs = new System.Windows.Forms.TextBox();\n            this.txtMayNotRun = new System.Windows.Forms.TextBox();\n            this.txtTestedWith = new System.Windows.Forms.TextBox();\n            this.tabPage5 = new System.Windows.Forms.TabPage();\n            this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();\n            this.label31 = new System.Windows.Forms.Label();\n            this.cmbPermission = new System.Windows.Forms.ComboBox();\n            this.label32 = new System.Windows.Forms.Label();\n            this.label33 = new System.Windows.Forms.Label();\n            this.txtWebSites = new System.Windows.Forms.TextBox();\n            this.txtFtpSites = new System.Windows.Forms.TextBox();\n            this.titleBar = new DoomLauncher.Controls.TitleBarControl();\n            this.tblMain.SuspendLayout();\n            this.flpButtons.SuspendLayout();\n            this.tabControl.SuspendLayout();\n            this.tabPage1.SuspendLayout();\n            this.tblLayout1.SuspendLayout();\n            this.tabPage2.SuspendLayout();\n            this.tblLayout2.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.numLevels)).BeginInit();\n            this.tabPage3.SuspendLayout();\n            this.tableLayoutPanel1.SuspendLayout();\n            this.tabPage4.SuspendLayout();\n            this.tableLayoutPanel2.SuspendLayout();\n            this.tabPage5.SuspendLayout();\n            this.tableLayoutPanel3.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnGenerate\n            // \n            this.btnGenerate.Location = new System.Drawing.Point(541, 5);\n            this.btnGenerate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnGenerate.Name = \"btnGenerate\";\n            this.btnGenerate.Size = new System.Drawing.Size(112, 35);\n            this.btnGenerate.TabIndex = 1;\n            this.btnGenerate.Text = \"Generate\";\n            this.btnGenerate.UseVisualStyleBackColor = true;\n            this.btnGenerate.Click += new System.EventHandler(this.btnOK_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(661, 5);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(112, 35);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Close\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // tblMain\n            // \n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.flpButtons, 0, 2);\n            this.tblMain.Controls.Add(this.tabControl, 0, 1);\n            this.tblMain.Controls.Add(this.titleBar, 0, 0);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 3;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 62F));\n            this.tblMain.Size = new System.Drawing.Size(785, 779);\n            this.tblMain.TabIndex = 0;\n            // \n            // flpButtons\n            // \n            this.flpButtons.Controls.Add(this.btnCancel);\n            this.flpButtons.Controls.Add(this.btnGenerate);\n            this.flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flpButtons.Location = new System.Drawing.Point(4, 722);\n            this.flpButtons.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.flpButtons.Name = \"flpButtons\";\n            this.flpButtons.Size = new System.Drawing.Size(777, 52);\n            this.flpButtons.TabIndex = 1;\n            // \n            // tabControl\n            // \n            this.tabControl.Controls.Add(this.tabPage1);\n            this.tabControl.Controls.Add(this.tabPage2);\n            this.tabControl.Controls.Add(this.tabPage3);\n            this.tabControl.Controls.Add(this.tabPage4);\n            this.tabControl.Controls.Add(this.tabPage5);\n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;\n            this.tabControl.Location = new System.Drawing.Point(4, 45);\n            this.tabControl.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabControl.Multiline = true;\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(777, 667);\n            this.tabControl.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;\n            this.tabControl.TabIndex = 2;\n            // \n            // tabPage1\n            // \n            this.tabPage1.Controls.Add(this.tblLayout1);\n            this.tabPage1.Location = new System.Drawing.Point(4, 29);\n            this.tabPage1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPage1.Name = \"tabPage1\";\n            this.tabPage1.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPage1.Size = new System.Drawing.Size(769, 634);\n            this.tabPage1.TabIndex = 0;\n            this.tabPage1.Text = \"General\";\n            this.tabPage1.UseVisualStyleBackColor = true;\n            // \n            // tblLayout1\n            // \n            this.tblLayout1.ColumnCount = 2;\n            this.tblLayout1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 240F));\n            this.tblLayout1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblLayout1.Controls.Add(this.cmbPrimaryPurpose, 1, 1);\n            this.tblLayout1.Controls.Add(this.txtAdditionalCredits, 1, 10);\n            this.tblLayout1.Controls.Add(this.txtDescription, 1, 9);\n            this.tblLayout1.Controls.Add(this.txtMiscAuthor, 1, 8);\n            this.tblLayout1.Controls.Add(this.txtOtherFiles, 1, 7);\n            this.tblLayout1.Controls.Add(this.txtEmail, 1, 6);\n            this.tblLayout1.Controls.Add(this.txtAuthor, 1, 5);\n            this.tblLayout1.Controls.Add(this.txtFilename, 1, 3);\n            this.tblLayout1.Controls.Add(this.label1, 0, 2);\n            this.tblLayout1.Controls.Add(this.label2, 0, 3);\n            this.tblLayout1.Controls.Add(this.label3, 0, 4);\n            this.tblLayout1.Controls.Add(this.label4, 0, 5);\n            this.tblLayout1.Controls.Add(this.label5, 0, 6);\n            this.tblLayout1.Controls.Add(this.label6, 0, 7);\n            this.tblLayout1.Controls.Add(this.label7, 0, 8);\n            this.tblLayout1.Controls.Add(this.label8, 0, 9);\n            this.tblLayout1.Controls.Add(this.label9, 0, 10);\n            this.tblLayout1.Controls.Add(this.txtTile, 1, 2);\n            this.tblLayout1.Controls.Add(this.dtRelease, 1, 4);\n            this.tblLayout1.Controls.Add(this.label35, 0, 1);\n            this.tblLayout1.Controls.Add(this.cmbEngine, 1, 0);\n            this.tblLayout1.Controls.Add(this.label34, 0, 0);\n            this.tblLayout1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblLayout1.Location = new System.Drawing.Point(4, 5);\n            this.tblLayout1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblLayout1.Name = \"tblLayout1\";\n            this.tblLayout1.RowCount = 13;\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 246F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout1.Size = new System.Drawing.Size(761, 624);\n            this.tblLayout1.TabIndex = 1;\n            // \n            // cmbPrimaryPurpose\n            // \n            this.cmbPrimaryPurpose.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbPrimaryPurpose.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbPrimaryPurpose.FormattingEnabled = true;\n            this.cmbPrimaryPurpose.Items.AddRange(new object[] {\n            \"Single+Coop play\",\n            \"Deathmatch\",\n            \"No levels included\"});\n            this.cmbPrimaryPurpose.Location = new System.Drawing.Point(244, 42);\n            this.cmbPrimaryPurpose.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbPrimaryPurpose.Name = \"cmbPrimaryPurpose\";\n            this.cmbPrimaryPurpose.Size = new System.Drawing.Size(513, 28);\n            this.cmbPrimaryPurpose.TabIndex = 22;\n            // \n            // txtAdditionalCredits\n            // \n            this.txtAdditionalCredits.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtAdditionalCredits.Location = new System.Drawing.Point(244, 584);\n            this.txtAdditionalCredits.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtAdditionalCredits.Name = \"txtAdditionalCredits\";\n            this.txtAdditionalCredits.Size = new System.Drawing.Size(513, 26);\n            this.txtAdditionalCredits.TabIndex = 17;\n            // \n            // txtDescription\n            // \n            this.txtDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtDescription.Location = new System.Drawing.Point(244, 338);\n            this.txtDescription.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtDescription.Multiline = true;\n            this.txtDescription.Name = \"txtDescription\";\n            this.txtDescription.Size = new System.Drawing.Size(513, 236);\n            this.txtDescription.TabIndex = 16;\n            // \n            // txtMiscAuthor\n            // \n            this.txtMiscAuthor.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtMiscAuthor.Location = new System.Drawing.Point(244, 301);\n            this.txtMiscAuthor.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtMiscAuthor.Name = \"txtMiscAuthor\";\n            this.txtMiscAuthor.Size = new System.Drawing.Size(513, 26);\n            this.txtMiscAuthor.TabIndex = 15;\n            // \n            // txtOtherFiles\n            // \n            this.txtOtherFiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtOtherFiles.Location = new System.Drawing.Point(244, 264);\n            this.txtOtherFiles.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtOtherFiles.Name = \"txtOtherFiles\";\n            this.txtOtherFiles.Size = new System.Drawing.Size(513, 26);\n            this.txtOtherFiles.TabIndex = 14;\n            // \n            // txtEmail\n            // \n            this.txtEmail.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtEmail.Location = new System.Drawing.Point(244, 227);\n            this.txtEmail.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtEmail.Name = \"txtEmail\";\n            this.txtEmail.Size = new System.Drawing.Size(513, 26);\n            this.txtEmail.TabIndex = 13;\n            // \n            // txtAuthor\n            // \n            this.txtAuthor.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtAuthor.Location = new System.Drawing.Point(244, 190);\n            this.txtAuthor.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtAuthor.Name = \"txtAuthor\";\n            this.txtAuthor.Size = new System.Drawing.Size(513, 26);\n            this.txtAuthor.TabIndex = 12;\n            // \n            // txtFilename\n            // \n            this.txtFilename.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtFilename.Location = new System.Drawing.Point(244, 116);\n            this.txtFilename.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtFilename.Name = \"txtFilename\";\n            this.txtFilename.Size = new System.Drawing.Size(513, 26);\n            this.txtFilename.TabIndex = 10;\n            // \n            // label1\n            // \n            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(4, 82);\n            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(38, 20);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Title\";\n            // \n            // label2\n            // \n            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(4, 119);\n            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(74, 20);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"Filename\";\n            // \n            // label3\n            // \n            this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(4, 156);\n            this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(107, 20);\n            this.label3.TabIndex = 2;\n            this.label3.Text = \"Release Date\";\n            // \n            // label4\n            // \n            this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(4, 193);\n            this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(57, 20);\n            this.label4.TabIndex = 3;\n            this.label4.Text = \"Author\";\n            // \n            // label5\n            // \n            this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(4, 230);\n            this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(111, 20);\n            this.label5.TabIndex = 4;\n            this.label5.Text = \"Email Address\";\n            // \n            // label6\n            // \n            this.label6.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label6.AutoSize = true;\n            this.label6.Location = new System.Drawing.Point(4, 267);\n            this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(160, 20);\n            this.label6.TabIndex = 5;\n            this.label6.Text = \"Other Files By Author\";\n            // \n            // label7\n            // \n            this.label7.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label7.AutoSize = true;\n            this.label7.Location = new System.Drawing.Point(4, 304);\n            this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label7.Name = \"label7\";\n            this.label7.Size = new System.Drawing.Size(129, 20);\n            this.label7.TabIndex = 6;\n            this.label7.Text = \"Misc. Author Info\";\n            // \n            // label8\n            // \n            this.label8.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label8.AutoSize = true;\n            this.label8.Location = new System.Drawing.Point(4, 446);\n            this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label8.Name = \"label8\";\n            this.label8.Size = new System.Drawing.Size(89, 20);\n            this.label8.TabIndex = 7;\n            this.label8.Text = \"Description\";\n            // \n            // label9\n            // \n            this.label9.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label9.AutoSize = true;\n            this.label9.Location = new System.Drawing.Point(4, 587);\n            this.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label9.Name = \"label9\";\n            this.label9.Size = new System.Drawing.Size(151, 20);\n            this.label9.TabIndex = 8;\n            this.label9.Text = \"Additional Credits to\";\n            // \n            // txtTile\n            // \n            this.txtTile.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtTile.Location = new System.Drawing.Point(244, 79);\n            this.txtTile.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtTile.Name = \"txtTile\";\n            this.txtTile.Size = new System.Drawing.Size(513, 26);\n            this.txtTile.TabIndex = 9;\n            // \n            // dtRelease\n            // \n            this.dtRelease.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dtRelease.Location = new System.Drawing.Point(244, 153);\n            this.dtRelease.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.dtRelease.Name = \"dtRelease\";\n            this.dtRelease.Size = new System.Drawing.Size(513, 26);\n            this.dtRelease.TabIndex = 18;\n            // \n            // label35\n            // \n            this.label35.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label35.AutoSize = true;\n            this.label35.Location = new System.Drawing.Point(4, 45);\n            this.label35.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label35.Name = \"label35\";\n            this.label35.Size = new System.Drawing.Size(124, 20);\n            this.label35.TabIndex = 20;\n            this.label35.Text = \"Primary Purpose\";\n            // \n            // cmbEngine\n            // \n            this.cmbEngine.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbEngine.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbEngine.FormattingEnabled = true;\n            this.cmbEngine.Location = new System.Drawing.Point(244, 5);\n            this.cmbEngine.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbEngine.Name = \"cmbEngine\";\n            this.cmbEngine.Size = new System.Drawing.Size(513, 28);\n            this.cmbEngine.TabIndex = 21;\n            // \n            // label34\n            // \n            this.label34.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label34.AutoSize = true;\n            this.label34.Location = new System.Drawing.Point(4, 8);\n            this.label34.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label34.Name = \"label34\";\n            this.label34.Size = new System.Drawing.Size(203, 20);\n            this.label34.TabIndex = 23;\n            this.label34.Text = \"Advanced Engine Required\";\n            // \n            // tabPage2\n            // \n            this.tabPage2.Controls.Add(this.tblLayout2);\n            this.tabPage2.Location = new System.Drawing.Point(4, 29);\n            this.tabPage2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPage2.Name = \"tabPage2\";\n            this.tabPage2.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPage2.Size = new System.Drawing.Size(769, 634);\n            this.tabPage2.TabIndex = 1;\n            this.tabPage2.Text = \"Included\";\n            this.tabPage2.UseVisualStyleBackColor = true;\n            // \n            // tblLayout2\n            // \n            this.tblLayout2.ColumnCount = 2;\n            this.tblLayout2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 240F));\n            this.tblLayout2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblLayout2.Controls.Add(this.chkGraphics, 1, 3);\n            this.tblLayout2.Controls.Add(this.chkMusic, 1, 2);\n            this.tblLayout2.Controls.Add(this.label12, 0, 2);\n            this.tblLayout2.Controls.Add(this.label10, 0, 0);\n            this.tblLayout2.Controls.Add(this.numLevels, 1, 0);\n            this.tblLayout2.Controls.Add(this.label11, 0, 1);\n            this.tblLayout2.Controls.Add(this.chkSounds, 1, 1);\n            this.tblLayout2.Controls.Add(this.label13, 0, 3);\n            this.tblLayout2.Controls.Add(this.label14, 0, 4);\n            this.tblLayout2.Controls.Add(this.label15, 0, 5);\n            this.tblLayout2.Controls.Add(this.label16, 0, 6);\n            this.tblLayout2.Controls.Add(this.label17, 0, 7);\n            this.tblLayout2.Controls.Add(this.chkDehacked, 1, 4);\n            this.tblLayout2.Controls.Add(this.chkDemos, 1, 5);\n            this.tblLayout2.Controls.Add(this.chkOther, 1, 6);\n            this.tblLayout2.Controls.Add(this.txtOtherFilesRequired, 1, 7);\n            this.tblLayout2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblLayout2.Location = new System.Drawing.Point(4, 5);\n            this.tblLayout2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tblLayout2.Name = \"tblLayout2\";\n            this.tblLayout2.RowCount = 11;\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 215F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tblLayout2.Size = new System.Drawing.Size(761, 624);\n            this.tblLayout2.TabIndex = 0;\n            // \n            // chkGraphics\n            // \n            this.chkGraphics.AutoSize = true;\n            this.chkGraphics.Location = new System.Drawing.Point(244, 116);\n            this.chkGraphics.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.chkGraphics.Name = \"chkGraphics\";\n            this.chkGraphics.Size = new System.Drawing.Size(96, 24);\n            this.chkGraphics.TabIndex = 31;\n            this.chkGraphics.Text = \"Included\";\n            this.chkGraphics.UseVisualStyleBackColor = true;\n            // \n            // chkMusic\n            // \n            this.chkMusic.AutoSize = true;\n            this.chkMusic.Location = new System.Drawing.Point(244, 79);\n            this.chkMusic.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.chkMusic.Name = \"chkMusic\";\n            this.chkMusic.Size = new System.Drawing.Size(96, 24);\n            this.chkMusic.TabIndex = 30;\n            this.chkMusic.Text = \"Included\";\n            this.chkMusic.UseVisualStyleBackColor = true;\n            // \n            // label12\n            // \n            this.label12.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label12.AutoSize = true;\n            this.label12.Location = new System.Drawing.Point(4, 82);\n            this.label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label12.Name = \"label12\";\n            this.label12.Size = new System.Drawing.Size(50, 20);\n            this.label12.TabIndex = 24;\n            this.label12.Text = \"Music\";\n            // \n            // label10\n            // \n            this.label10.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label10.AutoSize = true;\n            this.label10.Location = new System.Drawing.Point(4, 8);\n            this.label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label10.Name = \"label10\";\n            this.label10.Size = new System.Drawing.Size(89, 20);\n            this.label10.TabIndex = 20;\n            this.label10.Text = \"New Levels\";\n            // \n            // numLevels\n            // \n            this.numLevels.Location = new System.Drawing.Point(244, 5);\n            this.numLevels.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.numLevels.Name = \"numLevels\";\n            this.numLevels.Size = new System.Drawing.Size(62, 26);\n            this.numLevels.TabIndex = 21;\n            // \n            // label11\n            // \n            this.label11.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label11.AutoSize = true;\n            this.label11.Location = new System.Drawing.Point(4, 45);\n            this.label11.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label11.Name = \"label11\";\n            this.label11.Size = new System.Drawing.Size(64, 20);\n            this.label11.TabIndex = 22;\n            this.label11.Text = \"Sounds\";\n            // \n            // chkSounds\n            // \n            this.chkSounds.AutoSize = true;\n            this.chkSounds.Location = new System.Drawing.Point(244, 42);\n            this.chkSounds.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.chkSounds.Name = \"chkSounds\";\n            this.chkSounds.Size = new System.Drawing.Size(96, 24);\n            this.chkSounds.TabIndex = 23;\n            this.chkSounds.Text = \"Included\";\n            this.chkSounds.UseVisualStyleBackColor = true;\n            // \n            // label13\n            // \n            this.label13.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label13.AutoSize = true;\n            this.label13.Location = new System.Drawing.Point(4, 119);\n            this.label13.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label13.Name = \"label13\";\n            this.label13.Size = new System.Drawing.Size(73, 20);\n            this.label13.TabIndex = 25;\n            this.label13.Text = \"Graphics\";\n            // \n            // label14\n            // \n            this.label14.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label14.AutoSize = true;\n            this.label14.Location = new System.Drawing.Point(4, 156);\n            this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label14.Name = \"label14\";\n            this.label14.Size = new System.Drawing.Size(164, 20);\n            this.label14.TabIndex = 26;\n            this.label14.Text = \"Dehacked/BEX Patch\";\n            this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label15\n            // \n            this.label15.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label15.AutoSize = true;\n            this.label15.Location = new System.Drawing.Point(4, 193);\n            this.label15.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label15.Name = \"label15\";\n            this.label15.Size = new System.Drawing.Size(60, 20);\n            this.label15.TabIndex = 27;\n            this.label15.Text = \"Demos\";\n            this.label15.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label16\n            // \n            this.label16.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label16.AutoSize = true;\n            this.label16.Location = new System.Drawing.Point(4, 230);\n            this.label16.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label16.Name = \"label16\";\n            this.label16.Size = new System.Drawing.Size(49, 20);\n            this.label16.TabIndex = 28;\n            this.label16.Text = \"Other\";\n            this.label16.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label17\n            // \n            this.label17.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label17.AutoSize = true;\n            this.label17.Location = new System.Drawing.Point(4, 356);\n            this.label17.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label17.Name = \"label17\";\n            this.label17.Size = new System.Drawing.Size(155, 20);\n            this.label17.TabIndex = 29;\n            this.label17.Text = \"Other Files Required\";\n            this.label17.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // chkDehacked\n            // \n            this.chkDehacked.AutoSize = true;\n            this.chkDehacked.Location = new System.Drawing.Point(244, 153);\n            this.chkDehacked.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.chkDehacked.Name = \"chkDehacked\";\n            this.chkDehacked.Size = new System.Drawing.Size(96, 24);\n            this.chkDehacked.TabIndex = 32;\n            this.chkDehacked.Text = \"Included\";\n            this.chkDehacked.UseVisualStyleBackColor = true;\n            // \n            // chkDemos\n            // \n            this.chkDemos.AutoSize = true;\n            this.chkDemos.Location = new System.Drawing.Point(244, 190);\n            this.chkDemos.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.chkDemos.Name = \"chkDemos\";\n            this.chkDemos.Size = new System.Drawing.Size(96, 24);\n            this.chkDemos.TabIndex = 33;\n            this.chkDemos.Text = \"Included\";\n            this.chkDemos.UseVisualStyleBackColor = true;\n            // \n            // chkOther\n            // \n            this.chkOther.AutoSize = true;\n            this.chkOther.Location = new System.Drawing.Point(244, 227);\n            this.chkOther.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.chkOther.Name = \"chkOther\";\n            this.chkOther.Size = new System.Drawing.Size(96, 24);\n            this.chkOther.TabIndex = 34;\n            this.chkOther.Text = \"Included\";\n            this.chkOther.UseVisualStyleBackColor = true;\n            // \n            // txtOtherFilesRequired\n            // \n            this.txtOtherFilesRequired.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtOtherFilesRequired.Location = new System.Drawing.Point(244, 264);\n            this.txtOtherFilesRequired.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtOtherFilesRequired.Multiline = true;\n            this.txtOtherFilesRequired.Name = \"txtOtherFilesRequired\";\n            this.txtOtherFilesRequired.Size = new System.Drawing.Size(513, 205);\n            this.txtOtherFilesRequired.TabIndex = 35;\n            // \n            // tabPage3\n            // \n            this.tabPage3.Controls.Add(this.tableLayoutPanel1);\n            this.tabPage3.Location = new System.Drawing.Point(4, 29);\n            this.tabPage3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPage3.Name = \"tabPage3\";\n            this.tabPage3.Size = new System.Drawing.Size(769, 634);\n            this.tabPage3.TabIndex = 2;\n            this.tabPage3.Text = \"Play Info\";\n            this.tabPage3.UseVisualStyleBackColor = true;\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.ColumnCount = 2;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 240F));\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel1.Controls.Add(this.txtOtherGameStyles, 1, 5);\n            this.tableLayoutPanel1.Controls.Add(this.cmbDeathmatch, 1, 4);\n            this.tableLayoutPanel1.Controls.Add(this.cmbCoop, 1, 3);\n            this.tableLayoutPanel1.Controls.Add(this.cmbSingle, 1, 2);\n            this.tableLayoutPanel1.Controls.Add(this.label18, 0, 2);\n            this.tableLayoutPanel1.Controls.Add(this.label19, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.label20, 0, 1);\n            this.tableLayoutPanel1.Controls.Add(this.label21, 0, 3);\n            this.tableLayoutPanel1.Controls.Add(this.label22, 0, 4);\n            this.tableLayoutPanel1.Controls.Add(this.label23, 0, 5);\n            this.tableLayoutPanel1.Controls.Add(this.label24, 0, 6);\n            this.tableLayoutPanel1.Controls.Add(this.cmbGame, 1, 0);\n            this.tableLayoutPanel1.Controls.Add(this.txtMaps, 1, 1);\n            this.tableLayoutPanel1.Controls.Add(this.chkDifficulty, 1, 6);\n            this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);\n            this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.RowCount = 11;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 215F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(769, 634);\n            this.tableLayoutPanel1.TabIndex = 1;\n            // \n            // txtOtherGameStyles\n            // \n            this.txtOtherGameStyles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtOtherGameStyles.Location = new System.Drawing.Point(244, 190);\n            this.txtOtherGameStyles.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtOtherGameStyles.Name = \"txtOtherGameStyles\";\n            this.txtOtherGameStyles.Size = new System.Drawing.Size(521, 26);\n            this.txtOtherGameStyles.TabIndex = 41;\n            // \n            // cmbDeathmatch\n            // \n            this.cmbDeathmatch.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbDeathmatch.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbDeathmatch.FormattingEnabled = true;\n            this.cmbDeathmatch.Location = new System.Drawing.Point(244, 153);\n            this.cmbDeathmatch.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbDeathmatch.Name = \"cmbDeathmatch\";\n            this.cmbDeathmatch.Size = new System.Drawing.Size(521, 28);\n            this.cmbDeathmatch.TabIndex = 40;\n            // \n            // cmbCoop\n            // \n            this.cmbCoop.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbCoop.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbCoop.FormattingEnabled = true;\n            this.cmbCoop.Location = new System.Drawing.Point(244, 116);\n            this.cmbCoop.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbCoop.Name = \"cmbCoop\";\n            this.cmbCoop.Size = new System.Drawing.Size(521, 28);\n            this.cmbCoop.TabIndex = 39;\n            // \n            // cmbSingle\n            // \n            this.cmbSingle.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbSingle.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbSingle.FormattingEnabled = true;\n            this.cmbSingle.Location = new System.Drawing.Point(244, 79);\n            this.cmbSingle.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbSingle.Name = \"cmbSingle\";\n            this.cmbSingle.Size = new System.Drawing.Size(521, 28);\n            this.cmbSingle.TabIndex = 38;\n            // \n            // label18\n            // \n            this.label18.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label18.AutoSize = true;\n            this.label18.Location = new System.Drawing.Point(4, 82);\n            this.label18.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label18.Name = \"label18\";\n            this.label18.Size = new System.Drawing.Size(100, 20);\n            this.label18.TabIndex = 24;\n            this.label18.Text = \"Single Player\";\n            // \n            // label19\n            // \n            this.label19.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label19.AutoSize = true;\n            this.label19.Location = new System.Drawing.Point(4, 8);\n            this.label19.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label19.Name = \"label19\";\n            this.label19.Size = new System.Drawing.Size(53, 20);\n            this.label19.TabIndex = 20;\n            this.label19.Text = \"Game\";\n            // \n            // label20\n            // \n            this.label20.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label20.AutoSize = true;\n            this.label20.Location = new System.Drawing.Point(4, 45);\n            this.label20.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label20.Name = \"label20\";\n            this.label20.Size = new System.Drawing.Size(48, 20);\n            this.label20.TabIndex = 22;\n            this.label20.Text = \"Maps\";\n            // \n            // label21\n            // \n            this.label21.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label21.AutoSize = true;\n            this.label21.Location = new System.Drawing.Point(4, 119);\n            this.label21.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label21.Name = \"label21\";\n            this.label21.Size = new System.Drawing.Size(168, 20);\n            this.label21.TabIndex = 25;\n            this.label21.Text = \"Cooperative 2-4 Player\";\n            // \n            // label22\n            // \n            this.label22.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label22.AutoSize = true;\n            this.label22.Location = new System.Drawing.Point(4, 156);\n            this.label22.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label22.Name = \"label22\";\n            this.label22.Size = new System.Drawing.Size(171, 20);\n            this.label22.TabIndex = 26;\n            this.label22.Text = \"Deathmatch 2-4 Player\";\n            this.label22.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label23\n            // \n            this.label23.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label23.AutoSize = true;\n            this.label23.Location = new System.Drawing.Point(4, 193);\n            this.label23.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label23.Name = \"label23\";\n            this.label23.Size = new System.Drawing.Size(137, 20);\n            this.label23.TabIndex = 27;\n            this.label23.Text = \"Other game styles\";\n            this.label23.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label24\n            // \n            this.label24.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label24.AutoSize = true;\n            this.label24.Location = new System.Drawing.Point(4, 230);\n            this.label24.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label24.Name = \"label24\";\n            this.label24.Size = new System.Drawing.Size(132, 20);\n            this.label24.TabIndex = 28;\n            this.label24.Text = \"Difficulty Settings\";\n            this.label24.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // cmbGame\n            // \n            this.cmbGame.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbGame.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbGame.FormattingEnabled = true;\n            this.cmbGame.Location = new System.Drawing.Point(244, 5);\n            this.cmbGame.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbGame.Name = \"cmbGame\";\n            this.cmbGame.Size = new System.Drawing.Size(521, 28);\n            this.cmbGame.TabIndex = 36;\n            // \n            // txtMaps\n            // \n            this.txtMaps.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtMaps.Location = new System.Drawing.Point(244, 42);\n            this.txtMaps.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtMaps.Name = \"txtMaps\";\n            this.txtMaps.Size = new System.Drawing.Size(521, 26);\n            this.txtMaps.TabIndex = 37;\n            // \n            // chkDifficulty\n            // \n            this.chkDifficulty.AutoSize = true;\n            this.chkDifficulty.Location = new System.Drawing.Point(244, 227);\n            this.chkDifficulty.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.chkDifficulty.Name = \"chkDifficulty\";\n            this.chkDifficulty.Size = new System.Drawing.Size(63, 24);\n            this.chkDifficulty.TabIndex = 42;\n            this.chkDifficulty.Text = \"Yes\";\n            this.chkDifficulty.UseVisualStyleBackColor = true;\n            // \n            // tabPage4\n            // \n            this.tabPage4.Controls.Add(this.tableLayoutPanel2);\n            this.tabPage4.Location = new System.Drawing.Point(4, 29);\n            this.tabPage4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPage4.Name = \"tabPage4\";\n            this.tabPage4.Size = new System.Drawing.Size(769, 634);\n            this.tabPage4.TabIndex = 3;\n            this.tabPage4.Text = \"Construction\";\n            this.tabPage4.UseVisualStyleBackColor = true;\n            // \n            // tableLayoutPanel2\n            // \n            this.tableLayoutPanel2.ColumnCount = 2;\n            this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 240F));\n            this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel2.Controls.Add(this.label26, 0, 0);\n            this.tableLayoutPanel2.Controls.Add(this.label30, 0, 6);\n            this.tableLayoutPanel2.Controls.Add(this.label29, 0, 5);\n            this.tableLayoutPanel2.Controls.Add(this.label28, 0, 4);\n            this.tableLayoutPanel2.Controls.Add(this.label25, 0, 3);\n            this.tableLayoutPanel2.Controls.Add(this.label27, 0, 2);\n            this.tableLayoutPanel2.Controls.Add(this.cmbBase, 1, 0);\n            this.tableLayoutPanel2.Controls.Add(this.txtBuildTime, 1, 2);\n            this.tableLayoutPanel2.Controls.Add(this.txtEditorsUsed, 1, 3);\n            this.tableLayoutPanel2.Controls.Add(this.txtKnownBugs, 1, 4);\n            this.tableLayoutPanel2.Controls.Add(this.txtMayNotRun, 1, 5);\n            this.tableLayoutPanel2.Controls.Add(this.txtTestedWith, 1, 6);\n            this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 0);\n            this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tableLayoutPanel2.Name = \"tableLayoutPanel2\";\n            this.tableLayoutPanel2.RowCount = 11;\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 215F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel2.Size = new System.Drawing.Size(769, 634);\n            this.tableLayoutPanel2.TabIndex = 2;\n            // \n            // label26\n            // \n            this.label26.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label26.AutoSize = true;\n            this.label26.Location = new System.Drawing.Point(4, 8);\n            this.label26.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label26.Name = \"label26\";\n            this.label26.Size = new System.Drawing.Size(46, 20);\n            this.label26.TabIndex = 20;\n            this.label26.Text = \"Base\";\n            // \n            // label30\n            // \n            this.label30.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label30.AutoSize = true;\n            this.label30.Location = new System.Drawing.Point(4, 230);\n            this.label30.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label30.Name = \"label30\";\n            this.label30.Size = new System.Drawing.Size(94, 20);\n            this.label30.TabIndex = 27;\n            this.label30.Text = \"Tested With\";\n            this.label30.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label29\n            // \n            this.label29.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label29.AutoSize = true;\n            this.label29.Location = new System.Drawing.Point(4, 193);\n            this.label29.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label29.Name = \"label29\";\n            this.label29.Size = new System.Drawing.Size(137, 20);\n            this.label29.TabIndex = 26;\n            this.label29.Text = \"May Not Run With\";\n            this.label29.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label28\n            // \n            this.label28.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label28.AutoSize = true;\n            this.label28.Location = new System.Drawing.Point(4, 156);\n            this.label28.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label28.Name = \"label28\";\n            this.label28.Size = new System.Drawing.Size(98, 20);\n            this.label28.TabIndex = 25;\n            this.label28.Text = \"Known Bugs\";\n            // \n            // label25\n            // \n            this.label25.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label25.AutoSize = true;\n            this.label25.Location = new System.Drawing.Point(4, 119);\n            this.label25.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label25.Name = \"label25\";\n            this.label25.Size = new System.Drawing.Size(108, 20);\n            this.label25.TabIndex = 24;\n            this.label25.Text = \"Editor(s) used\";\n            // \n            // label27\n            // \n            this.label27.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label27.AutoSize = true;\n            this.label27.Location = new System.Drawing.Point(4, 82);\n            this.label27.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label27.Name = \"label27\";\n            this.label27.Size = new System.Drawing.Size(82, 20);\n            this.label27.TabIndex = 22;\n            this.label27.Text = \"Build Time\";\n            // \n            // cmbBase\n            // \n            this.cmbBase.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbBase.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbBase.FormattingEnabled = true;\n            this.cmbBase.Items.AddRange(new object[] {\n            \"New from scratch\",\n            \"Modified\"});\n            this.cmbBase.Location = new System.Drawing.Point(244, 5);\n            this.cmbBase.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbBase.Name = \"cmbBase\";\n            this.cmbBase.Size = new System.Drawing.Size(521, 28);\n            this.cmbBase.TabIndex = 28;\n            // \n            // txtBuildTime\n            // \n            this.txtBuildTime.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtBuildTime.Location = new System.Drawing.Point(244, 79);\n            this.txtBuildTime.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtBuildTime.Name = \"txtBuildTime\";\n            this.txtBuildTime.Size = new System.Drawing.Size(521, 26);\n            this.txtBuildTime.TabIndex = 29;\n            // \n            // txtEditorsUsed\n            // \n            this.txtEditorsUsed.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtEditorsUsed.Location = new System.Drawing.Point(244, 116);\n            this.txtEditorsUsed.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtEditorsUsed.Name = \"txtEditorsUsed\";\n            this.txtEditorsUsed.Size = new System.Drawing.Size(521, 26);\n            this.txtEditorsUsed.TabIndex = 30;\n            // \n            // txtKnownBugs\n            // \n            this.txtKnownBugs.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtKnownBugs.Location = new System.Drawing.Point(244, 153);\n            this.txtKnownBugs.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtKnownBugs.Name = \"txtKnownBugs\";\n            this.txtKnownBugs.Size = new System.Drawing.Size(521, 26);\n            this.txtKnownBugs.TabIndex = 31;\n            // \n            // txtMayNotRun\n            // \n            this.txtMayNotRun.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtMayNotRun.Location = new System.Drawing.Point(244, 190);\n            this.txtMayNotRun.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtMayNotRun.Name = \"txtMayNotRun\";\n            this.txtMayNotRun.Size = new System.Drawing.Size(521, 26);\n            this.txtMayNotRun.TabIndex = 32;\n            // \n            // txtTestedWith\n            // \n            this.txtTestedWith.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtTestedWith.Location = new System.Drawing.Point(244, 227);\n            this.txtTestedWith.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtTestedWith.Name = \"txtTestedWith\";\n            this.txtTestedWith.Size = new System.Drawing.Size(521, 26);\n            this.txtTestedWith.TabIndex = 33;\n            // \n            // tabPage5\n            // \n            this.tabPage5.Controls.Add(this.tableLayoutPanel3);\n            this.tabPage5.Location = new System.Drawing.Point(4, 29);\n            this.tabPage5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tabPage5.Name = \"tabPage5\";\n            this.tabPage5.Size = new System.Drawing.Size(769, 634);\n            this.tabPage5.TabIndex = 4;\n            this.tabPage5.Text = \"Permissions\";\n            this.tabPage5.UseVisualStyleBackColor = true;\n            // \n            // tableLayoutPanel3\n            // \n            this.tableLayoutPanel3.ColumnCount = 2;\n            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 240F));\n            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel3.Controls.Add(this.label31, 0, 0);\n            this.tableLayoutPanel3.Controls.Add(this.cmbPermission, 1, 0);\n            this.tableLayoutPanel3.Controls.Add(this.label32, 0, 1);\n            this.tableLayoutPanel3.Controls.Add(this.label33, 0, 2);\n            this.tableLayoutPanel3.Controls.Add(this.txtWebSites, 1, 1);\n            this.tableLayoutPanel3.Controls.Add(this.txtFtpSites, 1, 2);\n            this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0);\n            this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.tableLayoutPanel3.Name = \"tableLayoutPanel3\";\n            this.tableLayoutPanel3.RowCount = 11;\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 215F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));\n            this.tableLayoutPanel3.Size = new System.Drawing.Size(769, 634);\n            this.tableLayoutPanel3.TabIndex = 3;\n            // \n            // label31\n            // \n            this.label31.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label31.AutoSize = true;\n            this.label31.Location = new System.Drawing.Point(4, 8);\n            this.label31.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label31.Name = \"label31\";\n            this.label31.Size = new System.Drawing.Size(86, 20);\n            this.label31.TabIndex = 20;\n            this.label31.Text = \"Permission\";\n            // \n            // cmbPermission\n            // \n            this.cmbPermission.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cmbPermission.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbPermission.FormattingEnabled = true;\n            this.cmbPermission.Items.AddRange(new object[] {\n            \"May distribute\",\n            \"May not distribute\"});\n            this.cmbPermission.Location = new System.Drawing.Point(244, 5);\n            this.cmbPermission.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.cmbPermission.Name = \"cmbPermission\";\n            this.cmbPermission.Size = new System.Drawing.Size(521, 28);\n            this.cmbPermission.TabIndex = 28;\n            // \n            // label32\n            // \n            this.label32.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label32.AutoSize = true;\n            this.label32.Location = new System.Drawing.Point(4, 45);\n            this.label32.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label32.Name = \"label32\";\n            this.label32.Size = new System.Drawing.Size(79, 20);\n            this.label32.TabIndex = 29;\n            this.label32.Text = \"Web sites\";\n            // \n            // label33\n            // \n            this.label33.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.label33.AutoSize = true;\n            this.label33.Location = new System.Drawing.Point(4, 82);\n            this.label33.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.label33.Name = \"label33\";\n            this.label33.Size = new System.Drawing.Size(75, 20);\n            this.label33.TabIndex = 30;\n            this.label33.Text = \"FTP sites\";\n            // \n            // txtWebSites\n            // \n            this.txtWebSites.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtWebSites.Location = new System.Drawing.Point(244, 42);\n            this.txtWebSites.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtWebSites.Name = \"txtWebSites\";\n            this.txtWebSites.Size = new System.Drawing.Size(521, 26);\n            this.txtWebSites.TabIndex = 31;\n            // \n            // txtFtpSites\n            // \n            this.txtFtpSites.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.txtFtpSites.Location = new System.Drawing.Point(244, 79);\n            this.txtFtpSites.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.txtFtpSites.Name = \"txtFtpSites\";\n            this.txtFtpSites.Size = new System.Drawing.Size(521, 26);\n            this.txtFtpSites.TabIndex = 32;\n            // \n            // titleBar\n            // \n            this.titleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(54)))));\n            this.titleBar.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.titleBar.ForeColor = System.Drawing.Color.White;\n            this.titleBar.Location = new System.Drawing.Point(0, 0);\n            this.titleBar.Margin = new System.Windows.Forms.Padding(0);\n            this.titleBar.Name = \"titleBar\";\n            this.titleBar.Size = new System.Drawing.Size(785, 40);\n            this.titleBar.TabIndex = 3;\n            this.titleBar.Title = \"Text File Generator\";\n            // \n            // TxtGenerator\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(785, 779);\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n            this.Name = \"TxtGenerator\";\n            this.Text = \"Text File Generator\";\n            this.tblMain.ResumeLayout(false);\n            this.flpButtons.ResumeLayout(false);\n            this.tabControl.ResumeLayout(false);\n            this.tabPage1.ResumeLayout(false);\n            this.tblLayout1.ResumeLayout(false);\n            this.tblLayout1.PerformLayout();\n            this.tabPage2.ResumeLayout(false);\n            this.tblLayout2.ResumeLayout(false);\n            this.tblLayout2.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.numLevels)).EndInit();\n            this.tabPage3.ResumeLayout(false);\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.tabPage4.ResumeLayout(false);\n            this.tableLayoutPanel2.ResumeLayout(false);\n            this.tableLayoutPanel2.PerformLayout();\n            this.tabPage5.ResumeLayout(false);\n            this.tableLayoutPanel3.ResumeLayout(false);\n            this.tableLayoutPanel3.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private TableLayoutPanelDB tblMain;\n        private System.Windows.Forms.FlowLayoutPanel flpButtons;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnGenerate;\n        private DoomLauncher.CTabControl tabControl;\n        private System.Windows.Forms.TabPage tabPage1;\n        private TableLayoutPanelDB tblLayout1;\n        private System.Windows.Forms.TextBox txtAdditionalCredits;\n        private System.Windows.Forms.TextBox txtDescription;\n        private System.Windows.Forms.TextBox txtMiscAuthor;\n        private System.Windows.Forms.TextBox txtOtherFiles;\n        private System.Windows.Forms.TextBox txtEmail;\n        private System.Windows.Forms.TextBox txtAuthor;\n        private System.Windows.Forms.TextBox txtFilename;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.Label label8;\n        private System.Windows.Forms.Label label9;\n        private System.Windows.Forms.TextBox txtTile;\n        private System.Windows.Forms.DateTimePicker dtRelease;\n        private System.Windows.Forms.TabPage tabPage2;\n        private System.Windows.Forms.TabPage tabPage3;\n        private System.Windows.Forms.TabPage tabPage4;\n        private System.Windows.Forms.TabPage tabPage5;\n        private System.Windows.Forms.TableLayoutPanel tblLayout2;\n        private System.Windows.Forms.Label label10;\n        private System.Windows.Forms.NumericUpDown numLevels;\n        private System.Windows.Forms.Label label11;\n        private System.Windows.Forms.CheckBox chkSounds;\n        private System.Windows.Forms.Label label12;\n        private System.Windows.Forms.Label label13;\n        private System.Windows.Forms.Label label14;\n        private System.Windows.Forms.Label label15;\n        private System.Windows.Forms.Label label16;\n        private System.Windows.Forms.Label label17;\n        private System.Windows.Forms.CheckBox chkGraphics;\n        private System.Windows.Forms.CheckBox chkMusic;\n        private System.Windows.Forms.CheckBox chkDehacked;\n        private System.Windows.Forms.CheckBox chkDemos;\n        private System.Windows.Forms.CheckBox chkOther;\n        private System.Windows.Forms.TextBox txtOtherFilesRequired;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.Label label18;\n        private System.Windows.Forms.Label label19;\n        private System.Windows.Forms.Label label20;\n        private System.Windows.Forms.Label label21;\n        private System.Windows.Forms.Label label22;\n        private System.Windows.Forms.Label label23;\n        private System.Windows.Forms.Label label24;\n        private System.Windows.Forms.ComboBox cmbGame;\n        private System.Windows.Forms.TextBox txtMaps;\n        private System.Windows.Forms.ComboBox cmbDeathmatch;\n        private System.Windows.Forms.ComboBox cmbCoop;\n        private System.Windows.Forms.ComboBox cmbSingle;\n        private System.Windows.Forms.TextBox txtOtherGameStyles;\n        private System.Windows.Forms.CheckBox chkDifficulty;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;\n        private System.Windows.Forms.Label label25;\n        private System.Windows.Forms.Label label26;\n        private System.Windows.Forms.Label label27;\n        private System.Windows.Forms.Label label28;\n        private System.Windows.Forms.Label label29;\n        private System.Windows.Forms.Label label30;\n        private System.Windows.Forms.ComboBox cmbBase;\n        private System.Windows.Forms.TextBox txtBuildTime;\n        private System.Windows.Forms.TextBox txtEditorsUsed;\n        private System.Windows.Forms.TextBox txtKnownBugs;\n        private System.Windows.Forms.TextBox txtMayNotRun;\n        private System.Windows.Forms.TextBox txtTestedWith;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;\n        private System.Windows.Forms.Label label31;\n        private System.Windows.Forms.ComboBox cmbPermission;\n        private System.Windows.Forms.Label label32;\n        private System.Windows.Forms.Label label33;\n        private System.Windows.Forms.TextBox txtWebSites;\n        private System.Windows.Forms.TextBox txtFtpSites;\n        private System.Windows.Forms.Label label35;\n        private System.Windows.Forms.ComboBox cmbPrimaryPurpose;\n        private System.Windows.Forms.ComboBox cmbEngine;\n        private System.Windows.Forms.Label label34;\n        private Controls.TitleBarControl titleBar;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/TxtGenerator.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class TxtGenerator : Form\n    {\n        private IDataSourceAdapter m_adapter;\n\n        public TxtGenerator()\n        {\n            InitializeComponent();\n\n            PopulatePlayInfoCombo(cmbSingle);\n            PopulatePlayInfoCombo(cmbCoop);\n            PopulatePlayInfoCombo(cmbDeathmatch);\n            cmbSingle.SelectedIndex = cmbCoop.SelectedIndex = cmbDeathmatch.SelectedIndex = cmbBase.SelectedIndex = cmbPermission.SelectedIndex =\n                 cmbPrimaryPurpose.SelectedIndex = 0;\n\n            dtRelease.Format = DateTimePickerFormat.Custom;\n            dtRelease.CustomFormat = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;\n\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n        }\n\n        public void SetData(IDataSourceAdapter adapter)\n        {\n            SetData(adapter, null);\n        }\n\n        public void SetData(IDataSourceAdapter adapter, IGameFile gameFile)\n        {\n            m_adapter = adapter;\n\n            cmbEngine.ValueMember = \"SourcePortID\";\n            cmbEngine.DisplayMember = \"Name\";\n            List<ISourcePortData> sourcePorts = adapter.GetSourcePorts().ToList();\n            SourcePortData noPort = new SourcePortData();\n            noPort.SourcePortID = 0;\n            noPort.Name = \"N/A\";\n            sourcePorts.Insert(0, noPort);\n            cmbEngine.DataSource = sourcePorts;\n\n            cmbGame.ValueMember = \"IWadID\";\n            cmbGame.DisplayMember = \"Name\";\n            cmbGame.DataSource = GetIwads(adapter);\n            cmbGame.SelectedIndex = 0;\n\n            if (gameFile != null)\n            {\n                if (gameFile.SourcePortID.HasValue) cmbEngine.SelectedValue = gameFile.SourcePortID.Value;\n                txtTile.Text = gameFile.Title;\n                txtFilename.Text = gameFile.FileName;\n                if (gameFile.ReleaseDate.HasValue) dtRelease.Value = gameFile.ReleaseDate.Value;\n                txtAuthor.Text = gameFile.Author;\n                txtDescription.Text = gameFile.Description;\n                if (gameFile.MapCount.HasValue) numLevels.Value = gameFile.MapCount.Value;\n                if (gameFile.Map != null) txtMaps.Text = GetMapString(gameFile.Map);\n                if (gameFile.IWadID.HasValue) cmbGame.SelectedValue = gameFile.IWadID.Value;\n            }\n        }\n\n        private static IEnumerable<IIWadData> GetIwads(IDataSourceAdapter adapter)\n        {\n            List<IIWadData> iwads = new List<IIWadData>();\n\n            IWadData data = new IWadData();\n            data.IWadID = -1;\n            data.Name = \"N/A\";\n            iwads.Add(data);\n            iwads.AddRange(adapter.GetIWads());\n\n            return iwads;\n        }\n\n        private string CreateTextFile()\n        {\n            string textFile = @\"===========================================================================\nAdvanced engine needed  : {34}\nPrimary purpose         : {35}\n===========================================================================\nTitle                   : {0}\nFilename                : {1}\nRelease date            : {2}\nAuthor                  : {3}\nEmail Address           : {4}\nOther Files By Author   : {5}\nMisc. Author Info       : {6}\n\nDescription             : {7}\n\nAdditional Credits to   : {8}\n===========================================================================\n* What is included *\n\nNew levels              : {9}\nSounds                  : {10}\nMusic                   : {11}\nGraphics                : {12}\nDehacked/BEX Patch      : {13}\nDemos                   : {14}\nOther                   : {15}\nOther files required    : {16}\n\n\n* Play Information *\n\nGame                    : {17}\nMap #                   : {18}\nSingle Player           : {19}\nCooperative 2-4 Player  : {20}\nDeathmatch 2-4 Player   : {21}\nOther game styles       : {22}\nDifficulty Settings     : {23}\n\n\n* Construction *\n\nBase                    : {24}\nBuild Time              : {25}\nEditor(s) used          : {26}\nKnown Bugs              : {27}\nMay Not Run With        : {28}\nTested With             : {29}\n\n\n\n* Copyright / Permissions *\n\nAuthors {30} use the contents of this file as a base for\nmodification or reuse.  Permissions have been obtained from original \nauthors for any of their resources modified or included in this file.\n\n{31}\n\n* Where to get the file that this text file describes *\n\nThe Usual: ftp://archives.3dgamers.com/pub/idgames/ and mirrors\nWeb sites: {32}\nFTP sites: {33}\";\n\n            string may = @\"You MAY not distribute this file in any format.\";\n            string maynot = @\"You MAY distribute this file, provided you include this text file, with\nno modifications.  You may distribute this file in any electronic\nformat (BBS, Diskette, CD, etc) as long as you include this file \nintact.  I have received permission from the original authors of any\nmodified or included content in this file to allow further distribution.\";\n\n            return string.Format(textFile, txtTile.Text, txtFilename.Text, dtRelease.Value.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern),\n                txtAuthor.Text, txtEmail.Text, txtOtherFiles.Text, txtMiscAuthor.Text, txtDescription.Text, txtAdditionalCredits.Text, Convert.ToInt32(numLevels.Value),\n                GetIncluded(chkSounds), GetIncluded(chkMusic), GetIncluded(chkGraphics), GetIncluded(chkDehacked), GetIncluded(chkDemos), GetIncluded(chkOther),\n                txtOtherFilesRequired.Text, GetGameName(), txtMaps.Text, cmbSingle.SelectedItem.ToString(), cmbCoop.SelectedItem.ToString(),\n                cmbDeathmatch.SelectedItem.ToString(), txtOtherGameStyles.Text, GetIncluded(chkDifficulty), GetBase(cmbBase), txtBuildTime.Text, txtEditorsUsed.Text, txtKnownBugs.Text,\n                txtMayNotRun.Text, txtTestedWith.Text, cmbPermission.SelectedIndex == 0 ? \"MAY\" : \"may NOT\",\n                cmbPermission.SelectedIndex == 0 ? may : maynot, txtWebSites.Text, txtFtpSites.Text, \n                ((ISourcePortData)cmbEngine.SelectedItem).Name, cmbPrimaryPurpose.SelectedItem.ToString());\n        }\n\n        private string GetGameName()\n        {\n            IIWadData iwad = cmbGame.SelectedItem as IIWadData;\n\n            string ext = Path.GetExtension(iwad.Name);\n            if (!string.IsNullOrEmpty(ext))\n                return iwad.Name.Replace(ext, string.Empty);\n            else\n                return iwad.Name;\n        }\n\n        private static string GetMapString(string mapString)\n        {\n            string[] maps = mapString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);\n\n            if (maps.Length == 1)\n            {\n                return maps.First();\n            }\n            else if (maps.Length > 1)\n            {\n                List<Tuple<int, string>> mapLookup = new List<Tuple<int, string>>();\n\n                foreach (string map in maps)\n                {\n                    int mapDigit = 0;\n                    string numberString = new string(map.Where(x => Char.IsDigit(x)).ToArray());\n                    if (int.TryParse(numberString, out mapDigit))\n                        mapLookup.Add(new Tuple<int, string>(mapDigit, map));\n                }\n\n                if (mapLookup.Count > 0)\n                {\n                    int min = mapLookup.Min(x => x.Item1);\n                    int max = mapLookup.Max(x => x.Item1);\n\n                    return string.Format(\"{0}-{1}\", mapLookup.First(x => x.Item1 == min).Item2,\n                        mapLookup.First(x => x.Item1 == max).Item2);\n                }\n            }\n\n            return string.Empty;\n        }\n\n        private static string GetBase(ComboBox cmbBase)\n        {\n            if (cmbBase.SelectedIndex == 0)\n                return cmbBase.SelectedItem.ToString();\n\n            return string.Format(\"{0} (-)\", cmbBase.SelectedItem.ToString());\n        }\n\n        private static string GetIncluded(CheckBox chk)\n        {\n            return chk.Checked ? \"Yes\" : \"No\";\n        }\n\n        private static void PopulatePlayInfoCombo(ComboBox cmb)\n        {\n            cmb.Items.Add(\"Designed for\");\n            cmb.Items.Add(\"Player starts only\");\n            cmb.Items.Add(\"No\");\n        }\n\n        private void btnOK_Click(object sender, EventArgs e)\n        {\n            if (cmbGame.SelectedItem == null)\n            {\n                MessageBox.Show(this, \"A game must be selected.\", \"Game\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            string textFile = CreateTextFile();\n            string filename = Path.Combine(DataCache.Instance.AppConfiguration.TempDirectory.GetFullPath(), \"outgen.txt\");\n            \n            try\n            {\n                File.WriteAllText(filename, textFile);\n                Process.Start(filename);\n            }\n            catch(Exception ex)\n            {\n                Util.DisplayUnexpectedException(this, ex);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/TxtGenerator.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Forms/Welcome.Designer.cs",
    "content": "﻿namespace DoomLauncher.Forms\n{\n    partial class Welcome\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Welcome));\n            this.btnContinue = new System.Windows.Forms.Button();\n            this.tblMain = new System.Windows.Forms.TableLayoutPanel();\n            this.lblWelcome = new System.Windows.Forms.Label();\n            this.lnkHelp = new System.Windows.Forms.LinkLabel();\n            this.lblInfo = new DoomLauncher.GrowLabel();\n            this.tblMain.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnContinue\n            // \n            this.btnContinue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnContinue.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnContinue.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\n            this.btnContinue.Location = new System.Drawing.Point(381, 385);\n            this.btnContinue.Margin = new System.Windows.Forms.Padding(4);\n            this.btnContinue.Name = \"btnContinue\";\n            this.btnContinue.Size = new System.Drawing.Size(100, 28);\n            this.btnContinue.TabIndex = 4;\n            this.btnContinue.Text = \"Continue\";\n            this.btnContinue.UseVisualStyleBackColor = true;\n            // \n            // tblMain\n            // \n            this.tblMain.BackgroundImage = global::DoomLauncher.Properties.Resources.DoomLauncherTile;\n            this.tblMain.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;\n            this.tblMain.ColumnCount = 1;\n            this.tblMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.Controls.Add(this.lblWelcome, 0, 0);\n            this.tblMain.Controls.Add(this.lblInfo, 0, 1);\n            this.tblMain.Controls.Add(this.lnkHelp, 0, 2);\n            this.tblMain.Controls.Add(this.btnContinue, 0, 4);\n            this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tblMain.Location = new System.Drawing.Point(0, 0);\n            this.tblMain.Margin = new System.Windows.Forms.Padding(4);\n            this.tblMain.Name = \"tblMain\";\n            this.tblMain.RowCount = 5;\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 246F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 79F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 49F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 39F));\n            this.tblMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tblMain.Size = new System.Drawing.Size(485, 420);\n            this.tblMain.TabIndex = 3;\n            // \n            // lblWelcome\n            // \n            this.lblWelcome.AutoSize = true;\n            this.lblWelcome.BackColor = System.Drawing.Color.Transparent;\n            this.lblWelcome.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lblWelcome.ForeColor = System.Drawing.Color.White;\n            this.lblWelcome.Location = new System.Drawing.Point(8, 7);\n            this.lblWelcome.Margin = new System.Windows.Forms.Padding(8, 7, 4, 0);\n            this.lblWelcome.Name = \"lblWelcome\";\n            this.lblWelcome.Size = new System.Drawing.Size(284, 25);\n            this.lblWelcome.TabIndex = 0;\n            this.lblWelcome.Text = \"Welcome to Doom Launcher\";\n            // \n            // lnkHelp\n            // \n            this.lnkHelp.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.lnkHelp.AutoSize = true;\n            this.lnkHelp.BackColor = System.Drawing.Color.Transparent;\n            this.lnkHelp.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lnkHelp.LinkColor = System.Drawing.Color.White;\n            this.lnkHelp.Location = new System.Drawing.Point(4, 337);\n            this.lnkHelp.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lnkHelp.Name = \"lnkHelp\";\n            this.lnkHelp.Size = new System.Drawing.Size(329, 25);\n            this.lnkHelp.TabIndex = 3;\n            this.lnkHelp.TabStop = true;\n            this.lnkHelp.Text = \"Click here to view the help document\";\n            this.lnkHelp.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkHelp_LinkClicked);\n            // \n            // lblInfo\n            // \n            this.lblInfo.AutoSize = true;\n            this.lblInfo.BackColor = System.Drawing.Color.Transparent;\n            this.lblInfo.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n            this.lblInfo.ForeColor = System.Drawing.Color.White;\n            this.lblInfo.IsPath = false;\n            this.lblInfo.Location = new System.Drawing.Point(4, 246);\n            this.lblInfo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\n            this.lblInfo.Name = \"lblInfo\";\n            this.lblInfo.Size = new System.Drawing.Size(476, 50);\n            this.lblInfo.TabIndex = 2;\n            this.lblInfo.Text = \"If this is your first time using Doom Launcher it is recommended to view the help\" +\n    \" document.\";\n            // \n            // Welcome\n            // \n            this.AcceptButton = this.btnContinue;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(485, 420);\n            this.ControlBox = false;\n            this.Controls.Add(this.tblMain);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Margin = new System.Windows.Forms.Padding(4);\n            this.Name = \"Welcome\";\n            this.Text = \"Welcome\";\n            this.tblMain.ResumeLayout(false);\n            this.tblMain.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label lblWelcome;\n        private GrowLabel lblInfo;\n        private System.Windows.Forms.TableLayoutPanel tblMain;\n        private System.Windows.Forms.LinkLabel lnkHelp;\n        private System.Windows.Forms.Button btnContinue;\n    }\n}"
  },
  {
    "path": "DoomLauncher/Forms/Welcome.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Forms\n{\n    public partial class Welcome : Form\n    {\n        public Welcome()\n        {\n            InitializeComponent();\n            Stylizer.Stylize(this, DesignMode, StylizerOptions.SetupTitleBar);\n            lblInfo.BackColor = Color.Transparent;\n            lblWelcome.BackColor = Color.Transparent;\n            lblInfo.ForeColor = Color.White;\n            lblWelcome.ForeColor = Color.White;\n            lnkHelp.LinkColor = Color.White;\n        }\n\n        private void lnkHelp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            try\n            {\n                Process.Start(\"Help.pdf\");\n            }\n            catch\n            {\n                MessageBox.Show(this, \"Could not open the help file. Did you copy all the files to your Doom Launcher folder correctly?\", \"Help Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Forms/Welcome.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAA\n        AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUrNJUFCA3yDREX6n18e+iEhIPodnZ16Hh4\n        d+h4eHfoeHh36Hh4d+h2dnXohISD6Hx8eugLDRHqCxAX8iw1QZQ+S1r/KzI6/xMZIv9nZmb/m5qY/4qK\n        iv+Kion/ioqK/4qKiv+Kion/i4uL/5qZmP9paWj/AwQG/xMXG/8XGyH/MjhA6T5CS/8lLTX/BwoN/6Oj\n        ov/Nzcz/tra2/7i4t/+4uLf/tra2/8zMy/+lpaT/Fhwj/xsfJP8gJSr/GBsg6UFGTeg0NTf/Dw4O/ygr\n        LP/Y2dj/yMjG/8LCwf/BwcD/wcHA/8LCwf/GxcT/2djX/zlCTf8iKjX/Ki82/xseIehESU/oPkFF/yQk\n        Jv8aHiL/pKOj/+Xk4v+/v77/zc3N/83Nzf++vr7/5eXj/6Khof8eIyr/LDQ+/yguNv8gIyfoQ0VH6EtS\n        XP8+RE//GyEp/ygpKv/08/D/5+bl/76+v/+/wMH/6eno//T08/8qLTD/Dg8U/zc/SP9BTFn/KzE46EhK\n        TuhaZHD/Sllq/01VX/8aISj/WmFo/9TV1f+xsK7/tLKx/8zMzP9SWF7/HSEn/yktNP9OYnX/ZniI/yow\n        OOhGSE3ocXmC/5Ccpv84RlX/OT5C/xwnL/8fKDH/bnV+/1JXXP8eJCv/Iygu/y0uMP9BS1X/nqew/0BF\n        Tv8kKjHoUFRb6GdveP/08/H/mp6j/xMaIv8rMDX/SVBX/xokMP8uNj//QklQ/x8lLf8dICX/Z2pt/9rY\n        1v8pLjL/KCwx6FNZX+hYYWz/3Nzb//////+IiIv/n6Ch//z6+P9OUlj/uru9/+zs6/95fYP/kJCR/4aF\n        g//JzM7/NzxE/yoqLehbY2zoXmVt/8XGxv+3uLf/7Ozq/83Nzv+nqaz//////7i5uf+6urz//Pr3/8vM\n        zP/a2tn/yMrL/zQ4P/8lJyjoXmNr6GRobf/AwMD/gYKD/+Pj4v+foKL/c3V4//z8+v+SlJb/goSI/+Pj\n        4v/g4N///////8zKyf8wMTP/SFBb6F1jauhmZ2n/xsfH/4WFhf/s6+r/qamp/3h5ev/7+vn/mZyg/4+S\n        lv/p6en/6+vp///////Q0ND/Kiwt/05YYehna3Ppa25x/+ro5f/l4+L/6urp/+Lg4P/l5OP/5+bm/9zc\n        3f/q6ur/6+rp/+no5//l5eX/7+7t/0BGTP8xNDjpeHt//4OFif+tsLf/ur7C/5OZoP+Oj5D/t7m8/4uR\n        mf+rsrn/ub7D/42QlP+do6n/gYaN/5eZmv9cXF3/S09W/46TmJOIio/yf4eS6oKLleiFiY/onKi16ION\n        muh7gYnogYyY6HV6geh9g4vogIiS6ISMlOhxd3/qeHuB8mVobJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACQsNw4DAgSqDxIX8RUbJOsLERfoDRIY6GZmZeiCgoHod3Z26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26IKB\n        gOhoaWnoCgsO6A0RGOgOEBXrEhcd8CgyPqkyOUQNQ1Jirh8kK/8TFRr/FBoh/wsRGf8RFBn/kI+O/5KS\n        kf+GhoX/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eH\n        h/+GhoX/kpOR/4+OjP8RExX/ERcg/w0NDf8iKjT/JCo0/zA4Q6xKWGn4YXCC/xUZHv8lLDT/KzdE/wAA\n        Cv9xcnP/4d/d/7a2tf+xsbD/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Ozsv+zs7L/s7Oy/7Oz\n        sv+zs7L/sbGw/7W1tP/i4uH/bm1r/wAACP8cHiH/GR0j/yEpM/8WGiH/GSAn9zpDT+taZ3f/FBYa/z9F\n        Uf9baXr/AAUL/z9ESv/d3Nr/uLi3/7a3tv+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5uP+5ubj/ubm4/7m5\n        uP+5ubj/ubm4/7m5uP+2trb/uLm4/9jW1P87PD3/BwsV/xkZG/8cHiL/ICMo/xcZHf8RExXrOUBJ6EFL\n        V/8cHSH/Ki81/01aaf8aHB3/HSMr/xUXGf9iYmL/2trZ/7m5uf+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/ubm5/9vb2v9kY2P/ExMV/yEoLv8pLzn/ISYr/x8jJ/8xPEf/Iykw/xca\n        IOg7PkToPUdQ/yYqMP8cHR//Ji85/yAhIf8bISf/AAAB/5+fnv/X1tb/u7u7/729vf+9vb3/vb29/729\n        vf+9vb3/vb29/729vf+9vb3/vb29/729vf+7u7v/1tXU/5+env8QGyX/LTZA/yMlKP8kJyr/LDI5/yow\n        OP8hJiz/HiIo6Dg7P+g2OkD/KSsv/yQlJ/8hJCn/ICAg/xQYHP8qLTH/ycnJ/8jIx/+/v77/wMC//8DA\n        v//AwL//wMC//8DAv//AwL//wMC//8DAv//AwL//wMC//8DAv//ExMP/zs3M/0FKU/8fKTT/LDI7/zQ7\n        RP8rLzf/JScq/yEkKv8ZGx7oREhO6EdOV/8kJCT/JCMj/yEiJP8iISL/ERER/zE2Of/a29v/zs7M/8DA\n        wP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/wMDA/83NzP/a19T/NzxD/yY1\n        RP81PEf/KzA3/zdBTP8tMjj/KC42/xwfIuhFSlHoTFNb/ywwM/8rKy3/LC4y/ykqK/8dIST/MTY7/8XD\n        wv/S0tH/w8PD/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/Dw8P/0dDQ/8bF\n        w/81PUb/JCs0/yYoLP8+SlX/QEhT/y40Pf8qLjP/ICIm6D0/Q+g4Oj3/OkFK/zI3O/8uLzL/LTI3/y8z\n        Of8tMDX/ERIU/7Ozsv/g39//xcXE/8fHxv/Hx8b/x8fH/8bGxf/GxsX/x8fH/8fHxv/Hx8b/xcXE/+Df\n        3/+0srL/Exce/y40O/8pKy3/O0ZS/z1FTv8qLzf/MThE/y40O/8gIiXoPj4/6ERIUf85P0T/MTY9/zEz\n        Of81OkP/NDo//zY7Qf8AAAT/gYB+//r6+f/BwcH/ysrJ/8nJyf/FxcX/19fX/9fX1//FxcX/ycnJ/8rK\n        yf/BwsH/+/r5/4GDhf8AAAD/Kykq/zM7RP8wNj3/LjI7/zU+Sf81PEX/MThB/yQpLuhAQULoTVRb/0FH\n        Tv9CS1b/OUJO/zpCTP9AR0//OT9G/yQnKv8cGRb/4uLh/+no5//Dw8P/ysrK/9DQz/+6urr/urq6/9DQ\n        zv/Kysn/w8PE/+/u7f/Y2Nf/JSsx/yYmKP8xOD//LC80/yotNP9KV2T/VmRx/1dldP9AS1j/Jiwz6EJC\n        ROhSWmH/NTs//1hjcP9MVmH/SVNe/0xXZP8zNjz/P0VM/x8rNv9FTFL/5uXk//z6+P/Y2Nj/9vXz/1VY\n        XP9WWV3/+Pf2/93d3P/9/Pr/2dnZ/ztDTP8dIyv/PkNL/yswNv8lJiv/SlZk/2B1h/9xhZf/aXiJ/zxI\n        U/8kJizoRUZH6FBXX/9IUFv/UFxq/0xXY/9ianX/V2Z0/zI3O/8+RE3/SlVh/x4oMv8xOUD/m56f/9na\n        2f/r6uf/vr28/7++vf/n5eT/09TU/4yPkf8gJSn/ICgx/0JHTf80ODz/Kiko/0NOWf9SaHz/WGp9/4KP\n        nv9PXm7/Mz1I/ycsMOhISEroSElN/05YY/9ygI7/TFhj/0xaaf93hpf/P0tX/z1BRv80MzL/Q0tT/zVE\n        Uf8MEhn/ODxB/1BXX/9ZW17/Z21z/0ZGSP8oKi3/Fh4n/y0wNf9CSE7/Oj5D/zc5PP80NTj/P1Bi/0hY\n        Z/+an6P/WGVy/zU/TP8/SFL/KjA26FBTWehOUVX/RlFc/296hf/V1dT/f4iS/0pabf9GUFz/QEJF/z1B\n        Rf8/SFH/QUhP/z9ESv8wNTv/R1Zo/0dUY/8oKi//NT9J/z9GTv9AREn/PT9D/z5DS/87PkL/OTs8/ywz\n        Ov9PW2n/2NjY/8zLyv8dJjD/QEdR/zIzOP8pLjboV1tg6FdcYP9LVWD/QUxW/97d2v//////fICE/xAV\n        HP9ATFn/Rk9X/zw+Qf8/R1H/ISoz/z1ETP9xfYz/TlZe/0JFSf9ET1n/PEpY/z9DSP8/Qkf/Q0lR/zI1\n        OP84Oj7/Exgh/3R3e///////q6mp/yIoMP9HUFr/Mzg+/yswNuhNTU/oZGlx/1Zhb/9HUlz/xsXE//Dw\n        7////vv/paiq/xkeJf8nKi//KSww/yguNf98f4P/Mjc+/y0yN/9QVl3/LjZB/zc5O/9scHP/HiMp/z9K\n        Vf81PUX/Jigr/0tNUf8vMjf/Xl9h//////+2uLn/KC40/z9ESv84PkT/Kisv6FBQUOhmbHX/T1pn/0VO\n        Wv/Ozs3/7Ovr/9ra2f//////zsvK/zY8Qv8eIyn/v769///////Gxsf/LC4w/yEpNf9ARk7/zczK////\n        //+goaL/Higz/y4zO//Gxcb/eXp5/2JiY/9xcXH//////7u+v/8rMzv/QkVL/zk8Qv8uMDPoWlxh6Fxk\n        bf9FS1P/RE5Z/9HR0P/v7u3/+fn5/+Hh4f//////l5iZ/7i5uv//////+/r6///////Hx8f/WmBm/9zd\n        3f///////Pv7//////+mp6j/nJ2e//////9nZ2f/paWl/3t8fP//////v8HD/zVATf9GSVH/ODxC/yss\n        LuhianPoXWZw/0lQV/9FT1r/19bV/+7u7f+lpqb/4uLh/+np6P+enp//6ejo//Hx8f+Wlpj/sbKy//7+\n        /v+2uLj//v78/62ur/+oqKr/8/Py/+Tj4v+qqan/8/Tz/4WHiP/f4N//l5ma//n6+P/AwcL/MztH/0hN\n        VP86Ozz/MjU46GZscuhpcnz/SE5X/0RNWP/Z2Nb//v///yUmKf+XmJn//////5eXl//u7u3/0tTX/wEH\n        Dv+1tbX//f39/52foP//////lpaY/xofJv/29vf/2NfW/5+goP/u7u7/tLa3/+7u7//Q0dH/+vr5/76/\n        wP8tMDX/Q0ZJ/zY4O/8uMDLoY2dt6Gxyev9ITVT/QkdN/9va2P//////NTc5/5KTlP//////mJiY//Tz\n        8v/Ky83/GB4l/8XFxf/4+fj/mJma//////+rq6z/Ki80//Dx8f/e3t7/oqKi//Pz8v/n5+b/5+fn/+3t\n        7P//////vb69/yUkI/9RWGH/S1Rf/y4yNuhiZ2/oZ2xz/0lNUv9CRkz/397c//////87PD7/mJiY////\n        //+Zmpv/8/Pz/9DQ0P8dHiH/xMTF//v6+v+YmZn//////62wsv8vMjf/8/Pz/9/f3/+jo6P/9/f3/+3t\n        7f/p6ej/6Ojo///////AwcH/JiUk/09TWv97iZj/S1Re6GZrdOhqcHf/R0lL/0VKUf/k5OT//////0BB\n        Q/+cnJz//////5qbm//08/P/09PU/yMkJv/Gxsf/+/v7/5mZmf//////tbm9/ztBSP/z8vL/4OHi/6Wm\n        p//5+fj/6+vq/+rq6f/q6un//////8HBwv8yNDf/Ozk4/1deaf94hpboZm516G1yd/9MTU7/R0pN/+nq\n        7P//////IyMl/5GRkv//////pKSl//39/f/Ky8v/AAIG/8DBwf//////mpqb//////+usrb/Ji42//b0\n        8//l5eb/qaqr//r6+f/t7ez//f37//Dw7///////w8TG/zQ1OP9MUFT/P0VM/1FaY+hscXnoa252/1RY\n        Xv9BQD7/6erq//////9sbW3/s7Oz//z7+/+ysrH/+fn4/9ra2v9maGv/19fY//X19f+dnp//+fr5/8PE\n        x/9rbnP/+fn3/+Tk5P+rq63//f39//Pz8//h4eL/7u7u///////Dw8T/NDc8/19qdv9FSEn/LCoq6Hh/\n        iOheXmH/aHJ+/0ZFRf/z8e/////////////////////9/769vf/+/vz/////////////////9/b1/66v\n        sP////7/////////////////7ezr/7a2tv///////////2xvcv/d3t///////9HQzv8/RlD/Wl1j/0ZJ\n        UP8+Q0roe4OO611bWv9fZW3/d4GO/8HAv/++vLn/yMbG/9DS0//FzNH/Zm11/6eqrf/My8r/w8G//9XY\n        2v+2ur7/Ymhw/8PIzf/e4uX/0NLU/8/R0v+ZnaP/h4mL/9LS0//a3+P/Q0hR/5aYnP/MzMz/t7m6/1NV\n        V/9LS0//W2Fr/0NITut+ho/4cXFx/2BgYv9tc3r/bnqI/15odv9ITlb/Z3J//4KRof9ueYX/PkJH/zg2\n        NP9dZnL/TVNb/1xlcv9kbnv/S1Zh/2x5iP9kbnv/XGd0/0ZKUP9gZ3H/SU9V/2VxgP96hpf/QkJF/0NF\n        Sv9VXWb/YGFi/1VVVf9VWFz/RUdM+IqRmKuHiYz/gIKI/3V3fP98gIb/kpup/5Seq/9/gYX/bGpp/3t/\n        gP+EjJX/lqGu/52tvv95fYX/fH+H/4qUnv+EjZf/e4GI/3qBiv9+gor/hIyU/4SLlf98hIz/eX2C/5Gc\n        qf91eoH/eX6E/3yDjf9xcnT/a2pr/19iZ/9iaXKqk5qjC5KVnaWIipHvjJSf7IaLkuh/f4LoqLTD6Jmh\n        rOiTmZ7ooqix6L7L2ei/zNzoqLPA6I+YouiIjJLohImR6J2puOiSmqPoiZGa6IOEh+iPkpjoiY6V6Jii\n        seiGiI3oiZCW6Jqms+iIjZPohYiO6ImQmuyJkZvvb3B0pWJlaAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5SloAFRgeAA4OEiUNDhObDhEW4RAUGe8bIiroFRwk6A4T\n        GegOEhjoFRwk6AoPF+gbGhroZWRk6IKCgeh2dnXod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3\n        duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh3d3bod3d26Hd3duh2dnXogoKB6GRkY+gcHR3oDxYe6A8S\n        F+gMCw3oFx0l6BIYIegOEBboCwsN7xQaIuAaJC6aIik0JCwyPAAyOkYANERSABMYH0cPEBX1DAsN/w8S\n        Gf8RFBz/FRsj/xcdJf8VGiL/FBkg/wcME/8VGiD/lZWU/5+gnv+CgoL/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aG\n        hf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4aGhf+GhoX/hoaF/4KC\n        gf+fn57/l5iY/xIUGf8AAAD/Fxog/x0mMv8REhn/Dg0O/xAUGf8iLDr/KzQ//yszPvMqMTtELDM9AEBN\n        Xh8qMz7/HiUw/xARFf8dHyT/GyAq/xskL/8ZICj/HCQv/yMqM/8OGCH/GRwh/728vP+3t7b/r66u/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+v\n        r/+vr6//r6+v/6+vr/+vr6//uLi3/7y8vP8YGRv/BQUG/yQtOP8fJjP/GRwg/xQSEf8fJjD/PEtc/zE6\n        R/8iJzD/NDxG/jQ8RxpDT2CjW2p7/ztHWP8jKTP/IiUs/yQqNP8aIyz/GyIq/x8oM/8dJzD/Fx0m/wAA\n        Cv99fX//19XT/7GxsP+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0\n        s/+0tLP/tLSz/7S0s/+0tLP/tLSz/7S0s/+0tLP/sbGw/9jY1/95eXn/AAAA/x8kK/8qNUT/GiAn/xMT\n        E/8VFRb/LTlJ/0JTZf8ZHSf/EBIY/zM+Sv8uNT+eJDE95mV1iv9icYX/Nj9K/w8SGP8hKDD/MDhC/xsg\n        KP8dJC//KDVB/x0fJf8DBQ7/Oz9D/9XU0f+1tbX/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2\n        tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7a2tv+2trb/tra2/7W1tf/V1dX/NTQz/wAA\n        AP8rNkT/Iikx/xQVFf8SDw//GRwh/zJDVv8mLzv/EA0S/ygzP/8qNT//FRkh5CYsNu5SYnP/bnyM/0tZ\n        af8UGiL/EhAO/zM8R/8mLzr/LzlF/ztIWf8eJi//FRof/xohKf+zs7H/xcXE/7a2tf+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3\n        tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7e3tv+3t7b/t7e2/7a2\n        tf/FxcX/t7e2/woJCP8SGiT/JzA7/xQTEv8XGBr/Fhcb/x8mL/8rN0P/FhUW/yApMf8xPkz/GR0l/w4R\n        Fu4vMzvoPklX/11pev9KVmT/GiMt/w0LDP8vNT7/Tlpq/01XZv9HVWb/Hyct/xQUFf8CChX/k5SV/93c\n        2P+6urn/vb28/7q6uf+3t7b/uLi4/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4t/+4uLf/uLi3/7i4\n        uP+3t7b/urq5/729vP+6urj/4ODf/4uLif8AAAD/KDE9/xwbHf8bHiT/HB8l/xgaHf8iJjD/ISQo/xgZ\n        Gv8nMj//Gxsd/xMTF/8ZHiToOUJM6DE5Q/9LWWr/OkRR/x4kLf8TEhX/Jysy/1Nfbv9WYXH/RlJh/xca\n        Gv8aGx3/CBEc/1ZaYP/q5+X/y8rJ/8vLyv+6urr/tra2/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5uf+5ubn/ubm5/7m5\n        uf+5ubn/ubm5/7m5uf+5ubn/t7e2/7q6uv/Kysn/zMzM/+vp6P9FREP/BQsS/yMkKf8fISr/JCo0/xob\n        G/8ZGRr/IiQp/x0eIf8cIij/Gxsd/xgYF/8eIyf/Gx4j6EVQW+gtMTr/OUZT/zxIVv8mLDT/FBIR/yEj\n        J/88SFX/WWV1/1Bbav8TExL/GBga/yYuOf8dJCv/OUBH/zQ0Nf8iIiL/iYqL/9bW1f+5ubj/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/urq6/7q6\n        uv+6urr/urq6/7q6uv+6urr/urq6/7q6uv+6urr/ubm4/9jY1/+Hh4f/HyAg/zc3Of8uLCv/FRog/yMq\n        L/8hJCv/KDE+/x8gI/8YGBf/FRMR/x8jJ/81RFT/MTlD/yQoLv8pLzr/GBod/xAPEeg7QkvoMjQ7/zI9\n        Rv84RVP/ISUt/xUTEv8eHh//JzE6/0FMWf9FT1z/Gxwe/xUUE/8lLTb/ICcu/wYJDP8BCBD/AAAA/62t\n        rP/R0ND/ubm5/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7\n        uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7u7uv+7u7r/u7u6/7q6uf/Ly8v/ubi3/wIE\n        B/8AAAH/DRMa/yYxPP8lKS3/LDM6/ykxPP8pLzf/Iysz/ycwPP8iKTD/LjlC/zVDUP8xPkz/Ki43/x0h\n        Kf8ZHyfoQUlU6DIzN/8sMTn/M0JP/ykxPP8VFRb/GxgX/yQpMf8tOEP/JjA5/x4fIP8bGhn/ICUr/ygy\n        PP8dHBv/AAED/3Fzdv/i4eD/uLi5/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8vf+8vL3/vLy9/7y8\n        vf+9vL3/tre2/+jn5v90dHb/AAUN/0BOW/8/TFj/LTI3/yAhJf8oLzn/KCwx/x4dHP8vOEH/KzM6/ykt\n        Nf8xO0n/Ghsc/ycrMv8tN0L/HCIo6ERMVeg2OTz/KS80/zA9S/8qMjr/HyIl/x0cG/8nKjH/JC02/yQr\n        M/8hIyT/Hh4d/yAjKP8oMDv/GRod/w0MC/++vr7/1NPT/7u7uv++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+vf++vr3/vr69/76+\n        vf++vr3/vr69/76+vf++vr3/vr69/7y8u//Qz8//urm5/x0kLP8nMz7/LDE5/ykuNf8mKzT/Jigp/xsY\n        F/8mJyv/KSos/ywyO/8rLzX/Ki40/ycsMv8gIib/KDA3/xsfI+g6PUPoOj1E/yswNv8tNkP/JCYr/yYn\n        KP8oKiz/Jiku/yIlK/8iJSr/ICIj/yAhIf8jJin/KjE6/xMWG/8fICD/v7+//8vLyv++vr3/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/\n        vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/v7++/7+/vv+/v77/xMTD/8rJx/9AR0//KDVC/zY+\n        R/8pLzf/LDE4/yEfIf8vOEH/ND1H/yotNP8wNj//HRoY/yIkJ/8xPEr/Hx4e/x4dHf8aHSLoPkdR6DIw\n        MP8sMDb/KS84/yYpL/8eHR//JCUm/ycqLP8kJSr/IyUo/yAhIv8fHx7/IiMj/ygtM/8QERL/LTE1/8fH\n        yP/Jysn/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DA\n        wP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8DAwP/AwMD/wMDA/8TE\n        xP/R0M7/Q0lQ/x0pNP87Q03/NT5G/yUsNf8wOkT/P01a/zM4Qv83RFD/NUBM/x4bG/8uND3/Ky82/yco\n        Kv8kKzP/HCAm6DxAQ+g2ODz/Ki83/ygtMv8qLDD/IyQk/yIiIv8jJCb/JCYo/yMmKP8gIiT/ICAg/yMi\n        Iv8jJSj/ExQW/z5CR//Ly8v/ycnI/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LCwf/CwsH/wsLB/8LC\n        wf/CwsH/wsLB/8LCwf/GxsX/1dTT/zg5Pv8UGyb/QE1a/y46Rv8wOkf/PkhW/zM4Qf8nKS//KzI7/ysw\n        OP8vNDz/LjI5/yYoLf8sOEb/KC41/xUVFOg5OzvoWWJq/0RRYP8oLzf/JiYl/ygoKP8mJif/JCQm/yUm\n        J/8jJCb/IiMk/yMiIv8pKSz/JiYm/xIVF/87QUb/zMzK/8nJyP/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PD\n        wv/Dw8L/w8PC/8PDwv/Dw8L/w8PC/8PDwv/Dw8L/x8jH/9HQzv80NDj/Hio2/zhFUf81Pkv/PkdR/y4z\n        Ov8eHh//JSkt/ztHVP80OkT/NTxF/y82Pv83RFL/MThB/x0aGP8dICLoOz1B6EBESP9UXmv/Q01Y/x4d\n        HP8vMzn/KCoq/ykqKv8oKCn/JCQj/ykqLP8mJST/KCkq/y8zOP8XGyD/Mzc7/97d3P/e3t3/yMjH/8HB\n        wf/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TE\n        xP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/ExMT/xMTE/8TExP/BwcH/x8jH/93d3P/f3tz/PUNJ/xkh\n        Kf8uNkL/NDxG/y0yOP8iISL/Jiku/0dVZP9OW2n/P0hT/zA2Pv8oLDL/KCgq/0BJVP8mKjH/IyUo6D5B\n        Reg8Qk3/Kywx/y8wMf8wOUH/Ky80/yckIf8zNjv/MTU9/y8xNf8vNDn/Ky8z/yUkIf8zOkD/Iis1/zIx\n        Mf/Ix8j/xMXE/8bGx//Fxcb/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TE\n        xf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xMTF/8TExf/ExMX/xcXG/8fG\n        xv/Ew8P/yMjJ/zg7QP8dJC//OUFM/zI2O/8gHx//JCky/0ZVaP9RYG//NzxF/ygrMv8wOEL/MTQ5/yks\n        MP8tMDb/LjQ8/x0gJOg7OzzoSVFZ/ysvNP8gHx7/PUdU/0FLVv8vMzf/LjA0/yoqLf81OUD/LC4w/yot\n        MP8zOED/LC0w/zA4Pv8rLjL/IiQm/wUHC/+ZmJf/5uXk/8TEw//GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bGxf/GxsX/xsbF/8bG\n        xf/GxsX/xMTE/+bl5P+Yl5f/BgkN/ygsMf8tND3/NDxI/zU7QP8pKCb/JSsz/0JSZP9SX2z/LTA0/yMm\n        Kv85Qk3/N0BN/zxIVv9CT17/MjhA/yUmJ/8eICLoOzo76EVITf8uLzH/Ky81/y41PP85PkT/QEtY/ygq\n        Kv8pKif/Mjc9/y4wM/8lKCf/NT9K/zAxNf8tLjD/MjpB/yUnKf8AAAD/d3h3//Dv7//ExMT/yMjI/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jIx//IyMf/yMjH/8jI\n        x//IyMf/yMjH/8jIx//IyMf/yMjI/8TExf/v7ez/e31//wABBv8lKjH/MzxG/zI1Of8oJyX/Jyox/zxM\n        XP9KVV//MC4w/yksMf89Slf/NDtG/y4yPP8uND3/MDI6/zlASf8vNz7/Hh8f6Do5OOhAQ0n/Kist/zM5\n        Qf8zNz3/KSor/z1FUP81OkP/Kiwt/zc7Qv8xNDr/LjE2/zZCTf80OT7/LCsr/zhCTP81OT//CQkH/0tN\n        Tv/s7Oz/xsbG/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jI\n        yf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/IyMn/yMjJ/8jIyf/Ix8j/6eno/0xPVP8OEBP/LTE1/y0v\n        Mf8nJST/Jyku/zdEU/86Q03/Kysu/yswOP8+S1r/NDlC/y0zPf80Pkr/PERP/zI0OP84QU3/MzxF/x8g\n        I+hFSU3oPkBD/y0tMP8/SVf/Nj1D/y0sK/87RE3/OEBM/zAyOv87QUj/MzY+/zU4P/9BS1f/NjxA/y4t\n        Lf81Pkn/NzxD/yUjI/8OEBH/wcHB/+Pj4//Gxsb/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rK\n        yf/Jycn/yMjH/8jIx//Jycn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/Kysn/ysrJ/8rKyf/FxcX/6Ofm/7m7\n        u/8NERb/Jyco/yoqK/8nJST/Jygr/zVATf85Q0v/JSUm/ystN/85RVH/NDxF/zQ6Rf87RlP/QktW/zg+\n        R/9BTl3/R1Rj/yYmKP8kKjDoRkpP6ENDQv8zNzz/RlJf/1FdaP8rKiz/PURM/z5LVv8yOkP/PURP/zQ7\n        RP81O0L/RlJd/zc9Qv8wMTP/QktV/zY8Qv8yMTD/AgIE/2FhYP////7/x8fG/8vLyv/Ly8r/y8vK/8vL\n        yv/Ly8r/y8vK/8vLy//IyMf/zs7O/+Tk4//k5OP/zs7N/8jIx//Ly8v/y8vK/8vLyv/Ly8r/y8vK/8vL\n        y//Kysn/zMzL//n39P9WW2H/ERgf/zQ1Nf8sKyr/Kios/zU9Rv82QEn/KSkq/y0uMv80Pkv/P0ZR/0pS\n        W/9ATlz/V2Ft/0tVXf9HVmb/UF5u/zU8Q/8vN0H/KzM76D8+PuhBQED/Oj9F/0BKVP9CRkz/PUNM/0lT\n        Xv9WYm7/NT9J/z1FTv85Qk3/OkFM/05aZf86Qkv/NDQ6/z1CR/82PEb/Ly8t/zAvL/8AAAD/paWk//38\n        +//DxMX/zMzM/8vLzP/Ly8z/y8vM/8vLzP/Ly8z/z8/P/8rKyf+zsrH/srCx/8nJyP/Pz9D/y8vL/8vL\n        zP/Ly8z/y8vM/8zMzP/Kysv/xsfI///+/P+QkJL/CRAZ/0JKUv84Oz//MDM2/zQ6Qv8zPEf/Ki4x/yop\n        LP8yN0L/NkBN/09XY/9bann/W2x8/15pdv9XZ3j/Wml6/0pUYf9OWmb/OUVQ/yEjKuhDRUnoQD8+/z5F\n        Tv9HUl3/Kigm/zM5Pv9MWWj/aXOA/0VPWv80PUf/QEhT/0JKVP9ZY2//RFFf/zIzNv83O0D/OUBL/y8u\n        Lf8zNjf/JzA4/yQsNf/NzMz/+vj2/8jIyf/LzMv/zs7O/87Ozf/Ozs3/y8vL/+vr6f+qq6r/BAgN/wkO\n        Ff+sraz/6uno/8vLy//Ozs3/zs7N/87Ozv/Jycn/0NDQ/////v+rrq//GCEq/y0zOv84O0D/NDQ2/zY8\n        Rv8yOkT/KS0z/yoqLP8uMDn/ND5K/0lUYP9WZHT/WG6A/2R1hf9ldYX/cX+Q/1hldv9SYG//T11t/y82\n        Pv8iIyjoSUxQ6D89Pf9BSVP/UF5t/zQ1N/8wMjP/T11q/2Fpdv9JUl7/TFZg/1BZY/9LVmD/V2Nw/0hW\n        Zv8yNDj/Oj9D/zxBSP86RFH/Slxs/1Zlc/8lLjf/GSAm/7W2t/////7/39/e/8nKyf/Nzc3/z8/P/87O\n        zv/i4uH/w8PE/w8WH/8UGyH/xsbH/+Lh4f/Ozs7/zs7O/8zMy//MzMv/6+vp//37+f+Kiov/GCMt/zY/\n        Sf8/REv/NjtA/zg8Qf82O0P/LDA3/ywvMP8tLTH/MjpG/0ZTX/9cann/XW+A/1htfv9meIn/anyL/219\n        jv9fboD/P01a/z5KV/8xNDn/IiQo6EFBQuhCREb/QEdQ/1hjbv88RFD/NThA/05ebP9lb3z/Ulpl/1Fb\n        Zv9QWmf/XWVx/2Fsev9LW2r/Mzg+/zo+Qv80NDn/R1dm/0VRXv8xNj7/QEtT/zE8Rv8UHCT/dXh8/9rZ\n        1//7+vf/6ejo/9XV1f/Ozs7/zs7O/+Pj4/+6urv/t7e3/+Li4v/Ozs//0dHQ/97e3v/w7+3/9PPz/7/B\n        w/9OUVP/Cg0S/zhATP9ASFH/ODtC/zg/Rf84PUL/NDc9/y4yM/8xMjP/MDQ9/z5MWv9XaHf/XW6B/11v\n        gP9jdIf/eYaY/3KCkf9ndof/QU1a/z9LWv9ET1r/LTE3/yUoLuhBQkPoSkxQ/z9DSf84O0L/RE5b/1hi\n        bf9XYnD/T11s/1hha/9YXmn/Vl1p/1deav9seIf/VGd2/zQ8QP83OT3/PUNM/0BJUP8zMjT/PkJK/0JN\n        Wf9GTVb/PUZQ/xIdJ/8rMjn/fYGE/72/wP/g397/+Pf1/93d2v+dnZ3/vLy7/769vf+cnJv/3t3b//T0\n        9P/R0ND/qayv/2Zrb/8XHST/EBUY/zxARf8+RU3/O0JI/zg6Pf85PkX/NjlA/zM0Nv8yNDX/MTE0/zhD\n        Tv9NXGv/Wml8/2Fxgv9IW2z/YW19/4CMmf9odYb/U2Bu/ztIVv9MWWf/OURO/zI7R/8sMDboRUZG6E5Q\n        U/9BREn/MjM2/0NKU/9ZY27/Ym99/1JhcP86SVj/U11n/1llbv9hbHn/cn+O/1xtfv85Qkr/PEBF/0RO\n        W/83Nzn/QERI/0NMVf80Njv/Nz1E/0dSXv9ASVP/LDI7/w8TGf8dHyP/SVBV/2pwdf+EiIz/hISG/4eF\n        g/+LjI3/jpGW/3J0d/9PT0//Kikp/x0mMP8jLTT/NDY6/zg6Pf88Qkj/OUBG/zo/Rf85PD//PUFE/zxD\n        S/8yNTb/MjEx/zEzOf9DUF3/WGl4/2Z3iP85SVj/QE1Z/7y/wv9jbnj/Pkxc/0VUZP86Qk3/XGl4/0lV\n        Yf85Qkr/KCwy6EdHSOhLTE3/P0FI/0NITP9ITlf/Ulxp/1Nkcf98hZL/hI2V/yY3Rv9NXGn/b3yN/36L\n        m/9nd4f/P0tY/0BHUf9GT1r/PD9E/z9FS/8zMzX/MjM1/0ZTXv9FUl3/RExX/0FMVv81OkL/MTAx/y44\n        Q/8oNkT/FRsn/xIUGf8dJS3/HCIp/ykuNf8jLjv/EhER/ygnJv8+REz/R1Jc/zo8Qv81Njf/QkhP/z5E\n        Sv84PUP/O0BF/zg5O/9AR0//NztB/zAwMP8yNz//R1Vk/2NxgP80RFT/PEZR/+Hh4v/AwcL/GCQw/05f\n        b/9IVmb/LS0w/0xVYP9JV2X/NT1F/ycqLuhOUFLoS05S/zo7P/9FSVH/SU5V/1djbv9VZXT/b3mC//j0\n        8P+hpqn/PEhX/2h2h/9/jJz/aXeH/0NPXP9CSlP/SVFa/z1AQ/82NTP/MzM0/0VQW/9DT1j/OUBH/0RN\n        VP89R1D/LzA0/zxARf9ESlL/RlFd/0dQXf9fbHr/ZniK/zw+Qv9ISk3/U19s/zxCSf8xMC7/P0RL/0RL\n        Vf89QEb/MzM0/0JKUv9ARkr/ODxD/zxARf83OTz/O0BF/zs/Qf8xMTL/OUNM/0tZaP8mMT7/WV5k/+jn\n        5P//////f4SH/yEsOP9MVWD/Q0xY/zM1Of87QEf/SFBY/zE1O/8iJCnoVlpg6FNbZv86PED/R0pP/0pQ\n        WP9WYW3/VWFu/0xWYP/S0tP//////8jIyP9bZW7/Slhn/3F/j/9GTFb/QUlS/zs/Q/82MzH/QEJG/0dT\n        Xv9JWGL/Nzk8/zxARv88Qkj/NDM1/zs+RP9ETFX/PD9C/1djcP98i5z/doea/0xTW/8xLCn/SExR/0VM\n        VP9VY3D/UVhh/zU6P/9IUFj/PD5B/zY1Nv9DTFb/PUJI/zs/Q/86PkP/OTs9/z9ESP86Ozz/MTEy/zpF\n        UP9DUF7/i46S//n28v/n5+X/8vDv/42Qk/8aHyT/PkBF/0JNV/9EUFz/Q0dL/zIvL/8uND7/MDlC6FNW\n        WehkanH/QURL/0tQV/9KUFj/Tlpn/1VicP8yOkH/ysvK/+Xk5P/z8e//4N7d/2dveP8mMj//Nzc4/0NI\n        Tf9RWmb/TFZi/0RRXv9DUVv/Njg6/zIyNP9GUFr/SVJc/0VOV/9KV2P/Oz5F/ztARP9seYn/aHOB/1xo\n        dv9ARkz/PkBF/0hPVv9CSVH/Qk1V/2x8jf9cZnP/P0ZO/zs+QP86Ojz/QUhR/z1BSf88P0T/PEFH/zk7\n        PP88QUf/QERJ/zs6PP82OUD/JC44/8vMzP/39vX/z8/Q//j39/+Jio3/EhIV/z9HUP9OXW3/SlBZ/zcz\n        NP86RVL/P0pU/y4wNOhNUFboV1ha/0dLUv9PV2D/S1FY/01WYP9baXf/Lzc9/8nJyP/q6un/0dHR/+vq\n        6P/+/fv/d3h5/wgKDf81PEX/WGVy/0lXY/8/SFT/Ojw//zQxL/8+Q03/R1Bb/1JcZv81PET/QElT/0NH\n        TP9ARUv/W2h3/1Zfaf9IUlv/PEJJ/0JHTP9QWmX/RE5X/z9DR/8+R1D/YG+A/z1BR/9BQ0f/PD9B/0FJ\n        Uf9DSFD/Oz9D/zxBR/86Oz3/Oz5C/0ZJUP9BRUv/Njg9/xATGf+KjI7/+/r5/9TV1f/5+fn/iYiI/w8R\n        Fv9KWmn/UVdh/zU1N/9AS1f/SFRf/zM1N/8lJiroWVtg6E1MTf9LUVf/X2hy/0tPWP9JT1b/XW16/zM7\n        Qf/Hxsb/7ezr/9nZ2P/U1dX/4eDg//////+trq//Iywy/x8lLv9GS1P/PT9C/zc0M/8+RUz/PEBE/z9B\n        Rf81QEr/LDE3/y8xNf8pLTH/VVxk/0pSWv88Ozv/TFVg/0hQWf9BRkn/PEBI/1FZYv8uLi//MTc8/ykz\n        Pf87PUL/Q0hP/z9DSP9FT1n/RExU/z1AQ/9GS1H/KSkq/yYoLf9ER0v/PUBF/z9FS/8cISj/lZWU//r6\n        +f/W1tb/+vr4/4mJif8kLzv/VFxk/zg4Of8/R1D/SFRg/z4/Qv8vMTf/LjM56FBQUOhOUFH/T1Rd/2lw\n        ev9WYGz/TlZk/19ufP80PUb/xcTE/+/v7v/Z2tr/29vb/9jY2P/Z2dn//////9nZ2v84OTr/DQ0O/z49\n        Pv9DTFb/QEdQ/z8+PP8UGB3/KTA4/9HS0//V1dX/KSos/yUtN/9OUVX/PD1B/0tRWf9LU1v/WGFt/0xS\n        W/8PERT/SUtM/9fY2P+Hioz/DxMY/zk/Rv9FTFT/RlNf/0JKVP9DREf/Iigv/zY3OP9sb3L/HiEl/3d5\n        ff+CgoT/BQgM/5yeof/6+vn/2NjY//r59/+Sl5v/Iykx/zw6Ov8/REn/RElS/0JHTv8+Q0v/OT1D/yst\n        MuhPT07oT1FS/09UXv9haXX/Tllk/1FaZv9ZZ3f/NTxE/8XExP/x8fD/2trb/9zc3P/c3Nz/3Nzc/9XV\n        1f/49/f/9fX0/19eX/8LEBf/QktV/0VJUP8ICAz/P0JG/9zd3f////7//Pv7/+Ti4v9MUln/FBYZ/0hL\n        T/9GSlD/SE5Y/0tSXP8VGiD/WVlY//Pz8//29vX//////6qqqf8gIyf/Iyw0/1hlcf9PVl7/EhUZ/zE0\n        Of/j4uP/vb/A/wAAAP+QkJD/t7i5/wAAAP+am5v//f39/9nZ2f/8/Pv/kpOV/x8oMf9DTVf/R0xU/0NH\n        Tf9DRkr/RUlQ/zY4Ov8sLTDoUFBQ6FNVWf9cZG3/VWBr/0NHTf9RV2D/UV5s/y01O//Mzc3/8/Hv/9zc\n        2//d3dz/3d3c/93d3P/e3t3/19fX/+3t7P//////l5iY/zg7P/8KERn/cXN1/////v/29vT/19fW/9jY\n        1v/29vX//f39/2xrbf8OEBH/SlFY/1BaZ/8cIij/hoaI///////s7Oz/2NjX/93d3P//////1NTU/zI5\n        P/8tND3/KzA2/09SVf/v7+///////5STkv8AAAD/s7S1/9/e3v8AAAD/mJiX/////v/a29n//Pz6/5WX\n        mf8nMDn/TVNa/0lNU/9FSlH/QUNI/0JGTP85PkP/LC4v6FBPUOhbW13/WWFt/05XZv9ERkj/UFZf/1Je\n        a/8wNz//ysvL//Pz8v/c3N3/3t7f/93d3f/e3t7/3t7f/9/f3//a2tv/6urq//////88P0L/hIeJ////\n        ///p6ej/2dnZ/9/f3//e3t7/2NjY/+rq6v//////ioqL/zA3QP9LVF3/tLW3///////j4+P/2dna/97e\n        3v/e3t7/2dnZ///+/v/s7e3/QkVK/1VZXf//////7+7u//39/f+amZn/AAAA/9HS1P/+/fv/Fxgb/4+Q\n        kf//////29vc//78+v+VmJ3/KjdF/1FcaP9CRUr/Q0ZM/0VIUP9GTVf/Oj1D/y0uL+haXmXoU1db/1Jc\n        av9QXGn/QkJF/1JYYf9RXm3/MztE/8zMzP/08/L/3t7f/9zc3f/z8/P/5eXl/93d3f/g4OD/3d3d//39\n        /P+ampv/WVpc///////h4eH/3d3d/+Dg4P/a2tr/9/f4//Py8//W1tb/4uLi//////92e37/l5ue////\n        ///d3dz/2dnZ//X19f/s7Oz/29vb/+Dg4P/Z2dr/9PTz//T09P9zdXb/1dTU/+Xk5P//////kZKS/xob\n        G//n5uX//////zs8Pf99fn///////9zc3f/+/fz/lpme/y04RP9VYG7/SU5W/0JDRv9GSlL/R01U/zc3\n        Nv8sLS/oYGVr6F9mcf9UYW3/UVxo/0ZFRv9UXGT/Tltn/zM5P//Nzs7/9vX0/+Dh4P/j4+P/w8PD//j4\n        9//s7Ov/3d3c/+Dg3//+/v7/mpub/3Bwcv//////3t7e/+Hh4P/f397//////8LCw/+trq//7+/v/93e\n        3f//////hYeI/5udnv/+/fz/39/e/+bm5f+4uLn/6Ojo//f39v/b29v/4uLh/+Hh4f/6+vr/V1dX/7a2\n        tf/09fT//////4WGh/9AQUP//v79//////9sb3D/d3l5///////e3t7//////5aYmv8kKC7/TVNc/0xS\n        XP9JTVP/REVI/z9AQf81ODn/Kiwu6FtbXehoc37/VWFt/09WX/9FREX/VmFs/09caP8wNDv/zMvM//j3\n        9//g4OD//////1JTVP9WVlf/9fX1/+fn5//f39///v7+/5+foP9nZ2j//////+Hh4f/f39//+vr5/72+\n        wP8EBAb/hYeG///////f3t///////32Agv+WmZv////+/9/f3///////XWBj/ystMf/d3d7/9PPz/9/g\n        4P/l5eX/8PDw/15dXv/AwcH/8fHx//////+DhIb/bG9x///////9/Pz/nZ+g/4SGiP//////39/f////\n        //+Wl5r/KDE8/0xTXv9NU1z/R0lM/0VHSf9MUFX/R01V/zg+ROhYV1jobHZ//2Fwfv9QV2D/R0hN/1lk\n        cP9OW2f/MjY9/83Nzf/5+ff/4ODg//////93eHn/AAAA/3l7ff//////4eHh//////+foKD/aGlp////\n        ///g4OD/+Pj4/8bHyf8YHCP/EBUb/6aoqP//////3+Dg//////+Bg4X/mZye///////f39///////4WG\n        if8AAQf/WV9m//b19P/p6Oj/5eXl//Hx8P9dXl//wcLC//Lx8f//////i4yO/5aYmf//////7u7u/8PE\n        xf+dn6D/9/f2/+Dg4f//////lpWW/yktNP9QV2D/SEtP/0RFRv9IS0//SUtO/zo8Pf80NzroWVla6Gpx\n        ev9qdoP/Ulpi/0ZFRv9WX2v/TVpm/zI2Ov/Pzs3/+vr5/+Li4v//////e3t9/wgKDP9oamz//////+Tk\n        5P//////oaCg/2lpav//////4eHh//////+nqKv/JC02/ygvNf+goJ7//////+Hh4f//////foCC/5ea\n        m///////4eHh//////+Ehof/Fxke/09WXv/m5uX/8O/u/+fn5v/y8vL/Xl9f/8LDwv/19fT/+vn5/6an\n        qP+8vb7/9fT0/+Pj4//j4+P/0NDR/+fm5v/j4+P//////5iYmv8fICL/RUZG/0VFRf9JTVH/Q0ZM/0JG\n        Sv84ODv/KSgn6FdYWuhgaHD/bHaC/1ddZP9EQ0T/V2Bs/0pSXf8yMzX/z8/P//r6+//j4+P//////3p7\n        ff8GBwf/dXZ3///////k5OT//////6Giov9qamv//////+Li4v//////s7O1/y42P/8mKjD/oJ+e////\n        ///i4uL//////3p8ff+TlJX//////+Li4v//////hYeI/xUYHP9XXWT/7e3t/+7t7f/o6Oj/8vLy/2Bg\n        Yf/Dw8P/9/f2/+np6f/R0tL/39/f/+fn5//k5OT/6Ojo/+7u7v/j4+P/5OTj//////+YmZn/ICIl/0ZI\n        S/9HSk7/TVVg/1BYYv9GTFP/ODpA/zEzOOhZWVvoZW10/2Zvef9XXGX/SEhJ/1hgav9ITlj/MzI0/9DR\n        0P/8/Pz/5ubl//////97e3z/BwkK/3R1dv//////5+fn//////+io6P/bGxt///////k5OT//////7S0\n        tf8sMDf/JSow/6Khof//////5OTk//////96enz/kJGS///////k5eT//////4WGiP8XGx//VVpf/+zs\n        6//w8fH/6urq//Pz8/9iY2T/xsXG//n4+P/k5OT/7Ozs/+rq6v/m5ub/5+fn/+fn5//n5+f/5+fn/+Xl\n        5f//////mZqZ/yAhIf9ISUr/S05U/1dib/9mcYD/XWZz/0lTXf86QEboW1xg6GhtdP9cZG3/WF1l/0pK\n        Sv9WW2H/S1Jb/zIzNf/R0tH//v79/+jo5///////fX6A/wgICv9zdHT//////+np6P//////pKWl/25v\n        cP//////5ubl//////+1tbX/LC4x/yUpLf+jo6L//////+bm5f//////fX5//5KTlP//////5ufm////\n        //+KjpL/Fxgb/1JUV//w8PH/8vLw/+zs6//09PT/ZGVl/8jIyP/6+vn/5+fn/+np6f/p6ej/6Ojo/+np\n        6P/p6ej/6eno/+np6P/m5uf//////5ydnf8mJyr/SUlL/0RFSP9faXb/kqCx/3yFk/9SXGf/QEhR6F1g\n        ZehkaXH/W2Vv/1daYf9NTlH/TlNX/0xUXv84ODv/0tLS//7+/f/o6Oj//////3+BhP8KCw3/cnJy////\n        ///p6en//////6Wlpv9vb3H//////+fn5///////tLOz/y4vMf8nKiz/pKSj///////m5ub//////35/\n        f/+TlJT//////+fn5///////j5WY/xsgJv9RU1X/8fDw//Ly8v/s7Oz/9PT0/2JjY//IyMj/+/r6/+jo\n        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fo//////+dnp//Jigq/0tLTP9APj3/TVJa/4mY\n        qv+Rnqz/WGFu/0ZPWuhfY2zoaG10/19oc/9UVlz/U1VY/0tOUP9NVl//PD9E/9PT0v//////6urq////\n        //+AgYH/DhAS/3N0c///////6+vr//////+lpqb/bW1u///////o6On//////7W1tv8vMDP/KSos/6al\n        pf//////5+fo//////99fX3/kZKS///////o6Oj//////5OXnP8gJzD/UVNX/+/v7v/19PX/7e3u//X1\n        9f9jY2T/ycjI//z8/P/p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P//////nZ2d/yQk\n        Jv9MTU7/S0tL/0FAQP9VXmj/l6a5/4yaqv9ibHjoY2dw6GRna/9ncX3/VVlf/1VXW/9MS0z/TFJZ/0BF\n        TP/V1NX//////+zs6///////f39//xESFf92dnf//////+3t7P//////pqeo/3R0dP//////6enp////\n        //+6u77/MjQ4/ygpKv+oqan//////+jp6P//////f4CB/5KTlP//////6enp//////+Vm6D/KTA4/1xf\n        Y//x8PD/9fT0/+7u7v/29/f/Z2lr/8rKyf/9/f3/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs\n        6//q6ur//////6CgoP8qLTP/TlBS/09TWf9PUlb/QT8//2Fte/+Pn7D/eoWR6GpzfuheXmD/aXN//15j\n        af9VV1n/U1RV/0ZIS/9CSVD/2NjZ/////v/t7ez//////359fv8SEhT/eHl7///////u7u3//////6Sk\n        pf+BgYL//////+rq6f//////t7e3/zI0Nv8sLzL/qaqr///////q6un//////4CBgf+Tk5T//////+vr\n        6v//////mZ+k/zA6Q/9aXWL/8vHx//b29v/w7+//9vb2/21wdP/Nzs7//f38/+zs6//t7ez/7e3s/+3t\n        7P/s7Oz/7e3t/+3t7P/t7ez/7Ozs//////+ioqP/LC40/1FUWf9QVFj/UFBT/0tOVv9SX27/Xmt7/2h0\n        gOhvfInoXl9i/19lbP9mbXj/UlJT/1teYP9FRET/QkVK/9vd3///////7u7u//////9/f4D/EhIT/3t8\n        ff//////7+/v//////+kpKT/j4+Q///////r6+v//////7e4t/8yNTz/LC0y/6usrP//////6+vr////\n        //+CgoT/lJSV///////t7e3//////5qeo/83QEr/Wl5i//Py8v/4+Pj/8vLy//b19f9qbG7/zs/Q//7+\n        /v/t7e3/7u7u/+7u7v/v7+//8/Pz/+3t7f/u7u7/7u7u/+3t7f//////oqOl/y0vNf9SVFb/TU1O/0xQ\n        WP9ic4P/Zmx0/z9BQ/9OWGTodoKQ6GBhZf9WWVz/bnmH/1dYXP9QUVH/SUpM/0JCQ//d3d7///////Dw\n        7///////ZmZn/wAAAP9fX1////////Hx8f//////pqam/5iYmP//////7e3s//////+ura3/Fhke/xET\n        GP+fn6D//////+zs6///////g4SG/5WWlv//////7u7u//////98f4P/DBMd/0ZKUP/z8vD/+/v6//Pz\n        8v/4+Pj/aWpr/83Nzv//////7u7u//Dw7//u7u3/9/f3//z8+//u7+7/7+/v/+/v7//u7u7//////6Kk\n        pf8qKy7/TU5O/09SWf9icoL/Ympx/0hFQ/80Mi7/PkJI6IWQn+hhZGj/UE9Q/2x1gv9sc37/R0ZG/0lK\n        TP9EQ0T/3t3d///////w8O//9/f3/7/Av/+RkZD/u7u7//f29//w8PD//////6mpqf+enZ7//////+/v\n        7v/19fX/4ODg/729vv+9v8D/3d3e//b29f/u7u3//////4aHif+WmJn//////+/v7v/29/f/xcbI/5ud\n        n/+ztbf/8fHx//X19P/09PL/+fn5/29ydf/Pz8///////+/v7v/w8O//+vr6/9HS0/+anJz//v7+//Dw\n        7//w8PD/7u/u//////+kpKT/Ki0x/1BSWv9jcH3/bHR8/0pIR/9LTE//QkJF/zU2OOiUoK/oX2Jo/1RS\n        VP9aX2b/fYmY/1pcYP9CQUD/RUZI/97e3v//////8PDw/+7u7v/////////////////u7u7/8PDw////\n        //+qqan/oqGh///////w8PD/7u7u//n5+v////////////v7+//u7u7/7+/v//////+HiIn/lZeY////\n        ///w8PD/7u7u//////////////////Hx8f/v7+//9fX1//j49/9ub3L/0NHS///////w8PD/7+/w////\n        //+nqaz/QERJ///////39/f/8fHx//Dw8P//////q6yu/zU5QP9dZ3T/aHJ8/1FOTv9SVVz/WWFq/0hJ\n        T/82NTboi5im6Gltc/9UU1X/U1NT/2x3g/+AjJv/REND/0A9Pf/e39////////Dw8P/y8vL/8PDw/+/w\n        7//w8fD/8vLy//Dw8P//////uLe3/6qqqv//////8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy/+/v\n        7///////mpye/6eoq///////8PDw//Ly8v/x8fH/8PDw//Hw8P/x8fH/8vLx//f39///////bW1t/8XG\n        xv//////8PDw//Ly8v//////l5mc/yYsM//a3Nz///////Dw8P/w8PD//////52dnf8pLDH/aHF8/1ZW\n        V/9RUlX/Wl9q/1pjbv9WYm7/P0VK6ISPneh1eoL/Tk9Q/1ZWV/9WWFr/e4mX/295hv9FREX/+vj1////\n        /////////////////////////////////////////////4WMkv9ianH/7/Dw////////////////////\n        ////////////////////////+fj4/1tia/+IjpX/////////////////////////////////////////\n        ////////zs/R/19gYf/8+/n//////////////////////2hrbv8eJzD/srS4////////////////////\n        ///Kycj/PkRK/1pdY/9RT1D/Vllh/1leZ/9iZ3D/WV5n/0ZOV+h7hpXofYSO/09PT/9XWl3/WFlZ/1hc\n        Yf9vfI3/iJOe/62usf+cmpr/p6Wj/6inp/+lpKP/qqmo/6yvs/+4vcP/trq//3V9hP90gI7/U1xo/1NZ\n        X/+qr7P/q6qq/6moqP+pq6v/qaus/6mqrP+5vsP/wMbL/2NmbP9TW2X/UFtn/4OKkv+/xcz/v8PI/7W4\n        vP+1ub7/s7a6/6Kjo/+xtLj/rLK6/z1FUP9hZGn/uLy//6eoqf+vs7j/zNLY/8LJ0f9MUVn/S1Fa/3V8\n        hP+npqb/rK2u/62usv+qrK3/r7Cx/3d9g/9ISUr/UFFR/1NWXf9wdn//c3mC/1JTWf86Ojzpd4GN732D\n        jP9VVFP/VldY/19iaP9cXGD/XGBm/3qFkv9seYf/U1xk/zE1PP85P0j/S1Rf/z9FTP80Nzz/Tlto/4SW\n        qP9seof/Zmty/2Rlav9PVFv/PkZP/zEvL/8sKSb/RUpR/1FbaP8sLS//SVNf/1xodf9WX2z/am93/3+K\n        lv83P0b/SVZj/3GDlf9mc4H/WWJw/05ZZ/9QXGj/RU1X/0lRW/9gZmz/WmFp/0ZRXf80ODz/MDI1/1hl\n        c/+Hmq//Z256/2Fmbf9aY23/LS0t/zM0Nv88Q03/Njo+/z1BR/9eY2v/VlRU/1JUVv9YXGH/am1y/2Jl\n        b/9KTFD/PT0/7oCJleZ8hY3/XV1d/1dXWP9bXWD/X2Np/1paWv9eYGX/dYCO/4+erv+Yqbz/eoiX/2pz\n        fv93hJP/iJan/5mmtf+cqbj/oa6+/4SPnf9vdXz/YGhz/11iaf9WU07/U1RT/5GkuP+Bj5//XGBn/2Bk\n        bP9iZW3/g5Kk/1tfZ/95gIz/Z3N//09SVv9zf43/i5ir/3N8hf90fYb/eIKQ/3uJmf9WWV3/WFZS/15i\n        aP+Mna//cXuH/1FQUf9MT1H/eomb/46cr/9XXGP/Y2pz/1pcYP9YWVr/ZnB8/15iaP9fZm//XmJo/1RS\n        U/9UVln/WFpe/1NVWv9XV1v/UlVZ/0VKUeOCipCeh5Gb/3Fwcv9dXF3/XF9l/15jbP9fYmn/XF1e/2Jm\n        bP9pcoD/dX6N/42crf90f4v/WVpc/250e/9tc3r/U1NX/1ZWWP94foT/jpml/4qaqv9YX2b/S0pJ/3aF\n        l/+ZrcT/dICL/212gf9gZGz/XWRw/3iBjP98ipj/ZnF+/3qLnP9ocn3/VFNX/3R9iP9wfYr/W15l/2Nm\n        bf9xeob/eIiY/1lfZv9QTk7/d4GN/4ydr/9RVFv/W2Bm/298iv+RoLX/Zm97/1pfZ/9YWF3/X2Vu/2No\n        b/9ja3b/Y2x5/1xeYv9XVlT/WFhY/1lZWP9WVVb/WFxg/2FreP9ha3achImMGZOcqPuGiYz/cXFx/2dr\n        cv9manT/ZWl2/2Roc/9gYWb/am1y/2NlbP9gZG7/l6a7/4mWpP9WVlX/TUlG/1VSUv9UVFL/TUxI/0pG\n        Qv9veIL/hpms/4OSov+nuM//jZqs/257iP9ye4b/cXZ//2Jrdv9fYmn/Z2lt/3KEk/9zgY//dnyF/3qE\n        j/9cYGT/ZG55/2Jocv9iZWv/YmRo/3V+if+Flqb/Zm97/1FPUf93hZT/aHJ8/2FiZv9naWz/g4+f/3J/\n        jv9hanX/X2Vs/253gv9laW7/X2Vs/257if9aWVr/XV1g/15fYv9cXF7/a293/3F4hf9dYGb6Y2luGaCq\n        ugCdqLc9jpOZ8IaFiP+ChIv/foGJ/3yEjf9+hY//foSP/3h6f/9/f4D/cnN1/5Sfrv+zwdL/laGw/4yS\n        mf+EiY//fICG/4GFi/+Hj5n/rrzK/73L2/+Zo7D/usfV/6y4x/+Dj5v/goyW/4+Wov+Aho7/fIOM/3R0\n        df92eoP/l6a6/4mSnf+AhY7/g4yX/36JlP98hI3/eXp+/3p8gv92eHz/g4WK/5SerP96gIn/dXqC/56t\n        wP97f4j/aGVh/32Ch/+Mmaf/i5ej/4+cqf91eX//dnp//4CIkv99gYr/dHd+/32Gkf92fIX/gImV/3yD\n        i/9qaWrvV1dbPFxfZACaprkAmaWzAJCWniCJiYyWi42V3IiOle6JkJrpjJOe6I2Vn+iMlKDohYaL6IaJ\n        jOiYo7Doq7fF6KCsuuiRmqboqrTB6L7I1ejCzNvowMzd6MzX5ejP3OnooKm06Ki0w+jI1OPonqe06JKc\n        p+iTmqTok52n6IeMk+iHjJToiJCb6J+sveidqrjok52p6JCVneifqbTojZWg6IWGieiLjJDok5eg6ISG\n        ieiBf4LomqGn6JOcp+ilscLokJil6H59f+iFiY7ol6Sx6Jegq+iTmqLokJag6ISFieiOk5vogYOK6I6V\n        n+iWoK7pj5mj7oySmdx1dHWWZmdpH2dqcQBhZGkAwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABwAAAAAAA\n        AAM=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/GameFileView/GameFileViewFactory.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class GameFileViewFactory\n    {\n        public bool IsUsingColumnView => DefaultType == GameFileViewType.GridView;\n        public bool IsUsingTileView => DefaultType != GameFileViewType.GridView;\n        public GameFileViewType DefaultType { get; private set; }\n\n        private static readonly Padding TileMargin = new Padding(8, 8, 8, 8);\n\n        private readonly ToolTipDisplayHandler m_toolTipDisplayHandler;\n\n        public GameFileViewFactory(MainForm form, GameFileViewType defaultType)\n        {\n            DefaultType = defaultType;\n            m_toolTipDisplayHandler = new ToolTipDisplayHandler(form);\n        }\n\n        public static bool IsBaseViewTypeChange(GameFileViewType type, GameFileViewType other)\n        {\n            if (type == GameFileViewType.GridView && other != GameFileViewType.GridView)\n                return true;\n            if (other == GameFileViewType.GridView && type != GameFileViewType.GridView)\n                return true;\n\n            return false;\n        }\n\n        public void UpdateDefaultType(GameFileViewType defaultType)\n        {\n            DefaultType = defaultType;\n        }\n\n        public static ColumnField[] DefaultColumnTextFields\n        {\n            get\n            {\n                return new ColumnField[]\n                {\n                    new ColumnField(\"FileNameNoPath\", \"File\"),\n                    new ColumnField(\"LastDirectory\", \"Directory\"),\n                    new ColumnField(\"Title\", \"Title\"),\n                    new ColumnField(\"Author\", \"Author\"),\n                    new ColumnField(\"ReleaseDate\", \"Release Date\"),\n                    new ColumnField(\"MapCount\", \"Maps\"),\n                    new ColumnField(\"Comments\", \"Comments\"),\n                    new ColumnField(\"Rating\", \"Rating\"),\n                    new ColumnField(\"Downloaded\", \"Downloaded\"),\n                    new ColumnField(\"LastPlayed\", \"Last Played\"),\n                };\n            }\n        }\n\n        public IGameFileView CreateGameFileView()\n        {\n            IGameFileView view;\n\n            switch (DefaultType)\n            {\n                case GameFileViewType.GridView:\n                    view = new GameFileViewControl();\n                    break;\n                case GameFileViewType.TileView:\n                case GameFileViewType.TileViewCondensed:\n                    view = new GameFileTileViewControl();\n                    break;\n                default:\n                    view = new GameFileViewControl();\n                    break;\n            }\n\n            m_toolTipDisplayHandler.RegisterView(view);\n            return view;\n        }\n\n        public GameFileTileBase CreateTile()\n        {\n            if (DefaultType == GameFileViewType.TileView)\n                return new GameFileTileExpanded { Margin = TileMargin };\n            else if (DefaultType == GameFileViewType.TileViewCondensed)\n                return new GameFileTile { Margin = TileMargin };\n\n            return null;\n        }\n\n        public static IGameFileView CreateGameFileViewGrid()\n        {\n            return new GameFileViewControl();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/GameFileView/GameFileViewType.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum GameFileViewType\n    {\n        GridView,\n        TileView,\n        TileViewCondensed\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/GameStores/AutomaticGameStoreCheck.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace DoomLauncher.GameStores\n{\n    public class AutomaticGameStoreCheck\n    {\n        private IDataSourceAdapter m_dataSourceAdapter;\n        private Func<GameStoreFiles> m_loadGameStoreFiles;\n        private List<string> m_installedGameFiles;\n\n        public AutomaticGameStoreCheck(Func<GameStoreFiles> loadGameStoreFiles, IDataSourceAdapter dataSourceAdapter)\n        {\n            m_dataSourceAdapter = dataSourceAdapter;\n            m_loadGameStoreFiles = loadGameStoreFiles;\n        }\n\n        public delegate Task AsyncWadInstaller(List<string> wads);\n        public delegate Task AsyncDoom64Installer(string doom64Exe);\n\n        public async Task LoadGamesFromGameStores(AsyncWadInstaller addIwadToGame, AsyncWadInstaller addPwadToGame, AsyncDoom64Installer addDoom64ExeToGame)\n        {\n            var gameStoreFiles = m_loadGameStoreFiles();\n\n            m_installedGameFiles = m_dataSourceAdapter.GetGameFileNames().Select(Path.GetFileName).ToList();\n\n            var iwadsFromStore = gameStoreFiles.InstalledIWads.Where(NotInCollection).ToList();\n            if (iwadsFromStore.Count > 0)\n            {\n                await addIwadToGame(iwadsFromStore);\n            }\n\n            var pwadsFromStore = gameStoreFiles.InstalledPWads.Where(NotInCollection).ToList();\n            if (pwadsFromStore.Count > 0)\n            {\n                await addPwadToGame(pwadsFromStore);\n            }\n\n            var doom64ExeFromStore = gameStoreFiles.InstalledDoom64Exe;\n            if (doom64ExeFromStore != null)\n            {\n                await addDoom64ExeToGame(doom64ExeFromStore);\n            }\n        }\n\n        private bool NotInCollection(string file)\n        {\n            var justTheFileName = Path.GetFileName(file);\n            var justTheFileNameZip = Path.GetFileNameWithoutExtension(file) + \".zip\";\n\n            return !m_installedGameFiles.Exists(x => x.Equals(justTheFileName) || x.Equals(justTheFileNameZip));\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/GameStores/GameStoreFiles.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher.GameStores\n{\n    public class GameStoreFiles\n    {\n        public List<string> InstalledIWads { get; }\n        public List<string> InstalledPWads { get; }\n        public string InstalledDoom64Exe { get; }\n\n        public static readonly GameStoreFiles EMPTY = new GameStoreFiles(new List<string>(), new List<string>(), null);\n\n        public GameStoreFiles(List<string> installedIWads, List<string> installedPWads, string installedDoom64Exe)\n        {\n            InstalledIWads = new List<string>(installedIWads);\n            InstalledPWads = new List<string>(installedPWads);\n            InstalledDoom64Exe = installedDoom64Exe;\n        }\n\n        public GameStoreFiles Combine(GameStoreFiles other) =>\n            new GameStoreFiles(\n                installedIWads: CombineListsIgnoreRepeats(InstalledIWads, other.InstalledIWads),\n                installedPWads: CombineListsIgnoreRepeats(InstalledPWads, other.InstalledPWads),\n                installedDoom64Exe: InstalledDoom64Exe ?? other.InstalledDoom64Exe);\n\n        private static bool HasSameFileName(string file1, string file2) =>\n            Path.GetFileName(file1).Equals(Path.GetFileName(file2));\n\n        private static List<string> CombineListsIgnoreRepeats(List<string> existingItems, List<string> newItems)\n        {\n            var resultList = new List<string>(existingItems);\n            foreach (var newItem in newItems)\n            {\n                if (!resultList.Exists(existingItem => HasSameFileName(newItem, existingItem)))\n                    resultList.Add(newItem);\n            }\n            return resultList;\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (obj is GameStoreFiles)\n            {\n                GameStoreFiles other = (GameStoreFiles)obj;\n                return InstalledIWads.SequenceEqual(other.InstalledIWads) \n                    && InstalledPWads.SequenceEqual(other.InstalledPWads)\n                    && (InstalledDoom64Exe != null && InstalledDoom64Exe.Equals(other.InstalledDoom64Exe)) || InstalledDoom64Exe == other.InstalledDoom64Exe;\n            }\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return (InstalledIWads, InstalledPWads, InstalledDoom64Exe).GetHashCode();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/GameStores/StoreGame.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace DoomLauncher.GameStores\n{\n    public class StoreGame\n    {\n        public readonly static StoreGame ULTIMATE_DOOM = new StoreGame(2280, 1317223010, \"DOOM + DOOM II\", \n            new List<string> { @\"rerelease\\doom.wad\", @\"rerelease\\doom2.wad\", @\"rerelease\\plutonia.wad\", @\"rerelease\\tnt.wad\", \n                               @\"base\\doom.wad\", @\"base\\doom2\\doom2.wad\", @\"base\\plutonia\\plutonia.wad\", @\"base\\tnt\\tnt.wad\" }, \n            new List<string> { @\"rerelease\\id1.wad\", @\"rerelease\\nerve.wad\", @\"rerelease\\masterlevels.wad\", @\"rerelease\\sigil.wad\", \n                               @\"rerelease\\sigil2.wad\" },\n            null);\n\n        public readonly static StoreGame HERETIC_PLUS_HEXEN = new StoreGame(3286930, 1572667751, \"Heretic + Hexen\",\n            new List<string> { @\"base\\heretic\\heretic.wad\", @\"base\\hexen\\hexen.wad\" },\n            new List<string> { @\"base\\hexendk\\hexdd.wad\" }, \n            null);\n\n        public readonly static StoreGame DOOM2 = new StoreGame(2300, null, \"DOOM II\", \n            new List<string> { \"base\\\\doom2.wad\" }, \n            new List<string>(), \n            null);\n\n        public readonly static StoreGame FINAL_DOOM = new StoreGame(2290, null, \"Final DOOM\", \n            new List<string> { \"base\\\\plutonia.wad\", \"base\\\\tnt.wad\" }, \n            new List<string>(),\n            null);\n\n        public readonly static StoreGame HERETIC = new StoreGame(2390, 1290366318, \"Heretic: Shadow of the Serpent Riders\", \n            new List<string> { \"base\\\\heretic.wad\" }, \n            new List<string>(),\n            null);\n\n        public readonly static StoreGame HEXEN = new StoreGame(2360, 1247951670, \"Hexen: Beyond Heretic\",\n            new List<string> { \"base\\\\hexen.wad\" },\n            new List<string>(), \n            null);\n\n        public readonly static StoreGame STRIFE = new StoreGame(317040, 1432899949, \"Strife: Veteran Edition\",\n            new List<string> { \"strife1.wad\" },\n            new List<string>(), \n            null);\n\n        public readonly static StoreGame DOOM64 = new StoreGame(1148590, 1456611261, \"Doom 64\",\n            new List<string> { \"doom64.wad\" },\n            new List<string>(), \n            \"doom64_x64.exe\");\n\n        public static readonly List<StoreGame> GAMES_IN_PRIORITY_ORDER = new List<StoreGame>() \n        { \n            ULTIMATE_DOOM, DOOM2, FINAL_DOOM, HERETIC_PLUS_HEXEN, HERETIC, HEXEN, STRIFE, DOOM64\n        };\n\n        public int SteamId { get; }\n\n        public int? GogId { get; }\n\n        public string Name { get; }\n\n        public List<string> ExpectedIWadFiles { get; }\n\n        public List<string> ExpectedPWadFiles { get; }\n\n        public string ExpectedDoom64Exe { get; }\n\n        private StoreGame(int steamId, int? gogId, string name, List<string> expectedIWadFiles, List<string> expectedPwadFiles, string expectedDoom64Exe)\n        {\n            SteamId = steamId;\n            GogId = gogId;\n            Name = name;\n            ExpectedIWadFiles = expectedIWadFiles;\n            ExpectedPWadFiles = expectedPwadFiles;\n            ExpectedDoom64Exe = expectedDoom64Exe;\n        }\n\n        public override bool Equals(object obj)\n        {\n            if (obj is StoreGame)\n            {\n                StoreGame other = (StoreGame)obj;\n                return other.SteamId == SteamId;\n            }\n            return false;\n        }\n\n        public override int GetHashCode()\n        {\n            return SteamId;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/GameStores/StoreGameLoader.cs",
    "content": "﻿using Microsoft.Win32;\nusing System;\nusing System.IO;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher.GameStores\n{\n    public static class StoreGameLoader\n    {\n        public delegate string GameFinder(StoreGame game); // null if not found\n\n        public static GameStoreFiles LoadAllStoreGamesFromRegistry()\n        {\n            var gameFinders = new List<GameFinder> { GetSteamGameFolder, GetGogGameFolder };\n            return LoadAllStoreGames(gameFinders);\n        }\n\n        private static string GetSteamGameFolder(StoreGame game)\n        {\n            var steamKey = $@\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Steam App {game.SteamId}\";\n            return Registry.GetValue(steamKey, \"InstallLocation\", null)?.ToString();\n        }\n\n        private static string GetGogGameFolder(StoreGame game)\n        {\n            var gogKey = $@\"HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\GOG.com\\Games\\{game.GogId}\";\n            return Registry.GetValue(gogKey, \"path\", null)?.ToString();\n        }\n\n        public static GameStoreFiles LoadAllStoreGames(List<GameFinder> gameFinders)\n        {\n            var gameStoreFiles = \n                from game in StoreGame.GAMES_IN_PRIORITY_ORDER\n                from finder in gameFinders\n                select LoadStoreGame(game, finder(game));\n\n            return gameStoreFiles.Aggregate(GameStoreFiles.EMPTY, (a, b) => a.Combine(b));\n        }\n\n\n        public static GameStoreFiles LoadStoreGame(StoreGame game, string gamePath)\n        {\n            // Expected IWad/PWad files are allowed to not exist; Id Software has changed the directory structure \n            // a few times, and it's fine if we can't find something. We'll take what we can get.\n\n            if (gamePath == null || !Directory.Exists(gamePath))\n                return GameStoreFiles.EMPTY;\n\n            List<string> installedIwads =\n                (from iwad in game.ExpectedIWadFiles\n                 let absolutePath = Path.Combine(gamePath, iwad)\n                 where File.Exists(absolutePath)\n                 select absolutePath).ToList();\n\n            List<string> installedPwads =\n                (from pwad in game.ExpectedPWadFiles\n                 let absolutePath = Path.Combine(gamePath, pwad)\n                 where File.Exists(absolutePath)\n                 select absolutePath).ToList();\n\n            string installedDoom64Exe = null;\n            if (game.ExpectedDoom64Exe != null)\n            {\n                var absolutePath = Path.Combine(gamePath, game.ExpectedDoom64Exe);\n                if (File.Exists(absolutePath))\n                    installedDoom64Exe = absolutePath;\n            }\n\n            return new GameStoreFiles(installedIwads, installedPwads, installedDoom64Exe);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/AddFileType.cs",
    "content": "﻿namespace DoomLauncher\n{\n    enum AddFileType\n    {\n        GameFile,\n        IWad\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/ArchiveUtil.cs",
    "content": "﻿using DoomLauncher.Archive.Rar;\nusing SevenZip;\nusing System;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    internal class ArchiveUtil\n    {\n        public static readonly string[] Exenstions = new string[] { \".7z\", \".rar\" };\n        private static readonly string[] CoreExtensions = new string[] { \".zip\", \".7z\", \".rar\" };\n\n        public static bool IsTransformableToZip(string extension) => Exenstions.Contains(extension, StringComparer.OrdinalIgnoreCase);\n\n        // If this is an archive that packages files together that Doom Launcher should read the contents of (\".zip\", \".7z\", \".rar\")\n        public static bool ShouldReadPackagedArchive(string file) => CoreExtensions.Contains(Path.GetExtension(file), StringComparer.OrdinalIgnoreCase);\n\n        public static bool CreateZipFrom(FileInfo fi, string tempDirectory, out FileInfo fileInfo)\n        {\n            fileInfo = null;\n            try\n            {\n                if (fi.Extension.Equals(\".7z\", StringComparison.OrdinalIgnoreCase))\n                    fileInfo = CreateZipFromSevenZip(fi, tempDirectory);\n                else if (fi.Extension.Equals(\".rar\", StringComparison.OrdinalIgnoreCase))\n                    fileInfo = CreateZipFromRar(fi, tempDirectory);\n\n                if (fileInfo != null)\n                    return true;\n            }\n            catch\n            {\n            }\n\n            return false;\n        }\n\n        private static FileInfo CreateZipFromSevenZip(FileInfo fi, string tempDirectory)\n        {\n            SevenZipBase.SetLibraryPath(Path.Combine(Util.GetInteropDirectory(), \"7z.dll\"));\n            using (SevenZipExtractor extractor = new SevenZipExtractor(fi.FullName))\n            {\n                DirectoryInfo dir = Directory.CreateDirectory(Path.Combine(tempDirectory, Guid.NewGuid().ToString()));\n                extractor.ExtractArchive(dir.FullName);\n\n                string zipFile = Path.Combine(tempDirectory, fi.Name.Replace(fi.Extension, \".zip\"));\n                ZipFile.CreateFromDirectory(dir.FullName, zipFile);\n\n                Directory.Delete(dir.FullName, true);\n                return new FileInfo(zipFile);\n            }\n        }\n\n        private static FileInfo CreateZipFromRar(FileInfo fi, string tempDirectory)\n        {\n            using (RarArchiveReader archive = new RarArchiveReader(fi.FullName))\n            {\n                DirectoryInfo dir = Directory.CreateDirectory(Path.Combine(tempDirectory, Guid.NewGuid().ToString()));\n\n                var directoryEntries = archive.Entries.Where(entry => entry.IsDirectory);\n                foreach (var dirEntry in directoryEntries)\n                    Directory.CreateDirectory(Path.Combine(dir.FullName, dirEntry.FullName));\n\n                foreach (var entry in archive.Entries)\n                {\n                    if (entry.IsDirectory)\n                        continue;\n\n                    try\n                    { \n                        string path = dir.FullName;\n                        if (entry.FullName.Contains(Path.DirectorySeparatorChar) || entry.FullName.Contains(Path.AltDirectorySeparatorChar))\n                            path = Path.Combine(dir.FullName, GetSubDirectoryPath(entry));\n\n                        entry.ExtractToFile(Path.Combine(path, entry.Name), true);\n                    }\n                    catch\n                    {\n                    }\n                }\n\n                string zipFile = Path.Combine(tempDirectory, fi.Name.Replace(fi.Extension, \".zip\"));\n                if (File.Exists(zipFile))\n                    File.Delete(zipFile);\n                ZipFile.CreateFromDirectory(dir.FullName, zipFile);\n\n                Directory.Delete(dir.FullName, true);\n                return new FileInfo(zipFile);\n            }\n        }\n\n        private static string GetSubDirectoryPath(IArchiveEntry entry)\n        {\n            int index;\n            if (entry.FullName.Contains(Path.DirectorySeparatorChar))\n                index = entry.FullName.LastIndexOf(Path.DirectorySeparatorChar);\n            else\n                index = entry.FullName.LastIndexOf(Path.AltDirectorySeparatorChar);\n\n            if (index == -1)\n                return string.Empty;\n            \n            return entry.FullName.Substring(0, index);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/AutoCompleteCombo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Handlers\n{\n    public static class AutoCompleteCombo\n    {\n        public static void SetAutoCompleteCustomSource(ComboBox cmb, IEnumerable<object> datasource, Type dataType, string property)\n        {\n            AutoCompleteStringCollection collection = new AutoCompleteStringCollection();\n\n            if (dataType != null)\n            {\n                PropertyInfo pi = dataType.GetProperty(property);\n                collection.AddRange(datasource.Select(x => (string)pi.GetValue(x)).ToArray());\n            }\n            else\n            {\n                collection.AddRange(datasource.Cast<string>().ToArray());\n            }\n\n            cmb.DataSource = datasource;\n            cmb.AutoCompleteSource = AutoCompleteSource.CustomSource;\n            cmb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;\n            cmb.AutoCompleteCustomSource = collection;\n            cmb.DropDown += Cmb_DropDown;\n\n            if (!datasource.Any())\n                cmb.Text = string.Empty;\n        }\n\n        private static void Cmb_DropDown(object sender, EventArgs e)\n        {\n            ((ComboBox)sender).PreviewKeyDown += Cmb_PreviewKeyDown;\n        }\n\n        private static void Cmb_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)\n        {\n            ComboBox cmb = (ComboBox)sender;\n            cmb.PreviewKeyDown -= Cmb_PreviewKeyDown;\n            if (cmb.DroppedDown)\n                cmb.Focus();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/DemoHandler.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher\n{\n    class DemoHandler\n    {\n        public DemoHandler(IDataSourceAdapter adapter, LauncherPath demoDirectory)\n        {\n            DataAdapter = adapter;\n            DemoDirectory = demoDirectory;\n        }\n\n        public IEnumerable<IFileData> HandleNewDemo(ISourcePortData sourcePort, IGameFile gameFile, string demoFile, string descriptionText)\n        {\n            List<IFileData> ret = new List<IFileData>();\n            FileInfo fi = new FileInfo(demoFile);\n\n            if (gameFile.GameFileID.HasValue && fi.Exists)\n            {\n                fi.CopyTo(Path.Combine(DemoDirectory.GetFullPath(), fi.Name));\n\n                FileData file = new FileData();\n                file.FileName = fi.Name;\n                file.GameFileID = gameFile.GameFileID.Value;\n                file.SourcePortID = sourcePort.SourcePortID;\n                file.FileTypeID = FileType.Demo;\n                file.Description = descriptionText;\n\n                DataAdapter.InsertFile(file);\n            }\n\n            return ret;\n        }\n\n        public IDataSourceAdapter DataAdapter { get; set; }\n        public LauncherPath DemoDirectory { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/DownloadHandler.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.IO;\n\nnamespace DoomLauncher\n{\n    class DownloadHandler\n    {\n        private readonly List<IGameFileDownloadable> m_currentDownloads = new List<IGameFileDownloadable>();\n\n        public DownloadHandler(LauncherPath downloadDirectory, DownloadView view)\n        {\n            DownloadDirectory = downloadDirectory;\n            DownloadView = view;\n            view.DownloadCancelled += view_DownloadCancelled;\n        }\n\n        public bool IsDownloading(IGameFileDownloadable dlItem)\n        {\n            return m_currentDownloads.Contains(dlItem);\n        }\n\n        void view_DownloadCancelled(object sender, EventArgs e)\n        {\n            var cancelled = DownloadView.GetCancelledDownloads();\n            foreach (object obj in cancelled)\n            {\n                IGameFileDownloadable dlItem = obj as IGameFileDownloadable;\n                if (dlItem != null)\n                {\n                    dlItem.Cancel();\n                    m_currentDownloads.Remove(dlItem);\n                }\n            }\n        }\n\n        public void Download(IGameFileDataSourceAdapter adapter, IGameFileDownloadable dlItem)\n        {\n            if (dlItem != null && !IsDownloading(dlItem))\n            {\n                try\n                {\n                    m_currentDownloads.Add(dlItem);\n                    dlItem.DownloadProgressChanged += dlItem_DownloadProgressChanged;\n                    dlItem.DownloadCompleted += dlItem_DownloadCompleted;\n\n                    if (DownloadView != null)\n                        DownloadView.AddDownload(dlItem, dlItem.FileName);\n\n                    dlItem.Download(adapter, Path.Combine(DownloadDirectory.GetFullPath(), dlItem.FileName));\n                }\n                catch\n                {\n                    //failed, nothing to do\n                }\n            }\n        }\n\n        private DateTime m_dtLastDowanloadUpdate = DateTime.Now;\n\n        void dlItem_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)\n        {\n            IGameFileDownloadable dlItem = sender as IGameFileDownloadable;\n\n            if (DownloadView != null && dlItem != null && \n                (e.ProgressPercentage == 100 || DateTime.Now.Subtract(m_dtLastDowanloadUpdate).TotalMilliseconds > 400))\n            {\n                m_dtLastDowanloadUpdate = DateTime.Now;\n                DownloadView.UpdateDownload(sender, e.ProgressPercentage);\n                DownloadView.UpdateDownload(sender, string.Format(\"{0} - {1}/{2}MB\", dlItem.FileName, \n                    Math.Round(e.BytesReceived / 1024.0 / 1024.0, 1), Math.Round(e.TotalBytesToReceive / 1024.0 / 1024.0, 1)));\n            }\n        }\n\n        void dlItem_DownloadCompleted(object sender, AsyncCompletedEventArgs e)\n        {\n            IGameFileDownloadable dlItem = sender as IGameFileDownloadable;\n            if (DownloadView != null && dlItem != null)\n            {\n                DownloadView.UpdateDownload(sender, string.Format(\"{0} ({1})\", dlItem.FileName, \n                    e.Cancelled ? \"Cancelled\" : \"Complete\"));\n\n                m_currentDownloads.Remove(dlItem);\n            }\n        }\n\n        public DownloadView DownloadView { get; set; }\n        public LauncherPath DownloadDirectory { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/FIleAddResults.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public class FileError\n    {\n        public string FileName { get; set; }\n        public string Error { get; set; }\n    }\n\n    class FileAddResults\n    {\n        public List<string> NewFiles = new List<string>();\n        public List<string> ReplacedFiles = new List<string>();\n        public List<FileError> Errors = new List<FileError>();\n\n        public IEnumerable<string> GetAllFiles() => NewFiles.Union(ReplacedFiles);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/FileLoadHandler.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher.Handlers\n{\n    public class FileLoadHandler\n    {\n        private enum AddFilesType\n        {\n            SourcePort,\n            IWAD\n        }\n\n        private List<IGameFile> m_iwadAdditionalFiles;\n        private List<IGameFile> m_sourcePortAdditionalFiles;\n        private List<IGameFile> m_saveAdditionalFiles = new List<IGameFile>();\n\n        private List<IGameFile> m_currentFiles = new List<IGameFile>();\n        private List<IGameFile> m_currentNewFiles = new List<IGameFile>();\n\n        private readonly IDataSourceAdapter m_adapter;\n        private readonly IGameFile m_gameFile;\n        private readonly IGameProfile m_gameProfile;\n        private IGameFile m_selectedIWad;\n        private ISourcePortData m_selectedSourcePort;\n\n        public FileLoadHandler(IDataSourceAdapter adapter, IGameFile gameFile)\n            : this (adapter, gameFile, (GameFile)gameFile)\n        {\n        }\n\n        public FileLoadHandler(IDataSourceAdapter adapter, IGameFile gameFile, IGameProfile gameProfile)\n        {\n            m_adapter = adapter;\n            m_gameFile = gameFile;\n            m_gameProfile = gameProfile;\n\n            // Load gameProfile's \"SettingsFiles\" GameFiles from the database,\n            // add gameFile, and set them to m_currentFiles and m_saveCurrentFiles.\n            SetAdditionalFiles(Util.GetAdditionalFiles(m_adapter, gameProfile));\n\n            // If gameProfile has an associated IWAD, load the IWAD GameFile, load its \"SettingsFiles\" GameFiles,\n            // removing those that are in its \"SettingsFilesSourcePort\" GameFiles.\n            //\n            // Otherwise load the gameProfile's \"SettingsFilesIWAD\" GameFiles.\n            m_iwadAdditionalFiles = GetIWadFilesFromGameFile(gameProfile);\n\n            // Load the \"SettingsFilesSourcePort\" GameFiles of gameProfile.\n            m_sourcePortAdditionalFiles = Util.GetSourcePortAdditionalFiles(m_adapter, gameProfile);\n        }\n\n        private List<IGameFile> GetIWadFilesFromGameFile(IGameProfile gameFile)\n        {\n            if (gameFile.IWadID.HasValue)\n            {\n                var gameFileIwad = m_adapter.GetGameFileIWads().FirstOrDefault(x => x.IWadID == gameFile.IWadID.Value);\n                if (gameFileIwad != null)\n                    return GetAdditionalFiles(AddFilesType.IWAD, gameFileIwad, null);\n            }\n\n            return Util.GetIWadAdditionalFiles(m_adapter, gameFile);\n        }\n\n        public bool IsIWadFile(IGameFile gameFile)\n        {\n            return m_iwadAdditionalFiles.Contains(gameFile);\n        }\n\n        public bool IsSourcePortFile(IGameFile gameFile)\n        {\n            return m_sourcePortAdditionalFiles.Contains(gameFile);\n        }\n\n        public List<IGameFile> GetCurrentAdditionalFiles()\n        {\n            return m_currentFiles.ToList();\n        }\n\n        public List<IGameFile> GetCurrentAdditionalNewFiles()\n        {\n            return m_currentNewFiles.ToList();\n        }\n\n        public List<IGameFile> GetIWadFiles()\n        {\n            return m_iwadAdditionalFiles.ToList();\n        }\n\n        public List<IGameFile> GetSourcePortFiles()\n        {\n            return m_sourcePortAdditionalFiles.ToList();\n        }\n\n        // Reset m_currentFiles and m_saveAdditionalFiles back to the state they were in after construction.\n        public void Reset()\n        {\n            SetAdditionalFiles(m_saveAdditionalFiles);\n        }\n\n        private void SetAdditionalFiles(IEnumerable<IGameFile> gameFiles)\n        {\n            //In pervious versions you were not able to control the order the current file. If it doesn't exist in the list add it.\n            if (!gameFiles.Contains(m_gameFile))\n            {\n                List<IGameFile> setFiles = new List<IGameFile>();\n                setFiles.Add(m_gameFile);\n                setFiles.AddRange(gameFiles);\n                gameFiles = setFiles.Distinct();\n            }\n\n            m_currentFiles = gameFiles.ToList();\n            m_saveAdditionalFiles = gameFiles.ToList();\n        }\n\n        // Recalculate m_currentFiles, m_iwadPortAdditionalFiles and m_sourcePortAdditionalFiles\n        // based on the given IWAD and SourcePort, also using the IWAD, SourcePort and results\n        // from the previous CalculateAdditionalFiles() call.\n        //\n        // Also records the difference from the existing m_currentFiles, and records the two \n        // parameters for next time.\n        public void CalculateAdditionalFiles(IGameFile iwad, ISourcePortData sourcePort)\n        {\n            // if iwad is provided, load the \"SettingsFile\" GameFiles from sourcePort into\n            // m_sourcePortAdditionalFiles, and unless the iwad is m_gameFile,\n            // load the iwad's \"SettingsFile\" GameFiles into m_iwadPortAdditionalFiles, subtracting the iwad's \"SettingsFileSourcePort\" GameFiles.\n            // Exclude m_gameFile from both. \n            //\n            // Otherwise clear m_iwadPortAdditionalFiles and m_sourcePortAdditionalFiles.\n            SetExtraAdditionalFilesFromSettings(iwad, sourcePort);\n\n            IGameFile lastIwad = m_selectedIWad;\n            ISourcePortData lastSourcePort = m_selectedSourcePort;\n            if (lastIwad == null)\n                lastIwad = iwad;\n            if (lastSourcePort == null)\n                lastSourcePort = sourcePort;\n\n            List<IGameFile> gameFiles = m_currentFiles;\n            List<IGameFile> originalList = gameFiles.ToList();\n\n            // Get the \"SettingsFile\" GameFiles from iwad, subtracting its\n            // \"SettingsFileSourcePort\" GameFiles, adding the \"SettingsFile\" GameFiles\n            // from sourcePort and removing m_gameFile\n            List<IGameFile> newTypeFiles = GetAdditionalFiles(iwad, sourcePort);\n            List<IGameFile> oldTypeFiles = GetAdditionalFiles(lastIwad, lastSourcePort);\n            gameFiles.RemoveAll(x => oldTypeFiles.Contains(x));\n            gameFiles.AddRange(newTypeFiles);\n\n            // Any files that are still around from before should come first\n            gameFiles = SortByOriginal(gameFiles, originalList);\n\n            // If iwad has \"SettingsFile\" GameFiles that are not in \"SettingsFileSourcePort\", then  \n            // make sure these come first\n            gameFiles = CheckIwadFileOrder(gameFiles, iwad, sourcePort);\n\n            // Remember the calculated game files, and which ones are new \n            m_currentFiles = gameFiles.Distinct().ToList();\n            m_currentNewFiles = gameFiles.Except(originalList).ToList();\n\n            // Remember the inputs for next time\n            m_selectedIWad = iwad;\n            m_selectedSourcePort = sourcePort;\n        }\n\n        private List<IGameFile> CheckIwadFileOrder(List<IGameFile> gameFiles, IGameFile iwad, ISourcePortData sourcePort)\n        {\n            var iwadAdditionalFiles = GetAdditionalFiles(AddFilesType.IWAD, iwad, sourcePort, removeIwad: false);\n\n            if (iwadAdditionalFiles.Count == 0)\n                return gameFiles;\n\n            if (iwadAdditionalFiles[0].GameFileID == iwad.GameFileID)\n                return gameFiles;\n\n            gameFiles.RemoveAll(x => iwadAdditionalFiles.Contains(x));\n            return GetAdditionalFiles(AddFilesType.IWAD, iwad, sourcePort).Union(gameFiles).ToList();\n        }\n\n        private void SetExtraAdditionalFilesFromSettings(IGameFile iwad, ISourcePortData sourcePort)\n        {\n            m_iwadAdditionalFiles.Clear();\n            m_sourcePortAdditionalFiles.Clear();\n\n            if (iwad != null)\n            {\n                if (!iwad.Equals(m_gameFile))\n                    m_iwadAdditionalFiles = GetAdditionalFiles(AddFilesType.IWAD, iwad, sourcePort);\n                m_sourcePortAdditionalFiles = GetAdditionalFiles(AddFilesType.SourcePort, iwad, sourcePort);\n\n                m_iwadAdditionalFiles.Remove(m_gameFile);\n                m_sourcePortAdditionalFiles.Remove(m_gameFile);\n            }\n        }\n\n        private List<IGameFile> GetAdditionalFiles(IGameFile gameIwad, ISourcePortData sourcePort)\n        {\n            var iwadExclude = Util.GetSourcePortAdditionalFiles(m_adapter, (GameFile)gameIwad);\n            return GetAdditionalFiles(AddFilesType.IWAD, gameIwad, sourcePort).Except(iwadExclude)\n                .Union(GetAdditionalFiles(AddFilesType.SourcePort, gameIwad, sourcePort))\n                .Except(new IGameFile[] { m_gameFile }).ToList();\n        }\n\n        private List<IGameFile> GetAdditionalFiles(AddFilesType type, IGameFile gameIwad, ISourcePortData sourcePort,\n            bool removeIwad = true)\n        {\n            switch (type)\n            {\n                case AddFilesType.IWAD:\n                    if (gameIwad != null)\n                    {\n                        var ret = Util.GetAdditionalFiles(m_adapter, (GameFile)gameIwad).Except(Util.GetSourcePortAdditionalFiles(m_adapter, (GameFile)gameIwad)).ToList();\n                        if (removeIwad)\n                            ret.Remove(gameIwad);\n                        return ret;\n                    }\n                    break;\n                case AddFilesType.SourcePort:\n                    if (sourcePort != null)\n                        return Util.GetAdditionalFiles(m_adapter, sourcePort);\n                    break;\n            }\n            return new List<IGameFile>();\n        }\n\n        private List<IGameFile> SortByOriginal(List<IGameFile> gameFiles, List<IGameFile> originalList)\n        {\n            List<IGameFile> sortedList = new List<IGameFile>();\n\n            foreach (var gameFile in originalList)\n            {\n                if (gameFiles.Contains(gameFile))\n                    sortedList.Add(gameFile);\n            }\n\n            sortedList.AddRange(gameFiles.Except(sortedList));\n            return sortedList;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/FileLoadHandlerLegacy.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher.Handlers\n{\n    public class FileLoadHandlerLegacy\n    {\n        private enum AddFilesType\n        {\n            SourcePort,\n            IWAD\n        }\n\n        private List<IGameFile> m_iwadAdditionalFiles = new List<IGameFile>();\n        private List<IGameFile> m_sourcePortAdditionalFiles = new List<IGameFile>();\n        private List<IGameFile> m_saveAdditionalFiles = new List<IGameFile>();\n\n        private List<IGameFile> m_currentFiles = new List<IGameFile>();\n        private List<IGameFile> m_currentNewFiles = new List<IGameFile>();\n\n        private readonly IDataSourceAdapter m_adapter;\n        private readonly IGameFile m_gameFile;\n        private IGameFile m_selectedIWad;\n        private ISourcePortData m_selectedSourcePort;\n\n        public FileLoadHandlerLegacy(IDataSourceAdapter adapter, IGameFile gameFile)\n        {\n            m_adapter = adapter;\n            m_gameFile = gameFile;\n            SetAdditionalFiles(Util.GetAdditionalFiles(m_adapter, (GameFile)gameFile));\n        }\n\n        public bool IsIWadFile(IGameFile gameFile)\n        {\n            return m_iwadAdditionalFiles.Contains(gameFile);\n        }\n\n        public bool IsSourcePortFile(IGameFile gameFile)\n        {\n            return m_sourcePortAdditionalFiles.Contains(gameFile);\n        }\n\n        public List<IGameFile> GetCurrentAdditionalFiles()\n        {\n            return m_currentFiles.ToList();\n        }\n\n        public List<IGameFile> GetCurrentAdditionalNewFiles()\n        {\n            return m_currentNewFiles.ToList();\n        }\n\n        public List<IGameFile> GetIWadFiles()\n        {\n            return m_iwadAdditionalFiles.ToList();\n        }\n\n        public List<IGameFile> GetSourcePortFiles()\n        {\n            return m_sourcePortAdditionalFiles.ToList();\n        }\n\n        public void Reset()\n        {\n            SetAdditionalFiles(m_saveAdditionalFiles);\n        }\n\n        private void SetAdditionalFiles(IEnumerable<IGameFile> gameFiles)\n        {\n            //In pervious versions you were not able to control the order the current file. If it doesn't exist in the list add it.\n            if (!gameFiles.Contains(m_gameFile))\n            {\n                List<IGameFile> setFiles = new List<IGameFile>();\n                setFiles.Add(m_gameFile);\n                setFiles.AddRange(gameFiles);\n                gameFiles = setFiles.Distinct();\n            }\n\n            m_currentFiles = gameFiles.ToList();\n            m_saveAdditionalFiles = gameFiles.ToList();\n        }\n\n        public void CalculateAdditionalFiles(IGameFile iwad, ISourcePortData sourcePort)\n        {\n            SetExtraAdditionalFilesFromSettings(iwad, sourcePort);\n\n            IGameFile lastIwad = m_selectedIWad;\n            ISourcePortData lastSourcePort = m_selectedSourcePort;\n            if (lastIwad == null) lastIwad = iwad;\n            if (lastSourcePort == null) lastSourcePort = sourcePort;\n\n            List<IGameFile> gameFiles = m_currentFiles;\n            List<IGameFile> originalList = gameFiles.ToList();\n            List<IGameFile> newTypeFiles = GetAdditionalFiles(iwad, sourcePort);\n            List<IGameFile> oldTypeFiles = GetAdditionalFiles(lastIwad, lastSourcePort);\n            gameFiles.RemoveAll(x => oldTypeFiles.Contains(x));\n\n            gameFiles.AddRange(newTypeFiles);\n\n            gameFiles = SortByOriginal(gameFiles, originalList);\n            m_currentFiles = gameFiles.Distinct().ToList();\n            m_currentNewFiles = gameFiles.Except(originalList).ToList();\n\n            m_selectedIWad = iwad;\n            m_selectedSourcePort = sourcePort;\n        }\n\n        private void SetExtraAdditionalFilesFromSettings(IGameFile iwad, ISourcePortData sourcePort)\n        {\n            m_iwadAdditionalFiles.Clear();\n            m_sourcePortAdditionalFiles.Clear();\n\n            if (iwad != null)\n            {\n                if (!iwad.Equals(m_gameFile))\n                    m_iwadAdditionalFiles = GetAdditionalFiles(AddFilesType.IWAD, iwad, sourcePort);\n                m_sourcePortAdditionalFiles = GetAdditionalFiles(AddFilesType.SourcePort, iwad, sourcePort);\n            }\n        }\n\n        private List<IGameFile> GetAdditionalFiles(IGameFile gameIwad, ISourcePortData sourcePort)\n        {\n            IEnumerable<IGameFile> exclude = new IGameFile[] { m_gameFile };\n            return GetAdditionalFiles(AddFilesType.IWAD, gameIwad, sourcePort)\n                .Union(GetAdditionalFiles(AddFilesType.SourcePort, gameIwad, sourcePort))\n                .Except(exclude).ToList();\n        }\n\n        private List<IGameFile> GetAdditionalFiles(AddFilesType type, IGameFile gameIwad, ISourcePortData sourcePort)\n        {\n            switch (type)\n            {\n                case AddFilesType.IWAD:\n                    if (gameIwad != null)\n                        return Util.GetAdditionalFiles(m_adapter, (GameFile)gameIwad);\n                    break;\n                case AddFilesType.SourcePort:\n                    if (sourcePort != null)\n                        return Util.GetAdditionalFiles(m_adapter, sourcePort);\n                    break;\n            }\n            return new List<IGameFile>();\n        }\n\n        private List<IGameFile> SortByOriginal(List<IGameFile> gameFiles, List<IGameFile> originalList)\n        {\n            List<IGameFile> sortedList = new List<IGameFile>();\n\n            foreach (var gameFile in originalList)\n            {\n                if (gameFiles.Contains(gameFile))\n                    sortedList.Add(gameFile);\n            }\n\n            sortedList.AddRange(gameFiles.Except(sortedList));\n            return sortedList;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/FileMapComparer.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Handlers\n{\n    public class FileMapComparer : IComparer<IFileData>\n    {\n        public int Compare(IFileData x, IFileData y)\n        {\n            bool xMap = string.IsNullOrEmpty(x.Map);\n            bool yMap = string.IsNullOrEmpty(y.Map);\n            if (!xMap && yMap)\n                return 0;\n\n            if (xMap && !yMap)\n                return -1;\n            if (!xMap && yMap)\n                return 1;\n\n            return x.Map.CompareTo(y.Map);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/GameFileTileManager.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    class GameFileTileManager\n    {\n        public event EventHandler TilesRecreated;\n\n        public static GameFileTileManager Instance { get; private set; } = new GameFileTileManager();\n\n        public List<GameFileTileBase> Tiles = new List<GameFileTileBase>();\n        public List<GameFileTileBase> OldTiles = new List<GameFileTileBase>();\n        public FlowLayoutPanelDB TileLayout = new FlowLayoutPanelDB();\n        public int MaxItems => DataCache.Instance.AppConfiguration.ItemsPerPage;\n\n        private GameFileViewFactory m_factory;\n\n        public void Init(GameFileViewFactory factory)\n        {\n            m_factory = factory;\n            TileLayout.Margin = new Padding(0);\n            TileLayout.AutoScroll = true;\n            TileLayout.CaptureArrowKeys = true;\n\n            ResetLayout();\n        }\n\n        private void ResetLayout()\n        {\n            OldTiles.AddRange(Tiles);\n\n            TileLayout.SuspendLayout();\n\n            if (m_factory.IsUsingTileView)\n            {\n                GameFileTileBase testTile = m_factory.CreateTile();\n\n                if (Tiles.Count == 0 || Tiles[0].GetType() != testTile.GetType() || Tiles[0].ImageWidth != testTile.ImageWidth)\n                    RecreateLayout();\n                else\n                    UpdateLayout();\n            }\n\n            TileLayout.ResumeLayout();\n\n            TilesRecreated?.Invoke(this, EventArgs.Empty);\n            OldTiles.Clear();\n        }\n\n        private void UpdateLayout()\n        {\n            if (Tiles.Count > MaxItems)\n            {\n                Tiles = Tiles.Take(MaxItems).ToList();\n                \n                while (TileLayout.Controls.Count > MaxItems)\n                    TileLayout.Controls.RemoveAt(TileLayout.Controls.Count - 1);\n            }\n            else\n            {\n                int addCount = MaxItems - Tiles.Count;\n                for (int i = 0; i < addCount; i++)\n                {\n                    GameFileTileBase tile = m_factory.CreateTile();\n                    Tiles.Add(tile);\n                    TileLayout.Controls.Add(tile);\n                }\n            }\n        }\n\n        private void RecreateLayout()\n        {\n            TileLayout.Controls.Clear();\n            Tiles.Clear();\n\n            for (int i = 0; i < MaxItems; i++)\n            {\n                GameFileTileBase tile = m_factory.CreateTile();\n                Tiles.Add(tile);\n                TileLayout.Controls.Add(tile);\n            }\n        }\n\n        public void SetMaxItems(int max)\n        {\n            DataCache.Instance.AppConfiguration.ItemsPerPage = max;\n            ResetLayout();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/GameProfileUtil.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\n\nnamespace DoomLauncher.Handlers\n{\n    public static class GameProfileUtil\n    {\n        public static IList<IGameProfile> GetAllProfiles(IDataSourceAdapter adapter, GameFile gameFile, out IList<IGameProfile> globalProfiles)\n        {\n            globalProfiles = adapter.GetGlobalGameProfiles().OrderBy(x => x.Name).ToList();\n\n            if (!gameFile.GameFileID.HasValue)\n                return Array.Empty<IGameProfile>();\n\n            List<IGameProfile> profiles = globalProfiles.ToList();\n            profiles.Add(gameFile);\n            profiles.AddRange(adapter.GetGameProfiles(gameFile.GameFileID.Value).OrderBy(x => x.Name));\n            return profiles;\n        }\n\n        public static bool IsValidProfileName(IDataSourceAdapter adapter, IGameFile gameFile, IList<IGameProfile> globalProfiles, \n            int gameProfileId, string name, out string error)\n        {\n            error = null;\n            if (string.IsNullOrEmpty(name))\n            {\n                error = \"A name must be entered.\";\n                return false;\n            }\n\n            if (NameExists(adapter, gameFile, globalProfiles, gameProfileId, name))\n            {\n                error = \"This profile name already exists.\";\n                return false;\n            }\n\n            return true;\n        }\n\n        public static bool NameExists(IDataSourceAdapter adapter, IGameFile gameFile, IList<IGameProfile> globalProfiles,\n            int excludeGameProfileId, string name)\n        {\n            if (gameFile.GameFileID.HasValue)\n            {\n                var gameProfiles = adapter.GetGameProfiles(gameFile.GameFileID.Value)\n                    .Where(x => x.GameProfileID != excludeGameProfileId);\n                if (FindProfileName(gameProfiles, name))\n                    return true;\n            }\n\n            return FindProfileName(globalProfiles, name);\n        }\n\n        private static bool FindProfileName(IEnumerable<IGameProfile> profiles, string name) =>\n            name.Equals(GameFile.DefaultProfileName, StringComparison.OrdinalIgnoreCase) || \n                   profiles.Any(x => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/ImageExtensions.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\nusing System.IO;\n\nnamespace DoomLauncher\n{\n    internal static class ImageExtensions\n    {\n        public static bool TryFromFile(string path, out Image image)\n        {\n            image = null;\n            try\n            {\n                if (!File.Exists(path))\n                    return false;\n\n                image = Image.FromFile(path);\n                return true;\n            }\n            catch\n            {\n            }\n\n            return false;\n        }\n\n        public static Image FromFileOrDefault(string path)\n        {\n            if (TryFromFile(path, out var image))\n                return image;\n\n            return new Bitmap(1, 1, PixelFormat.Format32bppRgb);\n        }\n\n        public static Image FixedSize(this Image imgPhoto, int width, int height, Color backColor)\n        {\n            int sourceWidth = imgPhoto.Width;\n            int sourceHeight = imgPhoto.Height;\n            int sourceX = 0;\n            int sourceY = 0;\n            int destX = 0;\n            int destY = 0;\n\n            float nPercent;\n            float nPercentW = width / (float)sourceWidth;\n            float nPercentH = height / (float)sourceHeight;\n\n            if (nPercentH < nPercentW)\n            {\n                nPercent = nPercentH;\n                destX = Convert.ToInt16((width - (sourceWidth * nPercent)) / 2);\n            }\n            else\n            {\n                nPercent = nPercentW;\n                destY = Convert.ToInt16((height - (sourceHeight * nPercent)) / 2);\n            }\n\n            int destWidth = (int)(sourceWidth * nPercent);\n            int destHeight = (int)(sourceHeight * nPercent);\n\n            Bitmap bmPhoto = new Bitmap(width, height, PixelFormat.Format32bppPArgb);\n            bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);\n\n            Graphics grPhoto = Graphics.FromImage(bmPhoto);\n            grPhoto.Clear(backColor);\n            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;\n\n            grPhoto.DrawImage(imgPhoto,\n                new Rectangle(destX, destY, destWidth, destHeight),\n                new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),\n                GraphicsUnit.Pixel);\n\n            grPhoto.Dispose();\n            return bmPhoto;\n        }\n\n        public static Image Rotate(this Image image, float angle)\n        {\n            Bitmap bm = image as Bitmap;\n\n            Matrix matrixOrigin = new Matrix();\n            matrixOrigin.Rotate(angle);\n\n            PointF[] points =\n            {\n                new PointF(0, 0),\n                new PointF(bm.Width, 0),\n                new PointF(bm.Width, bm.Height),\n                new PointF(0, bm.Height),\n            };\n            matrixOrigin.TransformPoints(points);\n            GetPointBounds(points, out float xMin, out float xMax,\n                out float yMin, out float yMax);\n\n            int width = (int)Math.Round(xMax - xMin);\n            int height = (int)Math.Round(yMax - yMin);\n            Bitmap result = new Bitmap(width, height);\n\n            Matrix matrixCenter = new Matrix();\n            matrixCenter.RotateAt(angle, new PointF(width / 2f, height / 2f));\n\n            using (Graphics gr = Graphics.FromImage(result))\n            {\n                gr.InterpolationMode = InterpolationMode.High;\n                gr.Clear(bm.GetPixel(0, 0));\n                gr.Transform = matrixCenter;\n\n                int x = (width - bm.Width) / 2;\n                int y = (height - bm.Height) / 2;\n                gr.DrawImage(bm, x, y);\n            }\n\n            return result;\n        }\n\n        public static Image Resize(this Image image, int width, int height, InterpolationMode interpolationMode)\n        {\n            var destRect = new Rectangle(0, 0, width, height);\n            var destImage = new Bitmap(width, height);\n\n            destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);\n\n            using (var graphics = Graphics.FromImage(destImage))\n            {\n                graphics.InterpolationMode = interpolationMode;\n                graphics.CompositingMode = CompositingMode.SourceCopy;\n                graphics.CompositingQuality = CompositingQuality.HighQuality;\n                graphics.SmoothingMode = SmoothingMode.HighQuality;\n                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;\n\n                using (var wrapMode = new ImageAttributes())\n                {\n                    wrapMode.SetWrapMode(WrapMode.TileFlipXY);\n                    graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);\n                }\n            }\n\n            return destImage;\n        }\n\n        public static Image ScaleDoomImage(this Image image)\n        {\n            // Check for Doom's aspect ratio and force to 1.33 like the original so the image doesn't look distored.\n            if (image.Width / (float)image.Height != 1.6f)\n                return image;\n\n            int multiplier = image.Width / 320;\n            return image.Resize(640 * multiplier, 480 * multiplier, InterpolationMode.NearestNeighbor);\n        }\n\n        private static void GetPointBounds(PointF[] points,\n            out float xmin, out float xmax,\n            out float ymin, out float ymax)\n        {\n            xmin = points[0].X;\n            xmax = xmin;\n            ymin = points[0].Y;\n            ymax = ymin;\n            foreach (PointF point in points)\n            {\n                if (xmin > point.X) xmin = point.X;\n                if (xmax < point.X) xmax = point.X;\n                if (ymin > point.Y) ymin = point.Y;\n                if (ymax < point.Y) ymax = point.Y;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/InvalidFile.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public class InvalidFile\n    {\n        public InvalidFile(string filename, string reason)\n        {\n            FileName = filename;\n            Reason = reason;\n        }\n\n        public string FileName { get; }\n        public string Reason { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/LaunchData.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    class LaunchData\n    {\n        public LaunchData(IGameFile gameFile, IGameProfile gameProfile, IEnumerable<IGameFile> additionalGameFiles)\n        {\n            GameFile = gameFile;\n            GameProfile = gameProfile;\n            if (additionalGameFiles == null)\n                AdditionalGameFiles = new List<IGameFile>();\n            else\n                AdditionalGameFiles = additionalGameFiles.ToList();\n            Success = true;\n        }\n\n        public LaunchData(string errorTitle, string errorDescritpion)\n        {\n            Success = false;\n            ErrorTitle = errorTitle;\n            ErrorDescription = errorDescritpion;\n        }\n\n        public bool Success { get; set; }\n        public string ErrorTitle { get; set; }\n        public string ErrorDescription { get; set; }\n        public IGameFile GameFile { get; set; }\n        public IGameProfile GameProfile { get; set; }\n        public List<IGameFile> AdditionalGameFiles { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/MenuConstants.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public static class MenuConstants\n    {\n        public static readonly string Rename = \"Rename...\";\n        public static readonly string Utility = \"Utility\";\n        public static readonly string Resync = \"Resync\";\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/NativeMethods.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace DoomLauncher\n{\n    public class NativeMethods\n    {\n        public enum GWL\n        {\n            ExStyle = -20\n        }\n\n        public enum LWA\n        {\n            ColorKey = 0x1,\n            Alpha = 0x2\n        }\n\n        [DllImport(\"user32.dll\", EntryPoint = \"GetWindowLong\")]\n        private static extern int GetWindowLongNative(IntPtr hWnd, GWL nIndex);\n\n        [DllImport(\"user32.dll\", EntryPoint = \"SetWindowLong\")]\n        private static extern int SetWindowLongNative(IntPtr hWnd, GWL nIndex, int dwNewLong);\n\n        [DllImport(\"user32.dll\", EntryPoint = \"SetLayeredWindowAttributes\")]\n        private static extern bool SetLayeredWindowAttributesNative(IntPtr hWnd, int crKey, int alpha, LWA dwFlags);\n\n        [DllImport(\"user32.dll\", EntryPoint= \"MoveWindow\", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, ExactSpelling = true, SetLastError = true)]\n        private static extern void MoveWindowNative(IntPtr hwnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);\n\n#pragma warning disable S4200\n        public static int GetWindowLong(IntPtr hWnd, GWL nIndex) => GetWindowLongNative(hWnd, nIndex);\n        public static int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong) => SetWindowLongNative(hWnd, nIndex, dwNewLong);\n        public static bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, int alpha, LWA dwFlags) => SetLayeredWindowAttributesNative(hWnd, crKey, alpha, dwFlags);\n        public static void MoveWindow(IntPtr hwnd, int X, int Y, int nWidth, int nHeight, bool bRepaint) => MoveWindowNative(hwnd, X, Y, nWidth, nHeight, bRepaint);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/NewFileDetector.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public class NewFileDetector : INewFileDetector\n    {\n        public NewFileDetector(string[] extensions, string directory)\n        {\n            Directory = directory;\n            Extenstions = extensions;\n            ScanSubDirectories = false;\n        }\n\n        public NewFileDetector(string[] extensions, string directory, bool scanSubDirectories)\n        {\n            Directory = directory;\n            Extenstions = extensions;\n            ScanSubDirectories = scanSubDirectories;\n        }\n\n        public void StartDetection()\n        {\n            BaseFiles = GetFiles(Directory);\n        }\n\n        public string[] GetNewFiles()\n        {\n            if (BaseFiles != null && Directory != null)\n            {\n                string[] baseFiles = BaseFiles.Select(x => x.FullName).ToArray();\n                string[] currentFiles = GetFiles(Directory).Select(x => x.FullName).ToArray();\n\n                return currentFiles.Except(baseFiles).ToArray();\n            }\n\n            return new string[] { };\n        }\n\n        public string[] GetModifiedFiles()\n        {\n            if (BaseFiles != null && Directory != null)\n            {\n                FileInfo[] currentFiles = GetFiles(Directory);\n                var joinedFiles = from file in BaseFiles\n                                  join currentFile in currentFiles\n                                  on file.FullName equals currentFile.FullName\n                                  select new { OriginalFile = file, CurrentFile = currentFile };\n\n                return (from file in joinedFiles \n                        where file.OriginalFile.LastWriteTime != file.CurrentFile.LastWriteTime ||\n                        file.OriginalFile.Length != file.CurrentFile.Length\n                        select file.CurrentFile.FullName).ToArray();\n            }\n\n            return new string[] { };\n        }\n\n        public string[] GetDeletedFiles()\n        {\n            if (BaseFiles != null && Directory != null)\n            {\n                string[] baseFiles = BaseFiles.Select(x => x.FullName).ToArray();\n                string[] currentFiles = GetFiles(Directory).Select(x => x.FullName).ToArray();\n\n                return baseFiles.Except(currentFiles).ToArray();\n            }\n\n            return new string[] { };\n        }\n\n        private FileInfo[] GetFiles(string directory)\n        {\n            try\n            {\n                if (ScanSubDirectories)\n                {\n                    List<FileInfo> files = new List<FileInfo>();\n                    DirectoryInfo dir = new DirectoryInfo(directory);\n                    DirectoryInfo[] subDirs = dir.GetDirectories();\n\n                    files.AddRange(GetFilesBase(directory));\n                    Array.ForEach(subDirs, x => files.AddRange(GetFiles(x.FullName)));\n\n                    return files.ToArray();\n                }\n                else\n                {\n                    return GetFilesBase(directory);\n                }\n            }\n            catch\n            {\n                return new FileInfo[] { };\n            }\n        }\n\n        private FileInfo[] GetFilesBase(string directory)\n        {\n            try\n            {\n                DirectoryInfo di = new DirectoryInfo(directory);\n                return di.GetFiles().Where(x => Extenstions.Contains(x.Extension)).ToArray();\n            }\n            catch\n            {\n                return new FileInfo[] { };\n            }\n        }\n\n        public bool ScanSubDirectories { get; set; }\n        public string Directory { get; set; }\n        private FileInfo[] BaseFiles { get; set; }\n        public string[] Extenstions { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/PathExtensions.cs",
    "content": "﻿using System.IO;\n\nnamespace DoomLauncher.Handlers\n{\n    public static class PathExtensions\n    {\n        // Path.IsRootedPath incorrectly allows path starting with directory separated chars to be counted as rooted.\n        // .NET Framework does not have this function so it is copied from .NET core source\n        public static bool IsPartiallyQualified(string path)\n        {\n            if (path.Length < 2)\n            {\n                // It isn't fixed, it must be relative.  There is no way to specify a fixed\n                // path with one character (or less).\n                return true;\n            }\n\n            if (IsDirectorySeparator(path[0]))\n            {\n                // There is no valid way to specify a relative path with two initial slashes or\n                // \\? as ? isn't valid for drive relative paths and \\??\\ is equivalent to \\\\?\\\n                return !(path[1] == '?' || IsDirectorySeparator(path[1]));\n            }\n\n            // The only way to specify a fixed path that doesn't begin with two slashes\n            // is the drive, colon, slash format- i.e. C:\\\n            return !((path.Length >= 3)\n                && (path[1] == Path.VolumeSeparatorChar)\n                && IsDirectorySeparator(path[2])\n                // To match old behavior we'll check the drive character for validity as the path is technically\n                // not qualified if you don't have a valid drive. \"=:\\\" is the \"=\" file's default data stream.\n                && IsValidDriveChar(path[0]));\n        }\n\n        internal static bool IsDirectorySeparator(char c)\n        {\n            return c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar;\n        }\n\n        internal static bool IsValidDriveChar(char value)\n        {\n            return ((value >= 'A' && value <= 'Z') || (value >= 'a' && value <= 'z'));\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/SaveGameHandler.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.SaveGame;\nusing DoomLauncher.SourcePort;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    class SaveGameHandler\n    {\n        public SaveGameHandler(IDataSourceAdapter adapter, LauncherPath savegameDirectory)\n        {\n            DataSourceAdapter = adapter;\n            SaveGameDirectory = savegameDirectory;\n        }\n\n        public IEnumerable<IFileData> HandleNewSaveGames(ISourcePortData sourcePort, IGameFile gameFile, string[] files)\n        {\n            List<IFileData> ret = new List<IFileData>();\n\n            if (gameFile != null && gameFile.GameFileID.HasValue)\n            {\n                foreach (string file in files)\n                {\n                    try\n                    {\n                        FileInfo fi = new FileInfo(file);\n                        string fileName = Guid.NewGuid().ToString() + fi.Extension;\n                        fi.CopyTo(Path.Combine(SaveGameDirectory.GetFullPath(), fileName));\n\n                        FileData fileData = new FileData\n                        {\n                            Description = GetSaveGameName(sourcePort, fi),\n                            OriginalFileName = fi.Name,\n                            FileName = fileName,\n                            GameFileID = gameFile.GameFileID.Value,\n                            SourcePortID = sourcePort.SourcePortID,\n                            FileTypeID = FileType.SaveGame\n                        };\n\n                        DataSourceAdapter.InsertFile(fileData);\n                        ret.Add(fileData);\n                    }\n                    catch\n                    {\n                        //failed, nothing to do\n                    }\n                }\n            }\n\n            return ret;\n        }\n\n        private static string GetSaveGameName(ISourcePortData sourcePort, FileInfo fi)\n        {\n            ISaveGameReader reader = CreateSaveGameReader(sourcePort, fi);\n\n            if (reader != null)\n                return reader.GetName();\n\n            return fi.Name;\n        }\n\n        private static ISaveGameReader CreateSaveGameReader(ISourcePortData sourcePort, FileInfo fi)\n        {\n            return sourcePort.GetFlavor().CreateSaveGameReader(fi);\n        }\n\n        public void HandleUpdateSaveGames(ISourcePortData sourcePort, IGameFile gameFile, IFileData[] files)\n        {\n            foreach (IFileData file in files)\n            {\n                FileInfo fi = new FileInfo(Path.Combine(sourcePort.GetReadSavePath().GetFullPath(), file.OriginalFileName));\n\n                if (fi.Exists)\n                {\n                    if (file.DateCreated == fi.LastWriteTime)\n                        continue;\n\n                    try\n                    {\n                        fi.CopyTo(Path.Combine(SaveGameDirectory.GetFullPath(), file.FileName), true);\n                    }\n                    catch\n                    {\n                        //failed, nothing to do\n                    }\n\n                    //check to see if the save name changed\n                    string saveName = GetSaveGameName(sourcePort, fi);\n                    if (saveName != file.Description)\n                        file.Description = saveName;\n\n                    file.DateCreated = fi.LastWriteTime;\n                    DataSourceAdapter.UpdateFile(file);\n                }\n            }\n        }\n\n        public void HandleDeleteSaveGames(string[] deletedFiles, IFileData[] previousFiles)\n        {\n            foreach (var file in deletedFiles)\n            {\n                FileInfo fi = new FileInfo(file);\n                IFileData saveFile = previousFiles.FirstOrDefault(x => x.OriginalFileName == fi.Name);\n                if (saveFile != null)\n                    DataSourceAdapter.DeleteFile(saveFile);\n            }\n        }\n\n        public void CopySaveGamesToSourcePort(ISourcePortData sourcePort, IFileData[] files)\n        {\n            foreach (IFileData file in files)\n            {\n                string savePath = sourcePort.GetReadSavePath().GetFullPath();\n                string fileName = Path.Combine(sourcePort.GetReadSavePath().GetFullPath(), file.OriginalFileName);\n                FileInfo fiFrom = new FileInfo(Path.Combine(SaveGameDirectory.GetFullPath(), file.FileName));\n\n                try\n                {\n                    if (fiFrom.Exists)\n                    {\n                        DirectoryInfo di = new DirectoryInfo(Path.Combine(savePath, file.OriginalFilePath));\n\n                        if (!di.Exists)\n                            di.Create();\n\n                        fiFrom.CopyTo(fileName, true);\n                    }\n                }\n                catch\n                {\n                    //failed, nothing to do\n                }\n            }\n        }\n\n        public LauncherPath SaveGameDirectory { get; set; }\n        public IDataSourceAdapter DataSourceAdapter { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/ScreenshotHandler.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public static class ScreenshotHandler\n    {\n        public static bool InsertScreenshot(IGameFile gameFile, MemoryStream imageStream, IEnumerable<IFileData> existingScreenshots, out IFileData fileData)\n        {\n            fileData = null;\n            if (gameFile == null || !gameFile.GameFileID.HasValue)\n                return false;\n\n            if (existingScreenshots == null)\n                existingScreenshots = DataCache.Instance.DataSourceAdapter.GetFiles(gameFile, FileType.Screenshot);\n\n            try\n            {\n                string fileName = Guid.NewGuid().ToString() + \".png\";\n                string path = Path.Combine(DataCache.Instance.AppConfiguration.ScreenshotDirectory.GetFullPath(), fileName);\n\n                using (FileStream fs = new FileStream(path, FileMode.Create))\n                    imageStream.WriteTo(fs);\n\n                fileData = new FileData\n                {\n                    FileName = fileName,\n                    GameFileID = gameFile.GameFileID.Value,\n                    SourcePortID = -1,\n                    FileTypeID = FileType.Screenshot,\n                    FileOrder = 0\n                };\n\n                DataCache.Instance.DataSourceAdapter.InsertFile(fileData);\n\n                int order = 1;\n                foreach (IFileData file in existingScreenshots)\n                {\n                    file.FileOrder = order++;\n                    DataCache.Instance.DataSourceAdapter.UpdateFile(file);\n                }\n\n                ThumbnailManager.UpdateThumbnail(gameFile);\n            }\n            catch\n            {\n                //failed, nothing to do\n            }\n\n            return true;\n        }\n        \n        public static IEnumerable<IFileData> HandleNewScreenshots(ISourcePortData sourcePort, IGameFile gameFile, string[] files)\n        {\n            List<IFileData> ret = new List<IFileData>();\n            if (gameFile == null || !gameFile.GameFileID.HasValue)\n                return ret;\n\n            foreach (string file in files)\n            {\n                try\n                {\n                    FileInfo fi = new FileInfo(file);\n                    string fileName = Guid.NewGuid().ToString() + fi.Extension;\n                    fi.CopyTo(Path.Combine(DataCache.Instance.AppConfiguration.ScreenshotDirectory.GetFullPath(), fileName));\n\n                    FileData fileData = new FileData\n                    {\n                        FileName = fileName,\n                        GameFileID = gameFile.GameFileID.Value,\n                        SourcePortID = sourcePort.SourcePortID,\n                        FileTypeID = FileType.Screenshot,\n                        FileOrder = short.MaxValue,\n                    };\n\n                    DataCache.Instance.DataSourceAdapter.InsertFile(fileData);\n                    ret.Add(fileData);\n\n                    if (DataCache.Instance.AppConfiguration.DeleteScreenshotsAfterImport)\n                        File.Delete(file);\n                }\n                catch\n                {\n                    //failed, nothing to do\n                }\n            }\n\n            return ret;\n        }\n\n        public static bool FindScreenshot(IEnumerable<IFileData> screenshots, Image image, out MemoryStream imageStream)\n        {\n            // Create png image in memory and use the size to compare to existing screenshot file sizes.\n            // This method should be accurate enough to determine if an existing screenshot is the titlepic.\n            // This method only works with titlepics pull by Doom Laucher, existing user generated screenshots from source ports will not match.\n            imageStream = null;\n            long fileSize = 0;\n            try\n            {\n                imageStream = new MemoryStream();\n                image.Save(imageStream, ImageFormat.Png);\n                fileSize = imageStream.Length;\n            }\n            catch { }\n\n            if (!screenshots.Any())\n                return false;\n\n            foreach (IFileData screenshot in screenshots)\n            {\n                try\n                {\n                    FileInfo fi = new FileInfo(Path.Combine(DataCache.Instance.AppConfiguration.ScreenshotDirectory.GetFullPath(), screenshot.FileName));\n                    if (fi.Length == fileSize)\n                        return true;\n                }\n                catch { }\n            }\n\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/Doom64SyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Text.RegularExpressions;\n\nnamespace DoomLauncher.Handlers.Sync {\n    public class Doom64SyncAction : ISyncAction\n    {\n        private static readonly Regex ClassTypeRegex = new Regex(@\"classtype\\s*=\"); // Only Doom64 files have classtype in the MAPINFO\n\n        private readonly IDataSourceAdapter m_database;\n\n        public Doom64SyncAction(IDataSourceAdapter database)\n        {\n            m_database = database;\n        }\n\n        public SyncResult ApplyToGameFile(IGameFile file, IArchiveReader reader, string[] mapInfoData)\n        {\n            var isDoom64 = IsDoom64Wad(mapInfoData);\n            file.IsDoom64 = isDoom64;\n\n            if (isDoom64)\n            {\n                var doom64Iwad = m_database.GetGameFile(\"doom64.zip\");\n                if (doom64Iwad != null)\n                {\n                    file.IWadID = doom64Iwad.IWadID;\n                }\n            }\n\n            return SyncResult.EMPTY;\n        }\n\n        private bool IsDoom64Wad(string[] mapInfoData)\n        {\n            foreach (string data in mapInfoData)\n            {\n                MatchCollection matches = ClassTypeRegex.Matches(data);\n                if (matches.Count > 0)\n                    return true;\n            }\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/Doom64TitlePicSyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher.Handlers.Sync {\n    public class Doom64TitlePicSyncAction : ISyncAction\n    {\n        public SyncResult ApplyToGameFile(IGameFile gameFile, IArchiveReader reader, string[] mapInfoData)\n        {\n            var entry = reader.Entries.FirstOrDefault(e => e.FullName.EndsWith(\"Doom64_HiRes.png\"));\n\n            if (entry != null)\n            {\n                var image = Image.FromStream(new MemoryStream(entry.ReadEntry()));\n                return SyncResult.TitlePic(gameFile, image);\n            }\n\n            return SyncResult.EMPTY;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/GameConfSyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Web.Script.Serialization;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class GameConfSyncAction : ISyncAction\n    {\n        private readonly IDataSourceAdapter m_database;\n\n        public GameConfSyncAction(IDataSourceAdapter database)\n        {\n            m_database = database;\n        }\n\n        public SyncResult ApplyToGameFile(IGameFile gameFile, IArchiveReader reader, string[] mapInfoData)\n        {\n            var entry = reader.Entries.FirstOrDefault(e => e.Name.ToLower().Equals(\"gameconf\"));\n            if (entry != null)\n            {\n                var json = entry.ReadString(Encoding.UTF7);\n\n                try\n                {\n                    var serializer = new JavaScriptSerializer();\n                    var gameConfData = serializer.Deserialize<Dictionary<string, object>>(json);\n\n                    var data = (Dictionary<string, object>)gameConfData[\"data\"];\n                    var title = data.ContainsKey(\"title\") ? data[\"title\"] as string : null;\n                    var author = data.ContainsKey(\"author\") ? data[\"author\"] as string : null;\n                    var description = data.ContainsKey(\"description\") ? data[\"description\"] as string : null;\n                    var iwad = data.ContainsKey(\"iwad\") ? data[\"iwad\"] as string : null;\n\n                    if (!string.IsNullOrEmpty(title))\n                        gameFile.Title = title;\n\n                    if (!string.IsNullOrEmpty(author))\n                        gameFile.Author = author;\n\n                    if (!string.IsNullOrEmpty(description))\n                        gameFile.Description = description;\n\n                    if (!string.IsNullOrEmpty(iwad))\n                    {\n                        var gameName = Path.GetFileNameWithoutExtension(iwad.ToLower());\n                        var iwadFile = m_database.GetIWads().FirstOrDefault(x =>\n                            Path.GetFileNameWithoutExtension(x.Name.ToLower()).Equals(gameName));\n                        if (iwadFile != null)\n                            gameFile.IWadID = iwadFile.IWadID;\n                    }\n                }\n                catch\n                {\n\n                }\n            }\n\n            return SyncResult.EMPTY;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/GameInfoSyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    /// <summary>\n    /// https://zdoom.org/wiki/GAMEINFO\n    /// </summary>\n    public class GameInfoSyncAction : ISyncAction\n    {\n        private static readonly Regex STARTUPTITLE_REGEX = new Regex(@\"\\s*STARTUPTITLE\\s*=\\s*\"\".*\"\"\"); //@\"\\s*{0}\\s*:[^=]*\";\n        private static readonly Regex SUBTRACT_REGEX = new Regex(@\"\\s*STARTUPTITLE\\s*=\\s*\");\n\n        public SyncResult ApplyToGameFile(IGameFile gameFile, IArchiveReader reader, string[] mapInfoData)\n        {\n            // Normally it's GAMEINFO, but I've seen GAMEINFO.txt in the wild. \n            var entry = reader.Entries.FirstOrDefault(x => x.Name.ToLower().StartsWith(\"gameinfo\"));\n            if (entry != null)\n            {\n                var text = entry.ReadString(Encoding.UTF7);\n                Match m = STARTUPTITLE_REGEX.Match(text);\n                if (m.Success)\n                {\n                    var fullStatement = m.Value;\n                    var assignment = SUBTRACT_REGEX.Match(fullStatement);\n                    if (assignment.Success)\n                    {\n                        var title = fullStatement.Substring(assignment.Length + 1, fullStatement.Length - assignment.Length - 2).Trim();\n                        if (!string.IsNullOrEmpty(title))\n                            gameFile.Title = title;\n                    }\n                }\n            }\n\n            return SyncResult.EMPTY;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/ISyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public interface ISyncAction\n    {\n        SyncResult ApplyToGameFile(IGameFile file, IArchiveReader reader, string[] mapInfoData);\n    }\n\n    class EmptySyncAction : ISyncAction\n    {\n        public SyncResult ApplyToGameFile(IGameFile gameFile, IArchiveReader reader, string[] mapInfoData)\n        {\n            return SyncResult.EMPTY;\n        }\n    }\n\n    public static class SyncActionExtensions\n    {\n        public static ISyncAction OnlyIf(this ISyncAction action, bool condition) =>\n            condition ? action : new EmptySyncAction();\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/IWadTitlesSyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class IWadTitlesSyncAction : ISyncAction\n    {\n        public SyncResult ApplyToGameFile(IGameFile gameFile, IArchiveReader reader, string[] mapInfoData)\n        {\n            IWadInfo info = IWadInfo.GetIWadInfo(gameFile.FileName);\n            if (info != null)\n                gameFile.Title = info.Title;\n\n            return SyncResult.EMPTY;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/IdGamesTextFileParser.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class IdGamesTextFileParser\n    {\n        private static readonly string s_fullRegex = @\"\\s*{0}\\s*:[^\\r\\n]*\";\n        private static readonly string s_fullRegexDescription = @\"\\s*{0}\\s*:[^=]*\";\n        private static readonly string s_regex = @\"\\s*{0}\\s*:\\s*\";\n        private readonly string[] m_dateParseFormats;\n\n        public IdGamesTextFileParser(string[] dateParseFormats)\n        {\n            m_dateParseFormats = dateParseFormats.ToArray();\n        }\n\n        public IdGamesTextInfo Parse(string text)\n        {\n            var title = FindValue(text, \"Title\", s_fullRegex, false);\n            var author = FindValue(text, \"Authors*\", s_fullRegex, false);\n            var releaseDate = ParseReleaseDate(text);\n            var description = FindValue(text, \"Description\", s_fullRegexDescription, false).Replace(\"\\r\\n\", \"\\n\");\n            var game = FindValue(text, \"Game\", s_fullRegex, false);\n\n            return new IdGamesTextInfo(title, author, releaseDate, description, game);\n        }\n\n        private DateTime? ParseReleaseDate(string text)\n        {\n            string[] dateItems = new string[] { \"Date Finished\", \"Release date\" };\n\n            string date = string.Empty;\n\n            foreach (string item in dateItems)\n            {\n                date = FindValue(text, item, s_fullRegex, true).Replace(\"th\", string.Empty).Trim();\n                if (!string.IsNullOrEmpty(date)) break;\n            }\n\n            if (!string.IsNullOrEmpty(date))\n            {\n                DateTime dt;\n                date = date.Replace(\".\", \"/\");\n                if (ParseDate1(date, m_dateParseFormats, out dt))\n                    return dt;\n                else if (ParseDate2(date, m_dateParseFormats, out dt))\n                    return dt;\n                else if (ParseDate3(date, m_dateParseFormats, out dt))\n                    return dt;\n            }\n            return null;\n        }\n\n        private bool ParseDate1(string date, string[] dateParseFormats, out DateTime dt)\n        {\n            if (DateTime.TryParse(date, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))\n            {\n                return true;\n            }   \n            else if (DateTime.TryParseExact(date, dateParseFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))\n                return true;\n\n            return false;\n        }\n\n        private bool ParseDate2(string date, string[] dateParseFormats, out DateTime dt)\n        {\n            if (date.Length > 0 && !char.IsNumber(date.Last())) date = date.Substring(0, date.Length - 1);\n            if (date.Length > 0 && !char.IsNumber(date.First())) date = date.Substring(1);\n\n            return ParseDate1(date, dateParseFormats, out dt);\n        }\n\n        private bool ParseDate3(string date, string[] dateParseFormats, out DateTime dt)\n        {\n            while (date.Length > 0 && !char.IsNumber(date.Last())) date = date.Substring(0, date.Length - 1);\n            while (date.Length > 0 && !char.IsNumber(date.First())) date = date.Substring(1);\n            return ParseDate1(date, dateParseFormats, out dt);\n        }\n\n        private string FindValue(string text, string category, string regexFull, bool ignoreCase)\n        {\n            Match m = new Regex(string.Format(regexFull, category), RegexOptions.IgnoreCase).Match(text);\n\n            if (m.Success)\n                return m.Value.Substring((new Regex(string.Format(s_regex, category), RegexOptions.IgnoreCase).Match(m.Value).Value.Length));\n\n            return string.Empty;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/IdGamesTextInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class IdGamesTextInfo\n    {\n        public static readonly IdGamesTextInfo EMPTY = new IdGamesTextInfo(null, null, null, null, null);\n\n        public IdGamesTextInfo(string title, string author, DateTime? releaseDate, string description, string game)\n        {\n            Title = title ?? \"\";\n            Author = author ?? \"\";\n            ReleaseDate = releaseDate;\n            Description = description ?? \"\";\n            Game = game ?? \"\";\n\n        }\n\n        public int QualityScore \n        {\n            get\n            {\n                var fields = new List<object>() { Title, Author, ReleaseDate, Description, Game };\n                return fields.Where(x => x != null && !(x is string s && string.IsNullOrWhiteSpace(s))).Count();\n            }\n        }\n\n        // Preserve the first non null element\n        public IdGamesTextInfo Combine(IdGamesTextInfo other) => \n            new IdGamesTextInfo(\n                !string.IsNullOrWhiteSpace(Title) ? Title : other.Title,\n                !string.IsNullOrWhiteSpace(Author) ? Author : other.Author, \n                ReleaseDate ?? other.ReleaseDate,\n                !string.IsNullOrWhiteSpace(Description) ? Description : other.Description,\n                !string.IsNullOrWhiteSpace(Game) ? Game : other.Game);\n\n        public string Title { get; }\n        public string Author { get; }\n        public DateTime? ReleaseDate { get; }\n        public string Description { get; }\n\n        public string Game { get; }\n\n        public override bool Equals(object obj)\n        {\n            return obj != null\n                && obj is IdGamesTextInfo info\n                && (Title, Author, ReleaseDate, Description, Game).Equals(\n                    (info.Title, info.Author, info.ReleaseDate, info.Description, info.Game));\n        }\n\n        public override int GetHashCode() => \n            (Title, Author, ReleaseDate, Description, Game).GetHashCode();\n    }\n\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/KnownWadsSyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Linq;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class KnownWadsSyncAction : ISyncAction\n    {\n        private readonly IDataSourceAdapter m_database;\n\n        public KnownWadsSyncAction(IDataSourceAdapter database)\n        {\n            m_database = database;\n        }\n\n        public SyncResult ApplyToGameFile(IGameFile file, IArchiveReader reader, string[] mapInfoData)\n        {\n            var baseName = file.FileNameBase.ToLower();\n            \n            switch (baseName)\n            {\n                case \"hexdd\":\n                    file.Title = \"Hexen: Deathkings of the Dark Citadel\";\n                    file.IWadID = m_database.GetIWads().FirstOrDefault(iwad => iwad.FileNameBase.Equals(\"hexen\", StringComparison.OrdinalIgnoreCase))?.IWadID;\n                    break;\n            };\n            return SyncResult.EMPTY;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/MapInfoUtil.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Text;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public static class MapInfoUtil\n    {\n        private static readonly string[] MapInfoNames = new string[] { \"mapinfo\", \"zmapinfo\" };\n        private static readonly string[] MapInfoSubNames = new string[] { \"mapinfo.\", \"zmapinfo.\" };\n\n        public static string[] GetMapInfoData(IArchiveReader reader)\n        {\n            var mapInfoEntries = reader.Entries.Where(IsEntryMapInfo).ToArray();\n            return GetArchiveEntryData(mapInfoEntries.ToArray());\n        }\n\n        private static string[] GetArchiveEntryData(params IArchiveEntry[] entries)\n        {\n            string[] data = new string[entries.Length];\n            for (int i = 0; i < entries.Length; i++)\n            {\n                try\n                {\n                    data[i] = Encoding.UTF8.GetString(entries[i].ReadEntry());\n                }\n                catch\n                {\n                    data[i] = string.Empty;\n                }\n            }\n\n            return data;\n        }\n        private static bool IsEntryMapInfo(IArchiveEntry entry)\n        {\n            try\n            {\n                string entryName = entry.GetNameWithoutExtension();\n                foreach (string name in MapInfoNames)\n                {\n                    if (entryName.Equals(name, StringComparison.OrdinalIgnoreCase))\n                        return true;\n                }\n\n                foreach (string name in MapInfoSubNames)\n                {\n                    if (entryName.StartsWith(name, StringComparison.OrdinalIgnoreCase))\n                        return true;\n                }\n\n                return false;\n            }\n            catch (ArgumentException)\n            {\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/MapStringSyncAction.cs",
    "content": "﻿using DoomLauncher.Archive;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Web.UI.WebControls;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class MapStringSyncAction : ISyncAction\n    {\n        private readonly LauncherPath m_tempDirectory;\n        private static readonly Regex MapRegex = new Regex(@\"\\s*map\\s+\\w+\", RegexOptions.IgnoreCase);\n        private static readonly Regex IncludeRegex = new Regex(@\"\\s*include\\s+(\\S+)\", RegexOptions.IgnoreCase);\n\n        public MapStringSyncAction(LauncherPath tempDirectory)\n        {\n            m_tempDirectory = tempDirectory;\n        }\n\n        public SyncResult ApplyToGameFile(IGameFile gameFile, IArchiveReader reader, string[] mapInfoData)\n        {\n            var maps = GetMaps(reader, mapInfoData);\n            var mapString = string.Join(\", \", maps.ToArray());\n\n            gameFile.Map = mapString;\n            if (!string.IsNullOrEmpty(gameFile.Map))\n                gameFile.MapCount = gameFile.Map.Count(x => x == ',') + 1;\n\n            return SyncResult.EMPTY;\n        }   \n\n        private List<string> GetMaps(IArchiveReader reader, string[] mapInfoData)\n        {\n            List<string> maps = new List<string>();\n            if (mapInfoData.Length > 0)\n            {\n                foreach (var mapInfo in mapInfoData)\n                    maps.AddRange(MapStringFromMapInfo(reader, mapInfo));\n            }\n            else\n            {\n                maps.AddRange(MapStringFromGameFileWads(reader));\n            }\n            return maps.Distinct().ToList();\n        }\n\n        private List<string> MapStringFromMapInfo(IArchiveReader reader, string mapInfoData)\n        {\n            return MapStringFromMapInfo(reader, mapInfoData, new HashSet<string>(StringComparer.OrdinalIgnoreCase));\n        }\n\n        private List<string> MapStringFromMapInfo(IArchiveReader reader, string mapInfoData, ISet<string> includedFiles)\n        {\n            List<string> maps = new List<string>();\n            maps.AddRange(ParseMapInfoInclude(reader, mapInfoData, includedFiles));\n            maps.AddRange(GetMapStringFromMapInfo(mapInfoData));\n\n            return maps;\n        }\n\n        private List<string> ParseMapInfoInclude(IArchiveReader reader, string mapinfo, ISet<string> includedFiles)\n        {\n            List<string> maps = new List<string>();\n            var includeFiles = new HashSet<string>(includedFiles); // copy the set to avoid modifying the original\n\n            MatchCollection matches = IncludeRegex.Matches(mapinfo);\n            foreach (Match match in matches)\n            {\n                if (match.Groups.Count < 2)\n                    continue;\n\n                string file = match.Groups[1].Value.Trim();\n                if (includeFiles.Contains(file))\n                    continue;\n\n                includeFiles.Add(file);\n\n                var entry = reader.Entries.FirstOrDefault(x => x.FullName.Equals(file, StringComparison.OrdinalIgnoreCase));\n                if (entry == null)\n                    continue;\n\n                string[] entryData = GetArchiveEntryData(entry);\n                if (entryData.Length > 0)\n                    maps.AddRange(MapStringFromMapInfo(reader, entryData[0], includeFiles)); // Recurse\n            }\n\n            return maps;\n        }\n\n        private List<string> GetMapStringFromMapInfo(string mapinfo)\n        {\n            MatchCollection matches = MapRegex.Matches(mapinfo);\n            return matches.Cast<Match>().Select(x => x.Value.Trim().Substring(3).Trim()).ToList();\n        }\n\n        private List<string> MapStringFromGameFileWads(IArchiveReader reader) =>\n            GetIWadFilenames(reader).SelectMany(Util.GetMapStringFromWad).ToList();\n\n        private List<string> GetIWadFilenames(IArchiveReader reader)\n        {\n            if (reader is WadArchiveReader wadArchive)\n            {\n                return new List<string>() { wadArchive.Filename };\n            }\n            else if (reader is RecursiveArchiveReader recursiveReader && recursiveReader.Root is WadArchiveReader wadArchive2)\n            {\n                return new List<string>() { wadArchive2.Filename };\n            }\n            else\n            {\n                IEnumerable<IArchiveEntry> wadEntries = GetEntriesByExtension(reader, \".wad\");\n                return wadEntries.Select(entry => Util.ExtractTempFile(m_tempDirectory.GetFullPath(), entry)).ToList();\n            }\n        }\n\n        private static string[] GetArchiveEntryData(params IArchiveEntry[] entries)\n        {\n            string[] data = new string[entries.Length];\n            for (int i = 0; i < entries.Length; i++)\n            {\n                try\n                {\n                    data[i] = Encoding.UTF8.GetString(entries[i].ReadEntry());\n                }\n                catch\n                {\n                    data[i] = string.Empty;\n                }\n            }\n\n            return data;\n        }\n\n        private static IEnumerable<IArchiveEntry> GetEntriesByExtension(IArchiveReader reader, string ext)\n        {\n            return reader.Entries.Where(x => x.Name.Contains('.') && Path.GetExtension(x.Name).Equals(ext, StringComparison.OrdinalIgnoreCase));\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/StartupImageSyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher.Handlers.Sync {\n\n\n    /// <summary>\n    /// https://zdoom.org/wiki/Startup_lumps\n    /// Planar image reading code adapted from https://github.com/ZDoom/gzdoom/blob/5e35ebc8fe698f86c8b0c4c98774bc397f30e7d4/src/common/textures/formats/startuptexture.cpp\n    /// </summary>\n    public class StartupImageSyncAction : ISyncAction\n    {\n        private static readonly int WIDTH = 640;\n        private static readonly int HEIGHT = 480;\n        private static readonly int PALETTE_LENGTH = 48; // 16 colors, 3 bytes each (RGB)\n        private static readonly int PIXELS_LENGTH = WIDTH * HEIGHT / 2; // 4 bits per pixel\n        private static readonly int STARTUP_LENGTH = PALETTE_LENGTH + PIXELS_LENGTH;\n\n        public SyncResult ApplyToGameFile(IGameFile gameFile, IArchiveReader reader, string[] mapInfoData)\n        {\n            var entry = reader.Entries.FirstOrDefault(e => \n                e.Name.ToLower().StartsWith(\"startup\") // STARTUP, startup.dat, startup.png, startup.lmp etc\n                && !e.Name.ToLower().EndsWith(\".wad\") // Not an image!\n                && !e.Name.ToLower().StartsWith(\"startup0\")); // Ignore Strife startup image\n\n            if (entry != null)\n            {\n                byte[] entryBytes = entry.ReadEntry();\n\n                try \n                { \n                    Image pngImage = new Bitmap(new MemoryStream(entryBytes), true);\n                    return SyncResult.TitlePic(gameFile, pngImage);\n                }\n                catch (System.Exception)\n                {\n                    // OK it's not a PNG... let's try planar image\n                }\n\n                if (entry.Length != STARTUP_LENGTH)\n                {\n                    return SyncResult.FailedTitlePicFile(gameFile);\n                }\n\n                Color[] palette = ReadPalette(entryBytes);\n                Image image = ReadPlanarPalettedImage(palette, entryBytes);\n                return SyncResult.TitlePic(gameFile, image);\n            }\n\n            return SyncResult.EMPTY;\n        }\n\n\n        // Each pixel is an index into the 16-length palette array.\n        // However, this is a planar image, meaning that each index is split apart into bits, \n        // rather than being stored as a single byte.\n        // All the first bits of all the indices come first, then all the second bits, etc.\n        private Image ReadPlanarPalettedImage(Color[] palette, byte[] entryBytes)\n        {\n            Bitmap image = new Bitmap(640, 480);\n            int planeSize = WIDTH * HEIGHT / 8;\n\n            for (int y = 0; y < HEIGHT; y++)\n            {\n                for (int x = 0; x < WIDTH / 8; x++)\n                {\n                    int offset = PALETTE_LENGTH + y * (WIDTH / 8) + x;\n                    byte p0 = entryBytes[offset];\n                    byte p1 = entryBytes[offset + planeSize];\n                    byte p2 = entryBytes[offset + 2 * planeSize];\n                    byte p3 = entryBytes[offset + 3 * planeSize];\n\n                    for (int bit = 0; bit < 8; bit++)\n                    {\n                        int mask = 1 << (7 - bit);\n                        int colorIndex =\n                            ((p0 & mask) != 0 ? 1 : 0) |\n                            ((p1 & mask) != 0 ? 2 : 0) |\n                            ((p2 & mask) != 0 ? 4 : 0) |\n                            ((p3 & mask) != 0 ? 8 : 0);\n\n                        image.SetPixel(x * 8 + bit, y, palette[colorIndex]);\n                    }\n                }\n            }\n            return image;\n        }\n\n        private Color[] ReadPalette(byte[] entryBytes)\n        {\n            Color[] palette = new Color[16];\n            for (int i = 0; i < 16; i++)\n            {\n                int r = entryBytes[i * 3 + 0] * 255 / 63;\n                int g = entryBytes[i * 3 + 1] * 255 / 63;\n                int b = entryBytes[i * 3 + 2] * 255 / 63;\n                palette[i] = Color.FromArgb(r, g, b);\n            }\n            return palette;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/SyncResult.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class SyncResult\n    {\n        public static readonly SyncResult EMPTY = \n            new SyncResult(new List<IGameFile>(), new List<IGameFile>(), \n                new List<InvalidFile>(), new Dictionary<IGameFile, Image>(), new List<IGameFile>());  \n\n        public List<IGameFile> AddedGameFiles { get; }\n        public List<IGameFile> UpdatedGameFiles { get; }\n        public List<InvalidFile> InvalidFiles { get; }\n        public Dictionary<IGameFile, Image> TitlePics { get; }\n        public List<IGameFile> FailedTitlePicFiles { get; }\n\n        public bool Failed => InvalidFiles.Count > 0;\n\n        public List<IGameFile> AddedOrUpdatedFiles\n        {\n            get => AddedGameFiles.Union(UpdatedGameFiles).ToList();\n        }\n\n        private SyncResult(List<IGameFile> addedGameFiles, List<IGameFile> updatedGameFiles, List<InvalidFile> invalidFiles,\n            Dictionary<IGameFile, Image> titlePics, List<IGameFile> failedTitlePicFiles)\n        {\n            AddedGameFiles = new List<IGameFile>(addedGameFiles);\n            UpdatedGameFiles = new List<IGameFile>(updatedGameFiles);\n            InvalidFiles = new List<InvalidFile>(invalidFiles);\n            TitlePics = titlePics;\n            FailedTitlePicFiles = new List<IGameFile>(failedTitlePicFiles);\n        }\n\n        public static SyncResult operator +(SyncResult a, SyncResult b) => a.Combine(b);\n\n        public SyncResult Combine(SyncResult other)\n        {\n            return new SyncResult(\n                addedGameFiles: CombineLists(AddedGameFiles, other.AddedGameFiles),\n                updatedGameFiles: CombineLists(UpdatedGameFiles, other.UpdatedGameFiles),\n                invalidFiles: CombineLists(InvalidFiles, other.InvalidFiles),\n                titlePics: CombineDictionariesKeepLatest(TitlePics, other.TitlePics),\n                failedTitlePicFiles: CombineLists(FailedTitlePicFiles, other.FailedTitlePicFiles));\n        }\n\n        public bool GetTitlePic(IGameFile gameFile, out Image image) =>\n            TitlePics.TryGetValue(gameFile, out image);\n\n\n        public static SyncResult AddedGameFile(IGameFile gameFile)\n        {\n            return new SyncResult(\n                addedGameFiles: new List<IGameFile>() { gameFile },\n                updatedGameFiles: new List<IGameFile>(),\n                invalidFiles: new List<InvalidFile>(),\n                titlePics: new Dictionary<IGameFile, Image>(),\n                failedTitlePicFiles: new List<IGameFile>());\n        }\n\n        public static SyncResult UpdatedGameFile(IGameFile gameFile)\n        {\n            return new SyncResult(\n                addedGameFiles: new List<IGameFile>(),\n                updatedGameFiles: new List<IGameFile>() { gameFile },\n                invalidFiles: new List<InvalidFile>(),\n                titlePics: new Dictionary<IGameFile, Image>(),\n                failedTitlePicFiles: new List<IGameFile>());\n        }\n\n        public static SyncResult InvalidFile(string filename, string reason)\n        {\n            return new SyncResult(\n                addedGameFiles: new List<IGameFile>(),\n                updatedGameFiles: new List<IGameFile>(),\n                invalidFiles: new List<InvalidFile>() { new InvalidFile(filename, reason) },\n                titlePics: new Dictionary<IGameFile, Image>(),\n                failedTitlePicFiles: new List<IGameFile>());\n        }\n\n        public static SyncResult TitlePic(IGameFile gameFile, Image image)\n        {\n            return new SyncResult(\n                addedGameFiles: new List<IGameFile>(),\n                updatedGameFiles: new List<IGameFile>() ,\n                invalidFiles: new List<InvalidFile>(),\n                titlePics: new Dictionary<IGameFile, Image>() { { gameFile, image } },\n                failedTitlePicFiles: new List<IGameFile>());\n        }\n\n        public static SyncResult FailedTitlePicFile(IGameFile gameFile)\n        {\n            return new SyncResult(\n                addedGameFiles: new List<IGameFile>(),\n                updatedGameFiles: new List<IGameFile>(),\n                invalidFiles: new List<InvalidFile>(),\n                titlePics: new Dictionary<IGameFile, Image>(),\n                failedTitlePicFiles: new List<IGameFile>() { gameFile });\n        }\n\n        private static List<A> CombineLists<A>(List<A> ourList, List<A> otherList)\n        {\n            var newList = new List<A>(ourList.Count + otherList.Count);\n            newList.AddRange(ourList);\n            newList.AddRange(otherList);\n            return newList.Distinct().ToList();\n        }\n\n        // Keep the existing key/values\n        private static Dictionary<K, V> CombineDictionariesKeepLatest<K, V>(Dictionary<K, V> ourDict, Dictionary<K, V> otherDict)\n        {\n            var combinedDictionary = new Dictionary<K, V>(otherDict);\n            foreach (var key in ourDict.Keys)\n            {\n                if (!combinedDictionary.ContainsKey(key))\n                    combinedDictionary[key] = ourDict[key];\n            }\n            return combinedDictionary;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/TextFileSyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class TextFileSyncAction : ISyncAction\n    {\n        private readonly Func<string, IdGamesTextInfo> m_parseTextFile;\n\n        public TextFileSyncAction(Func<string, IdGamesTextInfo> parseTextFile)\n        {\n            m_parseTextFile = parseTextFile;\n        }\n\n        public SyncResult ApplyToGameFile(IGameFile gameFile, IArchiveReader reader, string[] mapInfoData)\n        {\n            var textInfos = from entry in reader.Entries\n                            where isTxtFile(entry.FullName) || entry.FullName.ToLower().Equals(\"wadinfo\")\n                            let info = m_parseTextFile(entry.ReadString(Encoding.UTF7))\n                            orderby info.QualityScore descending\n                            select info;\n\n\n            var bestInfo = textInfos.Aggregate(IdGamesTextInfo.EMPTY, (a, b) => a.Combine(b));\n\n            if (!string.IsNullOrEmpty(bestInfo.Title))\n                gameFile.Title = bestInfo.Title;\n\n            if (!string.IsNullOrEmpty(bestInfo.Author))\n                gameFile.Author = bestInfo.Author;\n\n            if (bestInfo.ReleaseDate != null)\n                gameFile.ReleaseDate = bestInfo.ReleaseDate;\n\n            if (!string.IsNullOrEmpty(bestInfo.Description))\n                gameFile.Description = bestInfo.Description;\n\n            if (string.IsNullOrWhiteSpace(gameFile.Title))\n                gameFile.Title = GetUserFriendlyFilename(gameFile.FileNameNoPath);\n\n            return SyncResult.EMPTY;\n        }\n\n        private string GetUserFriendlyFilename(string filename)\n        {\n            var words = Path.GetFileNameWithoutExtension(filename).Replace(\"_\", \" \").Replace(\"-\", \" \").Split();\n            var capitalisedWords = words.Select(word => string.Concat(word[0].ToString().ToUpper(), word.Substring(1)));\n            return string.Join(\" \", capitalisedWords.ToArray());\n        }\n\n        private bool isTxtFile(string filename)\n        {\n            try\n            {\n                return Path.GetExtension(filename).Equals(\".txt\", StringComparison.OrdinalIgnoreCase);\n            }\n            catch (Exception)\n            {\n                return false; // Path.GetExtension is a bit of a stickler, but we just need yes or no.\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/TitlePicSyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing WadReader;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public class TitlePicSyncAction : ISyncAction\n    {\n        private const string DoomTitlepicName = \"TITLEPIC\";\n        private const string HereticHexenTitlepicName = \"TITLE\";\n        private static readonly Regex TitlePageRegex = new Regex(@\"titlepage\\s*=\\s*\"\"([^\"\"]*)\"\"\");\n        private readonly Palette m_doomPalette;\n        private readonly Palette m_hexenPalette;\n        private readonly Palette m_hereticPalette;\n        private readonly IDataSourceAdapter m_database;\n\n        public TitlePicSyncAction(IDataSourceAdapter database, Palette doomPalette, Palette hexenPalette, Palette hereticPalette)\n        {\n            m_doomPalette = doomPalette;\n            m_hexenPalette = hexenPalette;\n            m_hereticPalette = hereticPalette;\n            m_database = database;\n        }\n\n        public SyncResult ApplyToGameFile(IGameFile file, IArchiveReader reader, string[] mapInfoData)\n        {\n            string titlepicName = DoomTitlepicName;\n\n            if (GetTitlepicNameFromMapInfo(mapInfoData, out string newTitlepicName))\n                titlepicName = newTitlepicName;\n\n            Palette palette = null;\n            if (!TitlePicUtil.GetEntry(reader, titlepicName, out IArchiveEntry entry))\n            {\n                if (TitlePicUtil.GetEntry(reader, HereticHexenTitlepicName, out entry))\n                {\n                    var iwadFileName = m_database.GetIWads().FirstOrDefault(iw => iw.IWadID == file.IWadID)?.FileNameBase;\n\n                    if (iwadFileName != null && iwadFileName.Equals(\"hexen\", StringComparison.OrdinalIgnoreCase))\n                        palette = m_hexenPalette;\n                    else\n                        palette = m_hereticPalette;\n                }\n                else\n                {\n                    return SyncResult.EMPTY;\n                }\n            }\n\n            palette = palette ?? GetPaletteOrDefault(file, reader);\n\n            if (!TitlePicUtil.ConvertToImage(entry.ReadEntry(), palette, out Image image))\n            {\n                return SyncResult.FailedTitlePicFile(file);\n            }\n\n            return SyncResult.TitlePic(file, image);\n        }\n\n        private bool GetTitlepicNameFromMapInfo(string[] mapInfoData, out string newTitlepicName)\n        {\n            newTitlepicName = string.Empty;\n            foreach (string data in mapInfoData)\n            {\n                Match match = TitlePageRegex.Match(data);\n                if (!match.Success)\n                    continue;\n\n                newTitlepicName = match.Groups[1].Value;\n                return true;\n\n            }\n\n            return false;\n        }\n\n        private Palette GetPaletteOrDefault(IGameFile gameFile, IArchiveReader reader)\n        {\n            if (!TitlePicUtil.FindPalette(reader, out IArchiveEntry paletteEntry))\n            {\n                return m_doomPalette;\n            }\n\n            Palette palette = Palette.From(paletteEntry.ReadEntry());\n            if (palette != null)\n                return palette;\n\n            return m_doomPalette;\n        }\n    }\n}"
  },
  {
    "path": "DoomLauncher/Handlers/Sync/TitlePicUtil.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing WadReader;\n\nnamespace DoomLauncher.Handlers.Sync\n{\n    public static class TitlePicUtil\n    {\n        public static bool FindPalette(IArchiveReader archive, out IArchiveEntry entry) =>\n            GetEntry(archive, \"PLAYPAL\", out entry);\n\n        public static bool GetEntry(IArchiveReader archive, string name, out IArchiveEntry entry)\n        {\n            try\n            { \n                if (archive.EntriesHaveExtensions)\n                    entry = archive.Entries.FirstOrDefault(x => Path.GetFileNameWithoutExtension(x.Name).Equals(name, StringComparison.OrdinalIgnoreCase));\n                else\n                    entry = archive.Entries.FirstOrDefault(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase));\n            }\n            catch (Exception)\n            {\n                entry = null;\n                return false;\n            }\n            return entry != null;\n        }\n\n        public static bool ConvertToImage(byte[] data, Palette palette, out Image image)\n        {\n            try\n            {\n                if (IsPng(data) || IsJpg(data) || IsBmp(data))\n                {\n                    image = new Bitmap(new MemoryStream(data), true);\n                    return true;\n                }\n\n                DoomImage doomImage;\n                if (PaletteReaders.LikelyFlat(data))\n                    doomImage = PaletteReaders.ReadFlat(data);\n                else\n                    doomImage = PaletteReaders.ReadColumn(data);\n\n                if (palette != null && doomImage != null)\n                    doomImage = doomImage.PaletteToArgb(palette);\n\n                image = doomImage?.Bitmap;\n                return image != null;\n            }\n            catch\n            {\n                image = null;\n                return false;\n            }\n        }\n\n        private static bool IsPng(byte[] data)\n        {\n            return data.Length > 8 && data[0] == 137 && data[1] == 'P' && data[2] == 'N' && data[3] == 'G';\n        }\n\n        private static bool IsJpg(byte[] data)\n        {\n            return data.Length > 10 && data[0] == 0xFF && data[1] == 0xD8;\n        }\n\n        private static bool IsBmp(byte[] data)\n        {\n            return data.Length > 14 && data[0] == 'B' && data[1] == 'M';\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/SyncFileData.cs",
    "content": "﻿namespace DoomLauncher\n{\n    class SyncFileData\n    {\n        public SyncFileData(string filename)\n        {\n            FileName = filename;\n        }\n\n        public string FileName { get; set; }\n        public bool Selected { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/SyncFileOption.cs",
    "content": "﻿namespace DoomLauncher\n{\n    enum SyncFileOption\n    {\n        None,\n        Add,\n        Delete\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/SyncLibraryHandler.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing DoomLauncher.Handlers.Sync;\nusing DoomLauncher.Archive;\nusing DoomLauncher.Config;\n\nnamespace DoomLauncher\n{\n    public class SyncLibraryHandler\n    {\n        public delegate void SyncProgressHandler(SyncProgressEvent e);\n        public event SyncProgressHandler SyncFileChanged;\n\n        public delegate void GameFileDataNeededHandler(GameFileDataNeededEvent e);\n        public event GameFileDataNeededHandler GameFileDataNeeded;\n\n        private readonly IGameFileDataSourceAdapter m_dbDataSource;\n        private readonly IGameFileDataSourceAdapter m_syncDataSource;\n        private readonly FileManagement m_fileManagement;\n        private readonly List<ISyncAction> m_syncActions;\n        private readonly IDirectoriesConfiguration m_directories;\n\n        public SyncLibraryHandler(IGameFileDataSourceAdapter dbDataSource, IGameFileDataSourceAdapter syncDataSource,\n            IDirectoriesConfiguration directories, FileManagement fileManagement, List<ISyncAction> syncActions)\n        {\n            m_dbDataSource = dbDataSource;\n            m_syncDataSource = syncDataSource;\n            m_syncActions = syncActions;\n            m_fileManagement = fileManagement;\n            m_directories = directories;\n        }\n\n        public SyncResult SyncManyFiles(string[] files)\n        {\n            int syncFileCurrent = 0;\n            SyncResult result = SyncResult.EMPTY;\n\n            foreach (string fileName in files)\n            {\n                SyncFileChanged?.Invoke(new SyncProgressEvent(fileName, syncFileCurrent, files.Length));\n                result += SyncFile(fileName);\n                syncFileCurrent++;\n            }\n\n            return result;\n        }\n\n        public SyncResult SyncFile(string fileName)\n        {\n            SyncResult resultSoFar = PrepareGameFileForUpdate(fileName, out var existingFile, out var fileToUpdate);\n            if (resultSoFar.Failed)\n                return resultSoFar;\n\n            GameFileDataNeeded?.Invoke(new GameFileDataNeededEvent(fileToUpdate));\n\n            try\n            {\n                using (IArchiveReader reader = new RecursiveArchiveReader(CreateRootArchiveReader(fileToUpdate), CreateBranchArchiveReader))\n                {\n                    resultSoFar += PopulateGameFileFromArchive(fileToUpdate, reader);\n                }\n            }\n            catch (IOException)\n            {\n                fileToUpdate.Map = string.Empty;\n                resultSoFar += SyncResult.InvalidFile(fileName, \"File is in use/Not found\");\n            }\n            catch (InvalidDataException)\n            {\n                fileToUpdate.Map = string.Empty;\n                resultSoFar += SyncResult.InvalidFile(fileName, \"Zip archive invalid or contained an improper pk3\");\n            }\n            catch (Exception ex)\n            {\n                fileToUpdate.Map = string.Empty;\n                var errorMsg = string.Concat(\"Unexpected exception - \", ex.Message, ex.StackTrace);\n                resultSoFar += SyncResult.InvalidFile(fileName, errorMsg);\n            }\n\n            resultSoFar += Upsert(existingFile, fileToUpdate);\n\n            return resultSoFar;\n        }\n\n        private SyncResult PrepareGameFileForUpdate(string fileName, out IGameFile existingFile, out IGameFile fileToUpdate)\n        {\n            var resultSoFar = SyncResult.EMPTY;\n\n            fileToUpdate = m_syncDataSource.GetGameFile(fileName);\n            existingFile = m_dbDataSource.GetGameFile(fileName);\n\n            // If we've already got a copy in the DB, modify that one\n            if (existingFile != null)\n                fileToUpdate = existingFile;\n\n            if (fileToUpdate == null)\n            {\n                // Delete the file from managed storage\n                try\n                {\n                    FileInfo fileDelete = new FileInfo(Path.Combine(m_directories.GameFileDirectory.GetFullPath(), fileName));\n                    if (fileDelete.Exists)\n                        fileDelete.Delete();\n                }\n                catch\n                {\n                    //delete failed, just keep going\n                }\n                return SyncResult.InvalidFile(fileName, \"Not found\");\n            }\n\n            if (m_fileManagement == FileManagement.Unmanaged)\n                fileToUpdate.FileName = LauncherPath.GetRelativePath(fileName);\n\n            fileToUpdate.Downloaded = existingFile == null ? DateTime.Now : existingFile.Downloaded;\n\n            return SyncResult.EMPTY;\n        }\n\n        private SyncResult Upsert(IGameFile existingFile, IGameFile fileToUpdate)\n        {\n            if (existingFile == null)\n            {\n                m_dbDataSource.InsertGameFile(fileToUpdate);\n\n                IGameFile gameFile = m_dbDataSource.GetGameFile(fileToUpdate.FileName);\n                return (gameFile != null) ? SyncResult.AddedGameFile(gameFile) : SyncResult.EMPTY;\n            }\n            else\n            {\n                m_dbDataSource.UpdateGameFile(fileToUpdate, Util.DefaultGameFileUpdateFields);\n                return SyncResult.UpdatedGameFile(fileToUpdate);\n            }\n        }\n\n        private SyncResult PopulateGameFileFromArchive(IGameFile gameFile, IArchiveReader reader)\n        {\n            string[] mapInfoData = MapInfoUtil.GetMapInfoData(reader);\n            var syncResults = m_syncActions.Select(frag => frag.ApplyToGameFile(gameFile, reader, mapInfoData));\n            return syncResults.Aggregate(SyncResult.EMPTY, (a, b) => a + b);\n        }\n\n        private IArchiveReader CreateRootArchiveReader(IGameFile file)\n        {\n            if (m_fileManagement == FileManagement.Unmanaged)\n                return ArchiveReader.Create(new LauncherPath(file.FileName).GetFullPath());\n\n            return ArchiveReader.Create(Path.Combine(m_directories.GameFileDirectory.GetFullPath(), file.FileName));\n        }\n\n        private IArchiveReader CreateBranchArchiveReader(IArchiveEntry entry)\n        {\n            if (IsRecursiveEntry(entry))\n            {\n                string extractedFile = Util.ExtractTempFile(m_directories.TempDirectory.GetFullPath(), entry);\n                return ArchiveReader.Create(extractedFile);\n            }\n            else\n            {\n                return null;\n            }\n        }\n\n        private bool IsRecursiveEntry(IArchiveEntry entry)\n        {\n            List<string> recursiveExtensions = new List<string>(Util.GetReadablePkExtensions()).Append(\".wad\").ToList();\n            return entry.Name.Contains('.') && recursiveExtensions.Exists(ext => ext.Equals(Path.GetExtension(entry.Name), StringComparison.OrdinalIgnoreCase));\n        }\n\n        public class SyncProgressEvent\n        {\n            public string CurrentSyncFileName { get; }\n            public int SyncFileCurrent { get; }\n            public int SyncFileCount { get; }\n\n            public SyncProgressEvent(string currentSyncFileName, int syncFileCurrent, int syncFileCount)\n            {\n                CurrentSyncFileName = currentSyncFileName;\n                SyncFileCurrent = syncFileCurrent;\n                SyncFileCount = syncFileCount;\n            }\n        }\n\n        public class GameFileDataNeededEvent\n        {\n            public IGameFile CurrentGameFile { get; }\n\n            public GameFileDataNeededEvent(IGameFile currentGameFile)\n            {\n                CurrentGameFile = currentGameFile;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/TabHandler.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    class TabHandler\n    {\n        private readonly Dictionary<IGameFileView, TabItem> m_tabLookup = new Dictionary<IGameFileView, TabItem>();\n        private readonly List<ITabView> m_tabs = new List<ITabView>();\n\n        private class TabItem\n        {\n            public ITabView TabView { get; set; }\n            public TabPage TabPage { get; set; }\n        }\n\n        public TabHandler(CTabControl tabControl)\n        {            \n            TabControl = tabControl;\n        }\n\n        public void SetTabs(IEnumerable<ITabView> tabs)\n        {\n            m_tabLookup.Clear();\n\n            foreach (ITabView tab in tabs)\n                AddTab(tab);\n        }\n\n        private TabPage CreateTabPage(ITabView tab)\n        {\n            TabPage page = new TabPage(tab.Title);\n            page.Name = tab.Key.ToString();\n\n            if (tab is Control ctrl)\n            {\n                page.Controls.Add(ctrl);\n                ctrl.Dock = DockStyle.Fill;\n            }\n\n            return page;\n        }\n\n        public void AddTab(ITabView tab)\n        {\n            TabPage page = CreateTabPage(tab);\n\n            m_tabLookup.Add(tab.GameFileViewControl, new TabItem { TabView = tab, TabPage = page });\n            m_tabs.Add(tab);\n\n            TabControl.TabPages.Add(page);\n        }\n\n        public void InsertTab(int index, ITabView tab)\n        {\n            TabPage page = CreateTabPage(tab);\n            TabControl.TabPages.Insert(index, page);\n\n            m_tabLookup.Add(tab.GameFileViewControl, new TabItem { TabView = tab, TabPage = page });\n            m_tabs.Insert(index, tab);\n        }\n\n        public void RemoveTab(ITabView tab)\n        {\n            if (m_tabLookup.ContainsKey(tab.GameFileViewControl))\n            {\n                TabItem item = m_tabLookup[tab.GameFileViewControl];\n\n                m_tabLookup.Remove(tab.GameFileViewControl);\n                m_tabs.Remove(item.TabView);\n\n                TabControl.TabPages.Remove(item.TabPage);\n            }\n        }\n\n        public int GetTabIndex(ITabView tab)\n        {\n            int index = 0;\n            foreach (var item in m_tabLookup.Values)\n            {\n                if (item.TabView == tab)\n                    return index;\n                index++;\n            }\n\n            return -1;\n        }\n\n        public void SetTabIndex(int index, ITabView tab)\n        {\n            if (m_tabLookup.ContainsKey(tab.GameFileViewControl))\n            {\n                TabItem item = m_tabLookup[tab.GameFileViewControl];\n                TabControl.TabPages.Remove(item.TabPage);\n\n                if (index < TabControl.TabPages.Count)\n                    TabControl.TabPages.Insert(index, item.TabPage);\n                else\n                    TabControl.TabPages.Add(item.TabPage);\n            }\n        }\n\n        public void UpdateTabTitle(ITabView tab, string text)\n        {\n            tab.Title = text;\n\n            if (m_tabLookup.ContainsKey(tab.GameFileViewControl))\n            {\n                TabItem item = m_tabLookup[tab.GameFileViewControl];\n                item.TabPage.Text = text;\n            }\n        }\n\n        public ITabView TabViewForControl(IGameFileView ctrl)\n        {\n            if (m_tabLookup.ContainsKey(ctrl))\n                return m_tabLookup[ctrl].TabView;\n\n            return null;\n        }\n\n        public ITabView TabViewForTag(ITagData tag)\n        {\n            foreach (var item in m_tabLookup)\n            {\n                if (item.Value.TabView is TagTabView tagTabView && tagTabView.TagDataSource.TagID == tag.TagID)\n                    return item.Value.TabView;\n            }\n\n            return null;\n        }\n\n        public bool SelectTabView(ITabView view)\n        {\n            foreach (var item in m_tabLookup)\n            {\n                if (item.Value.TabView == view)\n                {\n                    TabControl.SelectedTab = item.Value.TabPage;\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        public void SelectTabFromKey(string key)\n        {\n            foreach (var item in m_tabLookup)\n            {\n                if (item.Value.TabView.Key.Equals(key))\n                {\n                    TabControl.SelectedTab = item.Value.TabPage;\n                    break;\n                }\n            }\n        }\n\n        public CTabControl TabControl { get; private set; }\n        public ITabView[] TabViews\n        {\n            get { return m_tabs.ToArray(); }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/TabKeys.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public static class TabKeys\n    {\n        public static readonly string RecentKey = \"Recent\";\n        public static readonly string LocalKey = \"Local\";\n        public static readonly string IWadsKey = \"IWads\";\n        public static readonly string IdGamesKey = \"Id Games\";\n        public static readonly string UntaggedKey = \"Untagged\";\n\n        public static string[] KeyNames => new string[] { RecentKey, LocalKey, UntaggedKey, IWadsKey, IdGamesKey };\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/ThumbnailManager.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public static class ThumbnailManager\n    {\n        public static List<IGameFile> IWads = new List<IGameFile>();\n        public static readonly Dictionary<int, IFileData> IWadTileImages = new Dictionary<int, IFileData>();\n\n        public static void SetIWads(List<IGameFile> iwads)\n        {\n            IWads = iwads;\n            IWadTileImages.Clear();\n\n            foreach (var iwad in iwads)\n            {\n                if (!iwad.IWadID.HasValue || !IWadInfo.TryGetIWadInfo(iwad.FileName, out var iwadInfo) || \n                    string.IsNullOrEmpty(iwadInfo.TileImage) || !File.Exists(iwadInfo.TileImage))\n                    continue;\n\n                IWadTileImages[iwad.IWadID.Value] = new FileData()\n                {\n                    GameFileID = iwad.GameFileID.Value,\n                    FileName = iwadInfo.TileImage,\n                    FileTypeID = FileType.TileImage,\n                    SourcePortID = 0\n                };  \n            }\n        }\n\n        public static void UpdateThumbnail(IGameFile gameFile)\n        {\n            bool delete = false;\n            var screenshot = DataCache.Instance.DataSourceAdapter.GetFiles(gameFile, FileType.Screenshot).FirstOrDefault();\n            var thumbnail = DataCache.Instance.DataSourceAdapter.GetFiles(gameFile, FileType.Thumbnail).FirstOrDefault();\n\n            // All screenshots for this game file were deleted\n            if (thumbnail != null && screenshot == null)\n                delete = true;\n            // The first screenshot was changed\n            if (thumbnail != null && screenshot != null && thumbnail.SourcePortID != screenshot.FileID)\n                delete = true;\n\n            if (delete)\n            {\n                string file = Path.Combine(DataCache.Instance.AppConfiguration.ThumbnailDirectory.GetFullPath(), thumbnail.FileName);\n                try\n                {\n                    if (File.Exists(file))\n                        File.Delete(file);\n                }\n                catch (IOException)\n                {\n                    // File is in use, insert to delete on next startup\n                    DataCache.Instance.DataSourceAdapter.InsertCleanupFile(new CleanupFile() { FileName = file });\n                }\n\n                DataCache.Instance.DataSourceAdapter.DeleteFile(thumbnail);\n            }\n\n            GetOrCreateThumbnail(gameFile);\n        }\n\n        // Returns or creates a new thumbnail and inserts into database if it doesn't exist\n        // Will search screenshots and thumbnails if provided, otherwise will check from database\n        public static IFileData GetOrCreateThumbnail(IGameFile gameFile, IEnumerable<IFileData> screenshots = null, IEnumerable<IFileData> thumbnails = null,\n            bool checkIWad = true)\n        {\n            if (thumbnails == null)\n                thumbnails = DataCache.Instance.DataSourceAdapter.GetFiles(gameFile, FileType.Thumbnail);\n\n            var thumbnail = thumbnails.FirstOrDefault(x => x.GameFileID == gameFile.GameFileID.Value);\n\n            if (thumbnail != null)\n                return thumbnail;\n\n            if (screenshots == null)\n                screenshots = DataCache.Instance.DataSourceAdapter.GetFiles(gameFile, FileType.Screenshot);\n\n            var screenshot = screenshots.FirstOrDefault(x => x.GameFileID == gameFile.GameFileID.Value);\n            if (screenshot != null)\n            {\n                if (!TryCreateThumbnail(screenshot, out var thumbnailFile))\n                    return null;\n\n                // Store the FileID of the screenshot in SourcePortID so we can use it to keep track of screenshot re-ordering / deletes\n                FileData fileData = new FileData()\n                {\n                    GameFileID = gameFile.GameFileID.Value,\n                    FileName = thumbnailFile,\n                    FileTypeID = FileType.Thumbnail,\n                    SourcePortID = screenshot.FileID.Value\n                };\n\n                DataCache.Instance.DataSourceAdapter.InsertFile(fileData);\n                return fileData;\n            }\n\n            if (checkIWad && gameFile.IWadID.HasValue)\n            {\n                var iwad = IWads.FirstOrDefault(x => x.IWadID == gameFile.IWadID.Value);\n                if (iwad == null)\n                    return null;\n\n                if (iwad.GameFileID.HasValue && iwad.GameFileID == gameFile.GameFileID)\n                {                    \n                    var iwadThumbnail = GetOrCreateThumbnail(iwad, checkIWad: false);\n                    if (iwadThumbnail != null)\n                        return iwadThumbnail;\n                }\n\n                if (IWadTileImages.TryGetValue(gameFile.IWadID.Value, out var fileData))\n                    return fileData;          \n            }\n\n            return null;\n        }\n\n        private static bool TryCreateThumbnail(IFileData screenshot, out string filename)\n        {\n            filename = string.Empty;\n            try\n            {\n                var config = DataCache.Instance.AppConfiguration;\n                string file = Path.Combine(config.ScreenshotDirectory.GetFullPath(), screenshot.FileName);\n                if (!File.Exists(file))\n                    return false;\n\n                const int ThumbnailSize = 300;\n                using (Image image = Image.FromFile(file))\n                {\n                    using (Image thumb = image.FixedSize(ThumbnailSize, GameFileTile.GetImageHeight(ThumbnailSize), Color.Black))\n                    {\n                        filename = Guid.NewGuid().ToString() + \".png\";\n                        thumb.Save(Path.Combine(config.ThumbnailDirectory.GetFullPath(), filename), ImageFormat.Png);\n                        return true;\n                    }\n                }\n            }\n            catch\n            {\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/ToolTipDisplayHandler.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Drawing;\nusing System.Timers;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    enum ToolTipState\n    {\n        Waiting,\n        BeforeShow,\n        Showing\n    }\n\n    class ToolTipDisplayHandler\n    {\n        private readonly System.Timers.Timer m_toolTipTimer;\n        private readonly ToolTip m_toolTip;\n        private readonly MainForm m_form;\n        private IGameFile m_gameFile;\n        private Point m_showPoint = new Point();\n        private Point m_lastPollPoint = new Point();\n        private ToolTipState m_state = ToolTipState.Waiting;\n\n        private const int TimerDelay = 500;\n        private const int Range = 16;\n\n        public ToolTipDisplayHandler(MainForm form)\n        {\n            m_form = form;\n            m_toolTip = new ToolTip();\n            m_toolTip.BackColor = ColorTheme.Current.TextBoxBackground;\n            m_toolTip.ForeColor = ColorTheme.Current.Text;\n            m_toolTip.OwnerDraw = true;\n            m_toolTip.Draw += ToolTip_Draw;\n\n            m_toolTipTimer = new System.Timers.Timer(TimerDelay);\n            m_toolTipTimer.Elapsed += ToolTipTimer_Elapsed;\n        }\n\n        public void RegisterView(IGameFileView view)\n        {\n            view.GameFileEnter += View_GameFileEnter;\n            view.GameFileLeave += View_GameFileLeave;\n            view.SelectionChange += View_SelectionChange;\n            view.ItemClick += View_ItemClick;\n        }\n\n        private void View_ItemClick(object sender, EventArgs e)\n        {\n            ResetToolTipAndClear();\n        }\n\n        private void View_SelectionChange(object sender, EventArgs e)\n        {\n            if (m_state == ToolTipState.Showing)\n                ResetToolTipAndClear();\n        }\n\n        private void ToolTipTimer_Elapsed(object sender, ElapsedEventArgs e)\n        {\n            m_lastPollPoint = GetMouseLocation();\n\n            if (m_state == ToolTipState.Showing)\n            {\n                if (!MouseMoveInRange(m_showPoint))\n                    ResetToolTipAndClear();\n            }\n            else if (m_state == ToolTipState.Waiting)\n            {\n                if (MouseMoveInRange(m_lastPollPoint) && m_form.ShouldShowToolTip && m_form.InvokeRequired)\n                    m_form.Invoke(new Action(ShowToolTip));\n            }\n        }\n\n        private void ShowToolTip()\n        {\n            if (m_gameFile == null)\n                return;\n\n            if (!DataCache.Instance.AppConfiguration.ShowTooltip)\n                return;\n\n            ToolTipHandler toolTipHandler = new ToolTipHandler();\n            m_showPoint = GetMouseLocation();\n            m_toolTip.Show(toolTipHandler.GetToolTipText(m_form.Font, m_gameFile), m_form, m_showPoint.X, m_showPoint.Y, 32767);\n            m_state = ToolTipState.Showing;\n        }\n\n        private Point GetMouseLocation()\n        {\n            return new Point(Cursor.Position.X - m_form.Location.X + 1, Cursor.Position.Y - m_form.Location.Y + 16);\n        }\n\n        private void View_GameFileEnter(object sender, GameFileEventArgs e)\n        {\n            if (m_gameFile != e.GameFile)\n            {\n                m_toolTip.Hide(m_form);\n                m_gameFile = e.GameFile;\n                m_toolTipTimer.Interval = TimerDelay;\n                m_toolTipTimer.Start();\n                m_state = ToolTipState.Waiting;\n            }\n        }\n\n        private void View_GameFileLeave(object sender, GameFileEventArgs e)\n        {\n            ResetToolTipAndClear();\n            m_gameFile = null;\n        }\n\n        private void ResetToolTipAndClear()\n        {\n            if (m_form.InvokeRequired)\n            {\n                m_form.Invoke(new Action(ResetToolTipAndClear));\n            }\n            else\n            {\n                m_toolTip.Hide(m_form);\n                m_state = ToolTipState.BeforeShow;\n                m_gameFile = null;\n                m_showPoint = new Point();\n            }\n        }\n\n        private bool MouseMoveInRange(in Point pt)\n        {\n            Rectangle rect = new Rectangle(pt, new Size(Range, Range));\n            rect.Offset(-Range / 2, -Range / 2);\n\n            return rect.Contains(GetMouseLocation());\n        }\n\n        private void ToolTip_Draw(object sender, DrawToolTipEventArgs e)\n        {\n            e.DrawBackground();\n            e.DrawBorder();\n            e.DrawText(TextFormatFlags.WordBreak);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/ToolTipGroup.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Handlers\n{\n    public class ToolTipGroup\n    {\n\n        private readonly List<(ToolTip, Control)> m_toolTips = new List<(ToolTip, Control)>();\n\n        public void SetToolTip(Control control, string caption)\n        {\n            var tooltip = new ToolTip();\n            tooltip.SetToolTip(control,  \" \" + caption);\n            tooltip.BackColor = ColorTheme.Current.TextBoxBackground;\n            tooltip.ForeColor = ColorTheme.Current.Text;\n            tooltip.OwnerDraw = true;\n            tooltip.Draw += ToolTip_Draw;\n            tooltip.Popup += ToolTip_Popup;\n            m_toolTips.Add((tooltip, control));\n        }\n\n        private void ToolTip_Popup(object sender, PopupEventArgs e)\n        {\n            foreach (var item in m_toolTips)\n            {\n                if (ReferenceEquals(sender, item.Item1))\n                    continue;\n\n                item.Item1.Hide(item.Item2);\n            }\n        }\n\n        private static void ToolTip_Draw(object sender, DrawToolTipEventArgs e)\n        {\n            e.DrawBackground();\n            e.DrawBorder();\n            e.DrawText(TextFormatFlags.WordBreak);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/ToolTipHandler.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Drawing;\nusing System.Text;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    class ToolTipHandler\n    {\n        public string GetToolTipText(Font font, IGameFile item)\n        {\n            StringBuilder sb = new StringBuilder();\n\n            if (!string.IsNullOrEmpty(item.FileName))\n            {\n                sb.Append(\"File: \");\n                sb.Append(item.FileName);\n\n                sb.Append(Environment.NewLine);\n                sb.Append(Environment.NewLine);\n            }\n\n            sb.Append(\"Title: \");\n            if (item.Title != null)\n                sb.Append(item.Title);\n\n            sb.Append(Environment.NewLine);\n            sb.Append(Environment.NewLine);\n\n            sb.Append(\"Author: \");\n            if (item.Author != null)\n                sb.Append(item.Author);\n\n            sb.Append(Environment.NewLine);\n            sb.Append(Environment.NewLine);\n\n            sb.Append(\"Release Date: \");\n            if (item.ReleaseDate.HasValue)\n                sb.Append(item.ReleaseDate.Value.ToShortDateString());\n            else\n                sb.Append(\"N/A\");\n\n            sb.Append(Environment.NewLine);\n            sb.Append(Environment.NewLine);\n\n            int maxWidth = 800, maxLines = 26, lineCount = 0;\n\n            try\n            {\n                sb.Append(\"Description: \");\n                sb.Append(FormatDescritionToWidth(font, item.Description, maxWidth, maxLines, out lineCount));\n                maxLines -= lineCount;\n            }\n            catch\n            {\n                sb.Append(item.Description);\n            }\n\n            if (!string.IsNullOrEmpty(item.Comments) && maxLines > 0)\n            {\n                sb.Append(Environment.NewLine);\n                sb.Append(Environment.NewLine);\n\n                try\n                {\n                    sb.Append(\"Comments: \");\n                    sb.Append(FormatDescritionToWidth(font, item.Comments, maxWidth, maxLines, out lineCount));\n                }\n                catch\n                {\n                    sb.Append(item.Comments);\n                }\n            }\n\n            return sb.ToString();\n        }\n\n        private string FormatDescritionToWidth(Font font, string description, int maxWidth, int maxLines, out int lineCount)\n        {\n            string[] lines = description.Split(new char[] { '\\n' });\n            StringBuilder sb = new StringBuilder();\n            lineCount = 0;\n\n            foreach (string line in lines)\n            {\n                if (string.IsNullOrEmpty(line))\n                {\n                    lineCount++;\n                    sb.Append(Environment.NewLine);\n                    continue;\n                }\n\n                string formatLine = line;\n                int width = 0;\n                \n                if (!string.IsNullOrEmpty(formatLine))\n                    width = TextRenderer.MeasureText(formatLine, font).Width;\n\n                while (width > maxWidth)\n                {\n                    string sub = TruncateLine(font, formatLine, maxWidth);\n                    sb.Append(sub.TrimStart());\n                    sb.Append(Environment.NewLine);\n                    if (++lineCount > maxLines) break;\n                    formatLine = formatLine.Replace(sub, string.Empty);\n                    width = TextRenderer.MeasureText(formatLine, font).Width;\n                }\n\n                if (lineCount < maxLines)\n                {\n                    sb.Append(formatLine.TrimStart());\n                    sb.Append(Environment.NewLine);\n                }\n\n                if (++lineCount > maxLines) break;\n            }\n\n            string ret = sb.Replace(\"\\r\", string.Empty).ToString();\n\n            if (ret.Length > 1)\n            {\n                while (ret.Contains(\"\\n\\n\\n\"))\n                    ret = ret.Replace(\"\\n\\n\\n\", \"\\n\\n\");\n                while (ret.Length > 1 && ret[ret.Length - 1] == '\\n')\n                    ret = ret.Substring(0, ret.Length - 1);\n            }\n            \n            return ret;\n        }\n\n        private string TruncateLine(Font font, string line, int maxWidth)\n        {\n            for (int i = 1; i < line.Length; i++)\n            {\n                int test = TextRenderer.MeasureText(line.Substring(0, i), font).Width;\n\n                if (test > maxWidth)\n                {\n                    while (i > 0 && line[i] != ' ') i--;\n                    if (i == 0) return line.Substring(0, i);\n                    return line.Substring(0, i);\n                }\n            }\n\n            return line;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/Util.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Data;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Windows.Forms;\nusing WadReader;\n\nnamespace DoomLauncher\n{\n    public static class Util\n    {\n        public static IEnumerable<object> TableToStructure(DataTable dt, Type type)\n        {\n            List<object> ret = new List<object>();\n            object convertedObj;\n            PropertyInfo[] properties = type.GetProperties().Where(x => x.GetSetMethod() != null && x.GetGetMethod() != null).ToArray();\n\n            foreach (DataRow dr in dt.Rows)\n            {\n                object obj = Activator.CreateInstance(type);\n\n                foreach (PropertyInfo pi in properties)\n                {\n                    Type pType = pi.PropertyType;\n\n                    if (pType.IsGenericType && pType.GetGenericTypeDefinition() == typeof(Nullable<>))\n                        pType = pType.GetGenericArguments()[0];\n\n                    if (dt.Columns.Contains(pi.Name) && ChangeType(dr[pi.Name].ToString(), pType, out convertedObj))\n                        pi.SetValue(obj, convertedObj, null);\n                }\n\n                ret.Add(obj);\n            }\n\n            return ret;\n        }\n\n        public static bool ChangeType(string obj, Type t, out object convertedObj)\n        {\n            convertedObj = null;\n            if (obj == null) return false;\n\n            if (obj.GetType() == typeof(string) && t == typeof(string))\n            {\n                convertedObj = obj;\n                return true;\n            }\n            else if (obj.GetType() == typeof(string) && t == typeof(bool) &&\n                (obj == \"0\" || obj == \"1\"))\n            {\n                if (obj == \"0\")\n                    convertedObj = false;\n                else\n                    convertedObj = true;\n                return true;\n            }\n            else if (t.BaseType == typeof(Enum))\n            {\n                convertedObj = Convert.ToInt32(obj);\n                return true;\n            }\n\n            MethodInfo method = t.GetMethod(\"TryParse\", new[] { typeof(string), Type.GetType(string.Format(\"{0}&\", t.FullName)) });\n\n            if (method != null)\n            {\n                object[] args = new object[] { obj, convertedObj };\n\n                if ((bool)method.Invoke(null, args))\n                {\n                    convertedObj = args[1];\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        public static List<string> GetMapStringFromWad(string file)\n        {\n            List<string> maps = new List<string>();\n\n            try\n            {\n                FileStream fs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);\n                WadFileReader wadReader = new WadFileReader(fs);\n\n                if (wadReader.WadType != WadType.Unknown)\n                {\n                    var mapLumps = WadFileReader.GetMapMarkerLumps(wadReader.ReadLumps()).OrderBy(x => x.Name).ToArray();\n                    fs.Close();\n\n                    foreach (var mapLump in mapLumps)\n                        maps.Add(mapLump.Name);\n                }\n                else\n                {\n                    fs.Close();\n                }\n            }\n            catch (Exception ex)\n            {\n                DisplayUnexpectedException(null, ex);\n            }\n\n            return maps;\n        }\n\n        public static void DisplayUnexpectedException(Form form, Exception ex)\n        {\n#if DEBUG\n            throw ex;\n#else\n            if (form == null)\n            {\n                DisplayException(form, ex);\n                return;\n            }\n            if (form.InvokeRequired)\n                form.Invoke(new Action<Form, Exception>(DisplayUnexpectedException), form, ex);\n            else\n                DisplayException(form, ex);\n#endif\n        }\n\n        private static void DisplayException(Form form, Exception ex)\n        {\n            if (form != null && form.InvokeRequired)\n            {\n                form.Invoke(new Action<Form, Exception>(DisplayException), new object[] { form, ex });\n            }\n            else\n            {\n                TextBoxForm txt = new TextBoxForm();\n                txt.Title = \"Unexpected Error\";\n                txt.HeaderText = \"An unexpected error occurred. Please submit the error report by clicking the link below. The report has been copied to your clipboard.\" + Environment.NewLine;\n                txt.DisplayText = ex.ToString();\n                txt.SetLink(\"Click here to submit\", GitHubRepository);\n                Clipboard.SetText(txt.DisplayText);\n\n                if (form == null)\n                {\n                    txt.ShowDialog();\n                }\n                else\n                {\n                    txt.StartPosition = FormStartPosition.CenterParent;\n                    txt.ShowDialog(form);\n                }\n            }\n        }\n\n        public static string GitHubRepository => $\"https://github.com/{GitHubUser}/{GitHubRepositoryName}\";\n\n        public static string GitHubUser => \"nstlaurent\";\n\n        public static string GitHubRepositoryName => \"DoomLauncher\";\n\n        public static string DoomworldThread => \"http://www.doomworld.com/vb/doom-general/69346-doom-launcher-doom-frontend-database/\";\n\n        public static string Realm667Thread => \"http://realm667.com/index.php/en/kunena/doom-launcher\";\n\n        public static void SetDefaultSearchFields(SearchControl ctrlSearch)\n        {\n            string[] filters = new string[]\n            {\n                \"Title\",\n                \"Author\",\n                \"Filename\",\n                \"Description\",\n            };\n\n            ctrlSearch.SetSearchFilters(filters);\n            ctrlSearch.SetSearchFilter(filters[0], true);\n            ctrlSearch.SetSearchFilter(filters[1], true);\n            ctrlSearch.SetSearchFilter(filters[2], true);\n        }\n\n        public static GameFileSearchField[] SearchFieldsFromSearchCtrl(SearchControl ctrlSearch)\n        {\n            string[] items = ctrlSearch.GetSelectedSearchFilters();\n            List<GameFileSearchField> ret = new List<GameFileSearchField>();\n            GameFileFieldType type;\n\n            foreach (string item in items)\n            {\n                if (Enum.TryParse(item, out type))\n                {\n                    ret.Add(new GameFileSearchField(type, GameFileSearchOp.Like, ctrlSearch.SearchText));\n                }\n            }\n\n            return ret.ToArray();\n        }\n\n        public static List<ISourcePortData> GetSourcePortsData(IDataSourceAdapter adapter)\n        {\n            List<ISourcePortData> sourcePorts = adapter.GetSourcePorts().ToList();\n            SourcePortData noPort = new SourcePortData();\n            noPort.Name = \"N/A\";\n            noPort.SourcePortID = -1;\n            sourcePorts.Insert(0, noPort);\n            return sourcePorts;\n        }\n\n        public static string[] GetSkills()\n        {\n            return new string[] { \"1\", \"2\", \"3\", \"4\", \"5\" };\n        }\n\n        public static string GetTimePlayedString(int minutes)\n        {\n            List<string> items = new List<string>();\n\n            TimeSpan ts = new TimeSpan(0, minutes, 0);\n\n            if (ts.Days > 0)\n                items.Add(TimeString(ts.Days, \"Day\"));\n            if (ts.Hours > 0)\n                items.Add(TimeString(ts.Hours, \"Hour\"));\n\n            items.Add(TimeString(ts.Minutes, \"Minute\"));\n\n            return string.Join(\", \", items.ToArray());\n        }\n\n        private static string TimeString(int time, string type)\n        {\n            return string.Concat(time.ToString(), \" \",  type, time == 1 ? string.Empty : \"s\");\n        }\n\n        public static List<IGameFile> GetAdditionalFiles(IDataSourceAdapter adapter, IGameProfile gameFile)\n        {\n            if (gameFile != null && !string.IsNullOrEmpty(gameFile.SettingsFiles))\n                return GetAdditionalFiles(adapter, gameFile.SettingsFiles);\n\n            return new List<IGameFile>();\n        }\n\n        public static List<IGameFile> GetIWadAdditionalFiles(IDataSourceAdapter adapter, IGameProfile gameFile)\n        {\n            if (gameFile != null && !string.IsNullOrEmpty(gameFile.SettingsFilesIWAD))\n                return GetAdditionalFiles(adapter, gameFile.SettingsFilesIWAD);\n\n            return new List<IGameFile>();\n        }\n\n        public static List<IGameFile> GetSourcePortAdditionalFiles(IDataSourceAdapter adapter, IGameProfile gameFile)\n        {\n            if (gameFile != null && !string.IsNullOrEmpty(gameFile.SettingsFilesSourcePort))\n                return GetAdditionalFiles(adapter, gameFile.SettingsFilesSourcePort);\n\n            return new List<IGameFile>();\n        }\n\n        public static List<IGameFile> GetAdditionalFiles(IDataSourceAdapter adapter, ISourcePortData sourcePort)\n        {\n            return GetAdditionalFiles(adapter, sourcePort.SettingsFiles);\n        }\n\n        private static List<IGameFile> GetAdditionalFiles(IDataSourceAdapter adapter, string property)\n        {\n            string[] fileNames = Util.SplitString(property);\n            List<IGameFile> gameFiles = new List<IGameFile>();\n            Array.ForEach(fileNames, x => gameFiles.Add(adapter.GetGameFile(x)));\n            return gameFiles.Where(x => x != null).ToList();\n        }\n\n        [Conditional(\"DEBUG\")]\n        public static void ThrowDebugException(string msg)\n        {\n            throw new Exception(msg);\n        }\n\n        public static IEnumerable<IArchiveEntry> GetEntriesByExtension(IArchiveReader reader, string[] extensions)\n        {\n            List<IArchiveEntry> entries = new List<IArchiveEntry>();\n\n            foreach (var ext in extensions)\n            {\n                 entries.AddRange(reader.Entries\n                     .Where(x => x.Name.Contains('.') && Path.GetExtension(x.Name).Equals(ext, StringComparison.OrdinalIgnoreCase)));\n            }\n\n            return entries;\n        }\n\n        public static string[] GetPkExtenstions()\n        {\n            return new string[] { \".pk3\", \".ipk3\", \".pk7\", \".zip\" };\n        }\n\n        public static string[] GetReadablePkExtensions()\n        {\n            return new string[] { \".pk3\", \".ipk3\", \".pke\", \".zip\" };\n        }\n\n        public static string[] GetDehackedExtensions()\n        {\n            return new string[] { \".deh\", \".bex\" };\n        }\n\n        public static string[] GetSourcePortPkExtensions()\n        {\n            return new string[] { \".pk3\", \".ipk3\", \".pk7\", \".pke\"};\n        }\n\n        public static string[] GetExtraDoom64Extensions()\n        {\n            return new string[] { \".kpf\" };\n        }\n\n        public static GameFileFieldType[] DefaultGameFileUpdateFields\n        {\n            get\n            {\n                return new GameFileFieldType[]\n                {\n                    GameFileFieldType.Author,\n                    GameFileFieldType.Title,\n                    GameFileFieldType.Description,\n                    GameFileFieldType.Downloaded,\n                    GameFileFieldType.LastPlayed,\n                    GameFileFieldType.ReleaseDate,\n                    GameFileFieldType.Comments,\n                    GameFileFieldType.Rating,\n                    GameFileFieldType.Map,\n                    GameFileFieldType.MapCount,\n                    GameFileFieldType.IWadID\n                };\n            }\n        }\n\n        //Takes a file 'MAP01.wad' and makes it 'MAP01_GUID.wad'.\n        //Checks if file with prefix MAP01 exists with same file length and returns that file (same file).\n        //Otherwise a new file is extracted and returned.\n        public static string ExtractTempFile(string tempDirectory, IArchiveEntry entry)\n        {\n            // The file is a regular file and not an archive - return the FulName\n            if (!entry.ExtractRequired)\n                return entry.FullName;\n\n            string ext = Path.GetExtension(entry.Name);\n            string file = entry.Name.Replace(ext, string.Empty) + \"_\";\n            string[] searchFiles = Directory.GetFiles(tempDirectory, file + \"*\");\n\n            string matchingFile = searchFiles.FirstOrDefault(x => new FileInfo(x).Length == entry.Length);\n\n            if (matchingFile == null)\n            {\n                string extractFile = Path.Combine(tempDirectory, string.Concat(file, Guid.NewGuid().ToString(), ext));\n                entry.ExtractToFile(extractFile);\n                return extractFile;\n            }\n\n            return matchingFile;\n        }\n\n        public static List<IIWadData> GetIWadsDataSource(IDataSourceAdapter adapter)\n        {\n            List<IIWadData> iwads = adapter.GetIWads().ToList();\n            iwads.ForEach(x => x.FileName = Path.GetFileNameWithoutExtension(x.FileName));\n            return iwads;\n        }\n\n        public static string CleanDescription(string description)\n        {\n            string[] items = description.Split(new char[] { '\\n' });\n            StringBuilder sb = new StringBuilder();\n\n            foreach (string item in items)\n            {\n                string text = Regex.Replace(item, @\"\\s+\", \" \");\n                if (text.StartsWith(\" \"))\n                    text = text.Substring(1);\n                sb.Append(text);\n                sb.Append(Environment.NewLine);\n            }\n\n            return sb.ToString();\n        }\n\n        //returns the first position after the magicID is found, else returns -1\n        public static long ReadAfter(MemoryStream ms, byte[] magicID)\n        {\n            long position = ms.Position;\n            byte[] check = new byte[magicID.Length];\n\n            while (ms.Position + magicID.Length < ms.Length)\n            {\n                ms.Read(check, 0, check.Length);\n\n                if (magicID.SequenceEqual(check))\n                    return ms.Position;\n\n                ms.Position = ++position;\n            }\n\n            return -1;\n        }\n\n        public static int GetPreviewScreenshotWidth(int value)\n        {\n            if (value > 0)\n                return 200 + (40 * value);\n            else\n                return 200 + (10 * value);\n        }\n\n        public static string[] SplitString(string value)\n        {\n            if (!string.IsNullOrEmpty(value))\n                return value.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);\n            else\n                return new string[] { };\n        }\n\n        public static string GetExecutableNoPath() => AppDomain.CurrentDomain.FriendlyName;\n\n        public static string GetClippedEllipsesText(Graphics g, Font f, string text, SizeF layout)\n        {\n            int charactersFitted, linesFilled;\n            g.MeasureString(text, f, layout, StringFormat.GenericDefault, out charactersFitted, out linesFilled);\n\n            if (charactersFitted != text.Length && charactersFitted > 3)\n                return text.Substring(0, charactersFitted - 3) + \"...\";\n\n            return text.Substring(0, charactersFitted);\n        }\n\n        static public SizeF MeasureDisplayString(this Graphics graphics, string text, Font font)\n        {\n            if (text.Length == 0)\n                return new SizeF(0, 0);\n\n            StringFormat format = new StringFormat();\n            RectangleF rect = new RectangleF(0, 0, 1000, 1000);\n            CharacterRange[] ranges = { new CharacterRange(0, text.Length) };\n\n            format.SetMeasurableCharacterRanges(ranges);\n\n            Region[] regions = graphics.MeasureCharacterRanges(text, font, rect, format);\n            rect = regions[0].GetBounds(graphics);\n            rect.Inflate(2, 2);\n\n            return rect.Size;\n        }\n\n        [DllImport(\"user32.dll\")]\n        static extern IntPtr WindowFromPoint(WinPoint Point);\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct WinPoint\n        {\n            public int X;\n            public int Y;\n\n            public WinPoint(int x, int y)\n            {\n                X = x;\n                Y = y;\n            }\n        }\n\n        public static bool IsVisibleAtPoint(this Control control, Point windowPoint)\n        {\n            var hwnd = WindowFromPoint(new WinPoint(windowPoint.X, windowPoint.Y));\n            var other = Control.FromChildHandle(hwnd);\n            if (other == null)\n                return false;\n\n            if (control == other || control.Contains(other))\n                return true;\n\n            return false;\n        }\n\n        public static IEnumerable<T> GetChildElements<T>(this Control control) where T : class\n        {\n            foreach (Control subControl in control.Controls)\n            {\n                if (subControl is T subControlType)\n                    yield return subControlType;\n\n                if (subControl.HasChildren)\n                {\n                    foreach (T child in GetChildElements<T>(subControl))\n                        yield return child;\n                }\n            }\n        }\n\n        public static bool IsDirectory(string path)\n        {\n            if (!File.Exists(path) && !Directory.Exists(path))\n                return false;\n\n            FileAttributes attr = File.GetAttributes(path);\n            return (attr & FileAttributes.Directory) == FileAttributes.Directory;\n        }\n\n        public static string ReadString(this IArchiveEntry entry, Encoding encoding) =>\r\n            encoding.GetString(ReadEntry(entry));\n\n        public static byte[] ReadEntry(this IArchiveEntry entry)\n        {\n            byte[] data = new byte[entry.Length];\n            entry.Read(data, 0, data.Length);\n            return data;\n        }\n\n        public static string GetDescription(this Enum value)\n        {\n            FieldInfo fi = value.GetType().GetField(value.ToString());\n            if (fi.GetCustomAttributes(typeof(DescriptionAttribute), false) is DescriptionAttribute[] attributes &&\n                attributes.Any())\n                return attributes.First().Description;\n\n            return value.ToString();\n        }\n\n        public static string GetInteropDirectory()\n        {\n            if (Environment.Is64BitOperatingSystem)\n                return \"x64\";\n\n            return \"x86\";\n        }\n\n        private static readonly SolidBrush RectangleBrush = new SolidBrush(Color.FromArgb(128, Color.Black));\n\n        public static void DrawImageTitleBar(string title, Rectangle paintRect, PaintEventArgs e, Brush textBrush, Font font)\n        {\n            if (string.IsNullOrEmpty(title))\n                return;\n\n            DpiScale dpiScale = new DpiScale(e.Graphics);\n            int padX = dpiScale.ScaleIntX(3);\n            int padY = dpiScale.ScaleIntY(2);\n            title = GetClippedEllipsesText(e.Graphics, font, title, new SizeF(paintRect.Width, font.Height));\n\n            SizeF size = e.Graphics.MeasureString(title, font);\n            RectangleF rect = new RectangleF(0, paintRect.Height - size.Height - padY,\n                e.ClipRectangle.Width, size.Height + padY);\n            e.Graphics.FillRectangle(RectangleBrush, rect);\n            e.Graphics.DrawString(title, font, textBrush, new PointF(padX, paintRect.Height - size.Height - padY));\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/UtilityHandler.cs",
    "content": "﻿using DoomLauncher.Adapters.Launch;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Text;\nusing System.Windows.Forms;\nusing static DoomLauncher.SpecificFilesForm;\n\nnamespace DoomLauncher\n{\n    class UtilityHandler\n    {\n        private readonly IWin32Window m_parent;\n        private readonly ISourcePortData m_utility;\n        private readonly AppConfiguration m_config;\n\n        public UtilityHandler(IWin32Window parent, AppConfiguration config, ISourcePortData utility)\n        {\n            m_parent = parent;\n            m_config = config;\n            m_utility = utility;\n        }\n\n        public bool RunUtility(IGameFile gameFile)\n        {\n            List<SpecificFilePath> files;\n            if (gameFile.IsUnmanaged())\n            {\n                files = new List<SpecificFilePath>\n                {\n                    new SpecificFilePath() { ExtractedFile = gameFile.FileName, InternalFilePath = gameFile.FileName }\n                };\n            }\n            else if (!GetUserSelectedFiles(gameFile, out files))\n            {\n                return true;\n            }\n\n            var features = new List<ILaunchFeature> \n            { \n                new UtilityFilesLaunchFeature(files),\n                new SourcePortExtraParametersLaunchFeature()\n            };\n\n            GameLauncher launcher = new GameLauncher(m_config, features);\n            var launchParameters = launcher.GetLaunchParameters(gameFile, Array.Empty<IGameFile>(), m_utility, false);\n\n            if (launchParameters.Failed)\n                return false;\n\n            try\n            {\n                Process.Start(m_utility.GetFullExecutablePath(), launchParameters.LaunchString);\n            }\n            catch\n            {\n                return false;\n            }\n\n            return true;\n        }\n\n        private bool GetUserSelectedFiles(IGameFile gameFile, out List<SpecificFilePath> files)\n        {\n            SpecificFilesForm form = new SpecificFilesForm();\n            form.AutoCheckSupportedExtensions(false);\n            form.ShowPkContentsCheckBox(true);\n            form.Initialize(m_config.GameFileDirectory, new IGameFile[] { gameFile }, SourcePortData.GetSupportedExtensions(m_utility),\n                new string[] { }, m_config.TempDirectory);\n            form.StartPosition = FormStartPosition.CenterParent;\n\n            if (form.ShowDialog(m_parent) != DialogResult.OK)\n            {\n                files = new List<SpecificFilePath>();\n                return false;\n            }\n\n            files = form.GetPathedSpecificFiles();\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Handlers/VersionHandler.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Handlers;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Data.Common;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class VersionHandler\n    {\n        private readonly IDataSourceAdapter m_adapter;\n        private readonly AppConfiguration m_appConfig;\n        private bool m_restartRequired;\n\n        public event EventHandler UpdateProgress;\n        public event EventHandler UpdateComplete;\n        public int ProgressPercent { get; private set; }\n\n        public VersionHandler(DataAccess access, IDataSourceAdapter adapter, AppConfiguration appConfig)\n        {\n            DataAccess = access;\n            m_adapter = adapter;\n            m_appConfig = appConfig;\n        }\n\n        public bool UpdateRequired()\n        {\n            AppVersion version = GetVersion();\n            var latestVersion = Enum.GetValues(typeof(AppVersion)).Cast<AppVersion>().Last();\n\n            if (version == AppVersion.Unknown || version < latestVersion)\n                return true;\n\n            return false;\n        }\n\n        private void ExecuteUpdate(Action update, AppVersion version)\n        {\n            if (GetVersion() < version || version == AppVersion.Unknown)\n            {\n                update();\n\n                if (version != AppVersion.Unknown)\n                    WriteVersion(version);\n            }\n        }\n\n        public VersionUpdateResults HandleVersionUpdate()\n        {\n            m_restartRequired = false;\n            if (UpdateRequired())\n            {\n                ExecuteUpdate(Pre_0_9_2, AppVersion.Unknown);\n                ExecuteUpdate(Pre_1_0_0, AppVersion.Version_1_0_0);\n                ExecuteUpdate(Pre_1_1_0, AppVersion.Version_1_1_0);\n                ExecuteUpdate(Pre_2_1_0, AppVersion.Version_2_1_0);\n                ExecuteUpdate(Pre_2_2_0, AppVersion.Version_2_2_0);\n                ExecuteUpdate(Pre_2_2_1, AppVersion.Version_2_2_1);\n                ExecuteUpdate(Pre_2_3_0, AppVersion.Version_2_3_0);\n                ExecuteUpdate(Pre_2_4_0, AppVersion.Version_2_4_0);\n                ExecuteUpdate(Pre_2_4_1, AppVersion.Version_2_4_1);\n                ExecuteUpdate(Pre_2_6_0, AppVersion.Version_2_6_0);\n                ExecuteUpdate(Pre_2_6_3, AppVersion.Version_2_6_3);\n                ExecuteUpdate(Pre_2_6_3_1, AppVersion.Version_2_6_3_1);\n                ExecuteUpdate(Pre_2_6_3_2, AppVersion.Version_2_6_3_2);\n                ExecuteUpdate(Pre_2_6_4_1, AppVersion.Version_2_6_4_1);\n                ExecuteUpdate(Pre_2_6_4_1_Update, AppVersion.Version_2_6_4_1_Update1);\n                ExecuteUpdate(Pre_2_7_0_0, AppVersion.Version_2_7_0_0);\n                ExecuteUpdate(Pre_2_8_0_0, AppVersion.Version_2_8_0_0);\n                ExecuteUpdate(Pre_2_8_0_0_1, AppVersion.Version_2_8_0_0_1);\n                ExecuteUpdate(Pre_Version_3_1_0, AppVersion.Version_3_1_0);\n                ExecuteUpdate(Pre_Version_3_2_0, AppVersion.Version_3_2_0);\n                ExecuteUpdate(Pre_Version_3_2_0_Update1, AppVersion.Version_3_2_0_Update1);\n                ExecuteUpdate(Pre_Version_3_2_0_Update2, AppVersion.Version_3_2_0_Update2);\n                ExecuteUpdate(Pre_Version_3_2_0_Update3, AppVersion.Version_3_2_0_Update3);\n                ExecuteUpdate(Pre_Version_3_3_0, AppVersion.Version_3_3_0);\n                ExecuteUpdate(Pre_Version_3_3_1, AppVersion.Version_3_3_1);\n                ExecuteUpdate(Pre_Version_3_3_2, AppVersion.Version_3_3_2);\n                ExecuteUpdate(Pre_Version_3_4_0, AppVersion.Version_3_4_0);\n                ExecuteUpdate(Pre_Version_3_4_0_Update1, AppVersion.Version_3_4_0_Update1);\n                ExecuteUpdate(Pre_Version_3_5_2, AppVersion.Version_3_5_2);\n                ExecuteUpdate(Pre_Version_3_5_2_Update1, AppVersion.Version_3_5_2_Update1);\n                ExecuteUpdate(Pre_Version_3_5_2_Update2, AppVersion.Version_3_5_2_Update2);\n                ExecuteUpdate(Pre_Version_3_5_3_Update1, AppVersion.Version_3_5_3_Update1);\n                ExecuteUpdate(Pre_Version_3_5_3_Update2, AppVersion.Version_3_5_3_Update2);\n                ExecuteUpdate(Pre_Version_3_5_3_Update3, AppVersion.Version_3_5_3_Update3);\n                ExecuteUpdate(Pre_Version_3_7_0, AppVersion.Version_3_7_0);\n                ExecuteUpdate(Pre_Version_3_7_0_Update1, AppVersion.Version_3_7_0_Update1);\n                ExecuteUpdate(Pre_Version_3_7_4, AppVersion.Version_3_7_4);\n                ExecuteUpdate(Pre_Version_3_7_7, AppVersion.Version_3_7_7);\n            }\n\n            return new VersionUpdateResults(m_restartRequired);\n        }\n\n        private AppVersion GetVersion()\n        {\n            IConfigurationData config = m_adapter.GetConfiguration().FirstOrDefault(x => x.Name == \"Version\");\n\n            if (config != null)\n                return (AppVersion)Convert.ToInt32(config.Value);\n\n            return AppVersion.Unknown;\n        }\n\n        private void WriteVersion(AppVersion version)\n        {\n            IConfigurationData config = m_adapter.GetConfiguration().FirstOrDefault(x => x.Name == \"Version\");\n\n            if (config != null)\n            {\n                config.Value = Convert.ToInt32(version).ToString();\n                m_adapter.UpdateConfiguration(config);\n            }\n            else\n            {\n                ConfigurationData newConfig = new ConfigurationData();\n                newConfig.Name = \"Version\";\n                newConfig.UserCanModify = false;\n                newConfig.Value = Convert.ToInt32(version).ToString();\n                m_adapter.InsertConfiguration(newConfig);\n            }\n        }\n\n        public void Pre_1_0_0()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n\n            if (!dt.Select(\"name = 'SettingsMap'\").Any())\n            {\n                string query = @\"alter table GameFiles add column 'SettingsMap' TEXT;\n                alter table GameFiles add column 'SettingsSkill' TEXT;\n                alter table GameFiles add column 'SettingsExtraParams' TEXT;\n                alter table GameFiles add column 'SettingsFiles' TEXT;\";\n\n                DataAccess.ExecuteNonQuery(query);\n            }\n\n            dt = DataAccess.ExecuteSelect(\"select * from Configuration where Name = 'ColumnConfig'\").Tables[0];\n\n            if (dt.Rows.Count == 0)\n            {\n                string query = @\"insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('SplitTopBottom', '475', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('SplitLeftRight', '680', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('AppWidth', '1024', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('AppHeight', '768', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('AppX', '0', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('AppY', '0', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('WindowState', 'Normal', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('ColumnConfig', '', '', 0);\";\n                DataAccess.ExecuteNonQuery(query);\n            }\n        }\n\n        public void Pre_0_9_2()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select name from sqlite_master where type='table' and name='Configuration';\").Tables[0];\n\n            if (dt.Rows.Count == 0)\n            {\n                string query = @\"CREATE TABLE 'Configuration' (\n\t                'ConfigID'\tINTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n\t                'Name'\tTEXT NOT NULL,\n\t                'Value'\tTEXT NOT NULL,\n\t                'AvailableValues'\tTEXT NOT NULL,\n\t                'UserCanModify'\tINTEGER);\";\n\n                DataAccess.ExecuteNonQuery(query);\n\n                query = string.Format(@\"insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('IdGamesUrl', 'http://www.doomworld.com/idgames/', '', 1);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('ApiPage', 'api/api.php', '', 1);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('MirrorUrl', 'ftp://mancubus.net/pub/idgames/', 'Germany;ftp://ftp.fu-berlin.de/pc/games/idgames/;Idaho;ftp://mirrors.syringanetworks.net/idgames/;Greece;ftp://ftp.ntua.gr/pub/vendors/idgames/;Texas;ftp://mancubus.net/pub/idgames/;New York;http://youfailit.net/pub/idgames/;Florida;http://www.gamers.org/pub/idgames/;', 1);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('ScreenshotCaptureDirectories', '', '', 1);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('DateParseFormats', 'dd/M/yy;dd/MM/yyyy;dd MMMM yyyy;', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('CleanTemp', 'true', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('GameFileDirectory', '{0}', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('ScreenshotDirectory', '{1}', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('TempDirectory', '{2}', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('GameWadDirectory', '{3}', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('DemoDirectory', '{4}', '', 0);\n                insert into Configuration (Name, Value, AvailableValues, UserCanModify) values('SaveGameDirectory', '{5}', '', 0);\",\n                ConfigurationManager.AppSettings[\"GameFileDirectory\"], ConfigurationManager.AppSettings[\"ScreenshotDirectory\"], ConfigurationManager.AppSettings[\"TempDirectory\"],\n                ConfigurationManager.AppSettings[\"GameWadDirectory\"], ConfigurationManager.AppSettings[\"DemoDirectory\"], ConfigurationManager.AppSettings[\"GameFileDirectory\"] + \"SaveGames\\\\\");\n\n                DataAccess.ExecuteNonQuery(query);\n\n                DirectoryInfo di = new DirectoryInfo(Path.Combine(LauncherPath.GetDataDirectory(), ConfigurationManager.AppSettings[\"GameFileDirectory\"], \"SaveGames\"));\n                if (!di.Exists)\n                    di.Create();\n            }\n\n            dt = DataAccess.ExecuteSelect(\"pragma table_info(Files);\").Tables[0];\n\n            if (!dt.Select(\"name = 'OriginalFileName'\").Any())\n            {\n                string query = @\"alter table Files add column 'OriginalFileName' TEXT;\n                alter table Files add column 'OriginalFilePath' TEXT;\";\n\n                DataAccess.ExecuteNonQuery(query);\n            }\n        }\n\n        public void Pre_1_1_0()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select name from sqlite_master where type='table' and name='Tags';\").Tables[0];\n            //tag table update\n            if (dt.Rows.Count == 0)\n            {\n                string query = @\"CREATE TABLE 'Tags' (\n\t            'TagID'\tINTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n\t            'Name'\tTEXT NOT NULL,\n\t            'HasTab'\tINTEGER NOT NULL);\";\n                DataAccess.ExecuteSelect(query);\n\n                query = @\"CREATE TABLE 'TagMapping' (\n\t            'FileID'\tINTEGER NOT NULL,\n\t            'TagID'\tINTEGER NOT NULL,\n\t            PRIMARY KEY(FileID,TagID));\";\n                DataAccess.ExecuteSelect(query);\n            }\n\n            dt = DataAccess.ExecuteSelect(\"pragma table_info(Tags);\").Tables[0];\n\n            if (!dt.Select(\"name = 'Color'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(\"alter table Tags add column 'HasColor' int;\");\n                DataAccess.ExecuteNonQuery(\"alter table Tags add column 'Color' int;\");\n            }\n\n            dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n            //GameFile map count update\n            if (!dt.Select(\"name = 'MapCount'\").Any())\n            {\n                CreateDatabaseBackup();\n\n                DataAccess.ExecuteNonQuery(\"alter table GameFiles add column 'MapCount' int;\");\n\n                GameFileGetOptions options = new GameFileGetOptions();\n                options.SelectFields = new GameFileFieldType[] { GameFileFieldType.GameFileID, GameFileFieldType.Map };\n                IEnumerable<IGameFile> gameFiles = m_adapter.GetGameFiles(options);\n\n                GameFileFieldType[] updateFields = new GameFileFieldType[] { GameFileFieldType.MapCount };\n                float total = gameFiles.Count();\n                int count = 0;\n\n                foreach (IGameFile gameFile in gameFiles)\n                {\n                    if (UpdateProgress != null)\n                    {\n                        ProgressPercent = Convert.ToInt32(count / total * 100);\n                        UpdateProgress(this, new EventArgs());\n                    }\n\n                    if (gameFile.Map != null)\n                    {\n                        gameFile.MapCount = gameFile.Map.Count(x => x == ',') + 1;\n                        m_adapter.UpdateGameFile(gameFile, updateFields);\n                    }\n\n                    count++;\n                }\n            }\n\n            if (!dt.Select(\"name = 'SettingsSpecificFiles'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(\"alter table GameFiles add column 'SettingsSpecificFiles' TEXT;\");\n            }\n\n            WriteVersion(AppVersion.Version_1_1_0);\n\n            UpdateComplete?.Invoke(this, new EventArgs());\n        }\n\n        [Conditional(\"RELEASE\")]\n        private static void CreateDatabaseBackup()\n        {\n            FileInfo fi = new FileInfo(DbDataSourceAdapter.DatabaseFileName);\n            fi.CopyTo(string.Format(\"{0}_{1}.sqlite.bak\", DbDataSourceAdapter.DatabaseFileName, Guid.NewGuid().ToString()));\n        }\n\n        private void Pre_2_1_0()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(Files);\").Tables[0];\n\n            if (!dt.Select(\"name = 'FileOrder'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(\"alter table Files add column 'FileOrder' int;\");\n                DataAccess.ExecuteNonQuery(\"update Files set FileOrder = 2\");\n            }\n\n            dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n\n            if (!dt.Select(\"name = 'MinutesPlayed'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(\"alter table GameFiles add column 'MinutesPlayed' int;\");\n                DataAccess.ExecuteNonQuery(\"update GameFiles set MinutesPlayed = 0\");\n            }\n        }\n\n        private void Pre_2_2_0()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select name from sqlite_master where type='table' and name='Stats';\").Tables[0];\n\n            if (dt.Rows.Count == 0)\n            {\n                DataAccess.ExecuteNonQuery(\"update Configuration set UserCanModify = 1 where Name = 'GameFileDirectory'\");\n\n                string query = @\"CREATE TABLE 'Stats' (\n\t            'StatID'\tINTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n\t            'GameFileID'\tINTEGER NOT NULL,\n                'KillCount'\tINTEGER NOT NULL,\n                'TotalKills'\tINTEGER NOT NULL,\n                'SecretCount'\tINTEGER NOT NULL,\n                'TotalSecrets'\tINTEGER NOT NULL,\n                'LevelTime'\tREAL NOT NULL,\n                'ItemCount'\tINTEGER NOT NULL,\n                'TotalItems'\tINTEGER NOT NULL,\n                'SourcePortID'\tINTEGER NOT NULL,\n                'MapName'\tTEXT NOT NULL,\n                'RecordTime'\tTEXT NOT NULL);\";\n\n                DataAccess.ExecuteNonQuery(query);\n            }\n        }\n\n        private void Pre_2_2_1()\n        {\n            IEnumerable<ISourcePortData> sourcePorts = m_adapter.GetSourcePorts();\n\n            foreach (ISourcePortData sourcePort in sourcePorts)\n            {\n                if (sourcePort.SupportedExtensions.Contains(\".pk3\"))\n                    sourcePort.SupportedExtensions = sourcePort.SupportedExtensions.Replace(\".pk3\", \".pk3,.pk7\");\n\n                List<DbParameter> parameters = new List<DbParameter>();\n                parameters.Add(DataAccess.DbAdapter.CreateParameter(\"ext\", sourcePort.SupportedExtensions));\n                parameters.Add(DataAccess.DbAdapter.CreateParameter(\"SourcePortID\", sourcePort.SourcePortID));\n                DataAccess.ExecuteNonQuery(\"update SourcePorts set SupportedExtensions = @ext where SourcePortID = @SourcePortID\", parameters);\n            }\n        }\n\n        private void Pre_2_3_0()\n        {\n            IEnumerable<IStatsData> stats = m_adapter.GetStats();\n            HashSet<IStatsData> statSet = new HashSet<IStatsData>();\n\n            foreach (IStatsData stat in stats)\n            {\n                if (!statSet.Contains(stat))\n                    statSet.Add(stat);\n                else\n                    m_adapter.DeleteStats(stat.StatID);\n            }\n        }\n\n        private void Pre_2_4_0()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(IWads);\").Tables[0];\n\n            if (!dt.Select(\"name = 'GameFileID'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(\"alter table IWads add column 'GameFileID' int;\");\n\n                IEnumerable<IIWadData> iwads = m_adapter.GetIWads();\n                IEnumerable<IGameFile> gameFiles = m_adapter.GetGameFiles();\n\n                foreach (IIWadData iwad in iwads)\n                {\n                    IGameFile find = gameFiles.FirstOrDefault(x => x.FileName.ToLower() == iwad.FileName.ToLower().Replace(\".wad\", \".zip\"));\n                    if (find != null)\n                    {\n                        iwad.GameFileID = find.GameFileID;\n                        m_adapter.UpdateIWad(iwad);\n                    }\n                }\n            }\n\n            UpdateSourcePortsTable();\n\n            //There was a bug in previous versions that would set MapCount to 1 when there were no maps found\n            DataAccess.ExecuteNonQuery(\"update GameFiles set MapCount = null where Map is null or length(Map) = 0\");\n        }\n\n        private void Pre_2_4_1()\n        {\n            string[] saveExts = new string[] { \"*.zds\", \"*.dsg\", \"*.esg\" };\n            foreach (string ext in saveExts)\n            {\n                string[] files = Directory.GetFiles(m_appConfig.DemoDirectory.GetFullPath(), ext);\n                foreach (string file in files)\n                {\n                    FileInfo fi = new FileInfo(file);\n                    FileInfo fiTo = new FileInfo(Path.Combine(m_appConfig.SaveGameDirectory.GetFullPath(), fi.Name));\n                    if (fiTo.Exists)\n                        fiTo.Delete();\n                    fi.MoveTo(fi.FullName);\n                }\n            }\n        }\n\n        private void Pre_2_6_0()\n        {\n            UpdateSourcePortsTable();\n\n            DataAccess.ExecuteNonQuery(string.Format(\"update SourcePorts set LaunchType = {0}\", (int)SourcePortLaunchType.SourcePort));\n            DataAccess.ExecuteNonQuery(\"update SourcePorts set FileOption = '-file'\");\n\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n\n            if (!dt.Select(\"name = 'SettingsStat'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(\"alter table GameFiles add column 'SettingsStat' INTEGER;\");\n                DataAccess.ExecuteNonQuery(\"update GameFiles set SettingsStat = 1\");\n            }\n        }\n\n        private void Pre_2_6_3()\n        {\n            UpdateSourcePortsTable();\n        }\n\n        private void Pre_2_6_3_1()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n            if (!dt.Select(\"name = 'SettingsFilesSourcePort'\").Any())\n                DataAccess.ExecuteNonQuery(\"alter table GameFiles add column 'SettingsFilesSourcePort' TEXT;\");\n            if (!dt.Select(\"name = 'SettingsFilesIWAD'\").Any())\n                DataAccess.ExecuteNonQuery(\"alter table GameFiles add column 'SettingsFilesIWAD' TEXT;\");\n\n            UpdateSourcePortsTable();\n\n            var gameFiles = m_adapter.GetGameFiles();\n            var ports = m_adapter.GetSourcePorts().ToDictionary(x => x.SourcePortID, x => x);\n            var iwads = m_adapter.GetIWads();\n            var gameFileIwads = m_adapter.GetGameFileIWads().ToDictionary(x => iwads.First(y => y.GameFileID == x.GameFileID.Value).IWadID, x => x);\n\n            foreach (var gameFile in gameFiles)\n            {\n                if (!string.IsNullOrEmpty(gameFile.SettingsFiles))\n                {\n                    var files = Util.GetAdditionalFiles(m_adapter, (GameFile)gameFile).Select(x => x.FileName);\n                    FileLoadHandlerLegacy filehandler = new FileLoadHandlerLegacy(m_adapter, gameFile);\n                    filehandler.CalculateAdditionalFiles(GetDictionaryData<IGameFile>(gameFile.IWadID, gameFileIwads),\n                        GetDictionaryData<ISourcePortData>(gameFile.SourcePortID, ports));\n\n                    var sourcePortFiles = filehandler.GetSourcePortFiles().Select(x => x.FileName).Where(x => files.Contains(x));\n                    var iwadFiles = filehandler.GetIWadFiles().Select(x => x.FileName).Where(x => files.Contains(x)).Except(sourcePortFiles);\n\n                    gameFile.SettingsFilesSourcePort = string.Join(\";\", sourcePortFiles.ToArray());\n                    gameFile.SettingsFilesIWAD = string.Join(\";\", iwadFiles.ToArray());\n\n                    m_adapter.UpdateGameFile(gameFile);\n                }\n            }\n        }\n\n        private void Pre_2_6_3_2()\n        {\n            DataAccess.ExecuteNonQuery(\"update SourcePorts set FileOption = '-file' where LaunchType = 0\");\n        }\n\n        private void Pre_2_6_4_1()\n        {\n            ConfigurationData config = new ConfigurationData()\n            {\n                Name = \"ScreenshotPreviewSize\",\n                Value = \"0\",\n                UserCanModify = true\n            };\n\n            m_adapter.InsertConfiguration(config);\n        }\n\n        private void Pre_2_6_4_1_Update()\n        {\n            var sourcePorts = m_adapter.GetSourcePorts();\n            var stats = m_adapter.GetStats();\n\n            foreach (var stat in stats)\n            {\n                if (!sourcePorts.Any(x => x.SourcePortID == stat.SourcePortID))\n                {\n                    stat.SourcePortID = -1;\n                    m_adapter.UpdateStats(stat);\n                }\n            }\n        }\n\n        private void Pre_2_7_0_0()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select name from sqlite_master where type='table' and name='GameProfiles';\").Tables[0];\n\n            if (dt.Rows.Count == 0)\n            {\n                string query = @\"CREATE TABLE 'GameProfiles' (\n\t                    'GameProfileID'\tINTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n                        'GameFileID'\tINTEGER NOT NULL,\n                        'SourcePortID'\tINTEGER NOT NULL,\n                        'IWadID'\tINTEGER NOT NULL,\n                        'Name'\tTEXT NOT NULL,\n\t                    'SettingsMap'\tTEXT,\n\t                    'SettingsSkill'\tTEXT,\n\t                    'SettingsExtraParams'\tTEXT,\n\t                    'SettingsFiles'\tTEXT,\n\t                    'SettingsFilesSourcePort'\tTEXT,\n\t                    'SettingsFilesIWAD'\tTEXT,\n\t                    'SettingsSpecificFiles'\tTEXT,\n                        'SettingsStat'\tINTEGER,\n                        'SettingsSaved' INTEGER);\";\n\n                DataAccess.ExecuteNonQuery(query);\n            }\n\n            dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n\n            if (!dt.Select(\"name = 'SettingsGameProfileID'\").Any())\n                DataAccess.ExecuteNonQuery(@\"alter table GameFiles add column 'SettingsGameProfileID' INTEGER;\");\n\n            if (!dt.Select(\"name = 'SettingsSaved'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(@\"alter table GameFiles add column 'SettingsSaved' INTEGER;\");\n                DataAccess.ExecuteNonQuery(\"update GameFiles set SettingsSaved = 1 where SourcePortID is not null\");\n                DataAccess.ExecuteNonQuery(\"update GameFiles set SettingsSaved = 0 where SourcePortID is null\");\n            }\n        }\n\n        private void Pre_2_8_0_0()\n        {\n            ConfigurationData config = new ConfigurationData()\n            {\n                Name = \"FileManagement\",\n                Value = FileManagement.Managed.ToString(),\n                UserCanModify = false,\n            };\n\n            m_adapter.InsertConfiguration(config);\n        }\n\n        private void Pre_2_8_0_0_1()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"GameFileViewType\",\n                Value = GameFileViewType.TileView.ToString(),\n                UserCanModify = false,\n            });\n\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"ItemsPerPage\",\n                Value = \"30\",\n                UserCanModify = false,\n            });\n        }\n\n        private void Pre_Version_3_1_0()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"DeleteScreenshotsAfterImport\",\n                Value = \"false\",\n                UserCanModify = true,\n                AvailableValues = \"Yes;true;No;false\"\n            });\n        }\n\n        private void Pre_Version_3_2_0()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"LastSelectedTabIndex\",\n                Value = \"0\",\n                UserCanModify = false,\n            });\n\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(Tags);\").Tables[0];\n\n            if (!dt.Select(\"name = 'ExcludeFromOtherTabs'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(@\"alter table Tags add column 'ExcludeFromOtherTabs' INTEGER;\");\n                DataAccess.ExecuteNonQuery(\"update Tags set ExcludeFromOtherTabs = 0\");\n            }\n        }\n\n        private void Pre_Version_3_2_0_Update1()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(Tags);\").Tables[0];\n\n            if (!dt.Select(\"name = 'Favorite'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(@\"alter table Tags add column 'Favorite' INTEGER;\");\n                DataAccess.ExecuteNonQuery(\"update Tags set Favorite = 0\");\n            }\n\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"SplitTagSelect\",\n                Value = \"300\",\n                UserCanModify = false,\n            });\n\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"TagSelectPinned\",\n                Value = \"False\",\n                UserCanModify = false,\n            });\n\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"ShowTabHeaders\",\n                Value = \"true\",\n                UserCanModify = true,\n                AvailableValues = \"Yes;true;No;false\"\n            });\n        }\n\n        private void Pre_Version_3_2_0_Update2()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"CopySaveFiles\",\n                Value = \"true\",\n                UserCanModify = true,\n                AvailableValues = \"Yes;true;No;false\"\n            });\n\n            UpdateSourcePortsTable();\n        }\n\n        private void Pre_Version_3_2_0_Update3()\n        {\n            IEnumerable<ISourcePortData> sourcePorts = m_adapter.GetSourcePorts();\n\n            foreach (ISourcePortData sourcePort in sourcePorts)\n            {\n                if (!sourcePort.SupportedExtensions.Contains(\".pk3\"))\n                    continue;\n                \n                sourcePort.SupportedExtensions = sourcePort.SupportedExtensions.Replace(\".pk3\", \".pk3,.ipk3\");\n\n                List<DbParameter> parameters = new List<DbParameter>\n                {\n                    DataAccess.DbAdapter.CreateParameter(\"ext\", sourcePort.SupportedExtensions),\n                    DataAccess.DbAdapter.CreateParameter(\"SourcePortID\", sourcePort.SourcePortID)\n                };\n                DataAccess.ExecuteNonQuery(\"update SourcePorts set SupportedExtensions = @ext where SourcePortID = @SourcePortID\", parameters);\n            }\n        }\n\n        private void Pre_Version_3_3_0()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n\n            if (!dt.Select(\"name = 'SettingsLoadLatestSave'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(@\"alter table GameFiles add column 'SettingsLoadLatestSave' INTEGER;\");\n                DataAccess.ExecuteNonQuery(\"update GameFiles set SettingsLoadLatestSave = 0\");\n            }\n\n            dt = DataAccess.ExecuteSelect(\"pragma table_info(GameProfiles);\").Tables[0];\n\n            if (!dt.Select(\"name = 'SettingsLoadLatestSave'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(@\"alter table GameProfiles add column 'SettingsLoadLatestSave' INTEGER;\");\n                DataAccess.ExecuteNonQuery(\"update GameProfiles set SettingsLoadLatestSave = 0\");\n            }\n        }\n\n        private void Pre_Version_3_3_1()\n        {\n\n            string query = @\"update SourcePorts set \n                    SupportedExtensions = @SupportedExtensions\n                    where SourcePortID = @sourcePortID\";\n\n            var sourcePorts = m_adapter.GetSourcePorts();\n            foreach (var sourcePort in sourcePorts)\n            {\n                if (sourcePort.SupportedExtensions.Contains(\".pke\"))\n                    continue;\n\n                sourcePort.SupportedExtensions += \",.pke\";\n\n                List<DbParameter> parameters = new List<DbParameter>\n                {\n                    DataAccess.DbAdapter.CreateParameter(\"SupportedExtensions\", sourcePort.SupportedExtensions),\n                    DataAccess.DbAdapter.CreateParameter(\"sourcePortID\", sourcePort.SourcePortID)\n                };\n\n                DataAccess.ExecuteNonQuery(query, parameters);\n            }\n        }\n\n        private void Pre_Version_3_3_2()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"select name from sqlite_master where type='table' and name='CleanupFiles';\").Tables[0];\n\n            if (dt.Rows.Count == 0)\n            {\n                string query = @\"CREATE TABLE 'CleanupFiles' (\n                    'CleanupFileID'\tINTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n\t                'FileName' TEXT NOT NULL);\";\n\n                DataAccess.ExecuteNonQuery(query);\n            }\n\n            string urls = \"Germany;https://www.quaddicted.com/files/idgames/;Idaho;ftp://mirrors.syringanetworks.net/idgames/;New York;https://youfailit.net/pub/idgames/;Sweden;https://ftpmirror1.infania.net/pub/idgames/;Virginia;http://www.gamers.org/pub/idgames/;\";\n            UpdateMirrorUrls(urls, \"New York\");\n        }\n\n        private void Pre_Version_3_4_0()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"AllowMultiplePlaySessions\",\n                Value = \"false\",\n                UserCanModify = true,\n                AvailableValues = \"Yes;true;No;false\"\n            });\n\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"AutomaticallyPullTitlpic\",\n                Value = \"true\",\n                UserCanModify = true,\n                AvailableValues = \"Yes;true;No;false\"\n            });\n        }\n\n        private void Pre_Version_3_4_0_Update1()\n        {\n            var columnConfig = DataCache.Instance.GetColumnConfig().ToList();\n            var columnGroups = columnConfig.GroupBy(x => x.Parent);\n            List<ColumnConfig> newColumns = new List<ColumnConfig>(columnConfig.Count * 2);\n\n            // Insert LastDirectory after FileNameNoPath\n            foreach (var set in columnGroups)\n            {\n                if (set.Any(x => x.Column.Equals(\"LastDirectory\", StringComparison.OrdinalIgnoreCase)))\n                    continue;  \n\n                List<ColumnConfig> sortColumns = set.ToList();\n                for (int i = 0; i < sortColumns.Count; i++)\n                {\n                    var col = sortColumns[i];\n                    newColumns.Add(col);\n                    if (!col.Column.Equals(\"FileNameNoPath\", StringComparison.OrdinalIgnoreCase))\n                        continue;\n\n                    newColumns.Add(new ColumnConfig()\n                    {\n                        Parent = set.Key,\n                        Column = \"LastDirectory\",\n                        Width = 100,\n                        Sort = SortOrder.None\n                    });\n                }\n\n                newColumns.AddRange(sortColumns);\n            }\n\n            string data = DataCache.SerializeColumnConfig(newColumns);\n            DataCache.Instance.UpdateConfig(DataCache.Instance.DataSourceAdapter.GetConfiguration(), AppConfiguration.ColumnConfigName, data);\n        }\n\n        private void Pre_Version_3_5_2()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"VisibleViews\",\n                Value = string.Join(\";\", TabKeys.KeyNames.Except(new string[] { TabKeys.LocalKey })),\n                UserCanModify = false,\n            });\n        }\n\n        private void Pre_Version_3_5_2_Update1()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(Stats);\").Tables[0];\n            if (!dt.Select(\"name = 'Skill'\").Any())\n                DataAccess.ExecuteNonQuery(@\"alter table Stats add column 'Skill' INTEGER;\");\n        }\n\n        private void Pre_Version_3_5_2_Update2()\n        {\n            UpdateSourcePortsTable();\n        }\n\n        private void Pre_Version_3_5_3_Update1()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n            if (!dt.Select(\"name = 'SettingsExtraParamsOnly'\").Any())\n            {\n                string query = @\"alter table GameFiles add column 'SettingsExtraParamsOnly' INTEGER;\";\n                DataAccess.ExecuteNonQuery(query);\n            }\n\n            dt = DataAccess.ExecuteSelect(\"pragma table_info(GameProfiles);\").Tables[0];\n            if (!dt.Select(\"name = 'SettingsExtraParamsOnly'\").Any())\n            {\n                string query = @\"alter table GameProfiles add column 'SettingsExtraParamsOnly' INTEGER;\";\n                DataAccess.ExecuteNonQuery(query);\n            }\n        }\n\n        private void Pre_Version_3_5_3_Update2()\n        {\n            DataTable dt = DataAccess.ExecuteSelect(\"pragma table_info(Files);\").Tables[0];\n            if (!dt.Select(\"name = 'UserTitle'\").Any())\n            {\n                string query = @\"alter table Files add column 'UserTitle' TEXT;\";\n                DataAccess.ExecuteNonQuery(query);\n            }\n\n            if (!dt.Select(\"name = 'UserDescription'\").Any())\n            {\n                string query = @\"alter table Files add column 'UserDescription' TEXT;\";\n                DataAccess.ExecuteNonQuery(query);\n            }\n\n            if (!dt.Select(\"name = 'Map'\").Any())\n            {\n                string query = @\"alter table Files add column 'Map' TEXT;\";\n                DataAccess.ExecuteNonQuery(query);\n            }\n        }\n\n        private void Pre_Version_3_5_3_Update3()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"ShowPlayDialog\",\n                Value = \"true\",\n                UserCanModify = true,\n                AvailableValues = \"Yes;true;No;false\"\n            });\n        }\n\n        private void Pre_Version_3_7_0()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"ColorThemeType\",\n                Value = \"Dark\",\n                UserCanModify = false,\n            });\n        }\n\n        private void Pre_Version_3_7_0_Update1()\n        {\n            m_restartRequired = true;\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = \"ImportScreenshots\",\n                Value = \"true\",\n                UserCanModify = true,\n                AvailableValues = \"Yes;true;No;false\"\n            });\n        }\n\n        private void Pre_Version_3_7_4()\n        {\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = AppConfiguration.ShowTooltipName,\n                Value = \"true\",\n                UserCanModify = true,\n                AvailableValues = \"Yes;true;No;false\"\n            });\n            m_adapter.InsertConfiguration(new ConfigurationData()\n            {\n                Name = AppConfiguration.TileImageSizeName,\n                Value = \"300\",\n                UserCanModify = true,\n            });\n\n            var screenshotWidth = m_adapter.GetConfiguration().FirstOrDefault(x => x.Name == AppConfiguration.ScreenshotPreviewSizeName);\n            if (screenshotWidth != null)\n            {\n                screenshotWidth.Value = Util.GetPreviewScreenshotWidth(Convert.ToInt32(screenshotWidth.Value)).ToString();\n                m_adapter.UpdateConfiguration(screenshotWidth);\n            }\n        }\n\n        private void Pre_Version_3_7_7()\n        {\n            var dt = DataAccess.ExecuteSelect(\"pragma table_info(GameFiles);\").Tables[0];\n\n            if (!dt.Select(\"name = 'IsDoom64'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(\"alter table GameFiles add column 'IsDoom64' INTEGER;\");\n                DataAccess.ExecuteNonQuery(\"update GameFiles set IsDoom64 = 0\");\n            }\n        }\n\n        private void UpdateSourcePortsTable()\n        {\n            var dt = DataAccess.ExecuteSelect(\"pragma table_info(SourcePorts);\").Tables[0];\n            if (!dt.Select(\"name = 'SettingsFiles'\").Any())\n                DataAccess.ExecuteNonQuery(\"alter table SourcePorts add column 'SettingsFiles' TEXT;\");\n            if (!dt.Select(\"name = 'LaunchType'\").Any())\n                DataAccess.ExecuteNonQuery(\"alter table SourcePorts add column 'LaunchType' TEXT;\");\n            if (!dt.Select(\"name = 'FileOption'\").Any())\n                DataAccess.ExecuteNonQuery(\"alter table SourcePorts add column 'FileOption' TEXT;\");\n            if (!dt.Select(\"name = 'ExtraParameters'\").Any())\n                DataAccess.ExecuteNonQuery(\"alter table SourcePorts add column 'ExtraParameters' TEXT;\");\n            if (!dt.Select(\"name = 'AltSaveDirectory'\").Any())\n                DataAccess.ExecuteNonQuery(@\"alter table SourcePorts add column 'AltSaveDirectory' TEXT;\");\n            if (!dt.Select(\"name = 'Archived'\").Any())\n            {\n                DataAccess.ExecuteNonQuery(@\"alter table SourcePorts add column 'Archived' INTEGER;\");\n                DataAccess.ExecuteNonQuery(\"update SourcePorts set Archived = 0\");\n            }\n        }\n\n        private void UpdateMirrorUrls(string urls, string defaultUrl)\n        { \n            var configuration = m_adapter.GetConfiguration().FirstOrDefault(x => x.Name.Equals(\"MirrorUrl\"));\n            if (configuration == null)\n                return;\n\n            var newUrls = GetConfigItems(urls);\n            var oldUrls = GetConfigItems(configuration.AvailableValues);\n\n            if (!GetConfigKey(configuration.Value, oldUrls, out string urlKey) || !newUrls.Any(x => x.Item1.Equals(urlKey)))\n                urlKey = defaultUrl;\n\n            if (GetConfigValue(urlKey, newUrls, out string value))\n                configuration.Value = value;\n            configuration.AvailableValues = urls;\n            m_adapter.UpdateConfiguration(configuration);\n        }\n\n        private static List<Tuple<string,string>> GetConfigItems(string text)\n        {    \n            List<Tuple<string, string>> configItems = new List<Tuple<string, string>>();\n            var items = text.Split(new char[] { ';' });\n\n            for (int i = 0; i < items.Length - 1; i+=2)\n                configItems.Add(new Tuple<string, string>(items[i], items[i + 1]));\n\n            return configItems;\n        }\n\n        private static bool GetConfigKey(string data, List<Tuple<string, string>> items, out string key)\n        {\n            key = string.Empty;\n            var item = items.FirstOrDefault(x => x.Item2.Equals(data));\n            if (item == null)\n                return false;\n            key = item.Item1;\n            return true;\n        }\n\n        private static bool GetConfigValue(string data, List<Tuple<string, string>> items, out string value)\n        {\n            value = string.Empty;\n            var item = items.FirstOrDefault(x => x.Item1.Equals(data));\n            if (item == null)\n                return false;\n            value = item.Item2;\n            return true;\n        }\n\n        private static T GetDictionaryData<T>(int? id, Dictionary<int, T> values)\n        {\n            if (id.HasValue && values.ContainsKey(id.Value))\n                return values[id.Value];\n            return default(T);\n        }\n\n        public DataAccess DataAccess { get; set; }\n    }\n}"
  },
  {
    "path": "DoomLauncher/Handlers/VersionUpdateResults.cs",
    "content": "﻿namespace DoomLauncher.Handlers\n{\n    public class VersionUpdateResults\n    {\n        public readonly bool RestartRequired;\n\n        public VersionUpdateResults(bool restartRequired)\n        {\n            RestartRequired = restartRequired;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/IWad/IWadInfo.cs",
    "content": "﻿using System.IO;\n\nnamespace DoomLauncher\n{\n    class IWadInfo\n    {\n        public string Title { get; }\n        public string TileImage { get; }\n        public bool HasMetadata { get; }\n\n        public IWadInfo(string title, string tileImage, bool hasMeta = false)\n        {\n            Title = title;\n            TileImage = Path.Combine(LauncherPath.GetDataDirectory(), \"TileImages\", tileImage);\n            HasMetadata = hasMeta;\n        }\n\n        public static bool TryGetIWadInfo(string fileName, out IWadInfo iwadInfo)\n        {\n            iwadInfo = GetIWadInfo(fileName);\n            return iwadInfo != null;\n        }\n\n        public static IWadInfo GetIWadInfo(string fileName)\n        {\n            string name = Path.GetFileNameWithoutExtension(fileName).ToUpper();\n\n            switch (name)\n            {\n                case \"DOOM1\":\n                    return new IWadInfo(\"Doom Shareware\", \"doom.png\");\n                case \"DOOM\":\n                    return new IWadInfo(\"The Ultimate Doom\", \"doom.png\");\n                case \"DOOM2\":\n                    return new IWadInfo(\"Doom II: Hell on Earth\", \"doom2.png\");\n                case \"PLUTONIA\":\n                    return new IWadInfo(\"Final Doom: The Plutonia Experiment\", \"plutonia.png\");\n                case \"TNT\":\n                    return new IWadInfo(\"Final Doom: TNT: Evilution\", \"tnt.png\");\n                case \"FREEDOOM1\":\n                    return new IWadInfo(\"Freedoom: Phase 1\", string.Empty);\n                case \"FREEDOOM2\":\n                    return new IWadInfo(\"Freedoom: Phase 2\", string.Empty);\n                case \"FREEDM\":\n                    return new IWadInfo(\"FreeDM\", string.Empty);\n                case \"CHEX\":\n                    return new IWadInfo(\"Chex Quest\", \"chexquest.png\");\n                case \"CHEX3\":\n                    return new IWadInfo(\"Chex Quest 3\", \"chexquest3.png\");\n                case \"HACX\":\n                    return new IWadInfo(\"Hacx: Twitch 'n Kill\", \"hacx.png\");\n                case \"HERETIC1\":\n                    return new IWadInfo(\"Heretic Shareware\", \"heretic.png\");\n                case \"HERETIC\":\n                    return new IWadInfo(\"Heretic: Shadow of the Serpent Riders\", \"heretic.png\");\n                case \"HEXEN\":\n                    return new IWadInfo(\"Hexen: Beyond Heretic\", \"hexen.png\");\n                case \"STRIFE0\":\n                    return new IWadInfo(\"Strife Demo\", \"strife.png\");\n                case \"STRIFE1\":\n                    return new IWadInfo(\"Strife: Quest for the Sigil\", \"strife.png\");\n                case \"DOOM64\":\n                    return new IWadInfo(\"Doom 64\", \"doom64.png\");\n                default:\n                    break;\n            }\n\n            return null;\n        }  \n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IConfigurationData.cs",
    "content": "﻿namespace DoomLauncher.Interfaces\n{\n    public interface IConfigurationData\n    {\n        int ConfigID { get; set; }\n        string Name { get; set; }\n        string Value { get; set; }\n        string AvailableValues { get; set; }\n        bool UserCanModify { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IConfigurationDataSourceAdapter.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface IConfigurationDataSourceAdapter\n    {\n        IEnumerable<IConfigurationData> GetConfiguration();\n        void InsertConfiguration(IConfigurationData config);\n        void UpdateConfiguration(IConfigurationData config);\n\n        IEnumerable<ITagData> GetTags();\n        void InsertTag(ITagData tag);\n        void UpdateTag(ITagData tag);\n        void DeleteTag(ITagData tag);\n        IEnumerable<ITagMapping> GetTagMappings();\n        IEnumerable<ITagMapping> GetTagMappings(int gameFileID);\n        void InsertTagMapping(ITagMapping tag);\n        void DeleteTagMapping(ITagMapping tag);\n        void DeleteTagMapping(int tagID);\n\n        IEnumerable<IGameProfile> GetGameProfiles(int gameFileID);\n        IEnumerable<IGameProfile> GetGlobalGameProfiles();\n        void InsertGameProfile(IGameProfile gameProfile);\n        void UpdateGameProfile(IGameProfile gameProfile);\n        void DeleteGameProfile(int gameProfileID);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/ICustomParam.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public interface ICustomParam\n    {\n        int CustomParamID { get; set; }\n        int GameFileID { get; set; }\n        string FileName { get; set; }\n        string Parameter { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IDataSourceAdapter.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface IDataSourceAdapter : IGameFileDataSourceAdapter, IIWadDataSourceAdapter, IConfigurationDataSourceAdapter, IStatsDataSourceAdapter\n    {\n        void UpdateGameFiles(GameFileFieldType ftWhere, GameFileFieldType ftSet, object fWhere, object fSet);\n\n        IEnumerable<ISourcePortData> GetSourcePorts(bool loadArchived = false);\n        IEnumerable<ISourcePortData> GetUtilities(bool loadArchived = false);\n\n        IEnumerable<ISourcePortData> GetDoom64(bool loadArchived = false);\n\n        ISourcePortData GetSourcePort(int sourcePortID);\n        void InsertSourcePort(ISourcePortData sourcePort);\n        void UpdateSourcePort(ISourcePortData sourcePort);\n        void DeleteSourcePort(ISourcePortData sourcePort);\n\n        IEnumerable<IFileData> GetFiles();\n        IEnumerable<IFileData> GetFiles(IGameFile gameFile);\n        IEnumerable<IFileData> GetFiles(IGameFile gameFile, FileType fileTypeID);\n        IEnumerable<IFileData> GetFiles(FileType fileTypeID);\n        void UpdateFile(IFileData file);\n        void UpdateFiles(int sourcePortID_Where, int? sourcePortID_Set);\n        void InsertFile(IFileData file);\n        void DeleteFile(IFileData file);\n        void DeleteFile(IGameFile file);\n        void DeleteFiles(ISourcePortData sourcePort, FileType fileTypeID);\n\n        IEnumerable<IGameFile> GetGameFiles(ITagData tag);\n        IEnumerable<IGameFile> GetGameFiles(IGameFileGetOptions options, ITagData tag);\n\n        IEnumerable<CleanupFile> GetCleanupFiles();\n        void InsertCleanupFile(CleanupFile file);\n        void DeleteCleanupFile(CleanupFile file);\n\n        //IEnumerable<ICustomParamDataSource> GetCustomParameters(int gameFileID);\n        //void InsertCustomParameter(ICustomParamDataSource data);\n        //void DeleteCustomParameter(ICustomParamDataSource data);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IDatabaseAdapter.cs",
    "content": "﻿using System.Data.Common;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface IDatabaseAdapter\n    {\n        DbConnection CreateConnection(string connectionString);\n        DbDataAdapter CreateAdapter();\n        DbParameter CreateParameter(string name, object value);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IFileAssociationView.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Interfaces\n{\n    public class MenuOptions\n    {\n        public string Title { get; set; }\n        public Func<bool> Action { get; set; }\n    }\n\n    interface IFileAssociationView\n    {\n        void SetContextMenu(ContextMenuStrip menu);\n        void SetData(IGameFile gameFile);\n        void ClearData();\n\n        bool DeleteAllowed { get; }\n        bool CopyOrExportAllowed { get; }\n        bool NewAllowed { get; }\n        bool EditAllowed { get; }\n        bool ViewAllowed { get; }\n        bool ChangeOrderAllowed { get; }\n\n        bool New();\n        bool Edit();\n        bool Delete();\n        void CopyToClipboard();\n        void CopyAllToClipboard();\n        void View();\n        bool MoveFileOrderUp();\n        bool MoveFileOrderDown();\n        bool SetFileOrderFirst();\n        bool Export();\n        bool ExportAll();\n\n        IGameFile GameFile { get; set; }\n\n        IList<MenuOptions> MenuOptions { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IFileData.cs",
    "content": "﻿using System;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface IFileData\n    {\n        int? FileID { get; set; }\n        int GameFileID { get; set; }\n        string FileName { get; set; }\n        DateTime DateCreated { get; set; }\n        FileType FileTypeID { get; set; }\n        int SourcePortID { get; set; }\n        string Description { get; set; }\n        string OriginalFileName { get; set; }\n        string OriginalFilePath { get; set; }\n        string UserTitle { get; set; }\n        string UserDescription { get; set; }\n        string Map { get; set; }\n        int FileOrder { get; set; }\n        bool IsUrl { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IGameFile.cs",
    "content": "﻿using System;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface IGameFile\n    {\n        int? GameFileID { get; set; }\n        string FileName { get; set; }\n        string FileNameBase { get; }\n        string FileNameNoPath { get; }\n        string LastDirectory { get; }\n        string Title { get; set; }\n        string Author { get; set; }\n        DateTime? ReleaseDate { get; set; }\n        string Description { get; set; }\n        int? IWadID { get; set; }\n        int? SourcePortID { get; set; }\n        string Thumbnail { get; set; }\n        string Comments { get; set; }\n        string Map { get; set; }\n        int? MapCount { get; set; }\n        double? Rating { get; set; }\n        DateTime? LastPlayed { get; set; }\n        DateTime? Downloaded { get; set; }\n\n        string SettingsMap { get; set; }\n        string SettingsSkill { get; set; }\n        string SettingsExtraParams { get; set; }\n        string SettingsFiles { get; set; }\n        string SettingsFilesSourcePort { get; set; }\n        string SettingsFilesIWAD { get; set; }\n        string SettingsSpecificFiles { get; set; }\n        bool SettingsStat { get; set; }\n        bool SettingsLoadLatestSave { get; set; }\n        bool SettingsSaved { get; set; }\n        bool SettingsExtraParamsOnly { get; set; }\n        int? SettingsGameProfileID { get; set; }\n\n        int MinutesPlayed { get; set; }\n        int FileSizeBytes { get; set; }\n\n        bool IsDoom64 { get; set; }\n\n        bool IsUnmanaged();\n        bool IsDirectory();\n\n        IArchiveReader OpenGameFile(LauncherPath gameFileDirectory);\n\n        bool ArchiveExists(LauncherPath gameFileDirectory);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IGameFileColumnView.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\n\nnamespace DoomLauncher\n{\n    public interface IGameFileColumnView : IGameFileView, IGameFileSortableView\n    {\n        event CancelEventHandler CustomRowPaint;\n\n        bool CustomRowColorPaint { get; set; }\n        IGameFile CustomRowPaintDataBoundItem { get; }\n        Color CustomRowPaintForeColor { get; set; }\n\n        ColumnField[] ColumnFields { get; }\n        void SetColumnFields(IEnumerable<ColumnField> columnFields);\n        void SetColumnFormat(string colName, string format);\n        void SetColumnWidth(string key, int width);\n        int GetColumnWidth(string key);\n\n        string[] GetColumnKeyOrder();\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IGameFileDataSourceAdapter.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface IGameFileDataSourceAdapter\n    {\n        int GetGameFilesCount();\n        IEnumerable<IGameFile> GetGameFiles();\n        IEnumerable<IGameFile> GetGameFiles(IGameFileGetOptions options);\n        IEnumerable<IGameFile> GetGameFileIWads();\n        IEnumerable<IGameFile> GetUntaggedGameFiles();\n        IEnumerable<string> GetGameFileNames();\n        IGameFile GetGameFile(string fileName);\n        void InsertGameFile(IGameFile gameFile);\n        void UpdateGameFile(IGameFile gameFile);\n        void UpdateGameFile(IGameFile gameFile, GameFileFieldType[] updateFields);\n        void DeleteGameFile(IGameFile gameFile);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IGameFileDownloadable.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Net;\n\nnamespace DoomLauncher.Interfaces\n{\n    interface IGameFileDownloadable\n    {\n        event DownloadProgressChangedEventHandler DownloadProgressChanged;\n        event AsyncCompletedEventHandler DownloadCompleted;\n\n        void Download(IGameFileDataSourceAdapter adapter, string dlFilename);\n        void Cancel();\n        string FileName { get; set; }\n        int FileSizeBytes { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IGameFileSortableView.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public interface IGameFileSortableView\n    {\n        string GetSortedColumnKey();\n        SortOrder GetColumnSort(string key);\n\n        void SetSortedColumn(string key, SortOrder sort);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IGameFileTile.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public interface IGameFileTile\n    {\n        event MouseEventHandler TileClick;\n        event EventHandler TileDoubleClick;\n\n        IGameFile GameFile { get; }\n        bool Selected { get; }\n\n        void SetSelected(bool set);\n        void SetData(IGameFile gameFile, IEnumerable<ITagData> tags);\n        void SetImageLocation(string file);\n        void SetImage(Image image);\n        void ClearData();\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IGameFileView.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class GameFileEventArgs\n    {\n        public IGameFile GameFile { get; private set; }\n        public GameFileEventArgs(IGameFile gameFile)\n        {\n            GameFile = gameFile;\n        }\n    }\n\n    public delegate void GameFileEventHandler(object sender, GameFileEventArgs e);\n\n    public interface IGameFileView\n    {\n        event EventHandler ItemClick;\n        event EventHandler ItemDoubleClick;\n        event EventHandler SelectionChange;\n        event KeyPressEventHandler ViewKeyPress;\n        event KeyEventHandler ViewKeyDown;\n        event DragEventHandler DragEnter;\n        event DragEventHandler DragDrop;\n        event GameFileEventHandler GameFileEnter;\n        event GameFileEventHandler GameFileLeave;\n\n        void SetDisplayText(string text);\n        void SetContextMenuStrip(ContextMenuStrip menu);\n        IEnumerable<IGameFile> DataSource { get; set; }\n        IGameFile SelectedItem { get; set; }\n        IGameFile[] SelectedItems { get; }\n        IGameFile GameFileForIndex(int index);\n        void RefreshData();\n        bool Focus();\n        void UpdateGameFile(IGameFile gameFile);\n\n        bool MultiSelect { get; set; }\n        bool AllowDrop { get; set; }\n\n        void SuspendLayout();\n        void ResumeLayout();\n\n        object DoomLauncherParent { get; set; }\n\n        void SetVisible(bool set);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IGameProfile.cs",
    "content": "﻿namespace DoomLauncher.Interfaces\n{\n    public interface IGameProfile\n    {\n        int GameProfileID { get; set; }\n        int? GameFileID { get; set; }\n        int? IWadID { get; set; }\n        int? SourcePortID { get; set; }\n        string Name { get; set; }\n        string SettingsMap { get; set; }\n        string SettingsSkill { get; set; }\n        string SettingsExtraParams { get; set; }\n        string SettingsFiles { get; set; }\n        string SettingsFilesSourcePort { get; set; }\n        string SettingsFilesIWAD { get; set; }\n        string SettingsSpecificFiles { get; set; }\n        bool SettingsStat { get; set; }\n        bool SettingsLoadLatestSave { get; set; }\n        bool SettingsSaved { get; set; }\n        bool SettingsExtraParamsOnly { get; set; }\n        bool IsGlobal { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IIWadData.cs",
    "content": "﻿namespace DoomLauncher.Interfaces\n{\n    public interface IIWadData\n    {\n        int IWadID { get; set; }\n        string Name { get; set; }\n        string FileName { get; set; }\n\n        string FileNameBase { get; }\n\n        int? GameFileID { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IIWadDataSourceAdapter.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface IIWadDataSourceAdapter\n    {\n        IEnumerable<IIWadData> GetIWads();\n        IIWadData GetIWad(int gameFileID);\n        void InsertIWad(IIWadData iwad);\n        void DeleteIWad(IIWadData iwad);\n        void UpdateIWad(IIWadData iwad);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/INewFileDetector.cs",
    "content": "﻿namespace DoomLauncher.Interfaces\n{\n    public interface INewFileDetector\n    {\n        void StartDetection();\n        string[] GetNewFiles();\n        string[] GetModifiedFiles();\n        string[] GetDeletedFiles();\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/ISettingsDataSource.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface ISettingsDataSource\n    {\n        int GameFileID { get; set; }\n        int SettingsID { get; set; }\n        string SettingsName { get; set; }\n        string SettingsMap { get; set; }\n        string SettingsSkill { get; set; }\n        string SettingsExtraParams { get; set; }\n        string SettingsFiles { get; set; }\n        string SettingsSpecificFiles { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/ISourcePortData.cs",
    "content": "﻿using DoomLauncher.SourcePort;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface ISourcePortData\n    {\n        int SourcePortID { get; set; }\n        string Name { get; set; }\n        string Executable { get; set; }\n        string SupportedExtensions { get; set; }\n        LauncherPath Directory { get; set; }\n        string SettingsFiles { get; set; }\n        SourcePortLaunchType LaunchType { get; set; }\n        string FileOption { get; set; }\n        string ExtraParameters { get; set; }\n        LauncherPath AltSaveDirectory { get; set; }\n        bool Archived { get; set; }\n\n        ISourcePortFlavor GetFlavor();\n\n        string GetFullExecutablePath();\n        LauncherPath GetReadSavePath();\n        LauncherPath GetLoadSavePath();\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IStatsData.cs",
    "content": "﻿using System;\n\nnamespace DoomLauncher\n{\n    public interface IStatsData\n    {\n        int KillCount { get; set; }\n        int TotalKills { get; set; }\n        int SecretCount { get; set; }\n        int TotalSecrets { get; set; }\n        float LevelTime { get; set; }\n        int ItemCount { get; set; }\n        int TotalItems { get; set; }\n        string MapName { get; set; }\n        DateTime RecordTime { get; set; }\n        int? Skill { get; set; }\n\n        string FormattedKills { get; }\n        string FormattedSecrets { get; }\n        string FormattedItems { get; }\n        string FormattedTime { get; }\n\n        int GameFileID { get; set; }\n        int SourcePortID { get; set; }\n        int StatID { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/IStatsDataSourceAdapter.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface IStatsDataSourceAdapter\n    {\n        IEnumerable<IStatsData> GetStats();\n        IEnumerable<IStatsData> GetStats(int gameFileID);\n        IEnumerable<IStatsData> GetStats(IEnumerable<IGameFile> gameFiles);\n        void InsertStats(IStatsData stats);\n        void UpdateStats(IStatsData stats);\n        void DeleteStatsByFile(int gameFileID);\n        void DeleteStats(int statID);\n        void DeleteStats(ISourcePortData sourcePort);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/ITabView.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface ITabView : ICloneable\n    {\n        event EventHandler<GameFileListEventArgs> DataSourceChanging;\n        event EventHandler<GameFileListEventArgs> DataSourceChanged;\n\n        void SetGameFiles();\n        void SetGameFiles(IEnumerable<GameFileSearchField> searchFields);\n        void SetGameFilesData(IEnumerable<IGameFile> gameFiles);\n        void UpdateDataSourceFile(IGameFile gameFile);\n        List<ColumnConfig> GetColumnConfig();\n        void SetColumnConfig(ColumnField[] columnTextFields, ColumnConfig[] colConfig);\n        bool IsLocal { get; }\n        bool IsEditAllowed { get; }\n        bool IsDeleteAllowed { get; }\n        bool IsSearchAllowed { get; }\n        bool IsPlayAllowed { get; }\n        bool IsAutoSearchAllowed { get; }\n        string Title { get; set; }\n        object Key { get; }\n        IGameFileDataSourceAdapter Adapter { get; set; }\n        IGameFileView GameFileViewControl { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/ITagData.cs",
    "content": "﻿namespace DoomLauncher.Interfaces\n{\n    public interface ITagData\n    {\n        int TagID { get; set; }\n        string Name { get; set; }\n        bool HasTab { get; set; }\n        bool HasColor { get; set; }\n        int? Color { get; set; }\n        bool ExcludeFromOtherTabs { get; set; }\n        bool Favorite { get; set; }\n        string FavoriteName { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/ITagMapLookup.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DoomLauncher.Interfaces\n{\n    public interface ITagMapLookup\n    {\n        event EventHandler<ITagData[]> TagMappingChanged;\n        void Refresh(ITagData[] tags);\n        void RemoveGameFile(IGameFile gameFile);\n        ITagData[] GetTags(IGameFile gameFile);\n        IEnumerable<ITagData> GetEnumerableTags(IGameFile gameFile);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Interfaces/ITagMapping.cs",
    "content": "﻿namespace DoomLauncher.Interfaces\n{\n    public interface ITagMapping\n    {\n        int TagID { get; set; }\n        int FileID { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/LaunchArgs.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public class LaunchArgs\n    {\n        public string LaunchFileName { get; set; }\n        public int? LaunchGameFileID { get; set; }\n        public bool AutoClose { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Program.Init.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\nusing DoomLauncher.Config;\nusing DoomLauncher.WindowsVersion;\nusing Microsoft.Win32;\nusing DoomLauncher.DataSources;\n\nnamespace DoomLauncher\n{\n    public static class ProgramInit\n    {\n        public static bool Init()\n        {\n            bool success = false;\n            CleanOldLibraries();\n            CheckInteropUpdate();\n\n            if (VerifyDatabase())\n            {\n                string dataSource = Path.Combine(LauncherPath.GetDataDirectory(), DbDataSourceAdapter.DatabaseFileName);\n                IDataSourceAdapter dataSourceAdapter = DbDataSourceAdapter.CreateAdapter();\n                DataCache.Instance.Init(dataSourceAdapter);\n\n                BackupDatabase(dataSource);\n                CreateSendToLink();\n                KillRunningApps();\n\n                success = VerifyGameFilesDirectory();\n            }\n\n            return success;\n        }\n\n        public static void CheckSystemTheme()\n        {\n            try\n            {\n                var adapter = DataCache.Instance.DataSourceAdapter;\n                if (DataCache.Instance.AppConfiguration.ConfigurationColorTheme != ColorThemeType.System &&\n                    adapter.GetSourcePorts().Any())\n                {\n                    DataCache.Instance.AppConfiguration.ColorTheme = DataCache.Instance.AppConfiguration.ConfigurationColorTheme;\n                    return;\n                }\n\n                ColorThemeType theme;\n                switch (WindowsVersionInfo.GetTheme())\n                {\n                    case WindowsTheme.Light:\n                        theme = ColorThemeType.Default;\n                        ColorTheme.Current = new DefaultTheme();\n                        break;\n                    case WindowsTheme.Dark:\n                    case WindowsTheme.Unknown:\n                    default:\n                        theme = ColorThemeType.Dark;\n                        ColorTheme.Current = new DarkTheme();\n                        break;\n                }\n\n                DataCache.Instance.AppConfiguration.ColorTheme = theme;\n            }\n            catch\n            {\n\n            }\n        }\n\n        private static bool VerifyGameFilesDirectory()\n        {\n            if (Directory.Exists(DataCache.Instance.AppConfiguration.GameFileDirectory.GetFullPath()))\n                return true;\n\n            bool check = false;\n\n            try\n            {\n                InitGameFilesDebug();\n                check = InitFileCheck(\"GameFiles\", \"GameFiles_\", true);\n\n                if (!check)\n                {\n                    MessageBox.Show(\"Initialization failure. Could not find DoomLauncher GameFiles directory. Please update your settings to continue.\",\n                        \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n\n                    DialogResult result;\n                    bool success = false;\n\n                    do\n                    {\n                        success = ShowSettings(true, out result);\n                    } while (result != DialogResult.Cancel && !success);\n\n                    check = success;\n                }\n            }\n            catch (Exception ex)\n            {\n                Util.DisplayUnexpectedException(null, ex);\n            }\n\n            return check;\n        }\n\n        private static bool ShowSettings(bool allowCancel, out DialogResult result)\n        {\n            SettingsForm form = new SettingsForm(DataCache.Instance.DataSourceAdapter, DataCache.Instance.AppConfiguration);\n            form.SetCancelAllowed(allowCancel);\n            form.StartPosition = FormStartPosition.CenterParent;\n            result = form.ShowDialog();\n\n            if (result == DialogResult.OK)\n            {\n                try\n                {\n                    DataCache.Instance.AppConfiguration.Refresh();\n                }\n                catch (DirectoryNotFoundException ex)\n                {\n                    MessageBox.Show(string.Format(\"The directory {0} was not found. DoomLauncher will not operate correctly with invalid paths. \" +\n                        \"Make sure the directory you are setting contains all folders required (Demos, SaveGames, Screenshots, Temp)\", ex.Message),\n                        \"Invalid Directory\",\n                        MessageBoxButtons.OK, MessageBoxIcon.Error);\n                    return false;\n                }\n                catch (Exception ex)\n                {\n                    Util.DisplayUnexpectedException(null, ex);\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        [Conditional(\"DEBUG\")]\n        private static void InitGameFilesDebug()\n        {\n            try\n            {\n                string basePath = \"GameFiles\";\n\n                if (!Directory.Exists(basePath))\n                {\n                    Directory.CreateDirectory(Path.Combine(basePath, \"Demos\"));\n                    Directory.CreateDirectory(Path.Combine(basePath, \"SaveGames\"));\n                    Directory.CreateDirectory(Path.Combine(basePath, \"Screenshots\"));\n                    Directory.CreateDirectory(Path.Combine(basePath, \"Temp\"));\n                }\n            }\n            catch\n            {\n                // For local debug code only, just catch if we testing in debug outside of dev\n            }\n        }\n\n        private static void BackupDatabase(string dataSource)\n        {\n            FileInfo fi = new FileInfo(dataSource);\n\n            if (fi.Exists)\n            {\n                Directory.CreateDirectory(Path.Combine(LauncherPath.GetDataDirectory(), \"Backup\"));\n                string backupName = GetBackupFileName(fi);\n\n                FileInfo fiBackup = new FileInfo(backupName);\n                if (!fiBackup.Exists)\n                    fi.CopyTo(backupName);\n\n                CleanupBackupDirectory();\n            }\n        }\n\n        private static void CleanupBackupDirectory()\n        {\n            string[] files = Directory.GetFiles(Path.Combine(LauncherPath.GetDataDirectory(), \"Backup\"), \"*.sqlite\");\n            List<FileInfo> filesInfo = new List<FileInfo>();\n            Array.ForEach(files, x => filesInfo.Add(new FileInfo(x)));\n            List<FileInfo> filesInfoOrdered = filesInfo.OrderBy(x => x.CreationTime).ToList();\n\n            while (filesInfoOrdered.Count > 10)\n            {\n                filesInfoOrdered.First().Delete();\n                filesInfoOrdered.RemoveAt(0);\n            }\n        }\n\n        private static string GetBackupFileName(FileInfo fi)\n        {\n            string end = DateTime.Now.ToString(\"yyyy_MM_dd\") + fi.Extension;\n            return Path.Combine(fi.DirectoryName, \"Backup\", fi.Name.Replace(fi.Extension, end));\n        }\n\n        private static bool VerifyDatabase()\n        {\n            bool check = false;\n            try\n            {\n                if (File.Exists(Path.Combine(LauncherPath.GetDataDirectory(), DbDataSourceAdapter.DatabaseFileName)))\n                {\n                    check = true;\n                    // Still attempt to delete the init database here for people that manually update (not installed)\n                    if (File.Exists(DbDataSourceAdapter.InitDatabaseFileName))\n                        File.Delete(DbDataSourceAdapter.InitDatabaseFileName);\n                    return check;\n                }\n\n                check = InitFileCheck(DbDataSourceAdapter.DatabaseFileName, DbDataSourceAdapter.InitDatabaseFileName, false);\n\n                if (!check)\n                {\n                    MessageBox.Show(\"Initialization failure. Could not find DoomLauncher database\",\n                        \"Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n            }\n            catch (Exception ex)\n            {\n                Util.DisplayUnexpectedException(null, ex);\n            }\n\n            return check;\n        }\n\n        private static bool InitFileCheck(string initFile, string file, bool directory)\n        {\n            string dataSource = Path.Combine(Directory.GetCurrentDirectory(), initFile);\n            string initDataSource = Path.Combine(Directory.GetCurrentDirectory(), file);\n\n            if (directory)\n            {\n                DirectoryInfo diInit = new DirectoryInfo(initDataSource);\n                DirectoryInfo diSource = new DirectoryInfo(dataSource);\n\n                if (diSource.Exists)\n                {\n                    if (diInit.Exists)\n                        diInit.Delete(true);\n                }\n                else\n                {\n                    if (diInit.Exists)\n                        diInit.MoveTo(dataSource);\n                    else\n                        return false;\n                }\n            }\n            else\n            {\n                FileInfo fiInit = new FileInfo(initDataSource);\n\n                if (File.Exists(dataSource))\n                {\n                    if (fiInit.Exists)\n                        fiInit.Delete();\n                }\n                else\n                {\n                    if (fiInit.Exists)\n                        fiInit.MoveTo(dataSource);\n                    else\n                        return false;\n                }\n            }\n\n            return true;\n        }\n\n        private static void CleanOldLibraries()\n        {\n            // Need to remove the old sqlite interop, only if it wasn't done through the installer\n            // The installer doesn't really support x86/x64 folders so the x64 dll is dumped in the main for now\n            if (LauncherPath.IsInstalled())\n                return;\n\n            try\n            {\n                string[] libraries = new string[] { \"SQLite.Interop.dll\", \"SQLite.Interop.dll.bak\", \"7z.dll\" };\n                foreach (string library in libraries)\n                {\n                    if (!File.Exists(library))\n                        continue;\n                    File.Delete(library);\n                }\n            }\n            catch\n            {\n                // Do not crash if it fails to delete for any reason\n            }\n        }\n\n        private static void CheckInteropUpdate()\n        {\n            if (LauncherPath.IsInstalled())\n                return;\n\n            string[] dirs = new string[] { \"x86\", \"x64\" };\n            string updateFile = Path.Combine(\"GameFiles\\\\Temp\", UpdateControl.AppUpdateFileName);\n            if (!File.Exists(updateFile) || AllInteropsExist())\n                return;\n\n            using (ZipArchive za = ZipFile.OpenRead(updateFile))\n            {\n                foreach (string dir in dirs)\n                {\n                    if (!Directory.Exists(dir))\n                        Directory.CreateDirectory(dir);\n\n                    var entries = za.Entries.Where(x => x.FullName.Contains(dir));\n                    foreach (var entry in entries)\n                        entry.ExtractToFile(Path.Combine(Directory.GetCurrentDirectory(), dir, entry.Name), true);\n                }\n            }\n        }\n\n        private static bool AllInteropsExist()\n        {\n            DirectoryInfo[] dirs = new DirectoryInfo[] { new DirectoryInfo(\"x86\"), new DirectoryInfo(\"x64\") };\n\n            foreach (DirectoryInfo dir in dirs)\n            {\n                if (!dir.Exists)\n                    return false;\n\n                FileInfo[] files = dir.GetFiles();\n                if (!files.Any(x => x.Name.Equals(\"SQLite.Interop.dll\", StringComparison.OrdinalIgnoreCase)))\n                    return false;\n                if (!files.Any(x => x.Name.Equals(\"7z.dll\", StringComparison.OrdinalIgnoreCase)))\n                    return false;\n            }\n\n            return true;\n        }\n\n        private static void CreateSendToLink()\n        {\n            //http://stackoverflow.com/questions/234231/creating-application-shortcut-in-a-directory\n            Type t = Type.GetTypeFromCLSID(new Guid(\"72C24DD5-D70A-438B-8A42-98424B88AFB8\")); //Windows Script Host Shell Object\n            dynamic shell = Activator.CreateInstance(t);\n            try\n            {\n                string sendToPath = Environment.ExpandEnvironmentVariables(@\"%AppData%\\Microsoft\\Windows\\SendTo\");\n                var lnk = shell.CreateShortcut(Path.Combine(sendToPath, \"DoomLauncher.lnk\"));\n\n                // This should always exist, but a user did report not having this folder on Windows 10...\n                if (!Directory.Exists(sendToPath))\n                    Directory.CreateDirectory(sendToPath);\n\n                try\n                {\n                    lnk.TargetPath = Path.Combine(Directory.GetCurrentDirectory(), Util.GetExecutableNoPath());\n                    lnk.IconLocation = string.Format(Path.Combine(Directory.GetCurrentDirectory(), \"DoomLauncher.ico\"));\n                    lnk.Save();\n                }\n                catch\n                {\n                    // Do not crash just for failing to create SendTo link\n                }\n                finally\n                {\n                    Marshal.FinalReleaseComObject(lnk);\n                }\n            }\n            catch\n            {\n                // Do not crash just for failing to create SendTo link\n            }\n            finally\n            {\n                Marshal.FinalReleaseComObject(shell);\n            }\n        }\n\n        private static void KillRunningApps()\n        {\n            try\n            {\n                Process currentProc = Process.GetCurrentProcess();\n                foreach (Process proc in Process.GetProcessesByName(\"DoomLauncher\").Where(x => x.Id != currentProc.Id))\n                {\n                    proc.CloseMainWindow();\n\n                    Stopwatch sw = Stopwatch.StartNew();\n                    while (sw.Elapsed.TotalSeconds < 10 && !proc.HasExited)\n                    {\n                        System.Threading.Thread.Sleep(100);\n                        proc.Refresh();\n                    }\n                }\n            }\n            catch\n            {\n                MessageBox.Show(\"Doom Launcher is already running and could not be stopped. It is not recommended to have more than instance running!\", \"Already Running\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Program.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    static class Program\n    {\n        [STAThread]\n        static void Main(string[] args)\n        {\n            try\n            {\n                Directory.SetCurrentDirectory(AssemblyDirectory);\n\n                Application.EnableVisualStyles();\n                Application.SetCompatibleTextRenderingDefault(false);\n\n                var splash = new SplashScreen();\n                splash.StartPosition = FormStartPosition.CenterScreen;\n                splash.Show();\n                splash.Invalidate();\n\n                if (!ProgramInit.Init())\n                    return;\n\n                ProgramInit.CheckSystemTheme();\n\n                MainForm form = new MainForm(GetLaunchArgs(args), splash);\n                form.Load += Form_Load;\n                Application.Run(form);\n            }\n            catch (Exception ex)\n            {\n                Util.DisplayUnexpectedException(null, ex);\n            }\n        }\n\n        private static async void Form_Load(object sender, EventArgs e)\n        {\n            MainForm form = sender as MainForm;\n            await form.Init();\n        }\n\n        static string AssemblyDirectory\n        {\n            get\n            {\n                string codeBase = Assembly.GetExecutingAssembly().CodeBase;\n                UriBuilder uri = new UriBuilder(codeBase);\n                string path = Uri.UnescapeDataString(uri.Path);\n                return Path.GetDirectoryName(path);\n            }\n        }\n\n        private static readonly string[] ArgKeys = new string[]\n        { \n            nameof(LaunchArgs.LaunchGameFileID),\n        };\n\n        private static readonly string[] FlagKeys = new string[]\n        {\n            nameof(LaunchArgs.AutoClose)\n        };\n\n        static LaunchArgs GetLaunchArgs(string[] args)\n        {\n            LaunchArgs launchArgs = new LaunchArgs();\n\n            for (int i = 0; i < args.Length; i++)\n            {\n                var arg = args[i];\n                if (!arg.StartsWith(\"-\"))\n                {\n                    launchArgs.LaunchFileName = args[i];\n                    break;\n                }\n\n                arg = arg.Substring(1);\n\n                var flag = FlagKeys.FirstOrDefault(x => x.Equals(arg, StringComparison.OrdinalIgnoreCase));\n                if (flag != null)\n                {\n                    SetLaunchFlag(launchArgs, flag);\n                    continue;\n                }\n\n                var argKey = ArgKeys.FirstOrDefault(x => x.Equals(arg, StringComparison.OrdinalIgnoreCase));\n                if (!ArgKeys.Any(x => x.Equals(arg, StringComparison.OrdinalIgnoreCase)))\n                    continue;\n\n                var pi = typeof(LaunchArgs).GetProperty(argKey);\n                if (pi == null)\n                    continue;\n\n                i++;\n                if (i >= args.Length)\n                    break;\n\n                if (!int.TryParse(args[i], out int value))\n                    continue;\n\n                pi.SetValue(launchArgs, value);\n            }\n\n            return launchArgs;\n        }\n\n        private static void SetLaunchFlag(LaunchArgs launchArgs, string flag)\n        {\n            var pi = typeof(LaunchArgs).GetProperty(flag);\n            if (pi == null)\n                return;\n\n            pi.SetValue(launchArgs, true);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/ProgressBarType.cs",
    "content": "﻿namespace DoomLauncher\n{\n    enum ProgressBarType\n    {\n        Copy,\n        Sync,\n        Update,\n        Delete,\n        Search,\n        CreateZip\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"DoomLauncher\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"DoomLauncher\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"0c03f10e-9945-4048-8708-d9623e8845ec\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"3.8.1.0\")]\n[assembly: AssemblyFileVersion(\"3.8.1.0\")]\n"
  },
  {
    "path": "DoomLauncher/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace DoomLauncher.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"DoomLauncher.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Bars {\n            get {\n                object obj = ResourceManager.GetObject(\"Bars\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap bon2a {\n            get {\n                object obj = ResourceManager.GetObject(\"bon2a\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap bon2b {\n            get {\n                object obj = ResourceManager.GetObject(\"bon2b\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Delete {\n            get {\n                object obj = ResourceManager.GetObject(\"Delete\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap DoomLauncherTile {\n            get {\n                object obj = ResourceManager.GetObject(\"DoomLauncherTile\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Byte[].\n        /// </summary>\n        internal static byte[] DoomPalette {\n            get {\n                object obj = ResourceManager.GetObject(\"DoomPalette\", resourceCulture);\n                return ((byte[])(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap DownArrow {\n            get {\n                object obj = ResourceManager.GetObject(\"DownArrow\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Edit {\n            get {\n                object obj = ResourceManager.GetObject(\"Edit\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Export {\n            get {\n                object obj = ResourceManager.GetObject(\"Export\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap ExportAll {\n            get {\n                object obj = ResourceManager.GetObject(\"ExportAll\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap File {\n            get {\n                object obj = ResourceManager.GetObject(\"File\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap FolderOpen {\n            get {\n                object obj = ResourceManager.GetObject(\"FolderOpen\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Byte[].\n        /// </summary>\n        internal static byte[] HereticPalette {\n            get {\n                object obj = ResourceManager.GetObject(\"HereticPalette\", resourceCulture);\n                return ((byte[])(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Byte[].\n        /// </summary>\n        internal static byte[] HexenPalette {\n            get {\n                object obj = ResourceManager.GetObject(\"HexenPalette\", resourceCulture);\n                return ((byte[])(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap kill {\n            get {\n                object obj = ResourceManager.GetObject(\"kill\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap map {\n            get {\n                object obj = ResourceManager.GetObject(\"map\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Pin {\n            get {\n                object obj = ResourceManager.GetObject(\"Pin\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Play {\n            get {\n                object obj = ResourceManager.GetObject(\"Play\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Save {\n            get {\n                object obj = ResourceManager.GetObject(\"Save\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Search {\n            get {\n                object obj = ResourceManager.GetObject(\"Search\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap secret {\n            get {\n                object obj = ResourceManager.GetObject(\"secret\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap StepBack {\n            get {\n                object obj = ResourceManager.GetObject(\"StepBack\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Tags {\n            get {\n                object obj = ResourceManager.GetObject(\"Tags\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap th {\n            get {\n                object obj = ResourceManager.GetObject(\"th\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap UpArrow {\n            get {\n                object obj = ResourceManager.GetObject(\"UpArrow\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap Video {\n            get {\n                object obj = ResourceManager.GetObject(\"Video\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"bon2a\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\bon2a_extra.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"bon2b\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\bon2d.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"kill\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\POSSL0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"th\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\th.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"secret\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\SOULB0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"DoomLauncherTile\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\DoomLauncherTile.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"map\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\PMAPA0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Delete\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"DownArrow\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\DownArrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Edit\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Export\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"ExportAll\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\ExportAll.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"File\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\File.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"FolderOpen\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\FolderOpen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Play\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Play.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Save\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Search\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Search.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"StepBack\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\StepBack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"UpArrow\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\UpArrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Video\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Video.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Bars\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Bars.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Tags\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Tags.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Pin\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Pin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"DoomPalette\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\PLAYPAL.LMP;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"HexenPalette\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\HexenPalette.pal;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"HereticPalette\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\HereticPalette.pal;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n</root>"
  },
  {
    "path": "DoomLauncher/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace DoomLauncher.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"17.0.3.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>\n"
  },
  {
    "path": "DoomLauncher/RecentFileType.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace DoomLauncher\n{\n    public enum RecentFileType\n    {\n        Played,\n        Downloaded\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SaveGame/DsgSaveGameReader.cs",
    "content": "﻿using System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace DoomLauncher.SaveGame\n{\n    public class DsgSaveGameReader : ISaveGameReader\n    {\n        private readonly string m_file;\n\n        public DsgSaveGameReader(string file)\n        {\n            m_file = file;\n        }\n\n        public string GetName()\n        {\n            try\n            {\n                using (var stream = File.OpenRead(m_file))\n                {\n                    byte[] data = new byte[24];\n                    int read = stream.Read(data, 0, data.Length);\n\n                    if (read != -1)\n                    {\n                        int index = data.ToList().IndexOf(0);\n                        if (index == -1)\n                            index = data.Length;\n                        if (index > 0)\n                            return Encoding.UTF8.GetString(data.Take(index).ToArray());\n                    }\n                }\n            }\n            catch\n            {\n                //continue to return the filename if we fail for any reason\n            }\n\n            return Path.GetFileName(m_file);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SaveGame/HelionSaveGameReader.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace DoomLauncher.SaveGame\n{\n    public class HelionSaveGameReader : ISaveGameReader\n    {\n        private readonly string m_file;\n\n        public HelionSaveGameReader(string file)\n        {\n            m_file = file;\n        }\n\n        public string GetName()\n        {\n            try\n            {\n                string name = TryGetSaveName(m_file);\n                if (!string.IsNullOrEmpty(name))\n                    return name;\n\n                return Path.GetFileName(m_file);\n            }\n            catch(Exception)\n            {\n                return Path.GetFileName(m_file);\n            }\n        }\n\n        private static string TryGetSaveName(string fileName)\n        {\n            ZipArchiveReader zipArchive = new ZipArchiveReader(fileName);\n            var entry = zipArchive.Entries.FirstOrDefault(x => x.Name.Equals(\"save.json\", StringComparison.OrdinalIgnoreCase));\n\n            if (entry == null)\n                return null;\n\n            JObject data = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(entry.ReadEntry())) as JObject;\n            JToken textData = data.GetValue(\"Text\");\n            if (textData == null)\n                return null;\n\n            return textData.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SaveGame/ISaveGameReader.cs",
    "content": "﻿namespace DoomLauncher.SaveGame\n{\n    public interface ISaveGameReader\n    {\n        string GetName();\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SaveGame/ZDoomSaveGameReader.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Text;\n\nnamespace DoomLauncher.SaveGame\n{\n    public class ZDoomSaveGameReader : ISaveGameReader\n    {\n        private readonly string m_file;\n\n        public ZDoomSaveGameReader(string file)\n        {\n            m_file = file;\n        }\n\n        public string GetName()\n        {\n            string name = GetNameFromJson(m_file);\n\n            if (name == null)\n                name = GetNameFromBinary(m_file);\n\n            if (name == null)\n                return Path.GetFileName(m_file);\n\n            return name;\n        }\n\n        private static string GetNameFromBinary(string file)\n        {\n            MemoryStream ms = new MemoryStream(File.ReadAllBytes(file));\n            long startPos = Util.ReadAfter(ms, Encoding.UTF8.GetBytes(\"tEXtTitle\"));\n\n            if (startPos != -1)\n            {\n                ms.Position = ++startPos;\n                long endPos = Util.ReadAfter(ms, new byte[] { 0, 0, 0 });\n\n                if (endPos != -1)\n                {\n                    int totalLength = (int)(endPos - startPos - 7);\n                    if (totalLength > 0)\n                    {\n                        if (totalLength > 24)\n                            totalLength = 24;\n                        ms.Position = startPos;\n                        byte[] strData = new byte[totalLength];\n                        ms.Read(strData, 0, totalLength);\n                        return Encoding.UTF8.GetString(strData);\n                    }\n                }\n            }\n\n            return null;\n        }\n\n        private static string GetNameFromJson(string file)\n        {\n            try\n            {\n                using (ZipArchive za = ZipFile.OpenRead(file))\n                {\n                    var entry = za.Entries.FirstOrDefault(x => x.Name.Equals(\"info.json\"));\n\n                    if (entry != null)\n                    {\n                        using (var stream = new StreamReader(entry.Open()))\n                        {\n                            JObject obj = JsonConvert.DeserializeObject(stream.ReadToEnd()) as JObject;\n                            var saveName = obj.Values().FirstOrDefault(x => x.Path == \"Title\");\n                            if (saveName != null)\n                                return saveName.ToString();\n                        }\n                    }\n                }\n            }\n            catch\n            {\n                //continue to return the filename if we fail for any reason\n            }\n\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Search/GameFileFieldType.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum GameFileFieldType\n    {\n        Filename,\n        Title,\n        Author,\n        Description,\n        ReleaseDate,\n        GameFileID,\n        LastPlayed,\n        Downloaded,\n        Map,\n        SourcePortID,\n        IWadID,\n        Comments,\n        Rating,\n        SettingsMap,\n        SettingsSkill,\n        SettingsExtraParams,\n        SettingsFiles,\n        SettingsSpecificFiles,\n        MapCount,\n        MinutesPlayed,\n        MD5,\n        SettingsStat,\n        SettingsFilesIWAD,\n        SettingsFilesSourcePort,\n        SettingsGameProfileID,\n        SettingsSaved,\n        SettingsLoadLatestSave,\n        SettingsExtraParamsOnly\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Search/GameFileGetOptions.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public class GameFileGetOptions : IGameFileGetOptions\n    {\n        public GameFileGetOptions()\n        {\n        }\n\n        public GameFileGetOptions(GameFileSearchField sf)\n        {\n            SearchField = sf;\n        }\n\n        public GameFileGetOptions(GameFileFieldType[] selectFields)\n        {\n            SelectFields = selectFields;\n        }\n\n        public GameFileGetOptions(GameFileFieldType[] selectFields, GameFileSearchField searchField)\n        {\n            SelectFields = selectFields;\n            SearchField = searchField;\n        }\n\n        public GameFileGetOptions(int limit)\n        {\n            Limit = limit;\n        }\n\n        public GameFileFieldType[] SelectFields { get; set; }\n        public GameFileSearchField SearchField { get; set; }\n        public GameFileFieldType? OrderField { get; set; }\n        public OrderType? OrderBy { get; set; }\n        public int? Limit { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Search/GameFileSearchField.cs",
    "content": "﻿using System.Linq;\n\nnamespace DoomLauncher\n{\n    public class GameFileSearchField\n    {\n        private static GameFileFieldType[] s_dateTimeFields = new GameFileFieldType[]\n        {\n            GameFileFieldType.ReleaseDate,\n            GameFileFieldType.Downloaded,\n            GameFileFieldType.LastPlayed\n        };\n\n        public GameFileSearchField(GameFileFieldType type, string search)\n        {\n            SearchFieldType = type;\n            SearchText = search;\n            SearchOp = GameFileSearchOp.Equal;\n        }\n\n        public GameFileSearchField(GameFileFieldType type, GameFileSearchOp op, string search)\n        {\n            SearchFieldType = type;\n            SearchText = search;\n            SearchOp = op;\n        }\n\n        public static bool IsDateTimeField(GameFileFieldType field)\n        {\n            return s_dateTimeFields.ToList().Contains(field);\n        }\n\n        public GameFileSearchOp SearchOp\n        {\n            get;\n            set;\n        }\n\n        public GameFileFieldType SearchFieldType\n        {\n            get;\n            set;\n        }\n\n        public string SearchText\n        {\n            get;\n            set;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Search/GameFileSearchOp.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum GameFileSearchOp\n    {\n        Equal,\n        NotEqual,\n        LessThan,\n        GreaterThan,\n        Like\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Search/IGameFileGetOptions.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public interface IGameFileGetOptions\n    {\n        GameFileFieldType[] SelectFields { get; set; }\n        GameFileSearchField SearchField { get; set; }\n        GameFileFieldType? OrderField { get; set; }\n        OrderType? OrderBy { get; set; }\n        int? Limit { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Search/OrderType.cs",
    "content": "﻿namespace DoomLauncher\n{\n    public enum OrderType\n    {\n        Asc,\n        Desc\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SourcePort/DoomsdaySourcePortFlavor.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher.SourcePort\n{\n    public class DoomsdaySourcePortFlavor : GenericSourcePortFlavor\n    {\n        public DoomsdaySourcePortFlavor(ISourcePortData sourcePortData)\n            : base(sourcePortData)\n        {\n\n        }\n\n        public override string IwadParameter(SpData data) =>\n            string.Format(\" -iwad \\\"{0}\\\" -game {1}\", Path.GetDirectoryName(data.Value), GetGame(data));\n\n        /**\n            doom1-share\tShareware Doom v1.9\n\t        doom1\tRegistered Doom v1.9\n\t        doom1-ultimate\tUltimate Doom*\n\t        doom2\tDoom 2\n\t        doom2-plut\tFinal Doom: Plutonia Experiment\n\t        doom2-tnt\tFinal Doom: TNT Evilution\n\t        chex\tChex Quest\n\t        hacx\tHacX\n            heretic-share\tShareware Heretic\n\t        heretic\tRegistered Heretic\n\t        heretic-ext\tHeretic: Shadow of the Serpent Riders**\n            hexen\tHexen v1.1\n\t        hexen-v10\tHexen v1.0\n\t        hexen-dk\tHexen: Death Kings of Dark Citadel\n\t        hexen-demo\tThe 4-level Hexen Demo \n         **/\n        private string GetGame(SpData data)\n        {\n            string filename = Path.GetFileNameWithoutExtension(data.Value);\n\n            if (filename.Equals(\"DOOM1\", StringComparison.OrdinalIgnoreCase))\n                return \"doom1-share\";\n            if (filename.Equals(\"DOOM\", StringComparison.OrdinalIgnoreCase))\n            {\n                if (data.GameFile.Map.Contains(\"E4M1\"))\n                    return \"doom1-ultimate\";\n                else\n                    return \"doom1\";\n            }\n            if (filename.Equals(\"DOOM2\", StringComparison.OrdinalIgnoreCase))\n                return \"doom2\";\n            if (filename.Equals(\"PLUTONIA\", StringComparison.OrdinalIgnoreCase))\n                return \"doom2-plut\";\n            if (filename.Equals(\"TNT\", StringComparison.OrdinalIgnoreCase))\n                return \"doom2-tnt\";\n            if (filename.Equals(\"CHEX\", StringComparison.OrdinalIgnoreCase))\n                return \"chex\";\n            if (filename.Equals(\"HACX\", StringComparison.OrdinalIgnoreCase))\n                return \"hacx\";\n            if (filename.Equals(\"HERETIC\", StringComparison.OrdinalIgnoreCase))\n            {\n                if (!data.GameFile.Map.Contains(\"E2M1\"))\n                    return \"heretic-share\";\n                else if (data.GameFile.Map.Contains(\"E4M1\"))\n                    return \"heretic-ext\";\n                else\n                    return \"heretic\";\n            }\n            if (filename.Equals(\"HEXEN\", StringComparison.OrdinalIgnoreCase) || filename.Equals(\"HEXDD\", StringComparison.OrdinalIgnoreCase))\n            {\n                if (data.AdditionalFiles.Any(x => Path.GetFileNameWithoutExtension(x.FileName).Equals(\"HEXDD\", StringComparison.OrdinalIgnoreCase)))\n                    return \"hexen-dk\";\n                if(data.GameFile.Map.Contains(\"MAP41\")) //not sure why doomsday cares about this but v10 has unfinished maze map MAP41, v11 does not\n                    return \"hexen-v10\";\n                if (!data.GameFile.Map.Contains(\"MAP05\"))\n                    return \"hexen-demo\";\n                return \"hexen\";\n            }\n\n            return \"doom2\";\n        }\n\n        public override bool Supported() => CheckFileNameWithoutExtension(\"doomsday\");\n\n        public override bool LoadSaveGameSupported() => false;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SourcePort/GenericSourcePortFlavor.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.SaveGame;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace DoomLauncher.SourcePort\n{\n    public class GenericSourcePortFlavor : ISourcePortFlavor\n    {\n        protected readonly ISourcePortData m_sourcePortData;\n\n        public GenericSourcePortFlavor(ISourcePortData sourcePortData)\n        {\n            m_sourcePortData = sourcePortData;\n        }\n\n        public bool CheckFileNameWithoutExtension(string name) =>\n            Path.GetFileNameWithoutExtension(m_sourcePortData.Executable).Equals(name, StringComparison.InvariantCultureIgnoreCase);\n\n        public bool CheckFileNameContains(string name) =>\n            CultureInfo.CurrentCulture.CompareInfo.IndexOf(m_sourcePortData.Executable, name) >= 0;\n\n        public virtual string IwadParameter(SpData data) => $\" -iwad \\\"{data.Value}\\\"\";\n\n        public virtual string FileParameter(SpData data)\n        {\n            if (!string.IsNullOrEmpty(m_sourcePortData.FileOption))\n                return string.Concat(\" \", m_sourcePortData.FileOption, \" \");\n            return string.Empty;\n        }\n\n        public virtual string WarpParameter(SpData data) => BuildWarpParameter(data.Value);\n\n        public virtual string SkillParameter(SpData data) =>\n            $\" -skill {data.Value}\";\n\n        public virtual string RecordParameter(SpData data) =>\n            $\" -record \\\"{data.Value}\\\"\";\n\n        public virtual string PlayDemoParameter(SpData data) =>\n            $\" -playdemo \\\"{data.Value}\\\"\";\n\n        public virtual string LoadSaveParameter(SpData data)\n        {\n            if (string.IsNullOrEmpty(data.Value))\n                return string.Empty;\n\n            string file = Path.GetFileNameWithoutExtension(data.Value);\n            if (!char.IsDigit(file[file.Length - 1]))\n                return string.Empty;\n\n            return $\"-loadgame {file[file.Length - 1]}\";\n        }\n\n        public static string BuildWarpParameter(string map)\n        {\n            if (Regex.IsMatch(map, @\"^E\\dM\\d$\") || Regex.IsMatch(map, @\"^MAP\\d\\d$\"))\n                return BuildWarpLegacy(map);\n\n            return GetMapParameter(map);\n        }\n\n        public static string GetMapParameter(string map) => $\" +map {map}\";\n\n        public virtual bool Supported() => true;\n\n        public virtual bool StatisticsSupported() => false;\n\n        public virtual bool LoadSaveGameSupported() => true;\n\n        public virtual string[] GetScreenshotDirectories() => Array.Empty<string>();\n\n        public virtual string[] GetSaveGameDirectories() => Array.Empty<string>();\n\n        public virtual IStatisticsReader CreateStatisticsReader(IGameFile gameFile, IEnumerable<IStatsData> existingStats) => null;\n\n        public virtual ISaveGameReader CreateSaveGameReader(FileInfo file)\n        {\n            if (file.Extension.Equals(\".zds\", StringComparison.InvariantCultureIgnoreCase))\n                return new ZDoomSaveGameReader(file.FullName);\n            else if (file.Extension.Equals(\".dsg\", StringComparison.InvariantCultureIgnoreCase))\n                return new DsgSaveGameReader(file.FullName);\n            else if (file.Extension.Equals(\".hsg\", StringComparison.InvariantCultureIgnoreCase))\n                return new HelionSaveGameReader(file.FullName);\n\n            return null;\n        }\n\n        private static string BuildWarpLegacy(string map)\n        {\n            List<string> numbers = new List<string>();\n            StringBuilder num = new StringBuilder();\n\n            for (int i = 0; i < map.Length; i++)\n            {\n                if (char.IsDigit(map[i]))\n                {\n                    num.Append(map[i]);\n                }\n                else\n                {\n                    if (num.Length > 0) numbers.Add(num.ToString());\n                    num.Clear();\n                }\n            }\n\n            if (num.Length > 0)\n                numbers.Add(num.ToString());\n\n            StringBuilder sb = new StringBuilder();\n            foreach (string number in numbers)\n            {\n                sb.Append(Convert.ToInt32(number));\n                sb.Append(' ');\n            }\n\n            if (numbers.Any())\n                sb.Remove(sb.Length - 1, 1);\n\n            return $\" -warp {sb.ToString()}\";\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SourcePort/HelionSourcePortFlavor.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher.SourcePort\n{\n    public class HelionSourcePortFlavor : GenericSourcePortFlavor\n    {\n        public HelionSourcePortFlavor(ISourcePortData sourcePortData)\n            : base(sourcePortData)\n        {\n\n        }\n\n        public override string WarpParameter(SpData data) => GetMapParameter(data.Value);\n\n        public override string LoadSaveParameter(SpData data) =>\n            $\"-loadgame \\\"{data.Value}\\\"\";\n\n        public override bool Supported() => CheckFileNameWithoutExtension(\"Helion\");\n\n        public override bool StatisticsSupported() => true;\n\n        public override IStatisticsReader CreateStatisticsReader(IGameFile gameFile, IEnumerable<IStatsData> existingStats) =>\n            new LevelstatReader(gameFile, Path.Combine(m_sourcePortData.Directory.GetFullPath(), \"levelstat.txt\"));\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SourcePort/ISourcePortFlavor.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.SaveGame;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher.SourcePort\n{\n    public interface ISourcePortFlavor\n    {\n        string IwadParameter(SpData data);\n        string FileParameter(SpData data);\n        string WarpParameter(SpData data);\n        string SkillParameter(SpData data);\n        string RecordParameter(SpData data);\n        string PlayDemoParameter(SpData data);\n        string LoadSaveParameter(SpData data);\n\n        bool Supported(); //if the exe is supported by this implementation\n        bool StatisticsSupported();\n        bool LoadSaveGameSupported();\n        string[] GetScreenshotDirectories();\n        string[] GetSaveGameDirectories();\n        IStatisticsReader CreateStatisticsReader(IGameFile gameFile, IEnumerable<IStatsData> existingStats);\n        ISaveGameReader CreateSaveGameReader(FileInfo file);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SourcePort/LevelstatSourcePortFlavor.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher.SourcePort\n{\n    public class LevelstatSourcePortFlavor : GenericSourcePortFlavor\n    {\n        public LevelstatSourcePortFlavor(ISourcePortData sourcePortData)\n            : base(sourcePortData)\n        {\n\n        }\n\n        public override bool Supported() =>\n            CheckFileNameContains(\"crispy-doom\") // + crispy-doom-truecolor\n            || CheckFileNameContains(\"crispy-heretic\") // + crispy-heretic-truecolor\n            || CheckFileNameWithoutExtension(\"so-doom\")\n            || CheckFileNameWithoutExtension(\"inter-heretic\")\n            || CheckFileNameContains(\"boom-plus.exe\") // prboom-plus + glboom-plus\n            || CheckFileNameWithoutExtension(\"dsda-doom\")\n            || CheckFileNameWithoutExtension(\"nyan-doom\")\n            || CheckFileNameWithoutExtension(\"fdwl\")\n            || CheckFileNameWithoutExtension(\"woof\")\n            || CheckFileNameWithoutExtension(\"nugget-doom\")\n            || CheckFileNameWithoutExtension(\"cherry-doom\");\n\n        public override bool StatisticsSupported() => true;\n\n        public override IStatisticsReader CreateStatisticsReader(IGameFile gameFile, IEnumerable<IStatsData> existingStats) =>\n            new LevelstatReader(gameFile, Path.Combine(m_sourcePortData.Directory.GetFullPath(), \"levelstat.txt\"));\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SourcePort/SpData.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher.SourcePort\n{\n    public class SpData\n    {\n        private static readonly GameFile EmptyGameFile = new GameFile();\n\n        public SpData()\n        {\n            Value = string.Empty;\n            GameFile = EmptyGameFile;\n            AdditionalFiles = new List<IGameFile>();\n        }\n\n        public SpData(string value, IGameFile gameFile, IEnumerable<IGameFile> addFiles)\n        {\n            Value = value;\n            GameFile = gameFile;\n            AdditionalFiles = addFiles.ToList();\n        }\n\n        public string Value { get; private set; }\n        public IGameFile GameFile { get; private set; }\n        public List<IGameFile> AdditionalFiles { get; private set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SourcePort/StatdumpSourcePortFlavor.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.Statistics;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace DoomLauncher.SourcePort\n{\n    public class StatdumpSourcePortFlavor : GenericSourcePortFlavor\n    {\n        public StatdumpSourcePortFlavor(ISourcePortData sourcePortData)\n            : base(sourcePortData)\n        {\n        \n        }\n\n        public override bool Supported() =>\n            CheckFileNameWithoutExtension(\"chocolate-doom\") ||\n            CheckFileNameWithoutExtension(\"cndoom\") ||\n            CheckFileNameWithoutExtension(\"crl-doom\") ||\n            CheckFileNameWithoutExtension(\"inter-doom\");\n\n        public override bool StatisticsSupported() => true;\n\n        public override IStatisticsReader CreateStatisticsReader(IGameFile gameFile, IEnumerable<IStatsData> existingStats) =>\n            new StatdumpReader(gameFile, Path.Combine(m_sourcePortData.Directory.GetFullPath(), \"stats.txt\"));\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/SourcePort/ZDoomSourcePortFlavor.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace DoomLauncher.SourcePort\n{\n    public class ZDoomSourcePortFlavor : GenericSourcePortFlavor\n    {\n        private static readonly string[] DirectoryNames = new string[] { \"GZDoom\", \"UZDoom\", \"VKDoom\" };\n\n        private static string UserDirectoryBase => Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);\n\n        public static string[] UserSaveGameDirectories => DirectoryNames.Select(x => UserSaveGameDirectory(x)).ToArray();\n        public static string[] UserScreenshotDirectories => DirectoryNames.Select(x => UserScreenshotDirectory(x)).ToArray();\n\n        public static string UserSaveGameDirectory(string name) => Path.Combine(UserDirectoryBase, \"Saved Games\", name);\n        public static string UserScreenshotDirectory(string name) => Path.Combine(UserDirectoryBase, \"Pictures\", \"Screenshots\", name);\n\n        public ZDoomSourcePortFlavor(ISourcePortData sourcePortData)\n            : base(sourcePortData)\n        {\n\n        }\n\n        public override bool Supported() =>\n            CheckFileNameContains(\"zdoom.exe\") ||\n            CheckFileNameWithoutExtension(\"zandronum\") ||\n            CheckFileNameWithoutExtension(\"vkdoom\");\n\n        public override string LoadSaveParameter(SpData data) =>\n            $\"-loadgame \\\"{data.Value}\\\"\";\n\n        public override bool StatisticsSupported() => true;\n\n        public override string[] GetScreenshotDirectories() => UserScreenshotDirectories;\n\n        public override string[] GetSaveGameDirectories() => UserSaveGameDirectories;\n\n        public override IStatisticsReader CreateStatisticsReader(IGameFile gameFile, IEnumerable<IStatsData> existingStats) =>\n            new ZDoomStatsReader(gameFile, m_sourcePortData.Directory.GetFullPath(), existingStats);\n\n        public override string WarpParameter(SpData data) => GetMapParameter(data.Value);\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Statistics/IStatisticsReader.cs",
    "content": "﻿using DoomLauncher.Interfaces;\n\nnamespace DoomLauncher\n{\n    public delegate void NewStatisticsEventHandler(object sender, NewStatisticsEventArgs e);\n\n    public interface IStatisticsReader\n    {\n        event NewStatisticsEventHandler NewStastics;\n        void Start();\n        void Stop();\n        string[] Errors { get; }\n        string LaunchParameter { get; }\n        bool ReadOnClose { get; }\n        void ReadNow();\n        IGameFile GameFile { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Statistics/LevelstatReader.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.Statistics;\n\nnamespace DoomLauncher\n{\n    public class LevelstatReader : MultiLineStatReader\n    {\n        private static string s_statRegex = @\"\\S+-(\\d+:)?\\d+:\\d+.\\d+\\((\\d+:)?\\d+:\\d+\\)K:\\d+/\\d+I:\\d+/\\d+S:\\d+/\\d+\";\n        private static ParseItem[] s_regexItems = new ParseItem[]\n        {\n            new ParseItem(@\"\\S+-\", \"-\", \"MapName\"),\n            new ParseItem(@\"(\\S+)?\\S+:\\S+\\(\", \"-(\", \"LevelTime\"),\n            new ParseItem(@\"\\d+/\", \"/\", \"KillCount\"),\n            new ParseItem(@\"K:\\d+\", \"K:\", \"TotalKills\"),\n            new ParseItem(@\"\\d+/\", \"/\", \"ItemCount\"),\n            new ParseItem(@\"I:\\d+\", \"I:\", \"TotalItems\"),\n            new ParseItem(@\"\\d+/\", \"/\", \"SecretCount\"),\n            new ParseItem(@\"S:\\d+\", \"S:\", \"TotalSecrets\")\n        };\n\n        public LevelstatReader(IGameFile gameFile, string statFile) : base(gameFile, statFile, s_statRegex, s_regexItems)\n        {\n            RemoveNewLines = false;\n        }\n\n        public override string LaunchParameter { get { return \"-levelstat\"; } }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Statistics/MultiLineStatReader.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text.RegularExpressions;\n\nnamespace DoomLauncher.Statistics\n{\n    public abstract class MultiLineStatReader : StatFileScanner, IStatisticsReader\n    {\n        public event NewStatisticsEventHandler NewStastics;\n\n        private readonly List<IStatsData> m_statistics = new List<IStatsData>();\n        private readonly ParseItem[] m_parseItems;\n        private readonly string m_statRegex;\n\n        protected MultiLineStatReader(IGameFile gameFile, string statFile, string statRegex, ParseItem[] parseItems) : base(statFile)\n        {\n            GameFile = gameFile;\n            m_parseItems = parseItems;\n            m_statRegex = statRegex;\n            ErrorOnFail = false;\n            ErrorOnParseItem = true;\n            RemoveNewLines = true;\n        }\n\n        public IGameFile GameFile { get; set; }\n        public bool ReadOnClose { get { return true; } }\n        public bool ErrorOnFail { get; set; }\n        public bool ErrorOnParseItem { get; set; }\n        public bool RemoveNewLines { get; set; }\n        public abstract string LaunchParameter { get; }\n\n        public void Start()\n        {\n            try\n            {\n                FileInfo fi = new FileInfo(StatFile);\n                if (fi.Exists)\n                    fi.Delete();\n            }\n            catch\n            {\n                //failed, nothing to do\n            }\n        }\n\n        public void Stop()\n        {\n            //nothing to do on stop\n        }\n\n        public void ReadNow()\n        {\n            ReadStatistics();\n        }\n\n        public string[] Errors\n        {\n            get { return m_errors.ToArray(); }\n        }\n\n        private void ReadStatistics()\n        {\n            try\n            {\n                string text = GetCleanedFileText();\n                MatchCollection matches = Regex.Matches(text, m_statRegex, RegexOptions.Singleline);\n\n                foreach (Match match in matches)\n                {\n                    IStatsData stats = null;\n\n                    if (match.Success)\n                        stats = ParseLine(match.Value);\n\n                    if (stats != null)\n                    {\n                        stats.RecordTime = DateTime.Now;\n                        stats.GameFileID = GameFile.GameFileID.Value;\n\n                        //Revived monsters adds to kill count\n                        if (stats.KillCount > stats.TotalKills)\n                            stats.KillCount = stats.TotalKills;\n\n                        if (!m_statistics.Contains(stats))\n                        {\n                            m_statistics.Add(stats);\n                            NewStastics?.Invoke(this, new NewStatisticsEventArgs(stats));\n                        }\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                if (ErrorOnFail)\n                    m_errors.Add(string.Format(\"Unexpected exception: {0}{1}{2}\", ex.Message, Environment.NewLine, ex.StackTrace));\n            }\n        }\n\n        private string GetCleanedFileText()\n        {\n            string text = File.ReadAllText(StatFile);\n            text = text.Replace(\" \", string.Empty).Replace(\"\\t\", string.Empty);\n\n            if (RemoveNewLines)\n                text = text.Replace(\"\\r\\n\", string.Empty).Replace(\"\\n\", string.Empty);\n            else\n                text = text.Replace(\"\\r\\n\", \"\\n\");\n            return text;\n        }\n\n        private IStatsData ParseLine(string line)\n        {\n            StatsData ret = new StatsData();\n\n            foreach (ParseItem item in m_parseItems)\n            {\n                Match match = Regex.Match(line, item.RegexInput);\n\n                if (match.Success)\n                {\n                    line = ReplaceFirst(line, match.Value);\n                    if (item.DataSourceProperty != null)\n                        SetStatProperty(ret, item, match.Value);\n                }\n                else if(ErrorOnParseItem)\n                {\n                    m_errors.Add(string.Format(\"Failed to parse {0} from levelstat file.\", item.DataSourceProperty));\n                }\n            }\n\n            return ret;\n        }\n\n        private static string ReplaceFirst(string text, string oldValue)\n        {\n            int idx = text.IndexOf(oldValue);\n\n            if (idx != -1)\n                return string.Concat(text.Substring(0, idx), text.Substring(idx + oldValue.Length));\n\n            return text;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Statistics/NewStatisticsEventArgs.cs",
    "content": "﻿using System;\n\nnamespace DoomLauncher\n{\n    public class NewStatisticsEventArgs : EventArgs\n    {\n        public NewStatisticsEventArgs(IStatsData stats)\n        {\n            Statistics = stats;\n            Update = false;\n        }\n\n        public NewStatisticsEventArgs(IStatsData stats, bool update)\n        {\n            Statistics = stats;\n            Update = update;\n        }\n\n        public IStatsData Statistics { get; set; }\n        public bool Update { get; set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Statistics/StatFileScanner.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Reflection;\n\nnamespace DoomLauncher\n{\n    public class StatFileScanner\n    {\n        protected List<string> m_errors = new List<string>();\n\n        public class ParseItem\n        {\n            public ParseItem(string regexInput, string replace, string dataSourceProperty)\n            {\n                RegexInput = regexInput;\n                Replace = replace;\n                DataSourceProperty = dataSourceProperty;\n            }\n\n            public string RegexInput { get; set; }\n            public string Replace { get; set; }\n            public string DataSourceProperty { get; set; }\n        }\n\n        public StatFileScanner(string statFile)\n        {\n            StatFile = statFile;\n        }\n\n        public string StatFile { get; }\n\n        protected void SetStatProperty(StatsData stats, ParseItem item, string value)\n        {\n            foreach (char c in item.Replace)\n                value = value.Replace(c.ToString(), string.Empty);\n\n            PropertyInfo pi = stats.GetType().GetProperty(item.DataSourceProperty);\n\n            if (item.DataSourceProperty == \"LevelTime\")\n            {\n                string[] time = value.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);\n                if (time.Length == 2)\n                    pi.SetValue(stats, (Convert.ToSingle(time[0], CultureInfo.InvariantCulture) * 60) + Convert.ToSingle(time[1], CultureInfo.InvariantCulture));\n                // This is to support hours being written by ports like woof\n                else if (TimeSpan.TryParse(value, AppConfiguration.Culture, out var ts))\n                    pi.SetValue(stats, (float)ts.TotalSeconds);\n                else\n                    m_errors.Add($\"Failed to parse [{value}] for [LevelTime]\");\n            }\n            else\n            {\n                try\n                {\n                    if (pi.PropertyType == typeof(string))\n                        pi.SetValue(stats, value);\n                    else if (pi.PropertyType == typeof(int))\n                        pi.SetValue(stats, Convert.ToInt32(value));\n                    else if (pi.PropertyType == typeof(float))\n                        pi.SetValue(stats, Convert.ToSingle(value));\n                }\n                catch\n                {\n                    m_errors.Add(string.Format(\"Failed for parse value[{0}] for [{1}]\", value, item.DataSourceProperty));\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Statistics/StatdumpReader.cs",
    "content": "﻿using DoomLauncher.Interfaces;\n\nnamespace DoomLauncher.Statistics\n{\n    public class StatdumpReader : MultiLineStatReader\n    {\n        private static string s_statRegex = @\"=+\\w+(/\\w+)?=+Time:\\d+:\\d+\\(par:\\d+:\\d+\\)\\w+\\(\\w+\\):Kills:\\d+(/\\d+\\(-?\\d+%\\))?Items:\\d+(/\\d+\\(-?\\d+%\\))?Secrets:\\d+(/\\d+)?\";\n        private static ParseItem[] s_regexItems = new ParseItem[]\n        {\n            new ParseItem(@\"\\w+(/\\w+)?\", string.Empty, \"MapName\"),\n            new ParseItem(@\"\\d+:\\d+\", string.Empty, \"LevelTime\"),\n            new ParseItem(@\"\\d+:\\d+\", string.Empty, null), //remove par\n            new ParseItem(@\"\\w+\\(\\w+\\):\", string.Empty, null), //remove player name\n            new ParseItem(@\":\\d+\", \":\", \"KillCount\"),\n            new ParseItem(@\"Kills/\\d+\", \"Kills/\", \"TotalKills\"),\n            new ParseItem(@\":\\d+\", \":\", \"ItemCount\"),\n            new ParseItem(@\"Items/\\d+\", \"Items/\", \"TotalItems\"),\n            new ParseItem(@\":\\d+\", \":\", \"SecretCount\"),\n            new ParseItem(@\"Secrets/\\d+\", \"Secrets/\", \"TotalSecrets\")\n        };\n\n        public StatdumpReader(IGameFile gameFile, string statFile) : base(gameFile, statFile, s_statRegex, s_regexItems)\n        {\n            ErrorOnParseItem = false;\n        }\n\n        public override string LaunchParameter { get { return $\"-statdump \\\"{StatFile}\\\"\"; } }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Statistics/ZDoomStatsReader.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nnamespace DoomLauncher\n{\n    public class ZDoomStatsReader : IStatisticsReader\n    {\n        public event NewStatisticsEventHandler NewStastics;\n\n        struct LevelCount\n        {\n            public uint levelcount;\n        }\n\n        struct LevelStats //item stats excluded for binary (old save format) compatibility\n        {\n            public uint totalkills;\n            public uint killcount;\n            public uint totalsecrets;\n            public uint secretcount;\n            public uint leveltime;\n        }\n\n        private readonly string m_dir;\n        private readonly List<NewFileDetector> m_detectors = new List<NewFileDetector>();\n        private readonly List<IStatsData> m_statistics;\n        private readonly List<string> m_errors = new List<string>();\n\n        public ZDoomStatsReader(IGameFile gameFile, string directory, IEnumerable<IStatsData> existingStats)\n        {\n            m_dir = directory;\n            m_statistics = existingStats.ToList();\n            GameFile = gameFile;\n        }\n\n        public IGameFile GameFile { get; set; }\n\n        public string LaunchParameter { get { return string.Empty; } }\n        public bool ReadOnClose { get { return true; } }\n\n        public void Start()\n        {\n            m_detectors.Clear();\n            string[] zdsExtensions = new string[] { \".zds\" };\n            m_detectors.Add(new NewFileDetector(zdsExtensions, m_dir, true));\n\n            foreach (var userDir in ZDoomSourcePortFlavor.UserSaveGameDirectories)\n            {\n                if (Directory.Exists(userDir))\n                    m_detectors.Add(new NewFileDetector(zdsExtensions, userDir, true));\n            }\n            \n            m_detectors.ForEach(x => x.StartDetection());\n        }\n\n        public void Stop()\n        {\n            // Nothing to do\n        }\n\n        public void ReadNow()\n        {\n            if (m_detectors.Count == 0)\n                return;\n\n            List<string> files = new List<string>();\n            foreach (var detector in m_detectors)\n            {\n                files.AddRange(detector.GetNewFiles());\n                files.AddRange(detector.GetModifiedFiles());\n            }\n\n            if (files.Count > 0)\n                files.ForEach(x => HandleSaveFile(x));\n        }\n\n        public string[] Errors\n        {\n            get { return m_errors.ToArray(); }\n        }\n\n        private void HandleSaveFile(string file)\n        {\n            try\n            {\n                try\n                {\n                    ReadSaveFile(file);\n                }\n                catch (IOException)\n                {\n                    System.Threading.Thread.Sleep(200);\n                    ReadSaveFile(file); //try one more time...\n                }\n            }\n            catch (FileNotFoundException ex)\n            {\n                m_errors.Add(string.Format(\"The file {0} was not found and could not be parsed.\", ex.FileName));\n            }\n            catch (Exception ex)\n            {\n                m_errors.Add(string.Format(\"An unexpected error occurred with {0}: {1} {2} {3}\",\n                    file, ex.Message, Environment.NewLine, ex.StackTrace));\n            }\n        }\n\n        private void ReadSaveFile(string file)\n        {\n            lock (m_detectors)\n            {\n                //if we fail to read json (new save format) attempt to read binary (old save format)\n                if (!ParseJson(file))\n                    ParseBinary(file);\n            }\n        }\n\n        private bool ParseJson(string file)\n        {\n            List<StatsData> stats = null;\n            bool success = false;\n            try\n            {\n                using (ZipArchive za = ZipFile.OpenRead(file))\n                {\n                    var entry = za.Entries.FirstOrDefault(x => x.Name.Equals(\"globals.json\"));\n                    if (entry != null)\n                    {\n                        using (var stream = new StreamReader(entry.Open()))\n                            stats = ParseJsonStats(stream);\n                    }\n                }\n            }\n            catch\n            {\n                //nothing to do\n            }\n\n            if (stats != null)\n            {\n                foreach (var stat in stats)\n                    HandleStatsData(stat);\n                success = true;\n            }\n\n            return success;\n        }\n\n        private static List<StatsData> ParseJsonStats(StreamReader stream)\n        {\n            List<StatsData> stats = new List<StatsData>();\n            JObject obj = JsonConvert.DeserializeObject(stream.ReadToEnd()) as JObject;\n\n            var statsource = obj.GetValue(\"statistics\") as JObject;\n            if (statsource == null)\n                return stats;\n                \n            var levels = statsource.GetValue(\"levels\");\n            if (levels == null)\n                return stats;\n\n            int? skill = GetSkill(obj);            \n            foreach (JObject level in levels.OfType<JObject>())\n            {\n                uint totalkills = Convert.ToUInt32(level.GetValue(\"totalkills\"));\n                uint kills = Convert.ToUInt32(level.GetValue(\"killcount\"));\n\n                //item stats are only included in json (new save format), so they're converted to UInt32 here\n                uint totalitems = Convert.ToUInt32(level.GetValue(\"totalitems\"));\n                uint items = Convert.ToUInt32(level.GetValue(\"itemcount\"));\n\n                uint totalsecrets = Convert.ToUInt32(level.GetValue(\"totalsecrets\"));\n                uint secrets = Convert.ToUInt32(level.GetValue(\"secretcount\"));\n\n                uint time = Convert.ToUInt32(level.GetValue(\"leveltime\"));\n                string name = level.GetValue(\"levelname\").ToString();\n                stats.Add(CreateJsonStatsDataSource(totalkills, kills, totalitems, items, totalsecrets, secrets, time, name, skill));\n            }            \n\n            return stats;\n        }\n\n        private static int? GetSkill(JObject obj)\n        {\n            var cvars = obj.GetValue(\"importantcvars\");\n            if (cvars != null)\n                return GetSKillByImportCvars(cvars);\n\n            if (obj.GetValue(\"servercvars\") is JObject objectCvars)\n                return GetSkillByServerCvars(objectCvars);\n\n            return null;\n        }\n\n        private static int? GetSkillByServerCvars(JObject cvars)\n        {\n            var skill = cvars.GetValue(\"skill\");\n            if (skill == null)\n                return null;\n\n            if (int.TryParse(skill.ToString(), out int skillValue))\n                return skillValue + 1;\n\n            return null;\n        }\n\n        private static int? GetSKillByImportCvars(JToken cvars)\n        {\n            string[] stringCvars = cvars.ToString().Split(new char[] { '\\\\' });\n            int index = Array.FindIndex(stringCvars, x => x.Equals(\"skill\", StringComparison.OrdinalIgnoreCase));\n            if (index == -1 || index + 1 >= stringCvars.Length)\n                return null;\n\n            if (int.TryParse(stringCvars[index + 1], out int parsedSkill))\n                return parsedSkill + 1;\n\n            return null;\n        }\n\n        private void ParseBinary(string file)\n        {\n            MemoryStream ms = new MemoryStream(File.ReadAllBytes(file));\n            long position = Util.ReadAfter(ms, Encoding.UTF8.GetBytes(\"sTat\"));\n\n            if (position != -1)\n                ReadStatistics(ms);\n            else\n                m_errors.Add(string.Format(\"Unable to find statistics in the save file {0}.\", file));\n        }\n\n        private void ReadStatistics(MemoryStream ms)\n        {\n            LevelCount count = ReadStuctureFromFile<LevelCount>(ms);\n            count = CheckLevelCount(count);\n            int stringLength = ReadCount(ms);\n            ms.Position += stringLength - 1; //This part MAY contain the start episode map, just skip it\n\n            for (int i = 0; i < count.levelcount; i++)\n            {\n                LevelStats stats = ReadStuctureFromFile<LevelStats>(ms);\n                stats = CheckStats(stats);\n\n                ms.Position += 1; //skip NEW_NAME (27)\n                stringLength = ReadCount(ms) - 1;\n                byte[] levelNameBytes = new byte[stringLength];\n                ms.Read(levelNameBytes, 0, levelNameBytes.Length);\n\n                string levelName = Encoding.ASCII.GetString(levelNameBytes).ToLower();\n                StatsData statsData = CreateBinaryStatsDataSource(stats.totalkills, stats.killcount, stats.totalsecrets, stats.secretcount, stats.leveltime, levelName);\n                HandleStatsData(statsData);\n            }\n        }\n\n        private void HandleStatsData(StatsData statsData)\n        {\n            statsData.GameFileID = GameFile.GameFileID.Value;\n\n            if (!m_statistics.Contains(statsData))\n            {\n                m_statistics.Add(statsData);\n                NewStastics?.Invoke(this, new NewStatisticsEventArgs(statsData));\n            }\n        }\n\n        private static int s_endianCheck = 0x0000FFFF; //if bytes are set on the other side, then it must be stored backwards\n\n        private LevelCount CheckLevelCount(LevelCount count)\n        {\n            if (count.levelcount > s_endianCheck)\n                count.levelcount = ReverseBytes(count.levelcount);\n\n            return count;\n        }\n\n        private LevelStats CheckStats(LevelStats stats)\n        {\n            if (stats.killcount > s_endianCheck)\n                stats.killcount = ReverseBytes(stats.killcount);\n            if (stats.leveltime > s_endianCheck)\n                stats.leveltime = ReverseBytes(stats.leveltime);\n            if (stats.secretcount > s_endianCheck)\n                stats.secretcount = ReverseBytes(stats.secretcount);\n            if (stats.totalkills > s_endianCheck)\n                stats.totalkills = ReverseBytes(stats.totalkills);\n            if (stats.totalsecrets > s_endianCheck)\n                stats.totalsecrets = ReverseBytes(stats.totalsecrets);\n            return stats;\n        }\n\n        //separate json and binary to avoid stat overflow with how binary (old save format) is read\n        private static StatsData CreateJsonStatsDataSource(uint totalkills, uint killcount, uint totalitems, uint itemcount, uint totalsecrets, uint secretcount,\n            uint leveltime, string name, int? skill)\n        {\n            float calctime = Convert.ToSingle(leveltime) / 35.0f;\n            StatsData stats = new StatsData\n            {\n                RecordTime = DateTime.Now,\n                TotalKills = (int)totalkills,\n                KillCount = (int)killcount,\n                TotalItems = (int)totalitems,\n                ItemCount = (int)itemcount,\n                TotalSecrets = (int)totalsecrets,\n                SecretCount = (int)secretcount,\n                LevelTime = calctime,\n                MapName = name,\n                Skill = skill\n            };\n\n            return stats;\n        }\n\n        private static StatsData CreateBinaryStatsDataSource(uint totalkills, uint killcount, uint totalsecrets, uint secretcount, uint leveltime, string name)\n        {\n            float calctime = Convert.ToSingle(leveltime) / 35.0f;\n            StatsData stats = new StatsData\n            {\n                RecordTime = DateTime.Now,\n                TotalKills = (int)totalkills,\n                KillCount = (int)killcount,\n                TotalSecrets = (int)totalsecrets,\n                SecretCount = (int)secretcount,\n                LevelTime = calctime,\n                MapName = name\n            };\n\n            return stats;\n        }\n\n        private static int ReadCount(MemoryStream ms)\n        {\n            byte[] len = new byte[1];\n            int count = 0;\n            int ofs = 0;\n\n            do\n            {\n                ms.Read(len, 0, 1);\n                count |= (len[0] & 0x7f) << ofs;\n                ofs += 7;\n            } while ((len[0] & 0x80) != 0);\n\n            return count;\n        }\n\n        private static uint ReverseBytes(uint value)\n        {\n            return (value & 0x000000FFU) << 24 | (value & 0x0000FF00U) << 8 |\n                   (value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24;\n        }\n\n        private static T ReadStuctureFromFile<T>(MemoryStream ms)\n        {\n            byte[] bytes = new byte[Marshal.SizeOf(typeof(T))];\n            ms.Read(bytes, 0, bytes.Length);\n\n            GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);\n            T obj = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));\n            handle.Free();\n            return obj;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Stylize/CToolStripRenderer.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class CToolStripRenderer : ToolStripProfessionalRenderer\n    {\n        protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)\n        {\n            const string ArrowText = \"⏵\";\n            SizeF size = e.Graphics.MeasureString(ArrowText, e.Item.Font);\n            Color color = e.Item.Selected ? ColorTheme.Current.HighlightText : ColorTheme.Current.Text;\n            e.Graphics.DrawString(ArrowText, e.Item.Font, new SolidBrush(color), new PointF(e.Item.Width - size.Width, 1));\n        }\n\n        protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)\n        {\n            Color color = e.Item.Selected ? ColorTheme.Current.HighlightText : ColorTheme.Current.Text;\n            e.Graphics.DrawString(e.Item.Text, e.Item.Font, new SolidBrush(color), new PointF(34, 2));\n        }\n\n        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)\n        {\n            if (e.Item.Selected)\n            {\n                Rectangle rectangle = new Rectangle(0, 0, e.Item.Size.Width - 1, e.Item.Size.Height - 1);\n                e.Graphics.FillRectangle(new SolidBrush(ColorTheme.Current.Highlight), rectangle);\n                return;\n            }\n\n            base.OnRenderMenuItemBackground(e);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Stylize/DarkTheme.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class DarkTheme : IThemeColors\n    {\n        public Color TitlebarBackground => WindowDark;\n        public Color WindowDark => Color.FromArgb(255, 32, 32, 32);\n        public Color Window => Color.FromArgb(255, 48, 48, 54);\n        public Color WindowLight => Color.FromArgb(255, 58, 58, 64);\n        public Color Text => Color.White;\n        public Color DisabledText => Color.FromArgb(255, 102, 102, 102);\n        public Color HighlightText => Color.White;\n        public Color Highlight => Color.FromArgb(255, 90, 101, 234);\n        public FlatStyle ComboFlatStyle => FlatStyle.Flat;\n        public FlatStyle ButtonFlatStyle => FlatStyle.Flat;\n        public Color ButtonTextColor => Text;\n        public Color ButtonBackground => Color.FromArgb(255, 90, 101, 234);\n        public Color CheckBoxBackground => WindowLight;\n        public Color TextBoxBackground => WindowDark;\n        public Color DropDownBackground => WindowDark;\n        public Color Border => Color.FromArgb(255, 32, 32, 32);\n        public Color LinkText => Highlight;\n        public Color GridBorder => WindowDark;\n        public Color GridRow => WindowDark;\n        public Color GridRowAlt => WindowDark;\n        public Color Separator => Color.Gray;\n        public Color StatBackgroundGradientFrom => WindowDark;\n        public Color StatBackgroundGradientTo => Window;\n        public Color StatText => Color.White;\n        public Color CloseBackgroundHighlight => Color.FromArgb(255, 213, 50, 38);\n        public Color CloseForeColorHighlight => Color.White;\n        public Color ImageBackground => Color.Black;\n        public Color GridBackground => WindowDark;\n        public bool GridRowBorder => false;\n        public bool IsDark => true;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Stylize/DefaultTheme.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public class DefaultTheme : IThemeColors\n    {\n        public Color TitlebarBackground => WindowLight;\n        public Color WindowDark => SystemColors.Control;\n        public Color Window => SystemColors.Control;\n        public Color WindowLight => SystemColors.Window;\n        public Color Text => SystemColors.WindowText;\n        public Color DisabledText => Color.FromArgb(255, 142, 142, 142);\n        public Color HighlightText => SystemColors.HighlightText;\n        public Color Highlight => SystemColors.Highlight;\n        public Color ButtonTextColor => Text;\n        public FlatStyle ComboFlatStyle => FlatStyle.Standard;\n        public FlatStyle ButtonFlatStyle => FlatStyle.Standard;\n        public Color ButtonBackground => SystemColors.Window;\n        public Color CheckBoxBackground => SystemColors.Window;\n        public Color TextBoxBackground => Color.White;\n        public Color DropDownBackground => SystemColors.Window;\n        public Color Border => SystemColors.ControlDark;\n        public Color LinkText => Highlight;\n        public Color GridBorder => SystemColors.ControlDark;\n        public Color GridRow => SystemColors.Window;\n        public Color GridRowAlt => SystemColors.ControlLight;\n        public Color Separator => Color.Gray;\n        public Color StatBackgroundGradientFrom => Color.Gray;\n        public Color StatBackgroundGradientTo => Color.FromArgb(255, 191, 191, 191);\n        public Color StatText => Color.White;\n        public Color CloseBackgroundHighlight => Color.FromArgb(255, 213, 50, 38);\n        public Color CloseForeColorHighlight => Color.White;\n        public Color ImageBackground => Color.Black;\n        public Color GridBackground => Color.White;\n        public bool GridRowBorder => true;\n        public bool IsDark => false;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Stylize/IThemeColors.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public interface IThemeColors\n    {\n        Color TitlebarBackground { get; }\n        Color Window { get; }\n        Color WindowLight { get; }\n        Color WindowDark { get; }\n        Color Text { get; }\n        Color DisabledText { get; }\n        Color HighlightText { get; }\n        Color Highlight { get; }\n        Color ButtonTextColor { get; }\n        FlatStyle ComboFlatStyle { get; }\n        FlatStyle ButtonFlatStyle { get; }\n        Color ButtonBackground { get; }\n        Color CheckBoxBackground { get; }\n        Color TextBoxBackground { get; }\n        Color DropDownBackground { get; }\n        Color Border { get; }\n        Color LinkText { get; }\n        Color GridBorder { get; }\n        Color GridRow { get; }\n        Color GridRowAlt { get; }\n        Color Separator { get; }\n        Color StatBackgroundGradientFrom { get; }\n        Color StatBackgroundGradientTo { get; }\n        Color StatText { get; }\n        Color CloseBackgroundHighlight { get; }\n        Color CloseForeColorHighlight { get; }\n        Color ImageBackground { get; }\n        Color GridBackground { get; }\n        bool GridRowBorder { get; }\n        bool IsDark { get; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Stylize/ImmersiveDarkMode.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\nusing DoomLauncher.WindowsVersion;\n\nnamespace DoomLauncher\n{\n    public static class ImmersiveDarkMode\n    {\n        [DllImport(\"dwmapi.dll\")]\n        private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);\n\n        private const int DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19;\n        private const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20;\n\n        public static bool UseImmersiveDarkMode(Form form, bool enabled)\n        {\n            try\n            {\n                if (!WindowsVersionInfo.GetOsVersionInfo(out var versionInfo))\n                    return false;\n                \n                if (WindowsVersionInfo.IsWindows10OrGreater(versionInfo, 17763))\n                {\n                    var attribute = DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1;\n                    if (WindowsVersionInfo.IsWindows10OrGreater(versionInfo, 18985))\n                        attribute = DWMWA_USE_IMMERSIVE_DARK_MODE;\n\n                    int useImmersiveDarkMode = enabled ? 1 : 0;\n                    return DwmSetWindowAttribute(form.Handle, attribute, ref useImmersiveDarkMode, sizeof(int)) == 0;\n                }\n            }\n            catch { }\n\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Stylize/StyledMessageBox.cs",
    "content": "﻿using DoomLauncher.Forms;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher.Stylize\n{\n    public static class StyledMessageBox\n    {\n        public static DialogResult Show(IWin32Window window, string text, string caption, MessageBoxButtons buttons, \n            MessageBoxIcon icon = MessageBoxIcon.Error,\n            MessageBoxDefaultButton defaultButton = MessageBoxDefaultButton.Button1)\n        {\n            var systemIcon = SystemIcons.Information;\n            switch (icon)\n            {\n                case MessageBoxIcon.Error:\n                    systemIcon = SystemIcons.Error;\n                    break;\n                case MessageBoxIcon.Warning:\n                    systemIcon = SystemIcons.Warning;\n                    break;\n                case MessageBoxIcon.Question:\n                    systemIcon = SystemIcons.Question;\n                    break;\n                case MessageBoxIcon.Asterisk:\n                    systemIcon = SystemIcons.Asterisk;\n                    break;\n            }\n\n            var form = new MessageCheckBox(caption, text, string.Empty, systemIcon, buttons, defaultButton);\n            form.SetShowCheckBox(false);\n            form.StartPosition = FormStartPosition.CenterParent;\n            return form.ShowDialog(window);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Stylize/Stylizer.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing DoomLauncher.Controls;\n\nnamespace DoomLauncher\n{\n    public enum StylizerOptions\n    {\n        None,\n        SetupTitleBar,\n        StylizeTitleBar\n    }\n\n    internal class Stylizer\n    {\n        private readonly struct StylizeControlResults\n        {\n            public StylizeControlResults(bool loadRequired)\n            {\n                LoadRequired = loadRequired;\n            }\n\n            public readonly bool LoadRequired;\n        }\n\n        private static readonly IThemeColors CurrentTheme = ColorTheme.Current;\n\n        public static void Stylize(Form form, bool designMode, StylizerOptions options = StylizerOptions.None)\n        {\n            StylizeInternal(form, designMode, options, null);\n        }\n\n        private static void StylizeInternal(Form form, bool designMode, StylizerOptions options, Func<Control, bool> shouldStylize)\n        {\n            bool registerLoad = false;\n            if (designMode)\n                return;\n\n            if (options.HasFlag(StylizerOptions.SetupTitleBar))\n                SetupTitleBar(form);\n\n            foreach (Control control in form.Controls)\n            {\n                if (control is CRichTextBox)\n                    registerLoad = true;\n\n                var results = StylizeControlInternal(control, designMode, options, shouldStylize);\n                registerLoad = registerLoad || results.LoadRequired;\n            }\n\n            if (!designMode && registerLoad)\n                form.Load += Form_Load;\n        }\n\n        private static void Form_Load(object sender, EventArgs e)\n        {\n            Form form = (Form)sender;\n            form.Load -= Form_Load;\n            StylizeInternal(form, false, StylizerOptions.None, ShouldStylize);\n        }\n\n        private static bool ShouldStylize(Control control)\n        {\n            return control is CRichTextBox;\n        }\n\n        public static void SetupTitleBar(Form form)\n        {\n            form.ShowIcon = false;\n            form.Load += Form_LoadDarkMode;\n            var titleBars = form.Controls.Find(\"titleBar\", true);\n            if (titleBars.Length > 0 && titleBars[0].Parent is TableLayoutPanel tbl)\n            {\n                tbl.Controls.Remove(titleBars[0]);\n                if (tbl.RowStyles.Count > 0)\n                    tbl.RowStyles[0].Height = 0;\n                form.Height -= titleBars[0].Height;\n            }\n        }\n\n        private static void Form_LoadDarkMode(object sender, EventArgs e)\n        {\n            var form = (Form)sender;\n            if (ColorTheme.Current.IsDark)\n                ImmersiveDarkMode.UseImmersiveDarkMode(form, true);\n        }\n\n        public static void StylizeControl(Control control, bool designMode, StylizerOptions options = StylizerOptions.None, Func<Control, bool> shouldStylize = null)\n        {\n            StylizeControlInternal(control, designMode, options, shouldStylize);\n        }\n\n        private static StylizeControlResults StylizeControlInternal(Control control, bool designMode, StylizerOptions options,\n            Func<Control, bool> shouldStylize = null)\n        {\n            if (designMode || (!options.HasFlag(StylizerOptions.StylizeTitleBar) &&  control is TitleBarControl))\n                return new StylizeControlResults(false);\n\n            bool loadRequired = control is CRichTextBox;\n            if (shouldStylize == null || shouldStylize(control))\n            {\n                if (control is DataGridView grid)\n                    StyleGrid(grid);\n                else if (control is FormButton formButton)\n                    StyleFormButton(formButton);\n                else if (control is Button button)\n                    StyleButton(button);\n                else if (control is TextBox textBox)\n                    StyleTextBox(textBox);\n                else if (control is CRichTextBox richTextBox)\n                    StyleRichTextBox(richTextBox);\n                else if (control is LinkLabel linkLabel)\n                    StyleLinkLabel(linkLabel);\n                else if (control is ComboBox comboBox)\n                    StyleCombo(comboBox);\n                else if (control is CheckBox checkBox)\n                    StyleCheckBox(checkBox);\n                else if (control is CheckedListBox checkedListBox)\n                    StyleCheckdListBox(checkedListBox);\n                else if (control is ContextMenuStrip cms)\n                    StyleContextMenuStrip(cms);\n                else if (control is GroupBox groupBox)\n                    StyleGroupBox(groupBox);\n                else if (control is SlideShowPictureBox pb)\n                    StylePictureBox(pb);\n                else\n                    StyleDefault(control);\n            }\n\n            foreach (Control subControl in control.Controls)\n            {\n                var results = StylizeControlInternal(subControl, designMode, options);\n                loadRequired = loadRequired || results.LoadRequired;\n            }\n\n            return new StylizeControlResults(loadRequired);\n        }\n\n        private static void StylePictureBox(SlideShowPictureBox pb)\n        {\n            pb.BackColor = CurrentTheme.ImageBackground;\n        }\n\n        private static void StyleTextBox(TextBox textBox)\n        {\n            textBox.BackColor = CurrentTheme.TextBoxBackground;\n            textBox.ForeColor = CurrentTheme.Text;\n            textBox.BorderStyle = BorderStyle.FixedSingle;\n        }\n\n        private static void StyleRichTextBox(CRichTextBox textBox)\n        {\n            textBox.BackColor = CurrentTheme.TextBoxBackground;\n            textBox.ForeColor = CurrentTheme.Text;\n        }\n\n        private static void StyleGroupBox(GroupBox groupBox)\n        {\n            groupBox.Paint += GroupBox_Paint;\n        }\n\n        private static void GroupBox_Paint(object sender, PaintEventArgs e)\n        {\n            GroupBox box = (GroupBox)sender;\n            Graphics g = e.Graphics;\n            e.Graphics.Clear(SystemColors.Control);\n            e.Graphics.DrawString(box.Text, box.Font, Brushes.Black, 0, 0);\n\n            Brush textBrush = new SolidBrush(CurrentTheme.Text);\n            Brush borderBrush = new SolidBrush(CurrentTheme.Border);\n            Pen borderPen = new Pen(borderBrush);\n            SizeF strSize = g.MeasureString(box.Text, box.Font);\n            Rectangle rect = new Rectangle(box.ClientRectangle.X,\n                                           box.ClientRectangle.Y + (int)(strSize.Height / 2),\n                                           box.ClientRectangle.Width - 1,\n                                           box.ClientRectangle.Height - (int)(strSize.Height / 2) - 1);\n\n            \n            g.Clear(box.BackColor);\n            g.DrawString(box.Text, box.Font, textBrush, box.Padding.Left, 0);\n\n            g.DrawLine(borderPen, rect.Location, new Point(rect.X, rect.Y + rect.Height));\n            g.DrawLine(borderPen, new Point(rect.X + rect.Width, rect.Y), new Point(rect.X + rect.Width, rect.Y + rect.Height));\n            g.DrawLine(borderPen, new Point(rect.X, rect.Y + rect.Height), new Point(rect.X + rect.Width, rect.Y + rect.Height));\n            g.DrawLine(borderPen, new Point(rect.X, rect.Y), new Point(rect.X + box.Padding.Left, rect.Y));\n            g.DrawLine(borderPen, new Point(rect.X + box.Padding.Left + (int)(strSize.Width), rect.Y), new Point(rect.X + rect.Width, rect.Y));\n        }\n\n        private static void StyleDefault(Control control)\n        {\n            control.BackColor = CurrentTheme.Window;\n            control.ForeColor = CurrentTheme.Text;\n        }\n\n        public static void StylizeControl(ToolStripDropDownButton control, bool designMode)\n        {\n            if (designMode)\n                return;\n\n            control.BackColor = CurrentTheme.Window;\n            control.ForeColor = CurrentTheme.Text;\n\n            foreach (var item in control.DropDownItems)\n            {\n                if (item is ToolStripMenuItem menuItem)\n                {\n                    menuItem.BackColor = CurrentTheme.Window;\n                    menuItem.ForeColor = CurrentTheme.Text;\n                    menuItem.Paint += MenuItem_Paint;\n                    StyleMenuDropDownItems(menuItem);\n                    continue;\n                }\n\n                if (item is ToolStripSeparator toolStripSeparator)\n                    toolStripSeparator.Paint += ToolStripSeparator_Paint;\n            }\n        }\n\n        private static void MenuItem_Paint(object sender, PaintEventArgs e)\n        {\n            if (sender is ToolStripMenuItem item)\n            {\n                PointF point = new PointF(24, 2);\n                Rectangle rectangle = new Rectangle(2, 0, item.Size.Width - 4, item.Size.Height);\n                if (item.Selected)\n                {\n                    e.Graphics.FillRectangle(new SolidBrush(ColorTheme.Current.Highlight), rectangle);\n                    e.Graphics.DrawString(item.Text, item.Font, new SolidBrush(ColorTheme.Current.HighlightText), point);\n                    return;\n                }\n\n                e.Graphics.FillRectangle(new SolidBrush(ColorTheme.Current.Window), rectangle);\n                e.Graphics.DrawString(item.Text, item.Font, new SolidBrush(ColorTheme.Current.Text), point);\n            }\n        }\n\n        private static void StyleContextMenuStrip(ContextMenuStrip cms)\n        {\n            cms.Renderer = new CToolStripRenderer();\n\n            cms.BackColor = CurrentTheme.Window;\n            cms.ForeColor = CurrentTheme.Text;            \n\n            cms.ShowCheckMargin = false;\n            cms.ShowImageMargin = false;\n\n            foreach (var item in cms.Items)\n            {\n                if (!(item is ToolStripMenuItem menuItem))\n                    continue;\n\n                menuItem.BackColor = CurrentTheme.Window;\n                menuItem.ForeColor = CurrentTheme.Text;\n                StyleMenuDropDownItems(menuItem);\n            }\n        }\n\n        private static void StyleMenuDropDownItems(ToolStripMenuItem menuItem)\n        {\n            foreach (var subItem in menuItem.DropDownItems)\n            {\n                if (subItem is ToolStripSeparator separator)\n                {\n                    separator.Paint += ToolStripSeparator_Paint;\n                    continue;\n                }\n\n                if (!(subItem is ToolStripMenuItem subMenuItem))\n                    continue;\n\n                subMenuItem.BackColor = CurrentTheme.Window;\n                subMenuItem.ForeColor = CurrentTheme.Text;\n            }\n        }\n\n        private static void StyleCheckdListBox(CheckedListBox checkedListBox)\n        {\n            checkedListBox.BorderStyle = BorderStyle.None;\n        }\n\n        private static void StyleLinkLabel(LinkLabel label)\n        {\n            label.LinkColor = CurrentTheme.LinkText;\n        }\n\n        private static void StyleButton(Button button)\n        {\n            button.FlatStyle = CurrentTheme.ButtonFlatStyle;\n            if (button.FlatStyle == FlatStyle.Flat)\n                button.FlatAppearance.BorderSize = 0;\n            button.ForeColor = CurrentTheme.ButtonTextColor;\n            button.BackColor = CurrentTheme.ButtonBackground;\n        }\n\n        private static void StyleFormButton(FormButton button)\n        {\n            button.FlatStyle = FlatStyle.Flat;\n            button.FlatAppearance.BorderSize = 0;\n            button.BackColor = CurrentTheme.Window;\n        }\n\n        private static void StyleCheckBox(CheckBox checkBox)\n        {\n            checkBox.ForeColor = CurrentTheme.Text;\n            checkBox.BackColor = CurrentTheme.CheckBoxBackground;\n            checkBox.FlatStyle = FlatStyle.Flat;\n            checkBox.TextAlign = ContentAlignment.MiddleRight;\n            checkBox.FlatAppearance.BorderSize = 0;\n            checkBox.FlatAppearance.MouseOverBackColor = CurrentTheme.Window;\n            checkBox.FlatAppearance.CheckedBackColor = CurrentTheme.Window;\n            checkBox.FlatAppearance.MouseDownBackColor = CurrentTheme.Window;\n            checkBox.AutoSize = true;\n        }\n\n        private static void StyleCombo(ComboBox comboBox)\n        {\n            comboBox.BackColor = CurrentTheme.TextBoxBackground;\n            comboBox.ForeColor = CurrentTheme.Text;\n            comboBox.DrawMode = DrawMode.OwnerDrawFixed;\n            comboBox.FlatStyle = CurrentTheme.ComboFlatStyle;\n\n            // CComboBox implements it's own DrawItem\n            if (comboBox is CComboBox)\n                return;\n\n            comboBox.DrawItem += CComboBox.ComboBoxDrawItem;\n        }\n\n        private static void StyleGrid(DataGridView view)\n        {\n            view.DefaultCellStyle.NullValue = \"N/A\";\n            view.RowHeadersVisible = false;\n            view.AutoGenerateColumns = false;\n            view.ShowCellToolTips = false;\n            view.EnableHeadersVisualStyles = false;\n\n            view.ColumnHeadersDefaultCellStyle.BackColor = CurrentTheme.Window;\n            view.ColumnHeadersDefaultCellStyle.ForeColor = CurrentTheme.Text;\n            view.ColumnHeadersDefaultCellStyle.SelectionBackColor = view.ColumnHeadersDefaultCellStyle.BackColor;\n            view.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;\n            view.ColumnHeadersDefaultCellStyle.Padding = new Padding(0, 4, 0, 4);\n\n            view.ForeColor = CurrentTheme.Text;\n            view.BackgroundColor = CurrentTheme.GridBackground;\n            view.RowsDefaultCellStyle.ForeColor = CurrentTheme.Text;\n            view.RowsDefaultCellStyle.BackColor = CurrentTheme.GridRow;\n            view.AlternatingRowsDefaultCellStyle.ForeColor = CurrentTheme.Text;\n            view.AlternatingRowsDefaultCellStyle.BackColor = CurrentTheme.GridRowAlt;\n            view.DefaultCellStyle.SelectionBackColor = CurrentTheme.Highlight;\n\n            view.BorderStyle = BorderStyle.None;\n            view.Paint += View_Paint;\n\n            if (!CurrentTheme.GridRowBorder)\n                view.CellPainting += View_CellPainting;\n        }\n\n        private static void View_Paint(object sender, PaintEventArgs e)\n        {\n            DataGridView view = sender as DataGridView;\n            Rectangle rect = new Rectangle(view.ClientRectangle.Location, new Size(view.ClientRectangle.Width -1, view.ClientRectangle.Height - 1));\n            e.Graphics.DrawRectangle(new Pen(CurrentTheme.GridBorder), rect);\n        }\n\n        private static void View_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)\n        {\n            e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;\n            e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;\n            e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None;\n            e.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None;\n        }\n\n        private static void ToolStripSeparator_Paint(object sender, PaintEventArgs e)\n        {\n            ToolStripSeparator toolStripSeparator = (ToolStripSeparator)sender;\n            int width = toolStripSeparator.Width;\n            int height = toolStripSeparator.Height;\n\n            Color foreColor = CurrentTheme.Separator;\n            Color backColor = CurrentTheme.Window;\n\n            DpiScale dpiScale = new DpiScale(e.Graphics);\n            int pad = dpiScale.ScaleIntX(8);\n            e.Graphics.FillRectangle(new SolidBrush(backColor), 0, 0, width, height);\n            e.Graphics.DrawLine(new Pen(foreColor), pad, height / 2, width, height / 2);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/BasicTabViewCtrl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class BasicTabViewCtrl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.SuspendLayout();\n            // \n            // BasicTabViewCtrl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Name = \"BasicTabViewCtrl\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/BasicTabViewCtrl.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class BasicTabViewCtrl : UserControl, ITabView, ICloneable\n    {\n        public event EventHandler<GameFileListEventArgs> DataSourceChanging;\n        public event EventHandler<GameFileListEventArgs> DataSourceChanged;\n\n        protected readonly object m_key;\n        protected readonly GameFileFieldType[] m_selectFields;\n        protected GameFileViewFactory m_factory;\n\n        public BasicTabViewCtrl(object key, string title, IGameFileDataSourceAdapter adapter, GameFileFieldType[] selectFields, GameFileViewFactory factory)\n            : this (key, title, adapter, selectFields, factory.CreateGameFileView())\n        {\n            m_factory = factory;\n        }\n\n        protected BasicTabViewCtrl(object key, string title, IGameFileDataSourceAdapter adapter, GameFileFieldType[] selectFields, IGameFileView view)\n        {\n            InitializeComponent();\n            m_key = key;\n            Title = title;\n            Adapter = adapter;\n            m_selectFields = selectFields.ToArray();\n\n            UserControl ctrl = (UserControl)view;\n\n            ctrl.Anchor = AnchorStyles.Top | AnchorStyles.Left;\n            ctrl.Dock = DockStyle.Fill;\n            Controls.Add(ctrl);\n            GameFileView = (IGameFileView)ctrl;\n        }\n\n        public virtual object Clone()\n        {\n            // TODO this is also dumb\n            BasicTabViewCtrl view = new BasicTabViewCtrl(m_key, Title, Adapter, m_selectFields, GameFileViewFactory.CreateGameFileViewGrid());\n            SetBaseCloneProperties(view);\n            return view;\n        }\n\n        protected void SetBaseCloneProperties(ITabView view)\n        {\n            if (GameFileViewControl is IGameFileColumnView columnView)\n                view.SetColumnConfig(columnView.ColumnFields, GetColumnConfig().ToArray());\n            else\n                view.SetColumnConfig(GameFileViewFactory.DefaultColumnTextFields, DataCache.Instance.GetColumnConfig());\n        }\n\n        public List<ColumnConfig> GetColumnConfig()\n        {\n            string tabKey = Key.ToString();\n\n            if (GameFileViewControl is IGameFileColumnView columnView)\n            {\n                List<ColumnConfig> config = new List<ColumnConfig>();\n\n                foreach (string key in columnView.GetColumnKeyOrder())\n                    config.Add(new ColumnConfig(tabKey, key, columnView.GetColumnWidth(key), columnView.GetColumnSort(key)));\n\n                return config;\n            }\n            else if (GameFileViewControl is IGameFileSortableView sortableView)\n            {\n                List<ColumnConfig> config = new List<ColumnConfig>();\n                string key = sortableView.GetSortedColumnKey();\n\n                if (!string.IsNullOrEmpty(key) && sortableView.GetColumnSort(key) != SortOrder.None)\n                    config.Add(new ColumnConfig(tabKey, key, 0, sortableView.GetColumnSort(key)));\n\n                return config;\n            }\n            else\n            {\n                throw new InvalidOperationException(\"GameFileViewControl is not IGameFileSortableView\");\n            }\n        }\n\n        public void SetColumnConfig(ColumnField[] columnTextFields, ColumnConfig[] colConfig)\n        {\n            var currentColumnConfig = GetColumnConfig();\n            if (CompareColumnConfig(currentColumnConfig, colConfig))\n                return;\n\n            string key = Key.ToString();\n\n            if (GameFileViewControl is IGameFileColumnView columnView)\n            {\n                columnView.SuspendLayout();\n\n                var sortedColumns = SortColumns(key, columnTextFields, colConfig);\n                columnView.SetColumnFields(sortedColumns);\n                SetSortedColumn(key, columnView, colConfig);\n                SetColumnWidths(key, columnView, colConfig);\n\n                columnView.SetColumnFormat(\"ReleaseDate\", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\n                columnView.SetColumnFormat(\"Downloaded\", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\n                columnView.SetColumnFormat(\"LastPlayed\", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\n\n                GameFileViewControl.ResumeLayout();\n            }\n            else if (GameFileViewControl is IGameFileSortableView sortableView)\n            {\n                var sortedColumns = SortColumns(key, columnTextFields, colConfig);\n                foreach (var sortColumn in sortedColumns)\n                {\n                    ColumnConfig config = colConfig.FirstOrDefault(x => x.Sort != SortOrder.None && x.Parent == key && sortColumn.DataKey.Equals(x.Column, StringComparison.InvariantCultureIgnoreCase));\n                    if (config != null)\n                    {\n                        sortableView.SetSortedColumn(config.Column, config.Sort);\n                        break;\n                    }\n                }\n            }\n        }\n\n        private bool CompareColumnConfig(IList<ColumnConfig> x, IList<ColumnConfig> y)\n        {\n            if (x.Count != y.Count)\n                return false;\n\n            for (int i = 0; i < x.Count; i++)\n            {\n                var configX = x[i];\n                var configY = y[i];\n\n                if (configX.Column != configY.Column)\n                    return false;\n\n                // Ignore the last column. Set to take up entire width and the values will never match.\n                if (i != x.Count - 1 && configX.Width != configY.Width)\n                    return false;\n            }\n\n            return true;\n        }\n\n        private static ColumnField[] SortColumns(string tab, ColumnField[] items, ColumnConfig[] config)\n        {\n            List<ColumnField> ret = new List<ColumnField>();\n            //Pre 1.1.0 update check. Without this maps will be thrown on the end of the column list\n            bool setMapLocation = config.Length > 0 && !config.Any(x => x.Column.Equals(\"mapcount\", StringComparison.OrdinalIgnoreCase));\n\n            foreach (ColumnConfig configItem in config)\n            {\n                var check = items.FirstOrDefault(x =>\n                    configItem.Parent == tab && x.DataKey.Equals(configItem.Column, StringComparison.InvariantCultureIgnoreCase));\n\n                if (check != null)\n                    ret.Add(check);\n            }\n            //continue with pre 1.1.0 check (this can probably be removed at this point, though)\n            if (setMapLocation && ret.Count > 4)\n            {\n                var maps = items.FirstOrDefault(x => x.Title.Equals(\"maps\", StringComparison.InvariantCultureIgnoreCase));\n\n                if (maps != null)\n                {\n                    ret.Remove(maps);\n                    ret.Insert(4, maps);\n                }\n            }\n\n            return ret.Union(items).ToArray();\n        }\n\n        private static void SetColumnWidths(string tab, IGameFileColumnView ctrl, ColumnConfig[] config)\n        {\n            IEnumerable<ColumnConfig> configSet = config.Where(x => x.Parent == tab);\n            foreach (ColumnConfig col in configSet)\n            {\n                ctrl.SetColumnWidth(col.Column, col.Width);\n            }\n        }\n\n        private static void SetSortedColumn(string tab, IGameFileColumnView gameFileViewControl, ColumnConfig[] colConfig)\n        {\n            ColumnConfig config = colConfig.FirstOrDefault(x => x.Parent == tab && x.Sort != SortOrder.None);\n\n            if (config != null)\n                gameFileViewControl.SetSortedColumn(config.Column, config.Sort);\n        }\n\n        public IGameFileView GameFileViewControl { get { return GameFileView; } }\n\n        public object Key { get { return m_key; } }\n\n        protected virtual bool FilterIWads { get; set; } = true;\n\n        public virtual void SetGameFiles()\n        {\n            GameFileGetOptions options = new GameFileGetOptions();\n            options.SelectFields = m_selectFields;\n            SetDataSource(Adapter.GetGameFiles(options));\n        }\n\n        public virtual void SetGameFiles(IEnumerable<GameFileSearchField> searchFields)\n        {\n            IEnumerable<IGameFile> items = Enumerable.Empty<IGameFile>();\n            foreach (GameFileSearchField sf in searchFields)\n                items = items.Union(Adapter.GetGameFiles(new GameFileGetOptions(m_selectFields, sf)));\n\n            SetDataSource(items);\n        }\n\n        public void SetGameFilesData(IEnumerable<IGameFile> gameFiles)\n        {\n            SetDataSource(gameFiles);\n        }\n\n        public virtual void UpdateDataSourceFile(IGameFile gameFile)\n        {\n            if (GameFileView.DataSource != null)\n            {\n                foreach (IGameFile item in GameFileView.DataSource)\n                {\n                    if (item.Equals(gameFile))\n                    {\n                        Array.ForEach(item.GetType().GetProperties().Where(x => x.SetMethod != null).ToArray(), x => x.SetValue(item, x.GetValue(gameFile)));\n                        GameFileView.UpdateGameFile(gameFile);\n                        ((UserControl)GameFileView).Invalidate(true);\n                        break;\n                    }\n                }\n            }\n        }\n\n        protected void SetDisplayText(string text)\n        {\n            GameFileView.SetDisplayText(text);\n        }\n\n        protected void SetDataSource(IEnumerable<IGameFile> gameFiles)\n        {\n            if (FilterIWads && !(Adapter is IdGamesDataAdapater))\n                gameFiles = gameFiles.Except(Adapter.GetGameFileIWads());\n\n            var args = new GameFileListEventArgs(gameFiles);\n            DataSourceChanging?.Invoke(this, args);\n\n            gameFiles = args.GameFiles;\n\n            if (!gameFiles.Any())\n            {\n                GameFileView.DataSource = null;\n                GameFileView.SetDisplayText(\"No Results Found\");\n            }\n            else\n            {\n                GameFileView.DataSource = gameFiles.ToList();\n            }\n\n            DataSourceChanged?.Invoke(this, args);\n        }\n\n        public virtual bool IsLocal { get { return true; } }\n        public virtual bool IsEditAllowed { get { return true; } }\n        public virtual bool IsDeleteAllowed { get { return true; } }\n        public virtual bool IsSearchAllowed { get { return true; } }\n        public virtual bool IsPlayAllowed { get { return true; } }\n        public virtual bool IsAutoSearchAllowed { get { return true; } }\n        public string Title { get; set; }\n        public virtual IGameFileDataSourceAdapter Adapter { get; set; }\n        public IGameFileView GameFileView { get; private set; }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/BasicTabViewCtrl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "DoomLauncher/TabViews/IWadTabViewCtrl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class IWadTabViewCtrl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/IWadTabViewCtrl.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public partial class IWadTabViewCtrl : LocalTabViewCtrl\n    {\n        private static readonly GameFileFieldType[] SearchFields = new[] { GameFileFieldType.GameFileID, GameFileFieldType.Filename };\n        private readonly IDataSourceAdapter m_dsAdapter;\n\n        public IWadTabViewCtrl(object key, string title, IDataSourceAdapter adapter, GameFileFieldType[] selectFields, ITagMapLookup lookup, GameFileViewFactory factory)\n            : base(key, title, adapter, selectFields, lookup, factory)\n        {\n            InitializeComponent();\n            m_dsAdapter = adapter;\n        }\n\n        public override void SetGameFiles()\n        {\n            SetDataSource(m_dsAdapter.GetGameFileIWads());\n        }\n\n        public override void SetGameFiles(IEnumerable<GameFileSearchField> searchFields)\n        {\n            var gameFileIWads = m_dsAdapter.GetGameFileIWads();\n            IEnumerable<IGameFile> items = Enumerable.Empty<IGameFile>();\n            foreach (GameFileSearchField sf in searchFields)\n                items = items.Union(Adapter.GetGameFiles(new GameFileGetOptions(SearchFields, sf)));\n\n            gameFileIWads = gameFileIWads.Where(x => items.Any(y => x.GameFileID == y.GameFileID));\n            SetDataSource(gameFileIWads);\n        }\n\n        public override bool IsSearchAllowed => true;\n        protected override bool FilterIWads => false;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/IdGamesTabViewCtrl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class IdGamesTabViewCtrl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/IdGamesTabViewCtrl.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    public partial class IdGamesTabViewCtrl : OptionsTabViewCtrl\n    {\n        private bool m_working;\n        private string m_errorMessage;\n\n        public IdGamesTabViewCtrl(object key, string title, IGameFileDataSourceAdapter adapter, GameFileFieldType[] selectFields, GameFileViewFactory factory)\n            : base(key, title, adapter, selectFields, factory)\n        {\n            InitializeComponent();\n        }\n\n        public override void SetGameFiles()\n        {\n            SetGameFiles(null);\n        }\n\n        public override void SetGameFiles(IEnumerable<GameFileSearchField> searchFields)\n        {\n            if (m_working)\n                return;\n            \n            m_working = true;\n            IdGamesDataSource = null;\n            SetDisplayText(\"Searching...\");\n\n            BackgroundWorker worker = new BackgroundWorker();\n            worker.DoWork += UpdateIdGamesView_Worker;\n            worker.RunWorkerCompleted += UpdateIdGamesViewCompleted;\n            worker.RunWorkerAsync(searchFields);\n        }\n\n        private void UpdateIdGamesView_Worker(object sender, DoWorkEventArgs e)\n        {\n            m_errorMessage = string.Empty;\n            try\n            {\n                IEnumerable<GameFileSearchField> searchFields = e.Argument as IEnumerable<GameFileSearchField>;\n                if (searchFields == null || !searchFields.Any())\n                {\n                    IdGamesDataSource = Adapter.GetGameFiles();\n                }\n                else\n                {\n                    IEnumerable<IGameFile> ret = new IGameFile[0];\n\n                    foreach (GameFileSearchField sf in searchFields)\n                        ret = ret.Union(Adapter.GetGameFiles(new GameFileGetOptions(sf)));\n\n                    IdGamesDataSource = ret;\n                }\n            }\n            catch (IdGamesBadResponseException ex)\n            {\n                m_errorMessage = ex.Message;\n                IdGamesDataSource = null;\n            }\n            catch (Exception ex)\n            {\n                m_errorMessage = $\"Failed to query id games: {ex.Message}\";\n                IdGamesDataSource = null;\n            }\n        }\n\n        private void UpdateIdGamesViewCompleted(object sender, EventArgs e)\n        {\n            m_working = false;\n\n            if (m_errorMessage.Length > 0)\n            {\n                SetDisplayText(m_errorMessage);\n                return;\n            }\n\n            if (IdGamesDataSource != null)\n            {\n                SetDataSource(IdGamesDataSource);\n            }\n            else\n            {\n                SetDisplayText(\"Error retrieving data from id Games\");\n                MessageBox.Show(this, \"There was an error retrieving data from id Games.\", \"Connection Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n\n        public override bool IsLocal { get { return false; } }\n        public override bool IsEditAllowed { get { return false; } }\n        public override bool IsDeleteAllowed { get { return false; } }\n        public override bool IsSearchAllowed { get { return true; } }\n        public override bool IsPlayAllowed { get { return false; } }\n        public override bool IsAutoSearchAllowed { get { return false; } }\n\n        public IEnumerable<IGameFile> IdGamesDataSource { get; set; }\n        protected override bool FilterIWads { get { return false; } }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/LocalTabViewCtrl.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Drawing;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public class LocalTabViewCtrl : BasicTabViewCtrl\n    {\n        private readonly ITagMapLookup m_tagLookup;\n\n        public LocalTabViewCtrl(object key, string title, IGameFileDataSourceAdapter adapter, GameFileFieldType[] selectFields, ITagMapLookup lookup, GameFileViewFactory factory)\n            : base(key, title, adapter, selectFields, factory)\n        {\n            GameFileViewControl.DoomLauncherParent = this;\n            m_tagLookup = lookup;\n\n            if (m_tagLookup != null && GameFileViewControl is IGameFileColumnView columnView)\n            {\n                columnView.CustomRowColorPaint = true;\n                columnView.CustomRowPaint += GameFileViewControl_CustomRowPaint;\n            }\n        }\n\n        void GameFileViewControl_CustomRowPaint(object sender, System.ComponentModel.CancelEventArgs e)\n        {\n            if (GameFileViewControl is IGameFileColumnView columnView)\n            {\n                e.Cancel = false;\n                IGameFile gameFile = columnView.CustomRowPaintDataBoundItem;\n\n                if (gameFile != null)\n                {\n                    ITagData tag = m_tagLookup.GetTags(gameFile).FirstOrDefault(x => x.HasColor && x.Color.HasValue);\n\n                    if (tag != null)\n                        columnView.CustomRowPaintForeColor = Color.FromArgb(tag.Color.Value);\n                    else\n                        columnView.CustomRowPaintForeColor = ColorTheme.Current.Text;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/OptionsTabViewCtrl.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class OptionsTabViewCtrl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/OptionsTabViewCtrl.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public partial class OptionsTabViewCtrl : LocalTabViewCtrl\n    {\n        public OptionsTabViewCtrl(object key, string title, IGameFileDataSourceAdapter adapter, GameFileFieldType[] selectFields, GameFileViewFactory factory) \n            : base(key, title, adapter, selectFields, null, factory)\n        {\n            InitializeComponent();\n        }\n\n        public OptionsTabViewCtrl(object key, string title, IGameFileDataSourceAdapter adapter, GameFileFieldType[] selectFields, ITagMapLookup lookup, GameFileViewFactory factory)\n            : base(key, title, adapter, selectFields, lookup, factory)\n        {\n            InitializeComponent();\n        }\n\n        public GameFileGetOptions Options { get; set; }\n\n        public override void SetGameFiles()\n        {\n            if (Options != null)\n                SetGameFiles(null);\n            else\n                base.SetGameFiles();\n        }\n\n        public override void SetGameFiles(IEnumerable<GameFileSearchField> searchFields)\n        {\n            if (Options != null)\n            {\n                GameFileGetOptions options = new GameFileGetOptions();\n                options.Limit = 25;\n                options.OrderBy = OrderType.Desc;\n                options.OrderField = GameFileFieldType.Downloaded;\n                options.SelectFields = base.m_selectFields;\n\n                if (searchFields != null && searchFields.Any())\n                {\n                    IEnumerable<IGameFile> items = new IGameFile[0];\n\n                    foreach (GameFileSearchField sf in searchFields)\n                    {\n                        options.SearchField = sf;\n                        items = items.Union(Adapter.GetGameFiles(options));\n                    }\n\n                    base.SetDataSource(items);\n                }\n                else\n                {\n                    base.SetDataSource(Adapter.GetGameFiles(options));\n                }\n            }\n            else\n            {\n                base.SetGameFiles(searchFields);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/TagTabView.Designer.cs",
    "content": "﻿namespace DoomLauncher\n{\n    partial class TagTabView\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        [System.CodeDom.Compiler.GeneratedCode(\"Winform Designer\", \"VS2015 SP1\")]\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Text = \"TagTabView\";\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "DoomLauncher/TabViews/TagTabView.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    public partial class TagTabView : BasicTabViewCtrl\n    {\n        private IDataSourceAdapter m_tagAdapter;\n\n        public TagTabView(object key, string title, IDataSourceAdapter adapter, GameFileFieldType[] selectFields, ITagData tag, GameFileViewFactory factory)\n            : this(key, title, adapter, selectFields, tag, factory.CreateGameFileView())\n        {\n            m_factory = factory;\n        }\n\n        public TagTabView(object key, string title, IDataSourceAdapter adapter, GameFileFieldType[] selectFields, ITagData tag, IGameFileView view)\n            : base(key, title, adapter, selectFields, view)\n        {\n            InitializeComponent();\n            TagDataSource = tag;\n            m_tagAdapter = adapter;\n            FilterIWads = false;\n        }\n\n        public override object Clone()\n        {\n            TagTabView view = new TagTabView(m_key, Title, m_tagAdapter, m_selectFields, TagDataSource, GameFileViewFactory.CreateGameFileViewGrid());\n            SetBaseCloneProperties(view);\n            return view;\n        }        \n\n        public override void SetGameFiles()\n        {\n            GameFileGetOptions options = new GameFileGetOptions();\n            options.SelectFields = m_selectFields;\n            SetDataSource(m_tagAdapter.GetGameFiles(options, TagDataSource));\n        }\n\n        public override void SetGameFiles(IEnumerable<GameFileSearchField> searchFields)\n        {\n            IEnumerable<IGameFile> items = new IGameFile[0];\n\n            foreach (GameFileSearchField sf in searchFields)\n            {\n                items = items.Union(m_tagAdapter.GetGameFiles(new GameFileGetOptions(m_selectFields, sf), TagDataSource));\n            }\n\n            SetDataSource(items);\n        }\n\n        public ITagData TagDataSource\n        {\n            get;\n            set;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TabViews/UntaggedTabView.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DoomLauncher\n{\n    class UntaggedTabView : LocalTabViewCtrl\n    {\n        public UntaggedTabView(object key, string title, IGameFileDataSourceAdapter adapter, GameFileFieldType[] selectFields, ITagMapLookup lookup, GameFileViewFactory factory)\n            : base(key, title, adapter, selectFields, lookup, factory)\n        {\n\n        }\n\n        public override void SetGameFiles()\n        {\n            SetDataSource(Adapter.GetUntaggedGameFiles());\n        }\n\n        public override void SetGameFiles(IEnumerable<GameFileSearchField> searchFields)\n        {\n            IEnumerable<IGameFile> items = new IGameFile[0];\n            var untaggedFiles = Adapter.GetUntaggedGameFiles();\n\n            foreach (GameFileSearchField sf in searchFields)\n            {\n                var search = Adapter.GetGameFiles(new GameFileGetOptions(m_selectFields, sf));\n                items = items.Union(untaggedFiles.Intersect(search));\n            }\n\n            SetDataSource(items);\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/TextFileParsers/ZdlParser.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace DoomLauncher\n{\n    public class ZdlParser\n    {\n        private static string s_regexFull = @\"{0}=.*\";\n        private static string s_regex = @\"{0}=\";\n\n        private readonly List<string> m_errors = new List<string>();\n\n        private readonly IEnumerable<ISourcePortData> m_sourcePorts;\n        private readonly IEnumerable<IIWadData> m_iwads;\n\n        public ZdlParser(IEnumerable<ISourcePortData> sourcePorts, IEnumerable<IIWadData> iwads)\n        {\n            m_sourcePorts = sourcePorts;\n            m_iwads = iwads;\n        }\n\n        public string[] Errors { get { return m_errors.ToArray(); } }\n\n        public IGameFile[] Parse(string fileText)\n        {\n            m_errors.Clear();\n\n            List<IGameFile> gameFiles = new List<IGameFile>();\n            fileText = fileText.Replace(\"\\r\\n\", \"\\n\"); ;\n\n            if (!fileText.StartsWith(\"[zdl.save]\"))\n            {\n                m_errors.Add(\"Not a valid zdl file\");\n                return new IGameFile[] {};\n            }\n\n            string zdlFilePath = null;\n            int zdlFileNum = 0;\n\n            do\n            {\n                zdlFilePath = FindValue(fileText, string.Format(\"file{0}\", zdlFileNum), s_regexFull).Trim();\n                zdlFileNum++;\n\n                if (!string.IsNullOrEmpty(zdlFilePath))\n                {\n                    GameFile gameFile = new GameFile();\n                    gameFile.FileName = zdlFilePath;\n                    gameFiles.Add(gameFile);\n                }\n\n            } while (!string.IsNullOrEmpty(zdlFilePath));\n\n            if (gameFiles.Count > 0)\n            {\n                string skill = FindValue(fileText, \"skill\", s_regexFull);\n                string port = FindValue(fileText, \"port\", s_regexFull);\n                string warp = FindValue(fileText, \"warp\", s_regexFull);\n                string iwad = FindValue(fileText, \"iwad\", s_regexFull);\n                string parameters = FindValue(fileText, \"extra\", s_regexFull);\n\n                IGameFile gameFile = gameFiles[0];\n                gameFile.SettingsSkill = skill;\n                gameFile.SettingsMap = warp;\n                gameFile.Map = warp;\n                gameFile.SettingsExtraParams = parameters;\n                gameFile.SourcePortID = GetSourcePort(port);\n                gameFile.IWadID = GetIWad(iwad);\n            }\n            else\n            {\n                m_errors.Add(\"Did not contain any files (e.g. file=0)\");\n            }\n\n            return gameFiles.ToArray();\n        }\n\n        private int? GetSourcePort(string port)\n        {\n            ISourcePortData sp = m_sourcePorts.FirstOrDefault(x => x.Name.Equals(port, StringComparison.InvariantCultureIgnoreCase));\n\n            if (sp == null)\n                m_errors.Add(string.Format(\"Could not find Source Port - {0}\", port));\n\n            if (sp != null)\n                return sp.SourcePortID;\n\n            return null;\n        }\n\n        private int? GetIWad(string iwad)\n        {\n            iwad = Path.GetFileNameWithoutExtension(iwad);\n            IIWadData data = m_iwads.FirstOrDefault(x => Path.GetFileNameWithoutExtension(x.FileName).Equals(iwad, StringComparison.InvariantCultureIgnoreCase));\n\n            if (data == null)\n                m_errors.Add(string.Format(\"Could not find IWAD - {0}\", iwad));\n\n            if (data != null)\n                return data.IWadID;\n\n            return null;\n        }\n\n        private string FindValue(string text, string category, string regexFull)\n        {\n            Match m = new Regex(string.Format(regexFull, category), RegexOptions.Multiline).Match(text);\n\n            if (m.Success)\n                return m.Value.Substring((new Regex(string.Format(s_regex, category)).Match(m.Value).Value.Length));\n\n            return string.Empty;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Update/ApplicationUpdate.cs",
    "content": "﻿using Octokit;\nusing System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace DoomLauncher\n{\n    public class ApplicationUpdate\n    {\n        private readonly TimeSpan m_timeout;\n\n        public ApplicationUpdate(TimeSpan timeout)\n        {\n            m_timeout = timeout;\n        }\n\n        public async Task<ApplicationUpdateInfo> GetUpdateApplicationInfo(Version currentVersion)\n        {\n            try\n            {\n                var github = new GitHubClient(new ProductHeaderValue($\"{Util.GitHubUser}.{Util.GitHubRepositoryName}\"));\n                github.SetRequestTimeout(m_timeout);\n                var release = await github.Repository.Release.GetLatest(Util.GitHubUser, Util.GitHubRepositoryName);\n\n                if (release != null)\n                {\n                    Version remoteVersion = new Version(release.Name);\n                    if (remoteVersion > currentVersion)\n                    {\n                        ReleaseAsset asset;\n                        if (LauncherPath.IsInstalled())\n                            asset = release.Assets.FirstOrDefault(x => x.Name.EndsWith(\"_install.zip\"));\n                        else\n                            asset = release.Assets.FirstOrDefault(x => x.Name.EndsWith(\".zip\") && !x.Name.EndsWith(\"_install.zip\"));\n\n                        if (asset != null)\n                            return new ApplicationUpdateInfo(remoteVersion, asset.BrowserDownloadUrl, release.HtmlUrl, asset.CreatedAt.LocalDateTime);\n                    }\n                }\n            }\n            catch(RateLimitExceededException)\n            {\n                return null;\n            }\n\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Update/ApplicationUpdateInfo.cs",
    "content": "﻿using System;\n\nnamespace DoomLauncher\n{\n    public class ApplicationUpdateInfo\n    {\n        public ApplicationUpdateInfo(Version version, string downloadUrl, string releasePage, DateTime releaseDate)\n        {\n            Version = version;\n            DownloadUrl = downloadUrl;\n            ReleasePageUrl = releasePage;\n            ReleaseDate = releaseDate;\n        }\n\n        public readonly Version Version;\n        public readonly string DownloadUrl;\n        public readonly string ReleasePageUrl;\n        public readonly DateTime ReleaseDate;\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/Update/ApplicationUpdater.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace DoomLauncher\n{\n    class RenameFile\n    {\n        public RenameFile(string originalName, string newName)\n        {\n            OriginalName = originalName;\n            NewName = newName;\n        }\n\n        public string OriginalName;\n        public string NewName;\n    }\n\n    public class ApplicationUpdater\n    {\n        private static readonly string s_updateExtension = \".bak\";\n        private readonly string m_zipArchive;\n        private readonly string m_executingDirectory;\n\n        public string LastError { get; private set; } = string.Empty;\n\n        public ApplicationUpdater(string zipArchive, string executingDirectory)\n        {\n            m_zipArchive = zipArchive;\n            m_executingDirectory = executingDirectory;\n        }\n\n        public bool Execute()\n        {\n            if (LauncherPath.IsInstalled())\n                return ExecuteInstallUpdate();\n            else\n                return ExecuteNonInstallUpdate();\n        }\n\n        private bool ExecuteInstallUpdate()\n        {\n            try\n            {\n                string extractFolder = Path.Combine(Path.GetTempPath(), \"DoomLauncherUpdate\");\n                if (Directory.Exists(extractFolder))\n                    Directory.Delete(extractFolder, true);\n                using (ZipArchive za = ZipFile.OpenRead(m_zipArchive))\n                    za.ExtractToDirectory(extractFolder);\n\n                string setup = Path.Combine(extractFolder, \"setup.exe\");\n                if (File.Exists(setup))\n                {\n                    Process.Start(setup);\n                    Application.Exit();\n                }\n            }\n            catch(Exception ex)\n            {\n                SetLastErrorException(ex);\n                return false;\n            }\n\n            return true;\n        }\n\n        private bool ExecuteNonInstallUpdate()\n        {\n            List<RenameFile> renamedFiles = new List<RenameFile>();\n\n            try\n            {\n                using (ZipArchive za = ZipFile.OpenRead(m_zipArchive))\n                {\n                    var entries = za.Entries.Where(x => x.Name.Length > 0 && (x.FullName.StartsWith(\"DoomLauncher\\\\\") || x.FullName.StartsWith(\"DoomLauncher/\")));\n\n                    if (!entries.Any())\n                    {\n                        LastError = \"Could not find DoomLauncher folder in archive.\";\n                        return false;\n                    }\n\n                    foreach (var entry in entries)\n                    {\n                        string file = GetCopyFile(entry);\n                        FileInfo fileInfo = new FileInfo(file);\n\n                        if (fileInfo.Exists)\n                            renamedFiles.Add(new RenameFile(fileInfo.Name, RenameAppFile(fileInfo)));\n                        entry.ExtractToFile(file);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                SetLastErrorException(ex);\n                RevertRenamedFiles(renamedFiles);\n                return false;\n            }\n\n            Process.Start(Path.Combine(m_executingDirectory, Util.GetExecutableNoPath()));\n            return true;\n        }\n\n        private string GetCopyFile(ZipArchiveEntry entry)\n        {\n            if (entry.FullName.Contains(\"x86\"))\n                return Path.Combine(Directory.GetCurrentDirectory(), \"x86\", entry.Name);\n            if (entry.FullName.Contains(\"x64\"))\n                return Path.Combine(Directory.GetCurrentDirectory(), \"x64\", entry.Name);\n\n            return Path.Combine(Directory.GetCurrentDirectory(), entry.Name);\n        }\n\n        private void SetLastErrorException(Exception ex)\n        {\n            LastError = string.Concat(\"**ERROR TRACE**\", Environment.NewLine, ex.Message, Environment.NewLine, ex.StackTrace);\n        }\n\n        private void RevertRenamedFiles(List<RenameFile> renamedFiles)\n        {\n            foreach (RenameFile file in renamedFiles)\n            {\n                if (File.Exists(file.OriginalName))\n                    File.Delete(file.OriginalName);\n\n                File.Move(file.NewName, file.OriginalName);\n            }\n        }\n\n        private string RenameAppFile(FileInfo fileInfo)\n        {\n            string backupName = CreateBackupFileName(fileInfo);\n            if (File.Exists(backupName))\n                File.Delete(backupName);\n            fileInfo.MoveTo(backupName);\n            return backupName;\n        }\n\n        private string CreateBackupFileName(FileInfo fileInfo)\n        {\n            return fileInfo.FullName + s_updateExtension;\n        }\n\n        public static void CleanupUpdateFiles(string executingDirectory)\n        {\n            var files = Directory.GetFiles(executingDirectory).Where(x => x.EndsWith(s_updateExtension));\n\n            try\n            {\n                foreach (string file in files)\n                    File.Delete(file);\n            }\n            catch\n            {\n                //not critical\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/WindowsVersion/WindowsVersion.cs",
    "content": "﻿using Microsoft.Win32;\nusing System;\n\nnamespace DoomLauncher.WindowsVersion\n{\n    public enum WindowsTheme\n    {\n        Dark,\n        Light,\n        Unknown\n    }\n\n    public static class WindowsVersionInfo\n    {\n        public static bool GetOsVersionInfo(out Version versionInfo)\n        {\n            try\n            {\n                versionInfo = Environment.OSVersion.Version;\n                return true;\n            }\n            catch\n            {\n                versionInfo = new Version();\n                return false;\n            }\n        }\n\n        public static bool IsWindows10OrGreater(Version versionInfo, int build) =>\n            versionInfo.Major >= 10 && versionInfo.Build >= build;\n\n        public static WindowsTheme GetTheme()\n        {\n            try\n            {\n                int res = (int)Registry.GetValue(\n                    \"HKEY_CURRENT_USER\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\",\n                    \"AppsUseLightTheme\", -1);\n                switch (res)\n                {\n                    case 0: return WindowsTheme.Dark;\n                    case 1: return WindowsTheme.Light;\n                    default: return WindowsTheme.Unknown;\n                }\n            }\n            catch\n            {\n                return WindowsTheme.Unknown;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncher/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n  <assemblyIdentity version=\"2.6.5.0\" name=\"DoomLauncher.app\"/>\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\n    <security>\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n        <!-- UAC Manifest Options\n             If you want to change the Windows User Account Control level replace the \n             requestedExecutionLevel node with one of the following.\n\n        <requestedExecutionLevel  level=\"asInvoker\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"requireAdministrator\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"highestAvailable\" uiAccess=\"false\" />\n\n            Specifying requestedExecutionLevel element will disable file and registry virtualization. \n            Remove this element if your application requires this virtualization for backwards\n            compatibility.\n        -->\n        <requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\n      </requestedPrivileges>\n    </security>\n  </trustInfo>\n\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- A list of the Windows versions that this application has been tested on\n           and is designed to work with. Uncomment the appropriate elements\n           and Windows will automatically select the most compatible environment. -->\n\n      <!-- Windows Vista -->\n      <!--<supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" />-->\n\n      <!-- Windows 7 -->\n      <!--<supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />-->\n\n      <!-- Windows 8 -->\n      <!--<supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />-->\n\n      <!-- Windows 8.1 -->\n      <!--<supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />-->\n\n      <!-- Windows 10 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\n\n    </application>\n  </compatibility>\n\n  <!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher\n       DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need \n       to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should \n       also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->\n\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true</dpiAware>\n    </windowsSettings>\n  </application>\n\n  <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->\n  <!--\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity\n          type=\"win32\"\n          name=\"Microsoft.Windows.Common-Controls\"\n          version=\"6.0.0.0\"\n          processorArchitecture=\"*\"\n          publicKeyToken=\"6595b64144ccf1df\"\n          language=\"*\"\n        />\n    </dependentAssembly>\n  </dependency>\n  -->\n</assembly>\n"
  },
  {
    "path": "DoomLauncher/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"6.4.4\" targetFramework=\"net48\" />\n  <package id=\"Newtonsoft.Json\" version=\"13.0.1\" targetFramework=\"net48\" />\n  <package id=\"Octokit\" version=\"0.50.0\" targetFramework=\"net48\" />\n  <package id=\"SevenZipSharp\" version=\"0.64\" targetFramework=\"net48\" />\n  <package id=\"SevenZipSharp.Interop\" version=\"19.0.2\" targetFramework=\"net48\" />\n  <package id=\"SharpCompress\" version=\"0.31.0\" targetFramework=\"net48\" />\n  <package id=\"Squid-Box.SevenZipSharp\" version=\"1.5.0.366\" targetFramework=\"net48\" />\n  <package id=\"Stub.System.Data.SQLite.Core.NetFramework\" version=\"1.0.115.5\" targetFramework=\"net48\" />\n  <package id=\"System.Buffers\" version=\"4.5.1\" targetFramework=\"net48\" />\n  <package id=\"System.Collections.Specialized\" version=\"4.3.0\" targetFramework=\"net48\" />\n  <package id=\"System.Data.SQLite\" version=\"1.0.115.5\" targetFramework=\"net48\" />\n  <package id=\"System.Data.SQLite.Core\" version=\"1.0.115.5\" targetFramework=\"net48\" />\n  <package id=\"System.Data.SQLite.EF6\" version=\"1.0.115.5\" targetFramework=\"net48\" />\n  <package id=\"System.Data.SQLite.Linq\" version=\"1.0.115.5\" targetFramework=\"net48\" />\n  <package id=\"System.Memory\" version=\"4.5.4\" targetFramework=\"net48\" />\n  <package id=\"System.Numerics.Vectors\" version=\"4.5.0\" targetFramework=\"net48\" />\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"5.0.0\" targetFramework=\"net48\" />\n  <package id=\"System.Text.Encoding.CodePages\" version=\"5.0.0\" targetFramework=\"net48\" />\n</packages>"
  },
  {
    "path": "DoomLauncher.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31903.59\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DoomLauncher\", \"DoomLauncher\\DoomLauncher.csproj\", \"{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4} = {52357DD1-59A8-4412-98CA-6601D84B66B4}\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CheckBoxComboBox\", \"CheckBoxComboBox\\CheckBoxComboBox.csproj\", \"{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WadReader\", \"WadReader\\WadReader.csproj\", \"{15A9A8FC-096E-4458-AB7F-02386740CF4E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DoomLauncherRelease\", \"DoomLauncherRelease\\DoomLauncherRelease.csproj\", \"{52357DD1-59A8-4412-98CA-6601D84B66B4}\"\nEndProject\nProject(\"{54435603-DBB4-11D2-8724-00A0C9A8B90C}\") = \"Setup\", \"Setup\\Setup.vdproj\", \"{28E7A7D3-E32C-4D2F-AA60-7EF483DEB3A9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"BindingListView\", \"BindingListView\\BindingListView.csproj\", \"{75AF36A8-7797-4023-B183-5B63D448420A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"UnitTest\", \"UnitTest\\UnitTest.csproj\", \"{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|Mixed Platforms = Debug|Mixed Platforms\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|Mixed Platforms = Release|Mixed Platforms\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{70A25201-8EA4-48F8-A4A6-ED13ADF8823C}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{15A9A8FC-096E-4458-AB7F-02386740CF4E}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{52357DD1-59A8-4412-98CA-6601D84B66B4}.Release|x86.Build.0 = Release|Any CPU\n\t\t{28E7A7D3-E32C-4D2F-AA60-7EF483DEB3A9}.Debug|Any CPU.ActiveCfg = Debug\n\t\t{28E7A7D3-E32C-4D2F-AA60-7EF483DEB3A9}.Debug|Mixed Platforms.ActiveCfg = Debug\n\t\t{28E7A7D3-E32C-4D2F-AA60-7EF483DEB3A9}.Debug|x86.ActiveCfg = Debug\n\t\t{28E7A7D3-E32C-4D2F-AA60-7EF483DEB3A9}.Release|Any CPU.ActiveCfg = Release\n\t\t{28E7A7D3-E32C-4D2F-AA60-7EF483DEB3A9}.Release|Mixed Platforms.ActiveCfg = Release\n\t\t{28E7A7D3-E32C-4D2F-AA60-7EF483DEB3A9}.Release|x86.ActiveCfg = Release\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{75AF36A8-7797-4023-B183-5B63D448420A}.Release|x86.Build.0 = Release|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {847DA28F-AD38-47C7-9576-BCB3C6B863F1}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "DoomLauncherRelease/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.8\"/>\n    </startup>\n</configuration>\n"
  },
  {
    "path": "DoomLauncherRelease/DoomLauncherRelease.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{52357DD1-59A8-4412-98CA-6601D84B66B4}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>DoomLauncherRelease</RootNamespace>\n    <AssemblyName>DoomLauncherRelease</AssemblyName>\n    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.IO.Compression\" />\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "DoomLauncherRelease/Program.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Reflection;\n\nnamespace DoomLauncherRelease\n{\n    static class Program\n    {\n        static string s_argPath;\n\n        static int Main(string[] args)\n        {\n            if (args.Length > 0)\n                s_argPath = args[0];\n\n            string outputDir = \"ReleaseBuild\";\n            string buildDir = CreateBuildDirectory(outputDir);\n\n            if (!Directory.Exists(Path.Combine(GetBaseDir(), outputDir)))\n                Directory.CreateDirectory(Path.Combine(GetBaseDir(), outputDir));\n\n            Directory.CreateDirectory(buildDir);\n            CopyBuildFiles(buildDir);\n\n            string zipfile = CreateZipFile(outputDir, buildDir, false);\n            string zipfiledest = Path.Combine(GetBaseDir(), outputDir, Path.GetFileName(zipfile));\n            File.Copy(zipfile, zipfiledest, true);\n\n            zipfile = CreateZipFile(Path.Combine(GetBaseDir(), \"Setup\", GetBuildOutputDir()), buildDir, true);\n            zipfiledest = Path.Combine(GetBaseDir(), outputDir, Path.GetFileName(zipfile));\n            File.Copy(zipfile, zipfiledest, true);\n\n            return 0;\n        }\n\n        private static string CreateBuildDirectory(string outputDir)\n        {\n            if (Directory.Exists(outputDir))\n                Directory.Delete(outputDir, true);\n\n            return Path.Combine(outputDir, \"DoomLauncher\");\n        }\n\n        private static string CreateZipFile(string outputDir, string buildDir, bool installer)\n        {\n            string zipfile = $\"DoomLauncher_{GetVersion(buildDir)}{GetInstallPost(installer)}.zip\";\n            if (File.Exists(zipfile))\n                File.Delete(zipfile);\n\n            ZipFile.CreateFromDirectory(outputDir, zipfile);\n            return zipfile;\n        }\n\n        private static string GetInstallPost(bool installer)\n        {\n            if (installer)\n                return \"_install\";\n\n            return string.Empty;\n        }\n\n        private static string GetVersion(string buildDir)\n        {\n            string prefix = string.Empty;\n#if DEBUG\n            prefix = \"debug_\";\n#endif\n            var v = AssemblyName.GetAssemblyName(Path.Combine(buildDir, \"DoomLauncher.exe\")).Version;\n            return prefix + v.ToString();\n        }\n\n        private static void CopyBuildFiles(string outputdir)\n        {\n            foreach (string dir in GetDirectoriesToCreate())\n                Directory.CreateDirectory(Path.Combine(outputdir, dir));\n\n            var files = GetFilesToCopy();\n            string buildDir = Path.Combine(GetDoomLauncherDir(), GetBuildBinOutputDir());\n\n            foreach (var file in files)\n                File.Copy(Path.Combine(buildDir, file), Path.Combine(outputdir, file));\n\n            File.Copy(Path.Combine(GetDoomLauncherDir(), \"DoomLauncher.sqlite\"), Path.Combine(outputdir, \"DoomLauncher_.sqlite\"));\n\n            string tileimages = \"TileImages\";\n            string source = Path.Combine(buildDir, tileimages);\n            string dest = Path.Combine(outputdir, tileimages);\n            Directory.CreateDirectory(Path.Combine(outputdir, tileimages));\n\n            var imagefiles = Directory.GetFiles(source);\n            Array.ForEach(imagefiles, x => File.Copy(x, Path.Combine(dest, Path.GetFileName(x))));\n        }\n\n        static string[] GetDirectoriesToCreate() =>\n            new string[] { \"x86\", \"x64\" };\n\n        static string[] GetFilesToCopy()\n        {\n            return new string[]\n            {\n                \"CheckBoxComboBox.dll\",\n                \"DoomLauncher.exe\",\n                \"DoomLauncher.exe.config\",\n                \"DoomLauncher.ico\",\n                \"DoomLauncher.VisualElementsManifest.xml\",\n                \"Equin.ApplicationFramework.BindingListView.dll\",\n                \"Help.pdf\",\n                \"Newtonsoft.Json.dll\",\n                \"Newtonsoft.Json.xml\",\n                \"System.Data.SQLite.dll\",\n                \"System.Memory.dll\",\n                \"System.Numerics.Vectors.dll\",\n                \"System.Runtime.CompilerServices.Unsafe.dll\",\n                \"System.Buffers.dll\",\n                \"WadReader.dll\",\n                \"Octokit.dll\",\n                \"Octokit.xml\",\n                \"SevenZipSharp.dll\",\n                \"SharpCompress.dll\",\n                \"x64\\\\SQLite.Interop.dll\",\n                \"x86\\\\SQLite.Interop.dll\",\n                \"x64\\\\7z.dll\",\n                \"x86\\\\7z.dll\",\n            };\n        }\n\n        static string GetDoomLauncherDir()\n        {\n            return Path.Combine(GetBaseDir(), \"DoomLauncher\");\n        }\n\n        static string GetBaseDir()\n        {\n            if (string.IsNullOrEmpty(s_argPath))\n                return Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), @\"..\\..\\..\\\"));\n            else\n                return s_argPath;\n        }\n\n        static string GetBuildBinOutputDir()\n        {\n#if DEBUG\n            return Path.Combine(\"bin\", GetBuildOutputDir());\n#else\n            return Path.Combine(\"bin\", GetBuildOutputDir());\n#endif\n        }\n\n        static string GetBuildOutputDir()\n        {\n#if DEBUG\n            return \"Debug\";\n#else\n            return \"Release\";\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "DoomLauncherRelease/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"DoomLauncherRelease\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"DoomLauncherRelease\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"52357dd1-59a8-4412-98ca-6601d84b66b4\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "Newtonsoft.Json.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>Newtonsoft.Json</name>\n    </assembly>\n    <members>\n        <member name=\"T:Newtonsoft.Json.Bson.BsonObjectId\">\n            <summary>\n            Represents a BSON Oid (object id).\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Bson.BsonObjectId.Value\">\n            <summary>\n            Gets or sets the value of the Oid.\n            </summary>\n            <value>The value of the Oid.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonObjectId.#ctor(System.Byte[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Bson.BsonObjectId\"/> class.\n            </summary>\n            <param name=\"value\">The Oid value.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Bson.BsonReader\">\n            <summary>\n            Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Bson.BsonReader.JsonNet35BinaryCompatibility\">\n            <summary>\n            Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary.\n            </summary>\n            <value>\n            \t<c>true</c> if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Bson.BsonReader.ReadRootValueAsArray\">\n            <summary>\n            Gets or sets a value indicating whether the root object will be read as a JSON array.\n            </summary>\n            <value>\n            \t<c>true</c> if the root object will be read as a JSON array; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Bson.BsonReader.DateTimeKindHandling\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.DateTimeKind\" /> used when reading <see cref=\"T:System.DateTime\"/> values from BSON.\n            </summary>\n            <value>The <see cref=\"T:System.DateTimeKind\" /> used when reading <see cref=\"T:System.DateTime\"/> values from BSON.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonReader.#ctor(System.IO.Stream)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Bson.BsonReader\"/> class.\n            </summary>\n            <param name=\"stream\">The stream.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonReader.#ctor(System.IO.BinaryReader)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Bson.BsonReader\"/> class.\n            </summary>\n            <param name=\"reader\">The reader.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonReader.#ctor(System.IO.Stream,System.Boolean,System.DateTimeKind)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Bson.BsonReader\"/> class.\n            </summary>\n            <param name=\"stream\">The stream.</param>\n            <param name=\"readRootValueAsArray\">if set to <c>true</c> the root object will be read as a JSON array.</param>\n            <param name=\"dateTimeKindHandling\">The <see cref=\"T:System.DateTimeKind\" /> used when reading <see cref=\"T:System.DateTime\"/> values from BSON.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonReader.#ctor(System.IO.BinaryReader,System.Boolean,System.DateTimeKind)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Bson.BsonReader\"/> class.\n            </summary>\n            <param name=\"reader\">The reader.</param>\n            <param name=\"readRootValueAsArray\">if set to <c>true</c> the root object will be read as a JSON array.</param>\n            <param name=\"dateTimeKindHandling\">The <see cref=\"T:System.DateTimeKind\" /> used when reading <see cref=\"T:System.DateTime\"/> values from BSON.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonReader.Read\">\n            <summary>\n            Reads the next JSON token from the stream.\n            </summary>\n            <returns>\n            <c>true</c> if the next token was read successfully; <c>false</c> if there are no more tokens to read.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonReader.Close\">\n            <summary>\n            Changes the <see cref=\"T:Newtonsoft.Json.JsonReader.State\"/> to Closed.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Bson.BsonWriter\">\n            <summary>\n            Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Bson.BsonWriter.DateTimeKindHandling\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.DateTimeKind\" /> used when writing <see cref=\"T:System.DateTime\"/> values to BSON.\n            When set to <see cref=\"F:System.DateTimeKind.Unspecified\" /> no conversion will occur.\n            </summary>\n            <value>The <see cref=\"T:System.DateTimeKind\" /> used when writing <see cref=\"T:System.DateTime\"/> values to BSON.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.#ctor(System.IO.Stream)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Bson.BsonWriter\"/> class.\n            </summary>\n            <param name=\"stream\">The stream.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.#ctor(System.IO.BinaryWriter)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Bson.BsonWriter\"/> class.\n            </summary>\n            <param name=\"writer\">The writer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.Flush\">\n            <summary>\n            Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteEnd(Newtonsoft.Json.JsonToken)\">\n            <summary>\n            Writes the end.\n            </summary>\n            <param name=\"token\">The token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteComment(System.String)\">\n            <summary>\n            Writes out a comment <code>/*...*/</code> containing the specified text.\n            </summary>\n            <param name=\"text\">Text to place inside the comment.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteStartConstructor(System.String)\">\n            <summary>\n            Writes the start of a constructor with the given name.\n            </summary>\n            <param name=\"name\">The name of the constructor.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteRaw(System.String)\">\n            <summary>\n            Writes raw JSON.\n            </summary>\n            <param name=\"json\">The raw JSON to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteRawValue(System.String)\">\n            <summary>\n            Writes raw JSON where a value is expected and updates the writer's state.\n            </summary>\n            <param name=\"json\">The raw JSON to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteStartArray\">\n            <summary>\n            Writes the beginning of a JSON array.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteStartObject\">\n            <summary>\n            Writes the beginning of a JSON object.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WritePropertyName(System.String)\">\n            <summary>\n            Writes the property name of a name/value pair on a JSON object.\n            </summary>\n            <param name=\"name\">The name of the property.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.Close\">\n            <summary>\n            Closes this stream and the underlying stream.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Object)\">\n            <summary>\n            Writes a <see cref=\"T:System.Object\"/> value.\n            An error will raised if the value cannot be written as a single JSON token.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Object\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteNull\">\n            <summary>\n            Writes a null value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteUndefined\">\n            <summary>\n            Writes an undefined value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.String)\">\n            <summary>\n            Writes a <see cref=\"T:System.String\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.String\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Int32)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int32\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int32\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.UInt32)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt32\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt32\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Int64)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int64\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int64\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.UInt64)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt64\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt64\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Single)\">\n            <summary>\n            Writes a <see cref=\"T:System.Single\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Single\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Double)\">\n            <summary>\n            Writes a <see cref=\"T:System.Double\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Double\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Boolean)\">\n            <summary>\n            Writes a <see cref=\"T:System.Boolean\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Boolean\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Int16)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int16\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int16\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.UInt16)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt16\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt16\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Char)\">\n            <summary>\n            Writes a <see cref=\"T:System.Char\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Char\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Byte)\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Byte\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.SByte)\">\n            <summary>\n            Writes a <see cref=\"T:System.SByte\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.SByte\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Decimal)\">\n            <summary>\n            Writes a <see cref=\"T:System.Decimal\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Decimal\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.DateTime)\">\n            <summary>\n            Writes a <see cref=\"T:System.DateTime\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.DateTime\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.DateTimeOffset)\">\n            <summary>\n            Writes a <see cref=\"T:System.DateTimeOffset\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.DateTimeOffset\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Byte[])\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/>[] value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Byte\"/>[] value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Guid)\">\n            <summary>\n            Writes a <see cref=\"T:System.Guid\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Guid\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.TimeSpan)\">\n            <summary>\n            Writes a <see cref=\"T:System.TimeSpan\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.TimeSpan\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Uri)\">\n            <summary>\n            Writes a <see cref=\"T:System.Uri\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Uri\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteObjectId(System.Byte[])\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/>[] value that represents a BSON object id.\n            </summary>\n            <param name=\"value\">The Object ID value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Bson.BsonWriter.WriteRegex(System.String,System.String)\">\n            <summary>\n            Writes a BSON regex.\n            </summary>\n            <param name=\"pattern\">The regex pattern.</param>\n            <param name=\"options\">The regex options.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.ConstructorHandling\">\n            <summary>\n            Specifies how constructors are used when initializing objects during deserialization by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.ConstructorHandling.Default\">\n            <summary>\n            First attempt to use the public default constructor, then fall back to single parameterized constructor, then the non-public default constructor.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.ConstructorHandling.AllowNonPublicDefaultConstructor\">\n            <summary>\n            Json.NET will use a non-public default constructor before falling back to a parameterized constructor.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.BinaryConverter\">\n            <summary>\n            Converts a binary value to and from a base 64 string value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.BinaryConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.BinaryConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.BinaryConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.BsonObjectIdConverter\">\n            <summary>\n            Converts a <see cref=\"T:Newtonsoft.Json.Bson.BsonObjectId\"/> to and from JSON and BSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.BsonObjectIdConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.BsonObjectIdConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.BsonObjectIdConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.CustomCreationConverter`1\">\n            <summary>\n            Create a custom object\n            </summary>\n            <typeparam name=\"T\">The object type to convert.</typeparam>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.CustomCreationConverter`1.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.CustomCreationConverter`1.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.CustomCreationConverter`1.Create(System.Type)\">\n            <summary>\n            Creates an object which will then be populated by the serializer.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>The created object.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.CustomCreationConverter`1.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.CustomCreationConverter`1.CanWrite\">\n            <summary>\n            Gets a value indicating whether this <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> can write JSON.\n            </summary>\n            <value>\n            \t<c>true</c> if this <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> can write JSON; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.DataSetConverter\">\n            <summary>\n            Converts a <see cref=\"T:System.Data.DataSet\"/> to and from JSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DataSetConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DataSetConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DataSetConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified value type.\n            </summary>\n            <param name=\"valueType\">Type of the value.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified value type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.DataTableConverter\">\n            <summary>\n            Converts a <see cref=\"T:System.Data.DataTable\"/> to and from JSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DataTableConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DataTableConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DataTableConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified value type.\n            </summary>\n            <param name=\"valueType\">Type of the value.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified value type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.DateTimeConverterBase\">\n            <summary>\n            Provides a base class for converting a <see cref=\"T:System.DateTime\"/> to and from JSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DateTimeConverterBase.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.DiscriminatedUnionConverter\">\n            <summary>\n            Converts a F# discriminated union type to and from JSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DiscriminatedUnionConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DiscriminatedUnionConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.DiscriminatedUnionConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.EntityKeyMemberConverter\">\n            <summary>\n            Converts an Entity Framework EntityKey to and from JSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.EntityKeyMemberConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.EntityKeyMemberConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.EntityKeyMemberConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.ExpandoObjectConverter\">\n            <summary>\n            Converts an ExpandoObject to and from JSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.ExpandoObjectConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.ExpandoObjectConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.ExpandoObjectConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.ExpandoObjectConverter.CanWrite\">\n            <summary>\n            Gets a value indicating whether this <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> can write JSON.\n            </summary>\n            <value>\n            \t<c>true</c> if this <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> can write JSON; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.IsoDateTimeConverter\">\n            <summary>\n            Converts a <see cref=\"T:System.DateTime\"/> to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z).\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.IsoDateTimeConverter.DateTimeStyles\">\n            <summary>\n            Gets or sets the date time styles used when converting a date to and from JSON.\n            </summary>\n            <value>The date time styles used when converting a date to and from JSON.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.IsoDateTimeConverter.DateTimeFormat\">\n            <summary>\n            Gets or sets the date time format used when converting a date to and from JSON.\n            </summary>\n            <value>The date time format used when converting a date to and from JSON.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.IsoDateTimeConverter.Culture\">\n            <summary>\n            Gets or sets the culture used when converting a date to and from JSON.\n            </summary>\n            <value>The culture used when converting a date to and from JSON.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.IsoDateTimeConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.IsoDateTimeConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.JavaScriptDateTimeConverter\">\n            <summary>\n            Converts a <see cref=\"T:System.DateTime\"/> to and from a JavaScript date constructor (e.g. new Date(52231943)).\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.JavaScriptDateTimeConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.JavaScriptDateTimeConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing property value of the JSON that is being converted.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.KeyValuePairConverter\">\n            <summary>\n            Converts a <see cref=\"T:System.Collections.Generic.KeyValuePair`2\"/> to and from JSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.KeyValuePairConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.KeyValuePairConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.KeyValuePairConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.RegexConverter\">\n            <summary>\n            Converts a <see cref=\"T:System.Text.RegularExpressions.Regex\"/> to and from JSON and BSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.RegexConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.RegexConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.RegexConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.StringEnumConverter\">\n            <summary>\n            Converts an <see cref=\"T:System.Enum\"/> to and from its name string value.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.StringEnumConverter.CamelCaseText\">\n            <summary>\n            Gets or sets a value indicating whether the written enum text should be camel case.\n            </summary>\n            <value><c>true</c> if the written enum text will be camel case; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.StringEnumConverter.AllowIntegerValues\">\n            <summary>\n            Gets or sets a value indicating whether integer values are allowed.\n            </summary>\n            <value><c>true</c> if integers are allowed; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.StringEnumConverter.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Converters.StringEnumConverter\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.StringEnumConverter.#ctor(System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Converters.StringEnumConverter\"/> class.\n            </summary>\n            <param name=\"camelCaseText\"><c>true</c> if the written enum text will be camel case; otherwise, <c>false</c>.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.StringEnumConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.StringEnumConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.StringEnumConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.VersionConverter\">\n            <summary>\n            Converts a <see cref=\"T:System.Version\"/> to and from a string (e.g. \"1.2.3.4\").\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.VersionConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.VersionConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing property value of the JSON that is being converted.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.VersionConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Converters.XmlNodeConverter\">\n            <summary>\n            Converts XML to and from JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.XmlNodeConverter.DeserializeRootElementName\">\n            <summary>\n            Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements.\n            </summary>\n            <value>The name of the deserialize root element.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.XmlNodeConverter.WriteArrayAttribute\">\n            <summary>\n            Gets or sets a flag to indicate whether to write the Json.NET array attribute.\n            This attribute helps preserve arrays when converting the written XML back to JSON.\n            </summary>\n            <value><c>true</c> if the array attibute is written to the XML; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Converters.XmlNodeConverter.OmitRootObject\">\n            <summary>\n            Gets or sets a value indicating whether to write the root JSON object.\n            </summary>\n            <value><c>true</c> if the JSON root object is omitted; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.XmlNodeConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.XmlNodeConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.XmlNodeConverter.IsNamespaceAttribute(System.String,System.String@)\">\n            <summary>\n            Checks if the attributeName is a namespace attribute.\n            </summary>\n            <param name=\"attributeName\">Attribute name to test.</param>\n            <param name=\"prefix\">The attribute name prefix if it has one, otherwise an empty string.</param>\n            <returns><c>true</c> if attribute name is for a namespace attribute, otherwise <c>false</c>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Converters.XmlNodeConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified value type.\n            </summary>\n            <param name=\"valueType\">Type of the value.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified value type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.FloatParseHandling\">\n            <summary>\n            Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.FloatParseHandling.Double\">\n            <summary>\n            Floating point numbers are parsed to <see cref=\"F:Newtonsoft.Json.FloatParseHandling.Double\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.FloatParseHandling.Decimal\">\n            <summary>\n            Floating point numbers are parsed to <see cref=\"F:Newtonsoft.Json.FloatParseHandling.Decimal\"/>.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.DateFormatHandling\">\n            <summary>\n            Specifies how dates are formatted when writing JSON text.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateFormatHandling.IsoDateFormat\">\n            <summary>\n            Dates are written in the ISO 8601 format, e.g. \"2012-03-21T05:40Z\".\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat\">\n            <summary>\n            Dates are written in the Microsoft JSON format, e.g. \"\\/Date(1198908717056)\\/\".\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.DateParseHandling\">\n            <summary>\n            Specifies how date formatted strings, e.g. \"\\/Date(1198908717056)\\/\" and \"2012-03-21T05:40Z\", are parsed when reading JSON text.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateParseHandling.None\">\n            <summary>\n            Date formatted strings are not parsed to a date type and are read as strings.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateParseHandling.DateTime\">\n            <summary>\n            Date formatted strings, e.g. \"\\/Date(1198908717056)\\/\" and \"2012-03-21T05:40Z\", are parsed to <see cref=\"F:Newtonsoft.Json.DateParseHandling.DateTime\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateParseHandling.DateTimeOffset\">\n            <summary>\n            Date formatted strings, e.g. \"\\/Date(1198908717056)\\/\" and \"2012-03-21T05:40Z\", are parsed to <see cref=\"F:Newtonsoft.Json.DateParseHandling.DateTimeOffset\"/>.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.DateTimeZoneHandling\">\n            <summary>\n            Specifies how to treat the time value when converting between string and <see cref=\"T:System.DateTime\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateTimeZoneHandling.Local\">\n            <summary>\n            Treat as local time. If the <see cref=\"T:System.DateTime\"/> object represents a Coordinated Universal Time (UTC), it is converted to the local time.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateTimeZoneHandling.Utc\">\n            <summary>\n            Treat as a UTC. If the <see cref=\"T:System.DateTime\"/> object represents a local time, it is converted to a UTC.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateTimeZoneHandling.Unspecified\">\n            <summary>\n            Treat as a local time if a <see cref=\"T:System.DateTime\"/> is being converted to a string.\n            If a string is being converted to <see cref=\"T:System.DateTime\"/>, convert to a local time if a time zone is specified.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DateTimeZoneHandling.RoundtripKind\">\n            <summary>\n            Time zone information should be preserved when converting.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.DefaultValueHandling\">\n            <summary>\n            Specifies default value handling options for the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\SerializationTests.cs\" region=\"ReducingSerializedJsonSizeDefaultValueHandlingObject\" title=\"DefaultValueHandling Class\" />\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\SerializationTests.cs\" region=\"ReducingSerializedJsonSizeDefaultValueHandlingExample\" title=\"DefaultValueHandling Ignore Example\" />\n            </example>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DefaultValueHandling.Include\">\n            <summary>\n            Include members where the member value is the same as the member's default value when serializing objects.\n            Included members are written to JSON. Has no effect when deserializing.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DefaultValueHandling.Ignore\">\n            <summary>\n            Ignore members where the member value is the same as the member's default value when serializing objects\n            so that is is not written to JSON.\n            This option will ignore all default values (e.g. <c>null</c> for objects and nullable types; <c>0</c> for integers,\n            decimals and floating point numbers; and <c>false</c> for booleans). The default value ignored can be changed by\n            placing the <see cref=\"T:System.ComponentModel.DefaultValueAttribute\"/> on the property.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DefaultValueHandling.Populate\">\n            <summary>\n            Members with a default value but no JSON will be set to their default value when deserializing.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.DefaultValueHandling.IgnoreAndPopulate\">\n            <summary>\n            Ignore members where the member value is the same as the member's default value when serializing objects\n            and sets members to their default value when deserializing.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.FloatFormatHandling\">\n            <summary>\n            Specifies float format handling options when writing special floating point numbers, e.g. <see cref=\"F:System.Double.NaN\"/>,\n            <see cref=\"F:System.Double.PositiveInfinity\"/> and <see cref=\"F:System.Double.NegativeInfinity\"/> with <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.FloatFormatHandling.String\">\n            <summary>\n            Write special floating point values as strings in JSON, e.g. \"NaN\", \"Infinity\", \"-Infinity\".\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.FloatFormatHandling.Symbol\">\n            <summary>\n            Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity.\n            Note that this will produce non-valid JSON.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.FloatFormatHandling.DefaultValue\">\n            <summary>\n            Write special floating point values as the property's default value in JSON, e.g. 0.0 for a <see cref=\"T:System.Double\"/> property, null for a <see cref=\"T:System.Nullable`1\"/> property.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Formatting\">\n            <summary>\n            Specifies formatting options for the <see cref=\"T:Newtonsoft.Json.JsonTextWriter\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Formatting.None\">\n            <summary>\n            No special formatting is applied. This is the default.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Formatting.Indented\">\n            <summary>\n            Causes child objects to be indented according to the <see cref=\"P:Newtonsoft.Json.JsonTextWriter.Indentation\"/> and <see cref=\"P:Newtonsoft.Json.JsonTextWriter.IndentChar\"/> settings.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.IArrayPool`1\">\n            <summary>\n            Provides an interface for using pooled arrays.\n            </summary>\n            <typeparam name=\"T\">The array type content.</typeparam>\n        </member>\n        <member name=\"M:Newtonsoft.Json.IArrayPool`1.Rent(System.Int32)\">\n            <summary>\n            Rent a array from the pool. This array must be returned when it is no longer needed.\n            </summary>\n            <param name=\"minimumLength\">The minimum required length of the array. The returned array may be longer.</param>\n            <returns>The rented array from the pool. This array must be returned when it is no longer needed.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.IArrayPool`1.Return(`0[])\">\n            <summary>\n            Return an array to the pool.\n            </summary>\n            <param name=\"array\">The array that is being returned.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.IJsonLineInfo\">\n            <summary>\n            Provides an interface to enable a class to return line and position information.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.IJsonLineInfo.HasLineInfo\">\n            <summary>\n            Gets a value indicating whether the class can return line information.\n            </summary>\n            <returns>\n            \t<c>true</c> if LineNumber and LinePosition can be provided; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.IJsonLineInfo.LineNumber\">\n            <summary>\n            Gets the current line number.\n            </summary>\n            <value>The current line number or 0 if no line information is available (for example, HasLineInfo returns false).</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.IJsonLineInfo.LinePosition\">\n            <summary>\n            Gets the current line position.\n            </summary>\n            <value>The current line position or 0 if no line information is available (for example, HasLineInfo returns false).</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonArrayAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> how to serialize the collection.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonArrayAttribute.AllowNullItems\">\n            <summary>\n            Gets or sets a value indicating whether null items are allowed in the collection.\n            </summary>\n            <value><c>true</c> if null items are allowed in the collection; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonArrayAttribute.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonArrayAttribute\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonArrayAttribute.#ctor(System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonObjectAttribute\"/> class with a flag indicating whether the array can contain null items\n            </summary>\n            <param name=\"allowNullItems\">A flag indicating whether the array can contain null items.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonArrayAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonArrayAttribute\"/> class with the specified container Id.\n            </summary>\n            <param name=\"id\">The container Id.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonConstructorAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> to use the specified constructor when deserializing that object.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonContainerAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> how to serialize the object.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.Id\">\n            <summary>\n            Gets or sets the id.\n            </summary>\n            <value>The id.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.Title\">\n            <summary>\n            Gets or sets the title.\n            </summary>\n            <value>The title.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.Description\">\n            <summary>\n            Gets or sets the description.\n            </summary>\n            <value>The description.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.ItemConverterType\">\n            <summary>\n            Gets or sets the collection's items converter.\n            </summary>\n            <value>The collection's items converter.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.ItemConverterParameters\">\n            <summary>\n            The parameter list to use when constructing the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> described by ItemConverterType.\n            If null, the default constructor is used.\n            When non-null, there must be a constructor defined in the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> that exactly matches the number,\n            order, and type of these parameters.\n            </summary>\n            <example>\n            [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, \"Four\" })]\n            </example>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.NamingStrategyType\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Type\"/> of the <see cref=\"T:Newtonsoft.Json.Serialization.NamingStrategy\"/>.\n            </summary>\n            <value>The <see cref=\"T:System.Type\"/> of the <see cref=\"T:Newtonsoft.Json.Serialization.NamingStrategy\"/>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.NamingStrategyParameters\">\n            <summary>\n            The parameter list to use when constructing the <see cref=\"T:Newtonsoft.Json.Serialization.NamingStrategy\"/> described by NamingStrategyType.  \n            If null, the default constructor is used.\n            When non-null, there must be a constructor defined in the <see cref=\"T:Newtonsoft.Json.Serialization.NamingStrategy\"/> that exactly matches the number,\n            order, and type of these parameters.\n            </summary>\n            <example>\n            [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, \"Four\" })]\n            </example>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.IsReference\">\n            <summary>\n            Gets or sets a value that indicates whether to preserve object references.\n            </summary>\n            <value>\n            \t<c>true</c> to keep object reference; otherwise, <c>false</c>. The default is <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.ItemIsReference\">\n            <summary>\n            Gets or sets a value that indicates whether to preserve collection's items references.\n            </summary>\n            <value>\n            \t<c>true</c> to keep collection's items object references; otherwise, <c>false</c>. The default is <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.ItemReferenceLoopHandling\">\n            <summary>\n            Gets or sets the reference loop handling used when serializing the collection's items.\n            </summary>\n            <value>The reference loop handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonContainerAttribute.ItemTypeNameHandling\">\n            <summary>\n            Gets or sets the type name handling used when serializing the collection's items.\n            </summary>\n            <value>The type name handling.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonContainerAttribute.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonContainerAttribute\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonContainerAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonContainerAttribute\"/> class with the specified container Id.\n            </summary>\n            <param name=\"id\">The container Id.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonConvert\">\n            <summary>\n            Provides methods for converting between common language runtime types and JSON types.\n            </summary>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\SerializationTests.cs\" region=\"SerializeObject\" title=\"Serializing and Deserializing JSON with JsonConvert\" />\n            </example>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\">\n            <summary>\n            Gets or sets a function that creates default <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            Default settings are automatically used by serialization methods on <see cref=\"T:Newtonsoft.Json.JsonConvert\"/>,\n            and <see cref=\"M:Newtonsoft.Json.Linq.JToken.ToObject``1\"/> and <see cref=\"M:Newtonsoft.Json.Linq.JToken.FromObject(System.Object)\"/> on <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            To serialize without using any default settings create a <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> with\n            <see cref=\"M:Newtonsoft.Json.JsonSerializer.Create\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonConvert.True\">\n            <summary>\n            Represents JavaScript's boolean value true as a string. This field is read-only.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonConvert.False\">\n            <summary>\n            Represents JavaScript's boolean value false as a string. This field is read-only.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonConvert.Null\">\n            <summary>\n            Represents JavaScript's null as a string. This field is read-only.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonConvert.Undefined\">\n            <summary>\n            Represents JavaScript's undefined as a string. This field is read-only.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonConvert.PositiveInfinity\">\n            <summary>\n            Represents JavaScript's positive infinity as a string. This field is read-only.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonConvert.NegativeInfinity\">\n            <summary>\n            Represents JavaScript's negative infinity as a string. This field is read-only.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonConvert.NaN\">\n            <summary>\n            Represents JavaScript's NaN as a string. This field is read-only.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.DateTime)\">\n            <summary>\n            Converts the <see cref=\"T:System.DateTime\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.DateTime\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.DateTime,Newtonsoft.Json.DateFormatHandling,Newtonsoft.Json.DateTimeZoneHandling)\">\n            <summary>\n            Converts the <see cref=\"T:System.DateTime\"/> to its JSON string representation using the <see cref=\"T:Newtonsoft.Json.DateFormatHandling\"/> specified.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"format\">The format the date will be converted to.</param>\n            <param name=\"timeZoneHandling\">The time zone handling when the date is converted to a string.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.DateTime\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.DateTimeOffset)\">\n            <summary>\n            Converts the <see cref=\"T:System.DateTimeOffset\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.DateTimeOffset\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.DateTimeOffset,Newtonsoft.Json.DateFormatHandling)\">\n            <summary>\n            Converts the <see cref=\"T:System.DateTimeOffset\"/> to its JSON string representation using the <see cref=\"T:Newtonsoft.Json.DateFormatHandling\"/> specified.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"format\">The format the date will be converted to.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.DateTimeOffset\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Boolean)\">\n            <summary>\n            Converts the <see cref=\"T:System.Boolean\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Boolean\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Char)\">\n            <summary>\n            Converts the <see cref=\"T:System.Char\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Char\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Enum)\">\n            <summary>\n            Converts the <see cref=\"T:System.Enum\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Enum\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Int32)\">\n            <summary>\n            Converts the <see cref=\"T:System.Int32\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Int32\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Int16)\">\n            <summary>\n            Converts the <see cref=\"T:System.Int16\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Int16\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.UInt16)\">\n            <summary>\n            Converts the <see cref=\"T:System.UInt16\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.UInt16\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.UInt32)\">\n            <summary>\n            Converts the <see cref=\"T:System.UInt32\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.UInt32\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Int64)\">\n            <summary>\n            Converts the <see cref=\"T:System.Int64\"/>  to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Int64\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.UInt64)\">\n            <summary>\n            Converts the <see cref=\"T:System.UInt64\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.UInt64\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Single)\">\n            <summary>\n            Converts the <see cref=\"T:System.Single\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Single\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Double)\">\n            <summary>\n            Converts the <see cref=\"T:System.Double\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Double\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Byte)\">\n            <summary>\n            Converts the <see cref=\"T:System.Byte\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Byte\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.SByte)\">\n            <summary>\n            Converts the <see cref=\"T:System.SByte\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.SByte\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Decimal)\">\n            <summary>\n            Converts the <see cref=\"T:System.Decimal\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.SByte\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Guid)\">\n            <summary>\n            Converts the <see cref=\"T:System.Guid\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Guid\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.TimeSpan)\">\n            <summary>\n            Converts the <see cref=\"T:System.TimeSpan\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.TimeSpan\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Uri)\">\n            <summary>\n            Converts the <see cref=\"T:System.Uri\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Uri\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.String)\">\n            <summary>\n            Converts the <see cref=\"T:System.String\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.String\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.String,System.Char)\">\n            <summary>\n            Converts the <see cref=\"T:System.String\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"delimiter\">The string delimiter character.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.String\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.String,System.Char,Newtonsoft.Json.StringEscapeHandling)\">\n            <summary>\n            Converts the <see cref=\"T:System.String\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"delimiter\">The string delimiter character.</param>\n            <param name=\"stringEscapeHandling\">The string escape handling.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.String\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.ToString(System.Object)\">\n            <summary>\n            Converts the <see cref=\"T:System.Object\"/> to its JSON string representation.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <returns>A JSON string representation of the <see cref=\"T:System.Object\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object)\">\n            <summary>\n            Serializes the specified object to a JSON string.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <returns>A JSON string representation of the object.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.Formatting)\">\n            <summary>\n            Serializes the specified object to a JSON string using formatting.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <returns>\n            A JSON string representation of the object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Serializes the specified object to a JSON string using a collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"converters\">A collection converters used while serializing.</param>\n            <returns>A JSON string representation of the object.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Serializes the specified object to a JSON string using formatting and a collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <param name=\"converters\">A collection converters used while serializing.</param>\n            <returns>A JSON string representation of the object.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Serializes the specified object to a JSON string using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to serialize the object.\n            If this is null, default serialization settings will be used.</param>\n            <returns>\n            A JSON string representation of the object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,System.Type,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Serializes the specified object to a JSON string using a type, formatting and <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to serialize the object.\n            If this is null, default serialization settings will be used.</param>\n            <param name=\"type\">\n            The type of the value being serialized.\n            This parameter is used when <see cref=\"T:Newtonsoft.Json.TypeNameHandling\"/> is Auto to write out the type name if the type of the value does not match.\n            Specifing the type is optional.\n            </param>\n            <returns>\n            A JSON string representation of the object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Serializes the specified object to a JSON string using formatting and <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to serialize the object.\n            If this is null, default serialization settings will be used.</param>\n            <returns>\n            A JSON string representation of the object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,System.Type,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Serializes the specified object to a JSON string using a type, formatting and <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to serialize the object.\n            If this is null, default serialization settings will be used.</param>\n            <param name=\"type\">\n            The type of the value being serialized.\n            This parameter is used when <see cref=\"T:Newtonsoft.Json.TypeNameHandling\"/> is Auto to write out the type name if the type of the value does not match.\n            Specifing the type is optional.\n            </param>\n            <returns>\n            A JSON string representation of the object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObjectAsync(System.Object)\">\n            <summary>\n            Asynchronously serializes the specified object to a JSON string.\n            Serialization will happen on a new thread.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <returns>\n            A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObjectAsync(System.Object,Newtonsoft.Json.Formatting)\">\n            <summary>\n            Asynchronously serializes the specified object to a JSON string using formatting.\n            Serialization will happen on a new thread.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <returns>\n            A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeObjectAsync(System.Object,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Asynchronously serializes the specified object to a JSON string using formatting and a collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.\n            Serialization will happen on a new thread.\n            </summary>\n            <param name=\"value\">The object to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to serialize the object.\n            If this is null, default serialization settings will be used.</param>\n            <returns>\n            A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String)\">\n            <summary>\n            Deserializes the JSON to a .NET object.\n            </summary>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <returns>The deserialized object from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Deserializes the JSON to a .NET object using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"settings\">\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to deserialize the object.\n            If this is null, default serialization settings will be used.\n            </param>\n            <returns>The deserialized object from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String,System.Type)\">\n            <summary>\n            Deserializes the JSON to the specified .NET type.\n            </summary>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"type\">The <see cref=\"T:System.Type\"/> of object being deserialized.</param>\n            <returns>The deserialized object from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObject``1(System.String)\">\n            <summary>\n            Deserializes the JSON to the specified .NET type.\n            </summary>\n            <typeparam name=\"T\">The type of the object to deserialize to.</typeparam>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <returns>The deserialized object from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeAnonymousType``1(System.String,``0)\">\n            <summary>\n            Deserializes the JSON to the given anonymous type.\n            </summary>\n            <typeparam name=\"T\">\n            The anonymous type to deserialize to. This can't be specified\n            traditionally and must be infered from the anonymous type passed\n            as a parameter.\n            </typeparam>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"anonymousTypeObject\">The anonymous type object.</param>\n            <returns>The deserialized anonymous type from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeAnonymousType``1(System.String,``0,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Deserializes the JSON to the given anonymous type using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <typeparam name=\"T\">\n            The anonymous type to deserialize to. This can't be specified\n            traditionally and must be infered from the anonymous type passed\n            as a parameter.\n            </typeparam>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"anonymousTypeObject\">The anonymous type object.</param>\n            <param name=\"settings\">\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to deserialize the object.\n            If this is null, default serialization settings will be used.\n            </param>\n            <returns>The deserialized anonymous type from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObject``1(System.String,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Deserializes the JSON to the specified .NET type using a collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.\n            </summary>\n            <typeparam name=\"T\">The type of the object to deserialize to.</typeparam>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"converters\">Converters to use while deserializing.</param>\n            <returns>The deserialized object from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObject``1(System.String,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Deserializes the JSON to the specified .NET type using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <typeparam name=\"T\">The type of the object to deserialize to.</typeparam>\n            <param name=\"value\">The object to deserialize.</param>\n            <param name=\"settings\">\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to deserialize the object.\n            If this is null, default serialization settings will be used.\n            </param>\n            <returns>The deserialized object from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String,System.Type,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Deserializes the JSON to the specified .NET type using a collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.\n            </summary>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"type\">The type of the object to deserialize.</param>\n            <param name=\"converters\">Converters to use while deserializing.</param>\n            <returns>The deserialized object from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String,System.Type,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Deserializes the JSON to the specified .NET type using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"type\">The type of the object to deserialize to.</param>\n            <param name=\"settings\">\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to deserialize the object.\n            If this is null, default serialization settings will be used.\n            </param>\n            <returns>The deserialized object from the JSON string.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObjectAsync``1(System.String)\">\n            <summary>\n            Asynchronously deserializes the JSON to the specified .NET type.\n            Deserialization will happen on a new thread.\n            </summary>\n            <typeparam name=\"T\">The type of the object to deserialize to.</typeparam>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <returns>\n            A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObjectAsync``1(System.String,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Asynchronously deserializes the JSON to the specified .NET type using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            Deserialization will happen on a new thread.\n            </summary>\n            <typeparam name=\"T\">The type of the object to deserialize to.</typeparam>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"settings\">\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to deserialize the object.\n            If this is null, default serialization settings will be used.\n            </param>\n            <returns>\n            A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObjectAsync(System.String)\">\n            <summary>\n            Asynchronously deserializes the JSON to the specified .NET type.\n            Deserialization will happen on a new thread.\n            </summary>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <returns>\n            A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeObjectAsync(System.String,System.Type,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Asynchronously deserializes the JSON to the specified .NET type using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            Deserialization will happen on a new thread.\n            </summary>\n            <param name=\"value\">The JSON to deserialize.</param>\n            <param name=\"type\">The type of the object to deserialize to.</param>\n            <param name=\"settings\">\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to deserialize the object.\n            If this is null, default serialization settings will be used.\n            </param>\n            <returns>\n            A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.PopulateObject(System.String,System.Object)\">\n            <summary>\n            Populates the object with values from the JSON string.\n            </summary>\n            <param name=\"value\">The JSON to populate values from.</param>\n            <param name=\"target\">The target object to populate values onto.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.PopulateObject(System.String,System.Object,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Populates the object with values from the JSON string using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"value\">The JSON to populate values from.</param>\n            <param name=\"target\">The target object to populate values onto.</param>\n            <param name=\"settings\">\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to deserialize the object.\n            If this is null, default serialization settings will be used.\n            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.PopulateObjectAsync(System.String,System.Object,Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Asynchronously populates the object with values from the JSON string using <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"value\">The JSON to populate values from.</param>\n            <param name=\"target\">The target object to populate values onto.</param>\n            <param name=\"settings\">\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> used to deserialize the object.\n            If this is null, default serialization settings will be used.\n            </param>\n            <returns>\n            A task that represents the asynchronous populate operation.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeXmlNode(System.Xml.XmlNode)\">\n            <summary>\n            Serializes the XML node to a JSON string.\n            </summary>\n            <param name=\"node\">The node to serialize.</param>\n            <returns>A JSON string of the XmlNode.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeXmlNode(System.Xml.XmlNode,Newtonsoft.Json.Formatting)\">\n            <summary>\n            Serializes the XML node to a JSON string using formatting.\n            </summary>\n            <param name=\"node\">The node to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <returns>A JSON string of the XmlNode.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeXmlNode(System.Xml.XmlNode,Newtonsoft.Json.Formatting,System.Boolean)\">\n            <summary>\n            Serializes the XML node to a JSON string using formatting and omits the root object if <paramref name=\"omitRootObject\"/> is <c>true</c>.\n            </summary>\n            <param name=\"node\">The node to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <param name=\"omitRootObject\">Omits writing the root object.</param>\n            <returns>A JSON string of the XmlNode.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeXmlNode(System.String)\">\n            <summary>\n            Deserializes the XmlNode from a JSON string.\n            </summary>\n            <param name=\"value\">The JSON string.</param>\n            <returns>The deserialized XmlNode</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeXmlNode(System.String,System.String)\">\n            <summary>\n            Deserializes the XmlNode from a JSON string nested in a root elment specified by <paramref name=\"deserializeRootElementName\"/>.\n            </summary>\n            <param name=\"value\">The JSON string.</param>\n            <param name=\"deserializeRootElementName\">The name of the root element to append when deserializing.</param>\n            <returns>The deserialized XmlNode</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeXmlNode(System.String,System.String,System.Boolean)\">\n            <summary>\n            Deserializes the XmlNode from a JSON string nested in a root elment specified by <paramref name=\"deserializeRootElementName\"/>\n            and writes a .NET array attribute for collections.\n            </summary>\n            <param name=\"value\">The JSON string.</param>\n            <param name=\"deserializeRootElementName\">The name of the root element to append when deserializing.</param>\n            <param name=\"writeArrayAttribute\">\n            A flag to indicate whether to write the Json.NET array attribute.\n            This attribute helps preserve arrays when converting the written XML back to JSON.\n            </param>\n            <returns>The deserialized XmlNode</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeXNode(System.Xml.Linq.XObject)\">\n            <summary>\n            Serializes the <see cref=\"T:System.Xml.Linq.XNode\"/> to a JSON string.\n            </summary>\n            <param name=\"node\">The node to convert to JSON.</param>\n            <returns>A JSON string of the XNode.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeXNode(System.Xml.Linq.XObject,Newtonsoft.Json.Formatting)\">\n            <summary>\n            Serializes the <see cref=\"T:System.Xml.Linq.XNode\"/> to a JSON string using formatting.\n            </summary>\n            <param name=\"node\">The node to convert to JSON.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <returns>A JSON string of the XNode.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.SerializeXNode(System.Xml.Linq.XObject,Newtonsoft.Json.Formatting,System.Boolean)\">\n            <summary>\n            Serializes the <see cref=\"T:System.Xml.Linq.XNode\"/> to a JSON string using formatting and omits the root object if <paramref name=\"omitRootObject\"/> is <c>true</c>.\n            </summary>\n            <param name=\"node\">The node to serialize.</param>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <param name=\"omitRootObject\">Omits writing the root object.</param>\n            <returns>A JSON string of the XNode.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeXNode(System.String)\">\n            <summary>\n            Deserializes the <see cref=\"T:System.Xml.Linq.XNode\"/> from a JSON string.\n            </summary>\n            <param name=\"value\">The JSON string.</param>\n            <returns>The deserialized XNode</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeXNode(System.String,System.String)\">\n            <summary>\n            Deserializes the <see cref=\"T:System.Xml.Linq.XNode\"/> from a JSON string nested in a root elment specified by <paramref name=\"deserializeRootElementName\"/>.\n            </summary>\n            <param name=\"value\">The JSON string.</param>\n            <param name=\"deserializeRootElementName\">The name of the root element to append when deserializing.</param>\n            <returns>The deserialized XNode</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConvert.DeserializeXNode(System.String,System.String,System.Boolean)\">\n            <summary>\n            Deserializes the <see cref=\"T:System.Xml.Linq.XNode\"/> from a JSON string nested in a root elment specified by <paramref name=\"deserializeRootElementName\"/>\n            and writes a .NET array attribute for collections.\n            </summary>\n            <param name=\"value\">The JSON string.</param>\n            <param name=\"deserializeRootElementName\">The name of the root element to append when deserializing.</param>\n            <param name=\"writeArrayAttribute\">\n            A flag to indicate whether to write the Json.NET array attribute.\n            This attribute helps preserve arrays when converting the written XML back to JSON.\n            </param>\n            <returns>The deserialized XNode</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonConverter\">\n            <summary>\n            Converts an object to and from JSON.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Writes the JSON representation of the object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> to write to.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Reads the JSON representation of the object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from.</param>\n            <param name=\"objectType\">Type of the object.</param>\n            <param name=\"existingValue\">The existing value of object being read.</param>\n            <param name=\"serializer\">The calling serializer.</param>\n            <returns>The object value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConverter.CanConvert(System.Type)\">\n            <summary>\n            Determines whether this instance can convert the specified object type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>\n            \t<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConverter.GetSchema\">\n            <summary>\n            <para>\n            Gets the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of the JSON produced by the JsonConverter.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of the JSON produced by the JsonConverter.</returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonConverter.CanRead\">\n            <summary>\n            Gets a value indicating whether this <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> can read JSON.\n            </summary>\n            <value><c>true</c> if this <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> can read JSON; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonConverter.CanWrite\">\n            <summary>\n            Gets a value indicating whether this <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> can write JSON.\n            </summary>\n            <value><c>true</c> if this <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> can write JSON; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonConverterAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> to use the specified <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> when serializing the member or class.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonConverterAttribute.ConverterType\">\n            <summary>\n            Gets the <see cref=\"T:System.Type\"/> of the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.\n            </summary>\n            <value>The <see cref=\"T:System.Type\"/> of the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonConverterAttribute.ConverterParameters\">\n            <summary>\n            The parameter list to use when constructing the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> described by ConverterType.  \n            If null, the default constructor is used.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConverterAttribute.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonConverterAttribute\"/> class.\n            </summary>\n            <param name=\"converterType\">Type of the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonConverterAttribute.#ctor(System.Type,System.Object[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonConverterAttribute\"/> class.\n            </summary>\n            <param name=\"converterType\">Type of the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.</param>\n            <param name=\"converterParameters\">Parameter list to use when constructing the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>. Can be null.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonConverterCollection\">\n            <summary>\n            Represents a collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonDictionaryAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> how to serialize the collection.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonDictionaryAttribute.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonDictionaryAttribute\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonDictionaryAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonDictionaryAttribute\"/> class with the specified container Id.\n            </summary>\n            <param name=\"id\">The container Id.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonException\">\n            <summary>\n            The exception thrown when an error occurs during JSON serialization or deserialization.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonException\"/> class\n            with a specified error message.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonException\"/> class\n            with a specified error message and a reference to the inner exception that is the cause of this exception.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n            <param name=\"innerException\">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonException\"/> class.\n            </summary>\n            <param name=\"info\">The <see cref=\"T:System.Runtime.Serialization.SerializationInfo\"/> that holds the serialized object data about the exception being thrown.</param>\n            <param name=\"context\">The <see cref=\"T:System.Runtime.Serialization.StreamingContext\"/> that contains contextual information about the source or destination.</param>\n            <exception cref=\"T:System.ArgumentNullException\">The <paramref name=\"info\"/> parameter is null. </exception>\n            <exception cref=\"T:System.Runtime.Serialization.SerializationException\">The class name is null or <see cref=\"P:System.Exception.HResult\"/> is zero (0). </exception>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonExtensionDataAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> to deserialize properties with no matching class member into the specified collection\n            and write values during serialization.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonExtensionDataAttribute.WriteData\">\n            <summary>\n            Gets or sets a value that indicates whether to write extension data when serializing the object.\n            </summary>\n            <value>\n            \t<c>true</c> to write extension data when serializing the object; otherwise, <c>false</c>. The default is <c>true</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonExtensionDataAttribute.ReadData\">\n            <summary>\n            Gets or sets a value that indicates whether to read extension data when deserializing the object.\n            </summary>\n            <value>\n            \t<c>true</c> to read extension data when deserializing the object; otherwise, <c>false</c>. The default is <c>true</c>.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonExtensionDataAttribute.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonExtensionDataAttribute\"/> class.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonIgnoreAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> not to serialize the public field or public read/write property value.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonObjectAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> how to serialize the object.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonObjectAttribute.MemberSerialization\">\n            <summary>\n            Gets or sets the member serialization.\n            </summary>\n            <value>The member serialization.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonObjectAttribute.ItemRequired\">\n            <summary>\n            Gets or sets a value that indicates whether the object's properties are required.\n            </summary>\n            <value>\n            \tA value indicating whether the object's properties are required.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonObjectAttribute.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonObjectAttribute\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonObjectAttribute.#ctor(Newtonsoft.Json.MemberSerialization)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonObjectAttribute\"/> class with the specified member serialization.\n            </summary>\n            <param name=\"memberSerialization\">The member serialization.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonObjectAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonObjectAttribute\"/> class with the specified container Id.\n            </summary>\n            <param name=\"id\">The container Id.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonPropertyAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> to always serialize the member with the specified name.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.ItemConverterType\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> used when serializing the property's collection items.\n            </summary>\n            <value>The collection's items <see cref=\"T:Newtonsoft.Json.JsonConverter\"/>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.ItemConverterParameters\">\n            <summary>\n            The parameter list to use when constructing the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> described by ItemConverterType.\n            If null, the default constructor is used.\n            When non-null, there must be a constructor defined in the <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> that exactly matches the number,\n            order, and type of these parameters.\n            </summary>\n            <example>\n            [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, \"Four\" })]\n            </example>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.NamingStrategyType\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Type\"/> of the <see cref=\"T:Newtonsoft.Json.Serialization.NamingStrategy\"/>.\n            </summary>\n            <value>The <see cref=\"T:System.Type\"/> of the <see cref=\"T:Newtonsoft.Json.Serialization.NamingStrategy\"/>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.NamingStrategyParameters\">\n            <summary>\n            The parameter list to use when constructing the <see cref=\"T:Newtonsoft.Json.Serialization.NamingStrategy\"/> described by NamingStrategyType.  \n            If null, the default constructor is used.\n            When non-null, there must be a constructor defined in the <see cref=\"T:Newtonsoft.Json.Serialization.NamingStrategy\"/> that exactly matches the number,\n            order, and type of these parameters.\n            </summary>\n            <example>\n            [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, \"Four\" })]\n            </example>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.NullValueHandling\">\n            <summary>\n            Gets or sets the null value handling used when serializing this property.\n            </summary>\n            <value>The null value handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.DefaultValueHandling\">\n            <summary>\n            Gets or sets the default value handling used when serializing this property.\n            </summary>\n            <value>The default value handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.ReferenceLoopHandling\">\n            <summary>\n            Gets or sets the reference loop handling used when serializing this property.\n            </summary>\n            <value>The reference loop handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.ObjectCreationHandling\">\n            <summary>\n            Gets or sets the object creation handling used when deserializing this property.\n            </summary>\n            <value>The object creation handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.TypeNameHandling\">\n            <summary>\n            Gets or sets the type name handling used when serializing this property.\n            </summary>\n            <value>The type name handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.IsReference\">\n            <summary>\n            Gets or sets whether this property's value is serialized as a reference.\n            </summary>\n            <value>Whether this property's value is serialized as a reference.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.Order\">\n            <summary>\n            Gets or sets the order of serialization of a member.\n            </summary>\n            <value>The numeric order of serialization.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.Required\">\n            <summary>\n            Gets or sets a value indicating whether this property is required.\n            </summary>\n            <value>\n            \tA value indicating whether this property is required.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.PropertyName\">\n            <summary>\n            Gets or sets the name of the property.\n            </summary>\n            <value>The name of the property.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.ItemReferenceLoopHandling\">\n            <summary>\n            Gets or sets the the reference loop handling used when serializing the property's collection items.\n            </summary>\n            <value>The collection's items reference loop handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.ItemTypeNameHandling\">\n            <summary>\n            Gets or sets the the type name handling used when serializing the property's collection items.\n            </summary>\n            <value>The collection's items type name handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonPropertyAttribute.ItemIsReference\">\n            <summary>\n            Gets or sets whether this property's collection items are serialized as a reference.\n            </summary>\n            <value>Whether this property's collection items are serialized as a reference.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonPropertyAttribute.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonPropertyAttribute\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonPropertyAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonPropertyAttribute\"/> class with the specified name.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonReader\">\n            <summary>\n            Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonReader.State\">\n            <summary>\n            Specifies the state of the reader.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Start\">\n            <summary>\n            The Read method has not been called.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Complete\">\n            <summary>\n            The end of the file has been reached successfully.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Property\">\n            <summary>\n            Reader is at a property.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.ObjectStart\">\n            <summary>\n            Reader is at the start of an object.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Object\">\n            <summary>\n            Reader is in an object.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.ArrayStart\">\n            <summary>\n            Reader is at the start of an array.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Array\">\n            <summary>\n            Reader is in an array.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Closed\">\n            <summary>\n            The Close method has been called.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.PostValue\">\n            <summary>\n            Reader has just read a value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.ConstructorStart\">\n            <summary>\n            Reader is at the start of a constructor.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Constructor\">\n            <summary>\n            Reader in a constructor.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Error\">\n            <summary>\n            An error occurred that prevents the read operation from continuing.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonReader.State.Finished\">\n            <summary>\n            The end of the file has been reached successfully.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.CurrentState\">\n            <summary>\n            Gets the current reader state.\n            </summary>\n            <value>The current reader state.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.CloseInput\">\n            <summary>\n            Gets or sets a value indicating whether the underlying stream or\n            <see cref=\"T:System.IO.TextReader\"/> should be closed when the reader is closed.\n            </summary>\n            <value>\n            true to close the underlying stream or <see cref=\"T:System.IO.TextReader\"/> when\n            the reader is closed; otherwise false. The default is true.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.SupportMultipleContent\">\n            <summary>\n            Gets or sets a value indicating whether multiple pieces of JSON content can\n            be read from a continuous stream without erroring.\n            </summary>\n            <value>\n            true to support reading multiple pieces of JSON content; otherwise false. The default is false.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.QuoteChar\">\n            <summary>\n            Gets the quotation mark character used to enclose the value of a string.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.DateTimeZoneHandling\">\n            <summary>\n            Get or set how <see cref=\"T:System.DateTime\"/> time zones are handling when reading JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.DateParseHandling\">\n            <summary>\n            Get or set how date formatted strings, e.g. \"\\/Date(1198908717056)\\/\" and \"2012-03-21T05:40Z\", are parsed when reading JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.FloatParseHandling\">\n            <summary>\n            Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.DateFormatString\">\n            <summary>\n            Get or set how custom date formatted strings are parsed when reading JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.MaxDepth\">\n            <summary>\n            Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a <see cref=\"T:Newtonsoft.Json.JsonReaderException\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.TokenType\">\n            <summary>\n            Gets the type of the current JSON token. \n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.Value\">\n            <summary>\n            Gets the text value of the current JSON token.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.ValueType\">\n            <summary>\n            Gets The Common Language Runtime (CLR) type for the current JSON token.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.Depth\">\n            <summary>\n            Gets the depth of the current token in the JSON document.\n            </summary>\n            <value>The depth of the current token in the JSON document.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.Path\">\n            <summary>\n            Gets the path of the current JSON token. \n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReader.Culture\">\n            <summary>\n            Gets or sets the culture used when reading JSON. Defaults to <see cref=\"P:System.Globalization.CultureInfo.InvariantCulture\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonReader\"/> class with the specified <see cref=\"T:System.IO.TextReader\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.Read\">\n            <summary>\n            Reads the next JSON token from the stream.\n            </summary>\n            <returns><c>true</c> if the next token was read successfully; <c>false</c> if there are no more tokens to read.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.ReadAsInt32\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.ReadAsString\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.String\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.String\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.ReadAsBytes\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Byte\"/>[].\n            </summary>\n            <returns>A <see cref=\"T:System.Byte\"/>[] or a null reference if the next JSON token is null. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.ReadAsDouble\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.ReadAsBoolean\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.ReadAsDecimal\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.ReadAsDateTime\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.ReadAsDateTimeOffset\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.Skip\">\n            <summary>\n            Skips the children of the current token.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.SetToken(Newtonsoft.Json.JsonToken)\">\n            <summary>\n            Sets the current token.\n            </summary>\n            <param name=\"newToken\">The new token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.SetToken(Newtonsoft.Json.JsonToken,System.Object)\">\n            <summary>\n            Sets the current token and value.\n            </summary>\n            <param name=\"newToken\">The new token.</param>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.SetStateBasedOnCurrent\">\n            <summary>\n            Sets the state based on current token type.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.System#IDisposable#Dispose\">\n            <summary>\n            Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.Dispose(System.Boolean)\">\n            <summary>\n            Releases unmanaged and - optionally - managed resources\n            </summary>\n            <param name=\"disposing\"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReader.Close\">\n            <summary>\n            Changes the <see cref=\"T:Newtonsoft.Json.JsonReader.State\"/> to Closed. \n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonReaderException\">\n            <summary>\n            The exception thrown when an error occurs while reading JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReaderException.LineNumber\">\n            <summary>\n            Gets the line number indicating where the error occurred.\n            </summary>\n            <value>The line number indicating where the error occurred.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReaderException.LinePosition\">\n            <summary>\n            Gets the line position indicating where the error occurred.\n            </summary>\n            <value>The line position indicating where the error occurred.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonReaderException.Path\">\n            <summary>\n            Gets the path to the JSON where the error occurred.\n            </summary>\n            <value>The path to the JSON where the error occurred.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReaderException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonReaderException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReaderException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonReaderException\"/> class\n            with a specified error message.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReaderException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonReaderException\"/> class\n            with a specified error message and a reference to the inner exception that is the cause of this exception.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n            <param name=\"innerException\">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonReaderException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonReaderException\"/> class.\n            </summary>\n            <param name=\"info\">The <see cref=\"T:System.Runtime.Serialization.SerializationInfo\"/> that holds the serialized object data about the exception being thrown.</param>\n            <param name=\"context\">The <see cref=\"T:System.Runtime.Serialization.StreamingContext\"/> that contains contextual information about the source or destination.</param>\n            <exception cref=\"T:System.ArgumentNullException\">The <paramref name=\"info\"/> parameter is null. </exception>\n            <exception cref=\"T:System.Runtime.Serialization.SerializationException\">The class name is null or <see cref=\"P:System.Exception.HResult\"/> is zero (0). </exception>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonRequiredAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> to always serialize the member, and require the member has a value.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonSerializationException\">\n            <summary>\n            The exception thrown when an error occurs during JSON serialization or deserialization.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializationException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonSerializationException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializationException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonSerializationException\"/> class\n            with a specified error message.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializationException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonSerializationException\"/> class\n            with a specified error message and a reference to the inner exception that is the cause of this exception.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n            <param name=\"innerException\">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializationException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonSerializationException\"/> class.\n            </summary>\n            <param name=\"info\">The <see cref=\"T:System.Runtime.Serialization.SerializationInfo\"/> that holds the serialized object data about the exception being thrown.</param>\n            <param name=\"context\">The <see cref=\"T:System.Runtime.Serialization.StreamingContext\"/> that contains contextual information about the source or destination.</param>\n            <exception cref=\"T:System.ArgumentNullException\">The <paramref name=\"info\"/> parameter is null. </exception>\n            <exception cref=\"T:System.Runtime.Serialization.SerializationException\">The class name is null or <see cref=\"P:System.Exception.HResult\"/> is zero (0). </exception>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonSerializer\">\n            <summary>\n            Serializes and deserializes objects into and from the JSON format.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> enables you to control how objects are encoded into JSON.\n            </summary>\n        </member>\n        <member name=\"E:Newtonsoft.Json.JsonSerializer.Error\">\n            <summary>\n            Occurs when the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> errors during serialization and deserialization.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.ReferenceResolver\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Serialization.IReferenceResolver\"/> used by the serializer when resolving references.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.Binder\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Runtime.Serialization.SerializationBinder\"/> used by the serializer when resolving type names.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.TraceWriter\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Serialization.ITraceWriter\"/> used by the serializer when writing trace messages.\n            </summary>\n            <value>The trace writer.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.EqualityComparer\">\n            <summary>\n            Gets or sets the equality comparer used by the serializer when comparing references.\n            </summary>\n            <value>The equality comparer.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.TypeNameHandling\">\n            <summary>\n            Gets or sets how type name writing and reading is handled by the serializer.\n            </summary>\n            <remarks>\n            <see cref=\"P:Newtonsoft.Json.JsonSerializer.TypeNameHandling\"/> should be used with caution when your application deserializes JSON from an external source.\n            Incoming types should be validated with a custom <see cref=\"T:System.Runtime.Serialization.SerializationBinder\"/>\n            when deserializing with a value other than <c>TypeNameHandling.None</c>.\n            </remarks>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.TypeNameAssemblyFormat\">\n            <summary>\n            Gets or sets how a type name assembly is written and resolved by the serializer.\n            </summary>\n            <value>The type name assembly format.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.PreserveReferencesHandling\">\n            <summary>\n            Gets or sets how object references are preserved by the serializer.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.ReferenceLoopHandling\">\n            <summary>\n            Get or set how reference loops (e.g. a class referencing itself) is handled.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.MissingMemberHandling\">\n            <summary>\n            Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.NullValueHandling\">\n            <summary>\n            Get or set how null values are handled during serialization and deserialization.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.DefaultValueHandling\">\n            <summary>\n            Get or set how null default are handled during serialization and deserialization.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.ObjectCreationHandling\">\n            <summary>\n            Gets or sets how objects are created during deserialization.\n            </summary>\n            <value>The object creation handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.ConstructorHandling\">\n            <summary>\n            Gets or sets how constructors are used during deserialization.\n            </summary>\n            <value>The constructor handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.MetadataPropertyHandling\">\n            <summary>\n            Gets or sets how metadata properties are used during deserialization.\n            </summary>\n            <value>The metadata properties handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.Converters\">\n            <summary>\n            Gets a collection <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> that will be used during serialization.\n            </summary>\n            <value>Collection <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> that will be used during serialization.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.ContractResolver\">\n            <summary>\n            Gets or sets the contract resolver used by the serializer when\n            serializing .NET objects to JSON and vice versa.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.Context\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Runtime.Serialization.StreamingContext\"/> used by the serializer when invoking serialization callback methods.\n            </summary>\n            <value>The context.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.Formatting\">\n            <summary>\n            Indicates how JSON text output is formatted.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.DateFormatHandling\">\n            <summary>\n            Get or set how dates are written to JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.DateTimeZoneHandling\">\n            <summary>\n            Get or set how <see cref=\"T:System.DateTime\"/> time zones are handling during serialization and deserialization.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.DateParseHandling\">\n            <summary>\n            Get or set how date formatted strings, e.g. \"\\/Date(1198908717056)\\/\" and \"2012-03-21T05:40Z\", are parsed when reading JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.FloatParseHandling\">\n            <summary>\n            Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.FloatFormatHandling\">\n            <summary>\n            Get or set how special floating point numbers, e.g. <see cref=\"F:System.Double.NaN\"/>,\n            <see cref=\"F:System.Double.PositiveInfinity\"/> and <see cref=\"F:System.Double.NegativeInfinity\"/>,\n            are written as JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.StringEscapeHandling\">\n            <summary>\n            Get or set how strings are escaped when writing JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.DateFormatString\">\n            <summary>\n            Get or set how <see cref=\"T:System.DateTime\"/> and <see cref=\"T:System.DateTimeOffset\"/> values are formatted when writing JSON text, and the expected date format when reading JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.Culture\">\n            <summary>\n            Gets or sets the culture used when reading JSON. Defaults to <see cref=\"P:System.Globalization.CultureInfo.InvariantCulture\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.MaxDepth\">\n            <summary>\n            Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a <see cref=\"T:Newtonsoft.Json.JsonReaderException\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializer.CheckAdditionalContent\">\n            <summary>\n            Gets a value indicating whether there will be a check for additional JSON content after deserializing an object.\n            </summary>\n            <value>\n            \t<c>true</c> if there will be a check for additional JSON content after deserializing an object; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Create\">\n            <summary>\n            Creates a new <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> instance.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> will not use default settings \n            from <see cref=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\"/>.\n            </summary>\n            <returns>\n            A new <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> instance.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> will not use default settings \n            from <see cref=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\"/>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Create(Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Creates a new <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> instance using the specified <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> will not use default settings \n            from <see cref=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\"/>.\n            </summary>\n            <param name=\"settings\">The settings to be applied to the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.</param>\n            <returns>\n            A new <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> instance using the specified <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> will not use default settings \n            from <see cref=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\"/>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.CreateDefault\">\n            <summary>\n            Creates a new <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> instance.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> will use default settings \n            from <see cref=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\"/>.\n            </summary>\n            <returns>\n            A new <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> instance.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> will use default settings \n            from <see cref=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\"/>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.CreateDefault(Newtonsoft.Json.JsonSerializerSettings)\">\n            <summary>\n            Creates a new <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> instance using the specified <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> will use default settings \n            from <see cref=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\"/> as well as the specified <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </summary>\n            <param name=\"settings\">The settings to be applied to the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.</param>\n            <returns>\n            A new <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> instance using the specified <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> will use default settings \n            from <see cref=\"P:Newtonsoft.Json.JsonConvert.DefaultSettings\"/> as well as the specified <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Populate(System.IO.TextReader,System.Object)\">\n            <summary>\n            Populates the JSON values onto the target object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:System.IO.TextReader\"/> that contains the JSON structure to reader values from.</param>\n            <param name=\"target\">The target object to populate values onto.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Populate(Newtonsoft.Json.JsonReader,System.Object)\">\n            <summary>\n            Populates the JSON values onto the target object.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that contains the JSON structure to reader values from.</param>\n            <param name=\"target\">The target object to populate values onto.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Deserialize(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Deserializes the JSON structure contained by the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that contains the JSON structure to deserialize.</param>\n            <returns>The <see cref=\"T:System.Object\"/> being deserialized.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Deserialize(System.IO.TextReader,System.Type)\">\n            <summary>\n            Deserializes the JSON structure contained by the specified <see cref=\"T:System.IO.StringReader\"/>\n            into an instance of the specified type.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:System.IO.TextReader\"/> containing the object.</param>\n            <param name=\"objectType\">The <see cref=\"T:System.Type\"/> of object being deserialized.</param>\n            <returns>The instance of <paramref name=\"objectType\"/> being deserialized.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Deserialize``1(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Deserializes the JSON structure contained by the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>\n            into an instance of the specified type.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> containing the object.</param>\n            <typeparam name=\"T\">The type of the object to deserialize.</typeparam>\n            <returns>The instance of <typeparamref name=\"T\"/> being deserialized.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Deserialize(Newtonsoft.Json.JsonReader,System.Type)\">\n            <summary>\n            Deserializes the JSON structure contained by the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>\n            into an instance of the specified type.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> containing the object.</param>\n            <param name=\"objectType\">The <see cref=\"T:System.Type\"/> of object being deserialized.</param>\n            <returns>The instance of <paramref name=\"objectType\"/> being deserialized.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Serialize(System.IO.TextWriter,System.Object)\">\n            <summary>\n            Serializes the specified <see cref=\"T:System.Object\"/> and writes the JSON structure\n            to a <c>Stream</c> using the specified <see cref=\"T:System.IO.TextWriter\"/>. \n            </summary>\n            <param name=\"textWriter\">The <see cref=\"T:System.IO.TextWriter\"/> used to write the JSON structure.</param>\n            <param name=\"value\">The <see cref=\"T:System.Object\"/> to serialize.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Serialize(Newtonsoft.Json.JsonWriter,System.Object,System.Type)\">\n            <summary>\n            Serializes the specified <see cref=\"T:System.Object\"/> and writes the JSON structure\n            to a <c>Stream</c> using the specified <see cref=\"T:System.IO.TextWriter\"/>. \n            </summary>\n            <param name=\"jsonWriter\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> used to write the JSON structure.</param>\n            <param name=\"value\">The <see cref=\"T:System.Object\"/> to serialize.</param>\n            <param name=\"objectType\">\n            The type of the value being serialized.\n            This parameter is used when <see cref=\"P:Newtonsoft.Json.JsonSerializer.TypeNameHandling\"/> is Auto to write out the type name if the type of the value does not match.\n            Specifing the type is optional.\n            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Serialize(System.IO.TextWriter,System.Object,System.Type)\">\n            <summary>\n            Serializes the specified <see cref=\"T:System.Object\"/> and writes the JSON structure\n            to a <c>Stream</c> using the specified <see cref=\"T:System.IO.TextWriter\"/>. \n            </summary>\n            <param name=\"textWriter\">The <see cref=\"T:System.IO.TextWriter\"/> used to write the JSON structure.</param>\n            <param name=\"value\">The <see cref=\"T:System.Object\"/> to serialize.</param>\n            <param name=\"objectType\">\n            The type of the value being serialized.\n            This parameter is used when <see cref=\"P:Newtonsoft.Json.JsonSerializer.TypeNameHandling\"/> is Auto to write out the type name if the type of the value does not match.\n            Specifing the type is optional.\n            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializer.Serialize(Newtonsoft.Json.JsonWriter,System.Object)\">\n            <summary>\n            Serializes the specified <see cref=\"T:System.Object\"/> and writes the JSON structure\n            to a <c>Stream</c> using the specified <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>. \n            </summary>\n            <param name=\"jsonWriter\">The <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> used to write the JSON structure.</param>\n            <param name=\"value\">The <see cref=\"T:System.Object\"/> to serialize.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonSerializerSettings\">\n            <summary>\n            Specifies the settings on a <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> object.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.ReferenceLoopHandling\">\n            <summary>\n            Gets or sets how reference loops (e.g. a class referencing itself) is handled.\n            </summary>\n            <value>Reference loop handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.MissingMemberHandling\">\n            <summary>\n            Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization.\n            </summary>\n            <value>Missing member handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.ObjectCreationHandling\">\n            <summary>\n            Gets or sets how objects are created during deserialization.\n            </summary>\n            <value>The object creation handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.NullValueHandling\">\n            <summary>\n            Gets or sets how null values are handled during serialization and deserialization.\n            </summary>\n            <value>Null value handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.DefaultValueHandling\">\n            <summary>\n            Gets or sets how null default are handled during serialization and deserialization.\n            </summary>\n            <value>The default value handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.Converters\">\n            <summary>\n            Gets or sets a <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> collection that will be used during serialization.\n            </summary>\n            <value>The converters.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.PreserveReferencesHandling\">\n            <summary>\n            Gets or sets how object references are preserved by the serializer.\n            </summary>\n            <value>The preserve references handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.TypeNameHandling\">\n            <summary>\n            Gets or sets how type name writing and reading is handled by the serializer.\n            </summary>\n            <remarks>\n            <see cref=\"P:Newtonsoft.Json.JsonSerializerSettings.TypeNameHandling\"/> should be used with caution when your application deserializes JSON from an external source.\n            Incoming types should be validated with a custom <see cref=\"T:System.Runtime.Serialization.SerializationBinder\"/>\n            when deserializing with a value other than <c>TypeNameHandling.None</c>.\n            </remarks>\n            <value>The type name handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.MetadataPropertyHandling\">\n            <summary>\n            Gets or sets how metadata properties are used during deserialization.\n            </summary>\n            <value>The metadata properties handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.TypeNameAssemblyFormat\">\n            <summary>\n            Gets or sets how a type name assembly is written and resolved by the serializer.\n            </summary>\n            <value>The type name assembly format.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.ConstructorHandling\">\n            <summary>\n            Gets or sets how constructors are used during deserialization.\n            </summary>\n            <value>The constructor handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.ContractResolver\">\n            <summary>\n            Gets or sets the contract resolver used by the serializer when\n            serializing .NET objects to JSON and vice versa.\n            </summary>\n            <value>The contract resolver.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.EqualityComparer\">\n            <summary>\n            Gets or sets the equality comparer used by the serializer when comparing references.\n            </summary>\n            <value>The equality comparer.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.ReferenceResolver\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Serialization.IReferenceResolver\"/> used by the serializer when resolving references.\n            </summary>\n            <value>The reference resolver.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.ReferenceResolverProvider\">\n            <summary>\n            Gets or sets a function that creates the <see cref=\"T:Newtonsoft.Json.Serialization.IReferenceResolver\"/> used by the serializer when resolving references.\n            </summary>\n            <value>A function that creates the <see cref=\"T:Newtonsoft.Json.Serialization.IReferenceResolver\"/> used by the serializer when resolving references.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.TraceWriter\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Serialization.ITraceWriter\"/> used by the serializer when writing trace messages.\n            </summary>\n            <value>The trace writer.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.Binder\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Runtime.Serialization.SerializationBinder\"/> used by the serializer when resolving type names.\n            </summary>\n            <value>The binder.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.Error\">\n            <summary>\n            Gets or sets the error handler called during serialization and deserialization.\n            </summary>\n            <value>The error handler called during serialization and deserialization.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.Context\">\n            <summary>\n            Gets or sets the <see cref=\"T:System.Runtime.Serialization.StreamingContext\"/> used by the serializer when invoking serialization callback methods.\n            </summary>\n            <value>The context.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.DateFormatString\">\n            <summary>\n            Get or set how <see cref=\"T:System.DateTime\"/> and <see cref=\"T:System.DateTimeOffset\"/> values are formatted when writing JSON text, and the expected date format when reading JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.MaxDepth\">\n            <summary>\n            Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a <see cref=\"T:Newtonsoft.Json.JsonReaderException\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.Formatting\">\n            <summary>\n            Indicates how JSON text output is formatted.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.DateFormatHandling\">\n            <summary>\n            Get or set how dates are written to JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.DateTimeZoneHandling\">\n            <summary>\n            Get or set how <see cref=\"T:System.DateTime\"/> time zones are handling during serialization and deserialization.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.DateParseHandling\">\n            <summary>\n            Get or set how date formatted strings, e.g. \"\\/Date(1198908717056)\\/\" and \"2012-03-21T05:40Z\", are parsed when reading JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.FloatFormatHandling\">\n            <summary>\n            Get or set how special floating point numbers, e.g. <see cref=\"F:System.Double.NaN\"/>,\n            <see cref=\"F:System.Double.PositiveInfinity\"/> and <see cref=\"F:System.Double.NegativeInfinity\"/>,\n            are written as JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.FloatParseHandling\">\n            <summary>\n            Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.StringEscapeHandling\">\n            <summary>\n            Get or set how strings are escaped when writing JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.Culture\">\n            <summary>\n            Gets or sets the culture used when reading JSON. Defaults to <see cref=\"P:System.Globalization.CultureInfo.InvariantCulture\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonSerializerSettings.CheckAdditionalContent\">\n            <summary>\n            Gets a value indicating whether there will be a check for additional content after deserializing an object.\n            </summary>\n            <value>\n            \t<c>true</c> if there will be a check for additional content after deserializing an object; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonSerializerSettings.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonSerializerSettings\"/> class.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonTextReader\">\n            <summary>\n            Represents a reader that provides fast, non-cached, forward-only access to JSON text data.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.#ctor(System.IO.TextReader)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonReader\"/> class with the specified <see cref=\"T:System.IO.TextReader\"/>.\n            </summary>\n            <param name=\"reader\">The <c>TextReader</c> containing the XML data to read.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonTextReader.ArrayPool\">\n            <summary>\n            Gets or sets the reader's character buffer pool.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.Read\">\n            <summary>\n            Reads the next JSON token from the stream.\n            </summary>\n            <returns>\n            <c>true</c> if the next token was read successfully; <c>false</c> if there are no more tokens to read.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.ReadAsInt32\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.ReadAsDateTime\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.ReadAsString\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.String\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.String\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.ReadAsBytes\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Byte\"/>[].\n            </summary>\n            <returns>A <see cref=\"T:System.Byte\"/>[] or a null reference if the next JSON token is null. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.ReadAsBoolean\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.ReadAsDateTimeOffset\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.ReadAsDecimal\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.ReadAsDouble\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.Close\">\n            <summary>\n            Changes the state to closed. \n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextReader.HasLineInfo\">\n            <summary>\n            Gets a value indicating whether the class can return line information.\n            </summary>\n            <returns>\n            \t<c>true</c> if LineNumber and LinePosition can be provided; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonTextReader.LineNumber\">\n            <summary>\n            Gets the current line number.\n            </summary>\n            <value>\n            The current line number or 0 if no line information is available (for example, HasLineInfo returns false).\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonTextReader.LinePosition\">\n            <summary>\n            Gets the current line position.\n            </summary>\n            <value>\n            The current line position or 0 if no line information is available (for example, HasLineInfo returns false).\n            </value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonTextWriter\">\n            <summary>\n            Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonTextWriter.ArrayPool\">\n            <summary>\n            Gets or sets the writer's character array pool.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonTextWriter.Indentation\">\n            <summary>\n            Gets or sets how many IndentChars to write for each level in the hierarchy when <see cref=\"T:Newtonsoft.Json.Formatting\"/> is set to <c>Formatting.Indented</c>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonTextWriter.QuoteChar\">\n            <summary>\n            Gets or sets which character to use to quote attribute values.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonTextWriter.IndentChar\">\n            <summary>\n            Gets or sets which character to use for indenting when <see cref=\"T:Newtonsoft.Json.Formatting\"/> is set to <c>Formatting.Indented</c>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonTextWriter.QuoteName\">\n            <summary>\n            Gets or sets a value indicating whether object names will be surrounded with quotes.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.#ctor(System.IO.TextWriter)\">\n            <summary>\n            Creates an instance of the <c>JsonWriter</c> class using the specified <see cref=\"T:System.IO.TextWriter\"/>. \n            </summary>\n            <param name=\"textWriter\">The <c>TextWriter</c> to write to.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.Flush\">\n            <summary>\n            Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.Close\">\n            <summary>\n            Closes this stream and the underlying stream.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteStartObject\">\n            <summary>\n            Writes the beginning of a JSON object.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteStartArray\">\n            <summary>\n            Writes the beginning of a JSON array.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteStartConstructor(System.String)\">\n            <summary>\n            Writes the start of a constructor with the given name.\n            </summary>\n            <param name=\"name\">The name of the constructor.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteEnd(Newtonsoft.Json.JsonToken)\">\n            <summary>\n            Writes the specified end token.\n            </summary>\n            <param name=\"token\">The end token to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WritePropertyName(System.String)\">\n            <summary>\n            Writes the property name of a name/value pair on a JSON object.\n            </summary>\n            <param name=\"name\">The name of the property.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WritePropertyName(System.String,System.Boolean)\">\n            <summary>\n            Writes the property name of a name/value pair on a JSON object.\n            </summary>\n            <param name=\"name\">The name of the property.</param>\n            <param name=\"escape\">A flag to indicate whether the text should be escaped when it is written as a JSON property name.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteIndent\">\n            <summary>\n            Writes indent characters.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValueDelimiter\">\n            <summary>\n            Writes the JSON value delimiter.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteIndentSpace\">\n            <summary>\n            Writes an indent space.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Object)\">\n            <summary>\n            Writes a <see cref=\"T:System.Object\"/> value.\n            An error will raised if the value cannot be written as a single JSON token.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Object\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteNull\">\n            <summary>\n            Writes a null value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteUndefined\">\n            <summary>\n            Writes an undefined value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteRaw(System.String)\">\n            <summary>\n            Writes raw JSON.\n            </summary>\n            <param name=\"json\">The raw JSON to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.String)\">\n            <summary>\n            Writes a <see cref=\"T:System.String\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.String\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Int32)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int32\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int32\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.UInt32)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt32\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt32\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Int64)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int64\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int64\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.UInt64)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt64\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt64\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Single)\">\n            <summary>\n            Writes a <see cref=\"T:System.Single\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Single\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Nullable{System.Single})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Double)\">\n            <summary>\n            Writes a <see cref=\"T:System.Double\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Double\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Nullable{System.Double})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Boolean)\">\n            <summary>\n            Writes a <see cref=\"T:System.Boolean\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Boolean\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Int16)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int16\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int16\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.UInt16)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt16\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt16\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Char)\">\n            <summary>\n            Writes a <see cref=\"T:System.Char\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Char\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Byte)\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Byte\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.SByte)\">\n            <summary>\n            Writes a <see cref=\"T:System.SByte\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.SByte\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Decimal)\">\n            <summary>\n            Writes a <see cref=\"T:System.Decimal\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Decimal\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.DateTime)\">\n            <summary>\n            Writes a <see cref=\"T:System.DateTime\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.DateTime\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Byte[])\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/>[] value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Byte\"/>[] value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.DateTimeOffset)\">\n            <summary>\n            Writes a <see cref=\"T:System.DateTimeOffset\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.DateTimeOffset\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Guid)\">\n            <summary>\n            Writes a <see cref=\"T:System.Guid\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Guid\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.TimeSpan)\">\n            <summary>\n            Writes a <see cref=\"T:System.TimeSpan\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.TimeSpan\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Uri)\">\n            <summary>\n            Writes a <see cref=\"T:System.Uri\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Uri\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteComment(System.String)\">\n            <summary>\n            Writes out a comment <code>/*...*/</code> containing the specified text. \n            </summary>\n            <param name=\"text\">Text to place inside the comment.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonTextWriter.WriteWhitespace(System.String)\">\n            <summary>\n            Writes out the given white space.\n            </summary>\n            <param name=\"ws\">The string of white space characters.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonToken\">\n            <summary>\n            Specifies the type of JSON token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.None\">\n            <summary>\n            This is returned by the <see cref=\"T:Newtonsoft.Json.JsonReader\"/> if a <see cref=\"M:Newtonsoft.Json.JsonReader.Read\"/> method has not been called. \n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.StartObject\">\n            <summary>\n            An object start token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.StartArray\">\n            <summary>\n            An array start token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.StartConstructor\">\n            <summary>\n            A constructor start token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.PropertyName\">\n            <summary>\n            An object property name.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Comment\">\n            <summary>\n            A comment.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Raw\">\n            <summary>\n            Raw JSON.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Integer\">\n            <summary>\n            An integer.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Float\">\n            <summary>\n            A float.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.String\">\n            <summary>\n            A string.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Boolean\">\n            <summary>\n            A boolean.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Null\">\n            <summary>\n            A null token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Undefined\">\n            <summary>\n            An undefined token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.EndObject\">\n            <summary>\n            An object end token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.EndArray\">\n            <summary>\n            An array end token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.EndConstructor\">\n            <summary>\n            A constructor end token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Date\">\n            <summary>\n            A Date.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.JsonToken.Bytes\">\n            <summary>\n            Byte data.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonValidatingReader\">\n            <summary>\n            <para>\n            Represents a reader that provides <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> validation.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"E:Newtonsoft.Json.JsonValidatingReader.ValidationEventHandler\">\n            <summary>\n            Sets an event handler for receiving schema validation errors.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonValidatingReader.Value\">\n            <summary>\n            Gets the text value of the current JSON token.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonValidatingReader.Depth\">\n            <summary>\n            Gets the depth of the current token in the JSON document.\n            </summary>\n            <value>The depth of the current token in the JSON document.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonValidatingReader.Path\">\n            <summary>\n            Gets the path of the current JSON token. \n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonValidatingReader.QuoteChar\">\n            <summary>\n            Gets the quotation mark character used to enclose the value of a string.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonValidatingReader.TokenType\">\n            <summary>\n            Gets the type of the current JSON token.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonValidatingReader.ValueType\">\n            <summary>\n            Gets the Common Language Runtime (CLR) type for the current JSON token.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.#ctor(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonValidatingReader\"/> class that\n            validates the content returned from the given <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read from while validating.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonValidatingReader.Schema\">\n            <summary>\n            Gets or sets the schema.\n            </summary>\n            <value>The schema.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonValidatingReader.Reader\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.JsonReader\"/> used to construct this <see cref=\"T:Newtonsoft.Json.JsonValidatingReader\"/>.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> specified in the constructor.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.ReadAsInt32\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.ReadAsBytes\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Byte\"/>[].\n            </summary>\n            <returns>\n            A <see cref=\"T:System.Byte\"/>[] or a null reference if the next JSON token is null.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.ReadAsDecimal\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.ReadAsDouble\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.ReadAsBoolean\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.ReadAsString\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.String\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.String\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.ReadAsDateTime\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>. This method will return <c>null</c> at the end of an array.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.ReadAsDateTimeOffset\">\n            <summary>\n            Reads the next JSON token from the stream as a <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <returns>A <see cref=\"T:System.Nullable`1\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonValidatingReader.Read\">\n            <summary>\n            Reads the next JSON token from the stream.\n            </summary>\n            <returns>\n            <c>true</c> if the next token was read successfully; <c>false</c> if there are no more tokens to read.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonWriter\">\n            <summary>\n            Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.CloseOutput\">\n            <summary>\n            Gets or sets a value indicating whether the underlying stream or\n            <see cref=\"T:System.IO.TextReader\"/> should be closed when the writer is closed.\n            </summary>\n            <value>\n            true to close the underlying stream or <see cref=\"T:System.IO.TextReader\"/> when\n            the writer is closed; otherwise false. The default is true.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.Top\">\n            <summary>\n            Gets the top.\n            </summary>\n            <value>The top.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.WriteState\">\n            <summary>\n            Gets the state of the writer.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.Path\">\n            <summary>\n            Gets the path of the writer. \n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.Formatting\">\n            <summary>\n            Indicates how JSON text output is formatted.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.DateFormatHandling\">\n            <summary>\n            Get or set how dates are written to JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.DateTimeZoneHandling\">\n            <summary>\n            Get or set how <see cref=\"T:System.DateTime\"/> time zones are handling when writing JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.StringEscapeHandling\">\n            <summary>\n            Get or set how strings are escaped when writing JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.FloatFormatHandling\">\n            <summary>\n            Get or set how special floating point numbers, e.g. <see cref=\"F:System.Double.NaN\"/>,\n            <see cref=\"F:System.Double.PositiveInfinity\"/> and <see cref=\"F:System.Double.NegativeInfinity\"/>,\n            are written to JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.DateFormatString\">\n            <summary>\n            Get or set how <see cref=\"T:System.DateTime\"/> and <see cref=\"T:System.DateTimeOffset\"/> values are formatting when writing JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriter.Culture\">\n            <summary>\n            Gets or sets the culture used when writing JSON. Defaults to <see cref=\"P:System.Globalization.CultureInfo.InvariantCulture\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.#ctor\">\n            <summary>\n            Creates an instance of the <c>JsonWriter</c> class. \n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.Flush\">\n            <summary>\n            Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.Close\">\n            <summary>\n            Closes this stream and the underlying stream.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteStartObject\">\n            <summary>\n            Writes the beginning of a JSON object.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteEndObject\">\n            <summary>\n            Writes the end of a JSON object.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteStartArray\">\n            <summary>\n            Writes the beginning of a JSON array.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteEndArray\">\n            <summary>\n            Writes the end of an array.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteStartConstructor(System.String)\">\n            <summary>\n            Writes the start of a constructor with the given name.\n            </summary>\n            <param name=\"name\">The name of the constructor.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteEndConstructor\">\n            <summary>\n            Writes the end constructor.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WritePropertyName(System.String)\">\n            <summary>\n            Writes the property name of a name/value pair on a JSON object.\n            </summary>\n            <param name=\"name\">The name of the property.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WritePropertyName(System.String,System.Boolean)\">\n            <summary>\n            Writes the property name of a name/value pair on a JSON object.\n            </summary>\n            <param name=\"name\">The name of the property.</param>\n            <param name=\"escape\">A flag to indicate whether the text should be escaped when it is written as a JSON property name.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteEnd\">\n            <summary>\n            Writes the end of the current JSON object or array.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteToken(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Writes the current <see cref=\"T:Newtonsoft.Json.JsonReader\"/> token and its children.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read the token from.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteToken(Newtonsoft.Json.JsonReader,System.Boolean)\">\n            <summary>\n            Writes the current <see cref=\"T:Newtonsoft.Json.JsonReader\"/> token.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> to read the token from.</param>\n            <param name=\"writeChildren\">A flag indicating whether the current token's children should be written.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteToken(Newtonsoft.Json.JsonToken,System.Object)\">\n            <summary>\n            Writes the <see cref=\"T:Newtonsoft.Json.JsonToken\"/> token and its value.\n            </summary>\n            <param name=\"token\">The <see cref=\"T:Newtonsoft.Json.JsonToken\"/> to write.</param>\n            <param name=\"value\">\n            The value to write.\n            A value is only required for tokens that have an associated value, e.g. the <see cref=\"T:System.String\"/> property name for <see cref=\"F:Newtonsoft.Json.JsonToken.PropertyName\"/>.\n            A null value can be passed to the method for token's that don't have a value, e.g. <see cref=\"F:Newtonsoft.Json.JsonToken.StartObject\"/>.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteToken(Newtonsoft.Json.JsonToken)\">\n            <summary>\n            Writes the <see cref=\"T:Newtonsoft.Json.JsonToken\"/> token.\n            </summary>\n            <param name=\"token\">The <see cref=\"T:Newtonsoft.Json.JsonToken\"/> to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteEnd(Newtonsoft.Json.JsonToken)\">\n            <summary>\n            Writes the specified end token.\n            </summary>\n            <param name=\"token\">The end token to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteIndent\">\n            <summary>\n            Writes indent characters.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValueDelimiter\">\n            <summary>\n            Writes the JSON value delimiter.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteIndentSpace\">\n            <summary>\n            Writes an indent space.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteNull\">\n            <summary>\n            Writes a null value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteUndefined\">\n            <summary>\n            Writes an undefined value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteRaw(System.String)\">\n            <summary>\n            Writes raw JSON without changing the writer's state.\n            </summary>\n            <param name=\"json\">The raw JSON to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteRawValue(System.String)\">\n            <summary>\n            Writes raw JSON where a value is expected and updates the writer's state.\n            </summary>\n            <param name=\"json\">The raw JSON to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.String)\">\n            <summary>\n            Writes a <see cref=\"T:System.String\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.String\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Int32)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int32\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int32\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.UInt32)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt32\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt32\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Int64)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int64\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int64\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.UInt64)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt64\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt64\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Single)\">\n            <summary>\n            Writes a <see cref=\"T:System.Single\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Single\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Double)\">\n            <summary>\n            Writes a <see cref=\"T:System.Double\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Double\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Boolean)\">\n            <summary>\n            Writes a <see cref=\"T:System.Boolean\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Boolean\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Int16)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int16\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int16\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.UInt16)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt16\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt16\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Char)\">\n            <summary>\n            Writes a <see cref=\"T:System.Char\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Char\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Byte)\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Byte\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.SByte)\">\n            <summary>\n            Writes a <see cref=\"T:System.SByte\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.SByte\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Decimal)\">\n            <summary>\n            Writes a <see cref=\"T:System.Decimal\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Decimal\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.DateTime)\">\n            <summary>\n            Writes a <see cref=\"T:System.DateTime\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.DateTime\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.DateTimeOffset)\">\n            <summary>\n            Writes a <see cref=\"T:System.DateTimeOffset\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.DateTimeOffset\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Guid)\">\n            <summary>\n            Writes a <see cref=\"T:System.Guid\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Guid\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.TimeSpan)\">\n            <summary>\n            Writes a <see cref=\"T:System.TimeSpan\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.TimeSpan\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Int32})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.UInt32})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Int64})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.UInt64})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Single})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Double})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Boolean})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Int16})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.UInt16})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Char})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Byte})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.SByte})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Decimal})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.DateTime})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.DateTimeOffset})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Guid})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.TimeSpan})\">\n            <summary>\n            Writes a <see cref=\"T:System.Nullable`1\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Nullable`1\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Byte[])\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/>[] value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Byte\"/>[] value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Uri)\">\n            <summary>\n            Writes a <see cref=\"T:System.Uri\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Uri\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteValue(System.Object)\">\n            <summary>\n            Writes a <see cref=\"T:System.Object\"/> value.\n            An error will raised if the value cannot be written as a single JSON token.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Object\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteComment(System.String)\">\n            <summary>\n            Writes out a comment <code>/*...*/</code> containing the specified text. \n            </summary>\n            <param name=\"text\">Text to place inside the comment.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.WriteWhitespace(System.String)\">\n            <summary>\n            Writes out the given white space.\n            </summary>\n            <param name=\"ws\">The string of white space characters.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.Dispose(System.Boolean)\">\n            <summary>\n            Releases unmanaged and - optionally - managed resources\n            </summary>\n            <param name=\"disposing\"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriter.SetWriteState(Newtonsoft.Json.JsonToken,System.Object)\">\n            <summary>\n            Sets the state of the JsonWriter,\n            </summary>\n            <param name=\"token\">The JsonToken being written.</param>\n            <param name=\"value\">The value being written.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.JsonWriterException\">\n            <summary>\n            The exception thrown when an error occurs while reading JSON text.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.JsonWriterException.Path\">\n            <summary>\n            Gets the path to the JSON where the error occurred.\n            </summary>\n            <value>The path to the JSON where the error occurred.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriterException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonWriterException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriterException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonWriterException\"/> class\n            with a specified error message.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriterException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonWriterException\"/> class\n            with a specified error message and a reference to the inner exception that is the cause of this exception.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n            <param name=\"innerException\">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.JsonWriterException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.JsonWriterException\"/> class.\n            </summary>\n            <param name=\"info\">The <see cref=\"T:System.Runtime.Serialization.SerializationInfo\"/> that holds the serialized object data about the exception being thrown.</param>\n            <param name=\"context\">The <see cref=\"T:System.Runtime.Serialization.StreamingContext\"/> that contains contextual information about the source or destination.</param>\n            <exception cref=\"T:System.ArgumentNullException\">The <paramref name=\"info\"/> parameter is null. </exception>\n            <exception cref=\"T:System.Runtime.Serialization.SerializationException\">The class name is null or <see cref=\"P:System.Exception.HResult\"/> is zero (0). </exception>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.CommentHandling\">\n            <summary>\n            Specifies how JSON comments are handled when loading JSON.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.CommentHandling.Ignore\">\n            <summary>\n            Ignore comments.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.CommentHandling.Load\">\n            <summary>\n            Load comments as a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> with type <see cref=\"F:Newtonsoft.Json.Linq.JTokenType.Comment\"/>.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.LineInfoHandling\">\n            <summary>\n            Specifies how line information is handled when loading JSON.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.LineInfoHandling.Ignore\">\n            <summary>\n            Ignore line information.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.LineInfoHandling.Load\">\n            <summary>\n            Load line information.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.Extensions\">\n            <summary>\n            Contains the LINQ to JSON extension methods.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Ancestors``1(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Returns a collection of tokens that contains the ancestors of every token in the source collection.\n            </summary>\n            <typeparam name=\"T\">The type of the objects in source, constrained to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</typeparam>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the ancestors of every token in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.AncestorsAndSelf``1(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection.\n            </summary>\n            <typeparam name=\"T\">The type of the objects in source, constrained to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</typeparam>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains every token in the source collection, the ancestors of every token in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Descendants``1(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Returns a collection of tokens that contains the descendants of every token in the source collection.\n            </summary>\n            <typeparam name=\"T\">The type of the objects in source, constrained to <see cref=\"T:Newtonsoft.Json.Linq.JContainer\"/>.</typeparam>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the descendants of every token in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.DescendantsAndSelf``1(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection.\n            </summary>\n            <typeparam name=\"T\">The type of the objects in source, constrained to <see cref=\"T:Newtonsoft.Json.Linq.JContainer\"/>.</typeparam>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains every token in the source collection, and the descendants of every token in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Properties(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JObject})\">\n            <summary>\n            Returns a collection of child properties of every object in the source collection.\n            </summary>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> that contains the source collection.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> that contains the properties of every object in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Values(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken},System.Object)\">\n            <summary>\n            Returns a collection of child values of every object in the source collection with the given key.\n            </summary>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <param name=\"key\">The token key.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the values of every token in the source collection with the given key.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Values(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken})\">\n            <summary>\n            Returns a collection of child values of every object in the source collection.\n            </summary>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the values of every token in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Values``1(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken},System.Object)\">\n            <summary>\n            Returns a collection of converted child values of every object in the source collection with the given key.\n            </summary>\n            <typeparam name=\"U\">The type to convert the values to.</typeparam>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <param name=\"key\">The token key.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> that contains the converted values of every token in the source collection with the given key.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Values``1(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken})\">\n            <summary>\n            Returns a collection of converted child values of every object in the source collection.\n            </summary>\n            <typeparam name=\"U\">The type to convert the values to.</typeparam>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> that contains the converted values of every token in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Value``1(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken})\">\n            <summary>\n            Converts the value.\n            </summary>\n            <typeparam name=\"U\">The type to convert the value to.</typeparam>\n            <param name=\"value\">A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> cast as a <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</param>\n            <returns>A converted value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Value``2(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Converts the value.\n            </summary>\n            <typeparam name=\"T\">The source collection type.</typeparam>\n            <typeparam name=\"U\">The type to convert the value to.</typeparam>\n            <param name=\"value\">A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> cast as a <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</param>\n            <returns>A converted value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Children``1(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Returns a collection of child tokens of every array in the source collection.\n            </summary>\n            <typeparam name=\"T\">The source collection type.</typeparam>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the values of every token in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.Children``2(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Returns a collection of converted child tokens of every array in the source collection.\n            </summary>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <typeparam name=\"U\">The type to convert the values to.</typeparam>\n            <typeparam name=\"T\">The source collection type.</typeparam>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> that contains the converted values of every token in the source collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.AsJEnumerable(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken})\">\n            <summary>\n            Returns the input typed as <see cref=\"T:Newtonsoft.Json.Linq.IJEnumerable`1\"/>.\n            </summary>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>The input typed as <see cref=\"T:Newtonsoft.Json.Linq.IJEnumerable`1\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.Extensions.AsJEnumerable``1(System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Returns the input typed as <see cref=\"T:Newtonsoft.Json.Linq.IJEnumerable`1\"/>.\n            </summary>\n            <typeparam name=\"T\">The source collection type.</typeparam>\n            <param name=\"source\">An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the source collection.</param>\n            <returns>The input typed as <see cref=\"T:Newtonsoft.Json.Linq.IJEnumerable`1\"/>.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.IJEnumerable`1\">\n            <summary>\n            Represents a collection of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> objects.\n            </summary>\n            <typeparam name=\"T\">The type of token</typeparam>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.IJEnumerable`1.Item(System.Object)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.IJEnumerable`1\"/> with the specified key.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JArray\">\n            <summary>\n            Represents a JSON array.\n            </summary>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\LinqToJsonTests.cs\" region=\"LinqToJsonCreateParseArray\" title=\"Parsing a JSON Array from Text\" />\n            </example>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JArray.ChildrenTokens\">\n            <summary>\n            Gets the container's children tokens.\n            </summary>\n            <value>The container's children tokens.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JArray.Type\">\n            <summary>\n            Gets the node type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <value>The type.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.#ctor(Newtonsoft.Json.Linq.JArray)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> class from another <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> object to copy from.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.#ctor(System.Object[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> class with the specified content.\n            </summary>\n            <param name=\"content\">The contents of the array.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> class with the specified content.\n            </summary>\n            <param name=\"content\">The contents of the array.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Load(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Loads an <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>. \n            </summary>\n            <param name=\"reader\">A <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that will be read for the content of the <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/>.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> that contains the JSON that was read from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Load(Newtonsoft.Json.JsonReader,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Loads an <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>. \n            </summary>\n            <param name=\"reader\">A <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that will be read for the content of the <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/>.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> that contains the JSON that was read from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Parse(System.String)\">\n            <summary>\n            Load a <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> from a string that contains JSON.\n            </summary>\n            <param name=\"json\">A <see cref=\"T:System.String\"/> that contains JSON.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> populated from the string that contains JSON.</returns>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\LinqToJsonTests.cs\" region=\"LinqToJsonCreateParseArray\" title=\"Parsing a JSON Array from Text\" />\n            </example>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Parse(System.String,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Load a <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> from a string that contains JSON.\n            </summary>\n            <param name=\"json\">A <see cref=\"T:System.String\"/> that contains JSON.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> populated from the string that contains JSON.</returns>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\LinqToJsonTests.cs\" region=\"LinqToJsonCreateParseArray\" title=\"Parsing a JSON Array from Text\" />\n            </example>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.FromObject(System.Object)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> from an object.\n            </summary>\n            <param name=\"o\">The object that will be used to create <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/>.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> with the values of the specified object</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.FromObject(System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> from an object.\n            </summary>\n            <param name=\"o\">The object that will be used to create <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/>.</param>\n            <param name=\"jsonSerializer\">The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> that will be used to read the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JArray\"/> with the values of the specified object</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Writes this token to a <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n            <param name=\"writer\">A <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> into which this method will write.</param>\n            <param name=\"converters\">A collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> which will be used when writing the token.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JArray.Item(System.Object)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JArray.Item(System.Int32)\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> at the specified index.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.IndexOf(Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Determines the index of a specific item in the <see cref=\"T:System.Collections.Generic.IList`1\"/>.\n            </summary>\n            <param name=\"item\">The object to locate in the <see cref=\"T:System.Collections.Generic.IList`1\"/>.</param>\n            <returns>\n            The index of <paramref name=\"item\"/> if found in the list; otherwise, -1.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Insert(System.Int32,Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Inserts an item to the <see cref=\"T:System.Collections.Generic.IList`1\"/> at the specified index.\n            </summary>\n            <param name=\"index\">The zero-based index at which <paramref name=\"item\"/> should be inserted.</param>\n            <param name=\"item\">The object to insert into the <see cref=\"T:System.Collections.Generic.IList`1\"/>.</param>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            \t<paramref name=\"index\"/> is not a valid index in the <see cref=\"T:System.Collections.Generic.IList`1\"/>.</exception>\n            <exception cref=\"T:System.NotSupportedException\">The <see cref=\"T:System.Collections.Generic.IList`1\"/> is read-only.</exception>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.RemoveAt(System.Int32)\">\n            <summary>\n            Removes the <see cref=\"T:System.Collections.Generic.IList`1\"/> item at the specified index.\n            </summary>\n            <param name=\"index\">The zero-based index of the item to remove.</param>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">\n            \t<paramref name=\"index\"/> is not a valid index in the <see cref=\"T:System.Collections.Generic.IList`1\"/>.</exception>\n            <exception cref=\"T:System.NotSupportedException\">The <see cref=\"T:System.Collections.Generic.IList`1\"/> is read-only.</exception>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.GetEnumerator\">\n            <summary>\n            Returns an enumerator that iterates through the collection.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.Collections.Generic.IEnumerator`1\" /> that can be used to iterate through the collection.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Add(Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Adds an item to the <see cref=\"T:System.Collections.Generic.ICollection`1\"/>.\n            </summary>\n            <param name=\"item\">The object to add to the <see cref=\"T:System.Collections.Generic.ICollection`1\"/>.</param>\n            <exception cref=\"T:System.NotSupportedException\">The <see cref=\"T:System.Collections.Generic.ICollection`1\"/> is read-only.</exception>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Clear\">\n            <summary>\n            Removes all items from the <see cref=\"T:System.Collections.Generic.ICollection`1\"/>.\n            </summary>\n            <exception cref=\"T:System.NotSupportedException\">The <see cref=\"T:System.Collections.Generic.ICollection`1\"/> is read-only. </exception>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Contains(Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Determines whether the <see cref=\"T:System.Collections.Generic.ICollection`1\"/> contains a specific value.\n            </summary>\n            <param name=\"item\">The object to locate in the <see cref=\"T:System.Collections.Generic.ICollection`1\"/>.</param>\n            <returns>\n            true if <paramref name=\"item\"/> is found in the <see cref=\"T:System.Collections.Generic.ICollection`1\"/>; otherwise, false.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.CopyTo(Newtonsoft.Json.Linq.JToken[],System.Int32)\">\n            <summary>\n            Copies to.\n            </summary>\n            <param name=\"array\">The array.</param>\n            <param name=\"arrayIndex\">Index of the array.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JArray.IsReadOnly\">\n            <summary>\n            Gets a value indicating whether the <see cref=\"T:System.Collections.Generic.ICollection`1\" /> is read-only.\n            </summary>\n            <returns>true if the <see cref=\"T:System.Collections.Generic.ICollection`1\" /> is read-only; otherwise, false.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JArray.Remove(Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Removes the first occurrence of a specific object from the <see cref=\"T:System.Collections.Generic.ICollection`1\"/>.\n            </summary>\n            <param name=\"item\">The object to remove from the <see cref=\"T:System.Collections.Generic.ICollection`1\"/>.</param>\n            <returns>\n            true if <paramref name=\"item\"/> was successfully removed from the <see cref=\"T:System.Collections.Generic.ICollection`1\"/>; otherwise, false. This method also returns false if <paramref name=\"item\"/> is not found in the original <see cref=\"T:System.Collections.Generic.ICollection`1\"/>.\n            </returns>\n            <exception cref=\"T:System.NotSupportedException\">The <see cref=\"T:System.Collections.Generic.ICollection`1\"/> is read-only.</exception>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JConstructor\">\n            <summary>\n            Represents a JSON constructor.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JConstructor.ChildrenTokens\">\n            <summary>\n            Gets the container's children tokens.\n            </summary>\n            <value>The container's children tokens.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JConstructor.Name\">\n            <summary>\n            Gets or sets the name of this constructor.\n            </summary>\n            <value>The constructor name.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JConstructor.Type\">\n            <summary>\n            Gets the node type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <value>The type.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JConstructor.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JConstructor.#ctor(Newtonsoft.Json.Linq.JConstructor)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> class from another <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> object to copy from.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JConstructor.#ctor(System.String,System.Object[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> class with the specified name and content.\n            </summary>\n            <param name=\"name\">The constructor name.</param>\n            <param name=\"content\">The contents of the constructor.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JConstructor.#ctor(System.String,System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> class with the specified name and content.\n            </summary>\n            <param name=\"name\">The constructor name.</param>\n            <param name=\"content\">The contents of the constructor.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JConstructor.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> class with the specified name.\n            </summary>\n            <param name=\"name\">The constructor name.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JConstructor.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Writes this token to a <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n            <param name=\"writer\">A <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> into which this method will write.</param>\n            <param name=\"converters\">A collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> which will be used when writing the token.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JConstructor.Item(System.Object)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JConstructor.Load(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Loads an <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>. \n            </summary>\n            <param name=\"reader\">A <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that will be read for the content of the <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/>.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> that contains the JSON that was read from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JConstructor.Load(Newtonsoft.Json.JsonReader,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Loads an <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>. \n            </summary>\n            <param name=\"reader\">A <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that will be read for the content of the <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/>.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JConstructor\"/> that contains the JSON that was read from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JContainer\">\n            <summary>\n            Represents a token that can contain other tokens.\n            </summary>\n        </member>\n        <member name=\"E:Newtonsoft.Json.Linq.JContainer.ListChanged\">\n            <summary>\n            Occurs when the list changes or an item in the list changes.\n            </summary>\n        </member>\n        <member name=\"E:Newtonsoft.Json.Linq.JContainer.AddingNew\">\n            <summary>\n            Occurs before an item is added to the collection.\n            </summary>\n        </member>\n        <member name=\"E:Newtonsoft.Json.Linq.JContainer.CollectionChanged\">\n            <summary>\n            Occurs when the items list of the collection has changed, or the collection is reset.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JContainer.ChildrenTokens\">\n            <summary>\n            Gets the container's children tokens.\n            </summary>\n            <value>The container's children tokens.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.OnAddingNew(System.ComponentModel.AddingNewEventArgs)\">\n            <summary>\n            Raises the <see cref=\"E:Newtonsoft.Json.Linq.JContainer.AddingNew\"/> event.\n            </summary>\n            <param name=\"e\">The <see cref=\"T:System.ComponentModel.AddingNewEventArgs\"/> instance containing the event data.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.OnListChanged(System.ComponentModel.ListChangedEventArgs)\">\n            <summary>\n            Raises the <see cref=\"E:Newtonsoft.Json.Linq.JContainer.ListChanged\"/> event.\n            </summary>\n            <param name=\"e\">The <see cref=\"T:System.ComponentModel.ListChangedEventArgs\"/> instance containing the event data.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs)\">\n            <summary>\n            Raises the <see cref=\"E:Newtonsoft.Json.Linq.JContainer.CollectionChanged\"/> event.\n            </summary>\n            <param name=\"e\">The <see cref=\"T:System.Collections.Specialized.NotifyCollectionChangedEventArgs\"/> instance containing the event data.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JContainer.HasValues\">\n            <summary>\n            Gets a value indicating whether this token has child tokens.\n            </summary>\n            <value>\n            \t<c>true</c> if this token has child values; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JContainer.First\">\n            <summary>\n            Get the first child token of this token.\n            </summary>\n            <value>\n            A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> containing the first child token of the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JContainer.Last\">\n            <summary>\n            Get the last child token of this token.\n            </summary>\n            <value>\n            A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> containing the last child token of the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.Children\">\n            <summary>\n            Returns a collection of the child tokens of this token, in document order.\n            </summary>\n            <returns>\n            An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> containing the child tokens of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>, in document order.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.Values``1\">\n            <summary>\n            Returns a collection of the child values of this token, in document order.\n            </summary>\n            <typeparam name=\"T\">The type to convert the values to.</typeparam>\n            <returns>\n            A <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> containing the child values of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>, in document order.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.Descendants\">\n            <summary>\n            Returns a collection of the descendant tokens for this token in document order.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> containing the descendant tokens of the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.DescendantsAndSelf\">\n            <summary>\n            Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> containing this token, and all the descendant tokens of the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.Add(System.Object)\">\n            <summary>\n            Adds the specified content as children of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"content\">The content to be added.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.AddFirst(System.Object)\">\n            <summary>\n            Adds the specified content as the first children of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"content\">The content to be added.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.CreateWriter\">\n            <summary>\n            Creates an <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> that can be used to add tokens to the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <returns>An <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> that is ready to have content written to it.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.ReplaceAll(System.Object)\">\n            <summary>\n            Replaces the children nodes of this token with the specified content.\n            </summary>\n            <param name=\"content\">The content.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.RemoveAll\">\n            <summary>\n            Removes the child nodes from this token.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.Merge(System.Object)\">\n            <summary>\n            Merge the specified content into this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"content\">The content to be merged.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JContainer.Merge(System.Object,Newtonsoft.Json.Linq.JsonMergeSettings)\">\n            <summary>\n            Merge the specified content into this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> using <see cref=\"T:Newtonsoft.Json.Linq.JsonMergeSettings\"/>.\n            </summary>\n            <param name=\"content\">The content to be merged.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonMergeSettings\"/> used to merge the content.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JContainer.Count\">\n            <summary>\n            Gets the count of child JSON tokens.\n            </summary>\n            <value>The count of child JSON tokens</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JEnumerable`1\">\n            <summary>\n            Represents a collection of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> objects.\n            </summary>\n            <typeparam name=\"T\">The type of token</typeparam>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JEnumerable`1.Empty\">\n            <summary>\n            An empty collection of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> objects.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JEnumerable`1.#ctor(System.Collections.Generic.IEnumerable{`0})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JEnumerable`1\"/> struct.\n            </summary>\n            <param name=\"enumerable\">The enumerable.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JEnumerable`1.GetEnumerator\">\n            <summary>\n            Returns an enumerator that iterates through the collection.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> that can be used to iterate through the collection.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JEnumerable`1.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Returns an enumerator that iterates through a collection.\n            </summary>\n            <returns>\n            An <see cref=\"T:System.Collections.IEnumerator\"/> object that can be used to iterate through the collection.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JEnumerable`1.Item(System.Object)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.IJEnumerable`1\"/> with the specified key.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JEnumerable`1.Equals(Newtonsoft.Json.Linq.JEnumerable{`0})\">\n            <summary>\n            Determines whether the specified <see cref=\"T:Newtonsoft.Json.Linq.JEnumerable`1\"/> is equal to this instance.\n            </summary>\n            <param name=\"other\">The <see cref=\"T:Newtonsoft.Json.Linq.JEnumerable`1\"/> to compare with this instance.</param>\n            <returns>\n            \t<c>true</c> if the specified <see cref=\"T:Newtonsoft.Json.Linq.JEnumerable`1\"/> is equal to this instance; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JEnumerable`1.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified <see cref=\"T:System.Object\"/> is equal to this instance.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> to compare with this instance.</param>\n            <returns>\n            \t<c>true</c> if the specified <see cref=\"T:System.Object\"/> is equal to this instance; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JEnumerable`1.GetHashCode\">\n            <summary>\n            Returns a hash code for this instance.\n            </summary>\n            <returns>\n            A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. \n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JObject\">\n            <summary>\n            Represents a JSON object.\n            </summary>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\LinqToJsonTests.cs\" region=\"LinqToJsonCreateParse\" title=\"Parsing a JSON Object from Text\" />\n            </example>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JObject.ChildrenTokens\">\n            <summary>\n            Gets the container's children tokens.\n            </summary>\n            <value>The container's children tokens.</value>\n        </member>\n        <member name=\"E:Newtonsoft.Json.Linq.JObject.PropertyChanged\">\n            <summary>\n            Occurs when a property value changes.\n            </summary>\n        </member>\n        <member name=\"E:Newtonsoft.Json.Linq.JObject.PropertyChanging\">\n            <summary>\n            Occurs when a property value is changing.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.#ctor(Newtonsoft.Json.Linq.JObject)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> class from another <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> object to copy from.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.#ctor(System.Object[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> class with the specified content.\n            </summary>\n            <param name=\"content\">The contents of the object.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> class with the specified content.\n            </summary>\n            <param name=\"content\">The contents of the object.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JObject.Type\">\n            <summary>\n            Gets the node type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <value>The type.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.Properties\">\n            <summary>\n            Gets an <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of this object's properties.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of this object's properties.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.Property(System.String)\">\n            <summary>\n            Gets a <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> the specified name.\n            </summary>\n            <param name=\"name\">The property name.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> with the specified name or null.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.PropertyValues\">\n            <summary>\n            Gets an <see cref=\"T:Newtonsoft.Json.Linq.JEnumerable`1\"/> of this object's property values.\n            </summary>\n            <returns>An <see cref=\"T:Newtonsoft.Json.Linq.JEnumerable`1\"/> of this object's property values.</returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JObject.Item(System.Object)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JObject.Item(System.String)\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified property name.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.Load(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Loads an <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>. \n            </summary>\n            <param name=\"reader\">A <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that will be read for the content of the <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/>.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> that contains the JSON that was read from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.Load(Newtonsoft.Json.JsonReader,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Loads an <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>. \n            </summary>\n            <param name=\"reader\">A <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that will be read for the content of the <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/>.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> that contains the JSON that was read from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.Parse(System.String)\">\n            <summary>\n            Load a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> from a string that contains JSON.\n            </summary>\n            <param name=\"json\">A <see cref=\"T:System.String\"/> that contains JSON.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> populated from the string that contains JSON.</returns>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\LinqToJsonTests.cs\" region=\"LinqToJsonCreateParse\" title=\"Parsing a JSON Object from Text\" />\n            </example>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.Parse(System.String,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Load a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> from a string that contains JSON.\n            </summary>\n            <param name=\"json\">A <see cref=\"T:System.String\"/> that contains JSON.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> populated from the string that contains JSON.</returns>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\LinqToJsonTests.cs\" region=\"LinqToJsonCreateParse\" title=\"Parsing a JSON Object from Text\" />\n            </example>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.FromObject(System.Object)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> from an object.\n            </summary>\n            <param name=\"o\">The object that will be used to create <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/>.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> with the values of the specified object</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.FromObject(System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> from an object.\n            </summary>\n            <param name=\"o\">The object that will be used to create <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/>.</param>\n            <param name=\"jsonSerializer\">The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> that will be used to read the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JObject\"/> with the values of the specified object</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Writes this token to a <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n            <param name=\"writer\">A <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> into which this method will write.</param>\n            <param name=\"converters\">A collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> which will be used when writing the token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.GetValue(System.String)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified property name.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified property name.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.GetValue(System.String,System.StringComparison)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified property name.\n            The exact property name will be searched for first and if no matching property is found then\n            the <see cref=\"T:System.StringComparison\"/> will be used to match a property.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <param name=\"comparison\">One of the enumeration values that specifies how the strings will be compared.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified property name.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.TryGetValue(System.String,System.StringComparison,Newtonsoft.Json.Linq.JToken@)\">\n            <summary>\n            Tries to get the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified property name.\n            The exact property name will be searched for first and if no matching property is found then\n            the <see cref=\"T:System.StringComparison\"/> will be used to match a property.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"comparison\">One of the enumeration values that specifies how the strings will be compared.</param>\n            <returns><c>true</c> if a value was successfully retrieved; otherwise, <c>false</c>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.Add(System.String,Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Adds the specified property name.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.Remove(System.String)\">\n            <summary>\n            Removes the property with the specified name.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <returns><c>true</c> if item was successfully removed; otherwise, <c>false</c>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.TryGetValue(System.String,Newtonsoft.Json.Linq.JToken@)\">\n            <summary>\n            Tries the get value.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <param name=\"value\">The value.</param>\n            <returns><c>true</c> if a value was successfully retrieved; otherwise, <c>false</c>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.GetEnumerator\">\n            <summary>\n            Returns an enumerator that iterates through the collection.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> that can be used to iterate through the collection.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.OnPropertyChanged(System.String)\">\n            <summary>\n            Raises the <see cref=\"E:Newtonsoft.Json.Linq.JObject.PropertyChanged\"/> event with the provided arguments.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.OnPropertyChanging(System.String)\">\n            <summary>\n            Raises the <see cref=\"E:Newtonsoft.Json.Linq.JObject.PropertyChanging\"/> event with the provided arguments.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetProperties\">\n            <summary>\n            Returns the properties for this instance of a component.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.ComponentModel.PropertyDescriptorCollection\"/> that represents the properties for this component instance.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetProperties(System.Attribute[])\">\n            <summary>\n            Returns the properties for this instance of a component using the attribute array as a filter.\n            </summary>\n            <param name=\"attributes\">An array of type <see cref=\"T:System.Attribute\"/> that is used as a filter.</param>\n            <returns>\n            A <see cref=\"T:System.ComponentModel.PropertyDescriptorCollection\"/> that represents the filtered properties for this component instance.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetAttributes\">\n            <summary>\n            Returns a collection of custom attributes for this instance of a component.\n            </summary>\n            <returns>\n            An <see cref=\"T:System.ComponentModel.AttributeCollection\"/> containing the attributes for this object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetClassName\">\n            <summary>\n            Returns the class name of this instance of a component.\n            </summary>\n            <returns>\n            The class name of the object, or null if the class does not have a name.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetComponentName\">\n            <summary>\n            Returns the name of this instance of a component.\n            </summary>\n            <returns>\n            The name of the object, or null if the object does not have a name.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetConverter\">\n            <summary>\n            Returns a type converter for this instance of a component.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.ComponentModel.TypeConverter\"/> that is the converter for this object, or null if there is no <see cref=\"T:System.ComponentModel.TypeConverter\"/> for this object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetDefaultEvent\">\n            <summary>\n            Returns the default event for this instance of a component.\n            </summary>\n            <returns>\n            An <see cref=\"T:System.ComponentModel.EventDescriptor\"/> that represents the default event for this object, or null if this object does not have events.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetDefaultProperty\">\n            <summary>\n            Returns the default property for this instance of a component.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.ComponentModel.PropertyDescriptor\"/> that represents the default property for this object, or null if this object does not have properties.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetEditor(System.Type)\">\n            <summary>\n            Returns an editor of the specified type for this instance of a component.\n            </summary>\n            <param name=\"editorBaseType\">A <see cref=\"T:System.Type\"/> that represents the editor for this object.</param>\n            <returns>\n            An <see cref=\"T:System.Object\"/> of the specified type that is the editor for this object, or null if the editor cannot be found.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetEvents(System.Attribute[])\">\n            <summary>\n            Returns the events for this instance of a component using the specified attribute array as a filter.\n            </summary>\n            <param name=\"attributes\">An array of type <see cref=\"T:System.Attribute\"/> that is used as a filter.</param>\n            <returns>\n            An <see cref=\"T:System.ComponentModel.EventDescriptorCollection\"/> that represents the filtered events for this component instance.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetEvents\">\n            <summary>\n            Returns the events for this instance of a component.\n            </summary>\n            <returns>\n            An <see cref=\"T:System.ComponentModel.EventDescriptorCollection\"/> that represents the events for this component instance.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetPropertyOwner(System.ComponentModel.PropertyDescriptor)\">\n            <summary>\n            Returns an object that contains the property described by the specified property descriptor.\n            </summary>\n            <param name=\"pd\">A <see cref=\"T:System.ComponentModel.PropertyDescriptor\"/> that represents the property whose owner is to be found.</param>\n            <returns>\n            An <see cref=\"T:System.Object\"/> that represents the owner of the specified property.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JObject.GetMetaObject(System.Linq.Expressions.Expression)\">\n            <summary>\n            Returns the <see cref=\"T:System.Dynamic.DynamicMetaObject\"/> responsible for binding operations performed on this object.\n            </summary>\n            <param name=\"parameter\">The expression tree representation of the runtime value.</param>\n            <returns>\n            The <see cref=\"T:System.Dynamic.DynamicMetaObject\"/> to bind this object.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JsonMergeSettings\">\n            <summary>\n            Specifies the settings used when merging JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JsonMergeSettings.MergeArrayHandling\">\n            <summary>\n            Gets or sets the method used when merging JSON arrays.\n            </summary>\n            <value>The method used when merging JSON arrays.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JsonMergeSettings.MergeNullValueHandling\">\n            <summary>\n            Gets or sets how how null value properties are merged.\n            </summary>\n            <value>How null value properties are merged.</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JProperty\">\n            <summary>\n            Represents a JSON property.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JProperty.ChildrenTokens\">\n            <summary>\n            Gets the container's children tokens.\n            </summary>\n            <value>The container's children tokens.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JProperty.Name\">\n            <summary>\n            Gets the property name.\n            </summary>\n            <value>The property name.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JProperty.Value\">\n            <summary>\n            Gets or sets the property value.\n            </summary>\n            <value>The property value.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JProperty.#ctor(Newtonsoft.Json.Linq.JProperty)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> class from another <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> object to copy from.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JProperty.Type\">\n            <summary>\n            Gets the node type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <value>The type.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JProperty.#ctor(System.String,System.Object[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> class.\n            </summary>\n            <param name=\"name\">The property name.</param>\n            <param name=\"content\">The property content.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JProperty.#ctor(System.String,System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> class.\n            </summary>\n            <param name=\"name\">The property name.</param>\n            <param name=\"content\">The property content.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JProperty.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Writes this token to a <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n            <param name=\"writer\">A <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> into which this method will write.</param>\n            <param name=\"converters\">A collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> which will be used when writing the token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JProperty.Load(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Loads an <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>. \n            </summary>\n            <param name=\"reader\">A <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that will be read for the content of the <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/>.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> that contains the JSON that was read from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JProperty.Load(Newtonsoft.Json.JsonReader,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Loads an <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>. \n            </summary>\n            <param name=\"reader\">A <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that will be read for the content of the <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/>.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/> that contains the JSON that was read from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JPropertyDescriptor\">\n            <summary>\n            Represents a view of a <see cref=\"T:Newtonsoft.Json.Linq.JProperty\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JPropertyDescriptor.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JPropertyDescriptor\"/> class.\n            </summary>\n            <param name=\"name\">The name.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JPropertyDescriptor.CanResetValue(System.Object)\">\n            <summary>\n            When overridden in a derived class, returns whether resetting an object changes its value.\n            </summary>\n            <returns>\n            <c>true</c> if resetting the component changes its value; otherwise, <c>false</c>.\n            </returns>\n            <param name=\"component\">The component to test for reset capability.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JPropertyDescriptor.GetValue(System.Object)\">\n            <summary>\n            When overridden in a derived class, gets the current value of the property on a component.\n            </summary>\n            <returns>\n            The value of a property for a given component.\n            </returns>\n            <param name=\"component\">The component with the property for which to retrieve the value. \n                            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JPropertyDescriptor.ResetValue(System.Object)\">\n            <summary>\n            When overridden in a derived class, resets the value for this property of the component to the default value.\n            </summary>\n            <param name=\"component\">The component with the property value that is to be reset to the default value. \n                            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JPropertyDescriptor.SetValue(System.Object,System.Object)\">\n            <summary>\n            When overridden in a derived class, sets the value of the component to a different value.\n            </summary>\n            <param name=\"component\">The component with the property value that is to be set. \n                            </param><param name=\"value\">The new value. \n                            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JPropertyDescriptor.ShouldSerializeValue(System.Object)\">\n            <summary>\n            When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted.\n            </summary>\n            <returns>\n            <c>true</c> if the property should be persisted; otherwise, <c>false</c>.\n            </returns>\n            <param name=\"component\">The component with the property to be examined for persistence.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JPropertyDescriptor.ComponentType\">\n            <summary>\n            When overridden in a derived class, gets the type of the component this property is bound to.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.Type\"/> that represents the type of component this property is bound to. When the <see cref=\"M:System.ComponentModel.PropertyDescriptor.GetValue(System.Object)\"/> or <see cref=\"M:System.ComponentModel.PropertyDescriptor.SetValue(System.Object,System.Object)\"/> methods are invoked, the object specified might be an instance of this type.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JPropertyDescriptor.IsReadOnly\">\n            <summary>\n            When overridden in a derived class, gets a value indicating whether this property is read-only.\n            </summary>\n            <returns>\n            <c>true</c> if the property is read-only; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JPropertyDescriptor.PropertyType\">\n            <summary>\n            When overridden in a derived class, gets the type of the property.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.Type\"/> that represents the type of the property.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JPropertyDescriptor.NameHashCode\">\n            <summary>\n            Gets the hash code for the name of the member.\n            </summary>\n            <value></value>\n            <returns>\n            The hash code for the name of the member.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JRaw\">\n            <summary>\n            Represents a raw JSON string.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JRaw.#ctor(Newtonsoft.Json.Linq.JRaw)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JRaw\"/> class from another <see cref=\"T:Newtonsoft.Json.Linq.JRaw\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:Newtonsoft.Json.Linq.JRaw\"/> object to copy from.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JRaw.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JRaw\"/> class.\n            </summary>\n            <param name=\"rawJson\">The raw json.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JRaw.Create(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Creates an instance of <see cref=\"T:Newtonsoft.Json.Linq.JRaw\"/> with the content of the reader's current token.\n            </summary>\n            <param name=\"reader\">The reader.</param>\n            <returns>An instance of <see cref=\"T:Newtonsoft.Json.Linq.JRaw\"/> with the content of the reader's current token.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Represents an abstract JSON token.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.EqualityComparer\">\n            <summary>\n            Gets a comparer that can compare two tokens for value equality.\n            </summary>\n            <value>A <see cref=\"T:Newtonsoft.Json.Linq.JTokenEqualityComparer\"/> that can compare two nodes for value equality.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.Parent\">\n            <summary>\n            Gets or sets the parent.\n            </summary>\n            <value>The parent.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.Root\">\n            <summary>\n            Gets the root <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <value>The root <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.Type\">\n            <summary>\n            Gets the node type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <value>The type.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.HasValues\">\n            <summary>\n            Gets a value indicating whether this token has child tokens.\n            </summary>\n            <value>\n            \t<c>true</c> if this token has child values; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.DeepEquals(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Compares the values of two tokens, including the values of all descendant tokens.\n            </summary>\n            <param name=\"t1\">The first <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to compare.</param>\n            <param name=\"t2\">The second <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to compare.</param>\n            <returns><c>true</c> if the tokens are equal; otherwise <c>false</c>.</returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.Next\">\n            <summary>\n            Gets the next sibling token of this node.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the next sibling token.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.Previous\">\n            <summary>\n            Gets the previous sibling token of this node.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the previous sibling token.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.Path\">\n            <summary>\n            Gets the path of the JSON token. \n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.AddAfterSelf(System.Object)\">\n            <summary>\n            Adds the specified content immediately after this token.\n            </summary>\n            <param name=\"content\">A content object that contains simple content or a collection of content objects to be added after this token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.AddBeforeSelf(System.Object)\">\n            <summary>\n            Adds the specified content immediately before this token.\n            </summary>\n            <param name=\"content\">A content object that contains simple content or a collection of content objects to be added before this token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Ancestors\">\n            <summary>\n            Returns a collection of the ancestor tokens of this token.\n            </summary>\n            <returns>A collection of the ancestor tokens of this token.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.AncestorsAndSelf\">\n            <summary>\n            Returns a collection of tokens that contain this token, and the ancestors of this token.\n            </summary>\n            <returns>A collection of tokens that contain this token, and the ancestors of this token.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.AfterSelf\">\n            <summary>\n            Returns a collection of the sibling tokens after this token, in document order.\n            </summary>\n            <returns>A collection of the sibling tokens after this tokens, in document order.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.BeforeSelf\">\n            <summary>\n            Returns a collection of the sibling tokens before this token, in document order.\n            </summary>\n            <returns>A collection of the sibling tokens before this token, in document order.</returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.Item(System.Object)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Value``1(System.Object)\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the specified key converted to the specified type.\n            </summary>\n            <typeparam name=\"T\">The type to convert the token to.</typeparam>\n            <param name=\"key\">The token key.</param>\n            <returns>The converted token value.</returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.First\">\n            <summary>\n            Get the first child token of this token.\n            </summary>\n            <value>A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> containing the first child token of the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JToken.Last\">\n            <summary>\n            Get the last child token of this token.\n            </summary>\n            <value>A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> containing the last child token of the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Children\">\n            <summary>\n            Returns a collection of the child tokens of this token, in document order.\n            </summary>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> containing the child tokens of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>, in document order.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Children``1\">\n            <summary>\n            Returns a collection of the child tokens of this token, in document order, filtered by the specified type.\n            </summary>\n            <typeparam name=\"T\">The type to filter the child tokens on.</typeparam>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JEnumerable`1\"/> containing the child tokens of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>, in document order.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Values``1\">\n            <summary>\n            Returns a collection of the child values of this token, in document order.\n            </summary>\n            <typeparam name=\"T\">The type to convert the values to.</typeparam>\n            <returns>A <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> containing the child values of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>, in document order.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Remove\">\n            <summary>\n            Removes this token from its parent.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Replace(Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Replaces this token with the specified token.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Writes this token to a <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n            <param name=\"writer\">A <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> into which this method will write.</param>\n            <param name=\"converters\">A collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> which will be used when writing the token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.ToString\">\n            <summary>\n            Returns the indented JSON for this token.\n            </summary>\n            <returns>\n            The indented JSON for this token.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.ToString(Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Returns the JSON for this token using the given formatting and converters.\n            </summary>\n            <param name=\"formatting\">Indicates how the output is formatted.</param>\n            <param name=\"converters\">A collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> which will be used when writing the token.</param>\n            <returns>The JSON for this token using the given formatting and converters.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Boolean\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Boolean\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.DateTimeOffset\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.DateTimeOffset\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Boolean}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Int64\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Int64\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.DateTime}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.DateTimeOffset}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Decimal}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Double}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Char}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Int32\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Int32\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Int16\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Int16\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.UInt16\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.UInt16\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Char\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Char\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Byte\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Byte\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.SByte\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.SByte\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Int32}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Int16}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.UInt16}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Byte}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.SByte}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.DateTime\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.DateTime\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Int64}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Single}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Decimal\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Decimal\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.UInt32}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.UInt64}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Nullable`1\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Double\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Double\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Single\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Single\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.String\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.String\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.UInt32\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.UInt32\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.UInt64\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.UInt64\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Byte[]\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Byte\"/>[].\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Guid\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Guid\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Guid}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Guid\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.TimeSpan\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.TimeSpan\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.TimeSpan}\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.TimeSpan\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Uri\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to <see cref=\"T:System.Uri\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Boolean)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Boolean\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.DateTimeOffset)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.DateTimeOffset\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Byte)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Byte\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Byte})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.SByte)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.SByte\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.SByte})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Boolean})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Int64)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.DateTime})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.DateTimeOffset})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Decimal})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Double})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Int16)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Int16\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.UInt16)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.UInt16\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Int32)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Int32\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Int32})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.DateTime)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.DateTime\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Int64})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Single})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Decimal)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Decimal\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Int16})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.UInt16})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.UInt32})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.UInt64})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Double)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Double\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Single)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Single\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.String)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.String\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.UInt32)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.UInt32\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.UInt64)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.UInt64\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Byte[])~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Byte\"/>[] to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Uri)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Uri\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.TimeSpan)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.TimeSpan\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.TimeSpan})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Guid)~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Guid\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Guid})~Newtonsoft.Json.Linq.JToken\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.Nullable`1\"/> to <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"value\">The value to create a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> from.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> initialized with the specified value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.CreateReader\">\n            <summary>\n            Creates an <see cref=\"T:Newtonsoft.Json.JsonReader\"/> for this token.\n            </summary>\n            <returns>An <see cref=\"T:Newtonsoft.Json.JsonReader\"/> that can be used to read this token and its descendants.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.FromObject(System.Object)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> from an object.\n            </summary>\n            <param name=\"o\">The object that will be used to create <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the value of the specified object</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.FromObject(System.Object,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> from an object using the specified <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n            <param name=\"o\">The object that will be used to create <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</param>\n            <param name=\"jsonSerializer\">The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> that will be used when reading the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> with the value of the specified object</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.ToObject``1\">\n            <summary>\n            Creates the specified .NET type from the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <typeparam name=\"T\">The object type that the token will be deserialized to.</typeparam>\n            <returns>The new object created from the JSON value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.ToObject(System.Type)\">\n            <summary>\n            Creates the specified .NET type from the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"objectType\">The object type that the token will be deserialized to.</param>\n            <returns>The new object created from the JSON value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.ToObject``1(Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Creates the specified .NET type from the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> using the specified <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n            <typeparam name=\"T\">The object type that the token will be deserialized to.</typeparam>\n            <param name=\"jsonSerializer\">The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> that will be used when creating the object.</param>\n            <returns>The new object created from the JSON value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.ToObject(System.Type,Newtonsoft.Json.JsonSerializer)\">\n            <summary>\n            Creates the specified .NET type from the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> using the specified <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n            <param name=\"objectType\">The object type that the token will be deserialized to.</param>\n            <param name=\"jsonSerializer\">The <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> that will be used when creating the object.</param>\n            <returns>The new object created from the JSON value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.ReadFrom(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.\n            </summary>\n            <param name=\"reader\">An <see cref=\"T:Newtonsoft.Json.JsonReader\"/> positioned at the token to read into this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</param>\n            <returns>\n            An <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the token and its descendant tokens\n            that were read from the reader. The runtime type of the token is determined\n            by the token type of the first token encountered in the reader.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.ReadFrom(Newtonsoft.Json.JsonReader,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.\n            </summary>\n            <param name=\"reader\">An <see cref=\"T:Newtonsoft.Json.JsonReader\"/> positioned at the token to read into this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>\n            An <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the token and its descendant tokens\n            that were read from the reader. The runtime type of the token is determined\n            by the token type of the first token encountered in the reader.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Parse(System.String)\">\n            <summary>\n            Load a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> from a string that contains JSON.\n            </summary>\n            <param name=\"json\">A <see cref=\"T:System.String\"/> that contains JSON.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> populated from the string that contains JSON.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Parse(System.String,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Load a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> from a string that contains JSON.\n            </summary>\n            <param name=\"json\">A <see cref=\"T:System.String\"/> that contains JSON.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> populated from the string that contains JSON.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Load(Newtonsoft.Json.JsonReader,Newtonsoft.Json.Linq.JsonLoadSettings)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.\n            </summary>\n            <param name=\"reader\">An <see cref=\"T:Newtonsoft.Json.JsonReader\"/> positioned at the token to read into this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</param>\n            <param name=\"settings\">The <see cref=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\"/> used to load the JSON.\n            If this is null, default load settings will be used.</param>\n            <returns>\n            An <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the token and its descendant tokens\n            that were read from the reader. The runtime type of the token is determined\n            by the token type of the first token encountered in the reader.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Load(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> from a <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.\n            </summary>\n            <param name=\"reader\">An <see cref=\"T:Newtonsoft.Json.JsonReader\"/> positioned at the token to read into this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</param>\n            <returns>\n            An <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> that contains the token and its descendant tokens\n            that were read from the reader. The runtime type of the token is determined\n            by the token type of the first token encountered in the reader.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.SelectToken(System.String)\">\n            <summary>\n            Selects a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> using a JPath expression. Selects the token that matches the object path.\n            </summary>\n            <param name=\"path\">\n            A <see cref=\"T:System.String\"/> that contains a JPath expression.\n            </param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>, or null.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.SelectToken(System.String,System.Boolean)\">\n            <summary>\n            Selects a <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> using a JPath expression. Selects the token that matches the object path.\n            </summary>\n            <param name=\"path\">\n            A <see cref=\"T:System.String\"/> that contains a JPath expression.\n            </param>\n            <param name=\"errorWhenNoMatch\">A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.SelectTokens(System.String)\">\n            <summary>\n            Selects a collection of elements using a JPath expression.\n            </summary>\n            <param name=\"path\">\n            A <see cref=\"T:System.String\"/> that contains a JPath expression.\n            </param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> that contains the selected elements.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.SelectTokens(System.String,System.Boolean)\">\n            <summary>\n            Selects a collection of elements using a JPath expression.\n            </summary>\n            <param name=\"path\">\n            A <see cref=\"T:System.String\"/> that contains a JPath expression.\n            </param>\n            <param name=\"errorWhenNoMatch\">A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> that contains the selected elements.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.GetMetaObject(System.Linq.Expressions.Expression)\">\n            <summary>\n            Returns the <see cref=\"T:System.Dynamic.DynamicMetaObject\"/> responsible for binding operations performed on this object.\n            </summary>\n            <param name=\"parameter\">The expression tree representation of the runtime value.</param>\n            <returns>\n            The <see cref=\"T:System.Dynamic.DynamicMetaObject\"/> to bind this object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.System#Dynamic#IDynamicMetaObjectProvider#GetMetaObject(System.Linq.Expressions.Expression)\">\n            <summary>\n            Returns the <see cref=\"T:System.Dynamic.DynamicMetaObject\"/> responsible for binding operations performed on this object.\n            </summary>\n            <param name=\"parameter\">The expression tree representation of the runtime value.</param>\n            <returns>\n            The <see cref=\"T:System.Dynamic.DynamicMetaObject\"/> to bind this object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.DeepClone\">\n            <summary>\n            Creates a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>. All child tokens are recursively cloned.\n            </summary>\n            <returns>A new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.AddAnnotation(System.Object)\">\n            <summary>\n            Adds an object to the annotation list of this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"annotation\">The annotation to add.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Annotation``1\">\n            <summary>\n            Get the first annotation object of the specified type from this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <typeparam name=\"T\">The type of the annotation to retrieve.</typeparam>\n            <returns>The first annotation object that matches the specified type, or <c>null</c> if no annotation is of the specified type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Annotation(System.Type)\">\n            <summary>\n            Gets the first annotation object of the specified type from this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"P:Newtonsoft.Json.Linq.JToken.Type\"/> of the annotation to retrieve.</param>\n            <returns>The first annotation object that matches the specified type, or <c>null</c> if no annotation is of the specified type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Annotations``1\">\n            <summary>\n            Gets a collection of annotations of the specified type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <typeparam name=\"T\">The type of the annotations to retrieve.</typeparam>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/>  that contains the annotations for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.Annotations(System.Type)\">\n            <summary>\n            Gets a collection of annotations of the specified type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"P:Newtonsoft.Json.Linq.JToken.Type\"/> of the annotations to retrieve.</param>\n            <returns>An <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> of <see cref=\"T:System.Object\"/> that contains the annotations that match the specified type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.RemoveAnnotations``1\">\n            <summary>\n            Removes the annotations of the specified type from this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <typeparam name=\"T\">The type of annotations to remove.</typeparam>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JToken.RemoveAnnotations(System.Type)\">\n            <summary>\n            Removes the annotations of the specified type from this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <param name=\"type\">The <see cref=\"P:Newtonsoft.Json.Linq.JToken.Type\"/> of annotations to remove.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JTokenEqualityComparer\">\n            <summary>\n            Compares tokens to determine whether they are equal.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenEqualityComparer.Equals(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Determines whether the specified objects are equal.\n            </summary>\n            <param name=\"x\">The first object of type <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to compare.</param>\n            <param name=\"y\">The second object of type <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to compare.</param>\n            <returns>\n            <c>true</c> if the specified objects are equal; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenEqualityComparer.GetHashCode(Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Returns a hash code for the specified object.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> for which a hash code is to be returned.</param>\n            <returns>A hash code for the specified object.</returns>\n            <exception cref=\"T:System.ArgumentNullException\">The type of <paramref name=\"obj\"/> is a reference type and <paramref name=\"obj\"/> is null.</exception>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JTokenReader\">\n            <summary>\n            Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JTokenReader.CurrentToken\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> at the reader's current position.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenReader.#ctor(Newtonsoft.Json.Linq.JToken)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JTokenReader\"/> class.\n            </summary>\n            <param name=\"token\">The token to read from.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenReader.Read\">\n            <summary>\n            Reads the next JSON token from the stream.\n            </summary>\n            <returns>\n            <c>true</c> if the next token was read successfully; <c>false</c> if there are no more tokens to read.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JTokenReader.Path\">\n            <summary>\n            Gets the path of the current JSON token. \n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JTokenType\">\n            <summary>\n            Specifies the type of token.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.None\">\n            <summary>\n            No token type has been set.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Object\">\n            <summary>\n            A JSON object.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Array\">\n            <summary>\n            A JSON array.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Constructor\">\n            <summary>\n            A JSON constructor.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Property\">\n            <summary>\n            A JSON object property.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Comment\">\n            <summary>\n            A comment.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Integer\">\n            <summary>\n            An integer value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Float\">\n            <summary>\n            A float value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.String\">\n            <summary>\n            A string value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Boolean\">\n            <summary>\n            A boolean value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Null\">\n            <summary>\n            A null value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Undefined\">\n            <summary>\n            An undefined value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Date\">\n            <summary>\n            A date value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Raw\">\n            <summary>\n            A raw JSON value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Bytes\">\n            <summary>\n            A collection of bytes value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Guid\">\n            <summary>\n            A Guid value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.Uri\">\n            <summary>\n            A Uri value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.JTokenType.TimeSpan\">\n            <summary>\n            A TimeSpan value.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JTokenWriter\">\n            <summary>\n            Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JTokenWriter.CurrentToken\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> at the writer's current position.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JTokenWriter.Token\">\n            <summary>\n            Gets the token being writen.\n            </summary>\n            <value>The token being writen.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.#ctor(Newtonsoft.Json.Linq.JContainer)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JTokenWriter\"/> class writing to the given <see cref=\"T:Newtonsoft.Json.Linq.JContainer\"/>.\n            </summary>\n            <param name=\"container\">The container being written to.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JTokenWriter\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.Flush\">\n            <summary>\n            Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.Close\">\n            <summary>\n            Closes this stream and the underlying stream.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteStartObject\">\n            <summary>\n            Writes the beginning of a JSON object.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteStartArray\">\n            <summary>\n            Writes the beginning of a JSON array.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteStartConstructor(System.String)\">\n            <summary>\n            Writes the start of a constructor with the given name.\n            </summary>\n            <param name=\"name\">The name of the constructor.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteEnd(Newtonsoft.Json.JsonToken)\">\n            <summary>\n            Writes the end.\n            </summary>\n            <param name=\"token\">The token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WritePropertyName(System.String)\">\n            <summary>\n            Writes the property name of a name/value pair on a JSON object.\n            </summary>\n            <param name=\"name\">The name of the property.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Object)\">\n            <summary>\n            Writes a <see cref=\"T:System.Object\"/> value.\n            An error will raised if the value cannot be written as a single JSON token.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Object\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteNull\">\n            <summary>\n            Writes a null value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteUndefined\">\n            <summary>\n            Writes an undefined value.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteRaw(System.String)\">\n            <summary>\n            Writes raw JSON.\n            </summary>\n            <param name=\"json\">The raw JSON to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteComment(System.String)\">\n            <summary>\n            Writes out a comment <code>/*...*/</code> containing the specified text.\n            </summary>\n            <param name=\"text\">Text to place inside the comment.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.String)\">\n            <summary>\n            Writes a <see cref=\"T:System.String\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.String\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Int32)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int32\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int32\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.UInt32)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt32\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt32\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Int64)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int64\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int64\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.UInt64)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt64\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt64\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Single)\">\n            <summary>\n            Writes a <see cref=\"T:System.Single\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Single\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Double)\">\n            <summary>\n            Writes a <see cref=\"T:System.Double\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Double\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Boolean)\">\n            <summary>\n            Writes a <see cref=\"T:System.Boolean\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Boolean\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Int16)\">\n            <summary>\n            Writes a <see cref=\"T:System.Int16\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Int16\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.UInt16)\">\n            <summary>\n            Writes a <see cref=\"T:System.UInt16\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.UInt16\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Char)\">\n            <summary>\n            Writes a <see cref=\"T:System.Char\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Char\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Byte)\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Byte\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.SByte)\">\n            <summary>\n            Writes a <see cref=\"T:System.SByte\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.SByte\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Decimal)\">\n            <summary>\n            Writes a <see cref=\"T:System.Decimal\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Decimal\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.DateTime)\">\n            <summary>\n            Writes a <see cref=\"T:System.DateTime\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.DateTime\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.DateTimeOffset)\">\n            <summary>\n            Writes a <see cref=\"T:System.DateTimeOffset\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.DateTimeOffset\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Byte[])\">\n            <summary>\n            Writes a <see cref=\"T:System.Byte\"/>[] value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Byte\"/>[] value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.TimeSpan)\">\n            <summary>\n            Writes a <see cref=\"T:System.TimeSpan\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.TimeSpan\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Guid)\">\n            <summary>\n            Writes a <see cref=\"T:System.Guid\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Guid\"/> value to write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Uri)\">\n            <summary>\n            Writes a <see cref=\"T:System.Uri\"/> value.\n            </summary>\n            <param name=\"value\">The <see cref=\"T:System.Uri\"/> value to write.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JValue\">\n            <summary>\n            Represents a value in JSON (string, integer, date, etc).\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(Newtonsoft.Json.Linq.JValue)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class from another <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> object.\n            </summary>\n            <param name=\"other\">A <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> object to copy from.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Int64)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Decimal)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Char)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.UInt64)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Double)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Single)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.DateTime)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.DateTimeOffset)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Guid)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Uri)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.TimeSpan)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> class with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JValue.HasValues\">\n            <summary>\n            Gets a value indicating whether this token has child tokens.\n            </summary>\n            <value>\n            \t<c>true</c> if this token has child values; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.CreateComment(System.String)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> comment with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> comment with the given value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.CreateString(System.String)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> string with the given value.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> string with the given value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.CreateNull\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> null value.\n            </summary>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> null value.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.CreateUndefined\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> undefined value.\n            </summary>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Linq.JValue\"/> undefined value.</returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JValue.Type\">\n            <summary>\n            Gets the node type for this <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </summary>\n            <value>The type.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JValue.Value\">\n            <summary>\n            Gets or sets the underlying token value.\n            </summary>\n            <value>The underlying token value.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])\">\n            <summary>\n            Writes this token to a <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n            <param name=\"writer\">A <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> into which this method will write.</param>\n            <param name=\"converters\">A collection of <see cref=\"T:Newtonsoft.Json.JsonConverter\"/> which will be used when writing the token.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.Equals(Newtonsoft.Json.Linq.JValue)\">\n            <summary>\n            Indicates whether the current object is equal to another object of the same type.\n            </summary>\n            <returns>\n            <c>true</c> if the current object is equal to the <paramref name=\"other\"/> parameter; otherwise, <c>false</c>.\n            </returns>\n            <param name=\"other\">An object to compare with this object.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <param name=\"obj\">The <see cref=\"T:System.Object\"/> to compare with the current <see cref=\"T:System.Object\"/>.</param>\n            <returns>\n            <c>true</c> if the specified <see cref=\"T:System.Object\"/> is equal to the current <see cref=\"T:System.Object\"/>; otherwise, <c>false</c>.\n            </returns>\n            <exception cref=\"T:System.NullReferenceException\">\n            The <paramref name=\"obj\"/> parameter is null.\n            </exception>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.ToString(System.String)\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <param name=\"format\">The format.</param>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.ToString(System.IFormatProvider)\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <param name=\"formatProvider\">The format provider.</param>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.ToString(System.String,System.IFormatProvider)\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <param name=\"format\">The format.</param>\n            <param name=\"formatProvider\">The format provider.</param>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.GetMetaObject(System.Linq.Expressions.Expression)\">\n            <summary>\n            Returns the <see cref=\"T:System.Dynamic.DynamicMetaObject\"/> responsible for binding operations performed on this object.\n            </summary>\n            <param name=\"parameter\">The expression tree representation of the runtime value.</param>\n            <returns>\n            The <see cref=\"T:System.Dynamic.DynamicMetaObject\"/> to bind this object.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Linq.JValue.CompareTo(Newtonsoft.Json.Linq.JValue)\">\n            <summary>\n            Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.\n            </summary>\n            <param name=\"obj\">An object to compare with this instance.</param>\n            <returns>\n            A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings:\n            Value\n            Meaning\n            Less than zero\n            This instance is less than <paramref name=\"obj\"/>.\n            Zero\n            This instance is equal to <paramref name=\"obj\"/>.\n            Greater than zero\n            This instance is greater than <paramref name=\"obj\"/>.\n            </returns>\n            <exception cref=\"T:System.ArgumentException\">\n            \t<paramref name=\"obj\"/> is not the same type as this instance.\n            </exception>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.JsonLoadSettings\">\n            <summary>\n            Specifies the settings used when loading JSON.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JsonLoadSettings.CommentHandling\">\n            <summary>\n            Gets or sets how JSON comments are handled when loading JSON.\n            </summary>\n            <value>The JSON comment handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Linq.JsonLoadSettings.LineInfoHandling\">\n            <summary>\n            Gets or sets how JSON line info is handled when loading JSON.\n            </summary>\n            <value>The JSON line info handling.</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.MergeArrayHandling\">\n            <summary>\n            Specifies how JSON arrays are merged together.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.MergeArrayHandling.Concat\">\n            <summary>Concatenate arrays.</summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.MergeArrayHandling.Union\">\n            <summary>Union arrays, skipping items that already exist.</summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.MergeArrayHandling.Replace\">\n            <summary>Replace all array items.</summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.MergeArrayHandling.Merge\">\n            <summary>Merge array items together, matched by index.</summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Linq.MergeNullValueHandling\">\n            <summary>\n            Specifies how null value properties are merged.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.MergeNullValueHandling.Ignore\">\n            <summary>\n            The content's null value properties will be ignored during merging.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Linq.MergeNullValueHandling.Merge\">\n            <summary>\n            The content's null value properties will be merged.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.MemberSerialization\">\n            <summary>\n            Specifies the member serialization options for the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.MemberSerialization.OptOut\">\n            <summary>\n            All public members are serialized by default. Members can be excluded using <see cref=\"T:Newtonsoft.Json.JsonIgnoreAttribute\"/> or <see cref=\"T:System.NonSerializedAttribute\"/>.\n            This is the default member serialization mode.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.MemberSerialization.OptIn\">\n            <summary>\n            Only members marked with <see cref=\"T:Newtonsoft.Json.JsonPropertyAttribute\"/> or <see cref=\"T:System.Runtime.Serialization.DataMemberAttribute\"/> are serialized.\n            This member serialization mode can also be set by marking the class with <see cref=\"T:System.Runtime.Serialization.DataContractAttribute\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.MemberSerialization.Fields\">\n            <summary>\n            All public and private fields are serialized. Members can be excluded using <see cref=\"T:Newtonsoft.Json.JsonIgnoreAttribute\"/> or <see cref=\"T:System.NonSerializedAttribute\"/>.\n            This member serialization mode can also be set by marking the class with <see cref=\"T:System.SerializableAttribute\"/>\n            and setting IgnoreSerializableAttribute on <see cref=\"T:Newtonsoft.Json.Serialization.DefaultContractResolver\"/> to false.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.MetadataPropertyHandling\">\n            <summary>\n            Specifies metadata property handling options for the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.MetadataPropertyHandling.Default\">\n            <summary>\n            Read metadata properties located at the start of a JSON object.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.MetadataPropertyHandling.ReadAhead\">\n            <summary>\n            Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.MetadataPropertyHandling.Ignore\">\n            <summary>\n            Do not try to read metadata properties.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.MissingMemberHandling\">\n            <summary>\n            Specifies missing member handling options for the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.MissingMemberHandling.Ignore\">\n            <summary>\n            Ignore a missing member and do not attempt to deserialize it.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.MissingMemberHandling.Error\">\n            <summary>\n            Throw a <see cref=\"T:Newtonsoft.Json.JsonSerializationException\"/> when a missing member is encountered during deserialization.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.NullValueHandling\">\n            <summary>\n            Specifies null value handling options for the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\SerializationTests.cs\" region=\"ReducingSerializedJsonSizeNullValueHandlingObject\" title=\"NullValueHandling Class\" />\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\SerializationTests.cs\" region=\"ReducingSerializedJsonSizeNullValueHandlingExample\" title=\"NullValueHandling Ignore Example\" />\n            </example>\n        </member>\n        <member name=\"F:Newtonsoft.Json.NullValueHandling.Include\">\n            <summary>\n            Include null values when serializing and deserializing objects.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.NullValueHandling.Ignore\">\n            <summary>\n            Ignore null values when serializing and deserializing objects.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.ObjectCreationHandling\">\n            <summary>\n            Specifies how object creation is handled by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.ObjectCreationHandling.Auto\">\n            <summary>\n            Reuse existing objects, create new objects when needed.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.ObjectCreationHandling.Reuse\">\n            <summary>\n            Only reuse existing objects.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.ObjectCreationHandling.Replace\">\n            <summary>\n            Always create new objects.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.PreserveReferencesHandling\">\n            <summary>\n            Specifies reference handling options for the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement ISerializable.\n            </summary>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\SerializationTests.cs\" region=\"PreservingObjectReferencesOn\" title=\"Preserve Object References\" />       \n            </example>\n        </member>\n        <member name=\"F:Newtonsoft.Json.PreserveReferencesHandling.None\">\n            <summary>\n            Do not preserve references when serializing types.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.PreserveReferencesHandling.Objects\">\n            <summary>\n            Preserve references when serializing into a JSON object structure.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.PreserveReferencesHandling.Arrays\">\n            <summary>\n            Preserve references when serializing into a JSON array structure.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.PreserveReferencesHandling.All\">\n            <summary>\n            Preserve references when serializing.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.ReferenceLoopHandling\">\n            <summary>\n            Specifies reference loop handling options for the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.ReferenceLoopHandling.Error\">\n            <summary>\n            Throw a <see cref=\"T:Newtonsoft.Json.JsonSerializationException\"/> when a loop is encountered.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.ReferenceLoopHandling.Ignore\">\n            <summary>\n            Ignore loop references and do not serialize.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.ReferenceLoopHandling.Serialize\">\n            <summary>\n            Serialize loop references.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Required\">\n            <summary>\n            Indicating whether a property is required.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Required.Default\">\n            <summary>\n            The property is not required. The default state.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Required.AllowNull\">\n            <summary>\n            The property must be defined in JSON but can be a null value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Required.Always\">\n            <summary>\n            The property must be defined in JSON and cannot be a null value.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Required.DisallowNull\">\n            <summary>\n            The property is not required but it cannot be a null value.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.Extensions\">\n            <summary>\n            <para>\n            Contains the JSON schema extension methods.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.Extensions.IsValid(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Schema.JsonSchema)\">\n            <summary>\n            <para>\n            Determines whether the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> is valid.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n            <param name=\"source\">The source <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to test.</param>\n            <param name=\"schema\">The schema to test with.</param>\n            <returns>\n            \t<c>true</c> if the specified <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> is valid; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.Extensions.IsValid(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Schema.JsonSchema,System.Collections.Generic.IList{System.String}@)\">\n            <summary>\n            <para>\n            Determines whether the <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> is valid.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n            <param name=\"source\">The source <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to test.</param>\n            <param name=\"schema\">The schema to test with.</param>\n            <param name=\"errorMessages\">When this method returns, contains any error messages generated while validating. </param>\n            <returns>\n            \t<c>true</c> if the specified <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> is valid; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.Extensions.Validate(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Schema.JsonSchema)\">\n            <summary>\n            <para>\n            Validates the specified <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n            <param name=\"source\">The source <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to test.</param>\n            <param name=\"schema\">The schema to test with.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.Extensions.Validate(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Schema.JsonSchema,Newtonsoft.Json.Schema.ValidationEventHandler)\">\n            <summary>\n            <para>\n            Validates the specified <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/>.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n            <param name=\"source\">The source <see cref=\"T:Newtonsoft.Json.Linq.JToken\"/> to test.</param>\n            <param name=\"schema\">The schema to test with.</param>\n            <param name=\"validationEventHandler\">The validation event handler.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.JsonSchema\">\n            <summary>\n            <para>\n            An in-memory representation of a JSON Schema.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Id\">\n            <summary>\n            Gets or sets the id.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Title\">\n            <summary>\n            Gets or sets the title.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Required\">\n            <summary>\n            Gets or sets whether the object is required.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.ReadOnly\">\n            <summary>\n            Gets or sets whether the object is read only.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Hidden\">\n            <summary>\n            Gets or sets whether the object is visible to users.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Transient\">\n            <summary>\n            Gets or sets whether the object is transient.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Description\">\n            <summary>\n            Gets or sets the description of the object.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Type\">\n            <summary>\n            Gets or sets the types of values allowed by the object.\n            </summary>\n            <value>The type.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Pattern\">\n            <summary>\n            Gets or sets the pattern.\n            </summary>\n            <value>The pattern.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.MinimumLength\">\n            <summary>\n            Gets or sets the minimum length.\n            </summary>\n            <value>The minimum length.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.MaximumLength\">\n            <summary>\n            Gets or sets the maximum length.\n            </summary>\n            <value>The maximum length.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.DivisibleBy\">\n            <summary>\n            Gets or sets a number that the value should be divisble by.\n            </summary>\n            <value>A number that the value should be divisble by.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Minimum\">\n            <summary>\n            Gets or sets the minimum.\n            </summary>\n            <value>The minimum.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Maximum\">\n            <summary>\n            Gets or sets the maximum.\n            </summary>\n            <value>The maximum.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.ExclusiveMinimum\">\n            <summary>\n            Gets or sets a flag indicating whether the value can not equal the number defined by the \"minimum\" attribute.\n            </summary>\n            <value>A flag indicating whether the value can not equal the number defined by the \"minimum\" attribute.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.ExclusiveMaximum\">\n            <summary>\n            Gets or sets a flag indicating whether the value can not equal the number defined by the \"maximum\" attribute.\n            </summary>\n            <value>A flag indicating whether the value can not equal the number defined by the \"maximum\" attribute.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.MinimumItems\">\n            <summary>\n            Gets or sets the minimum number of items.\n            </summary>\n            <value>The minimum number of items.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.MaximumItems\">\n            <summary>\n            Gets or sets the maximum number of items.\n            </summary>\n            <value>The maximum number of items.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Items\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of items.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of items.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.PositionalItemsValidation\">\n            <summary>\n            Gets or sets a value indicating whether items in an array are validated using the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> instance at their array position from <see cref=\"P:Newtonsoft.Json.Schema.JsonSchema.Items\"/>.\n            </summary>\n            <value>\n            \t<c>true</c> if items are validated using their array position; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.AdditionalItems\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of additional items.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of additional items.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.AllowAdditionalItems\">\n            <summary>\n            Gets or sets a value indicating whether additional items are allowed.\n            </summary>\n            <value>\n            \t<c>true</c> if additional items are allowed; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.UniqueItems\">\n            <summary>\n            Gets or sets whether the array items must be unique.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Properties\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of properties.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of properties.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.AdditionalProperties\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of additional properties.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> of additional properties.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.PatternProperties\">\n            <summary>\n            Gets or sets the pattern properties.\n            </summary>\n            <value>The pattern properties.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.AllowAdditionalProperties\">\n            <summary>\n            Gets or sets a value indicating whether additional properties are allowed.\n            </summary>\n            <value>\n            \t<c>true</c> if additional properties are allowed; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Requires\">\n            <summary>\n            Gets or sets the required property if this property is present.\n            </summary>\n            <value>The required property if this property is present.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Enum\">\n            <summary>\n            Gets or sets the a collection of valid enum values allowed.\n            </summary>\n            <value>A collection of valid enum values allowed.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Disallow\">\n            <summary>\n            Gets or sets disallowed types.\n            </summary>\n            <value>The disallow types.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Default\">\n            <summary>\n            Gets or sets the default value.\n            </summary>\n            <value>The default value.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Extends\">\n            <summary>\n            Gets or sets the collection of <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> that this schema extends.\n            </summary>\n            <value>The collection of <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> that this schema extends.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchema.Format\">\n            <summary>\n            Gets or sets the format.\n            </summary>\n            <value>The format.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchema.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchema.Read(Newtonsoft.Json.JsonReader)\">\n            <summary>\n            Reads a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> containing the JSON Schema to read.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> object representing the JSON Schema.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchema.Read(Newtonsoft.Json.JsonReader,Newtonsoft.Json.Schema.JsonSchemaResolver)\">\n            <summary>\n            Reads a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from the specified <see cref=\"T:Newtonsoft.Json.JsonReader\"/>.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:Newtonsoft.Json.JsonReader\"/> containing the JSON Schema to read.</param>\n            <param name=\"resolver\">The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaResolver\"/> to use when resolving schema references.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> object representing the JSON Schema.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchema.Parse(System.String)\">\n            <summary>\n            Load a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from a string that contains schema JSON.\n            </summary>\n            <param name=\"json\">A <see cref=\"T:System.String\"/> that contains JSON.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> populated from the string that contains JSON.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchema.Parse(System.String,Newtonsoft.Json.Schema.JsonSchemaResolver)\">\n            <summary>\n            Parses the specified json.\n            </summary>\n            <param name=\"json\">The json.</param>\n            <param name=\"resolver\">The resolver.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> populated from the string that contains JSON.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchema.WriteTo(Newtonsoft.Json.JsonWriter)\">\n            <summary>\n            Writes this schema to a <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n            <param name=\"writer\">A <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> into which this method will write.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchema.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.Schema.JsonSchemaResolver)\">\n            <summary>\n            Writes this schema to a <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> using the specified <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaResolver\"/>.\n            </summary>\n            <param name=\"writer\">A <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> into which this method will write.</param>\n            <param name=\"resolver\">The resolver used.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchema.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.JsonSchemaException\">\n            <summary>\n            <para>\n            Returns detailed information about the schema exception.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchemaException.LineNumber\">\n            <summary>\n            Gets the line number indicating where the error occurred.\n            </summary>\n            <value>The line number indicating where the error occurred.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchemaException.LinePosition\">\n            <summary>\n            Gets the line position indicating where the error occurred.\n            </summary>\n            <value>The line position indicating where the error occurred.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchemaException.Path\">\n            <summary>\n            Gets the path to the JSON where the error occurred.\n            </summary>\n            <value>The path to the JSON where the error occurred.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaException\"/> class\n            with a specified error message.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaException\"/> class\n            with a specified error message and a reference to the inner exception that is the cause of this exception.\n            </summary>\n            <param name=\"message\">The error message that explains the reason for the exception.</param>\n            <param name=\"innerException\">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaException\"/> class.\n            </summary>\n            <param name=\"info\">The <see cref=\"T:System.Runtime.Serialization.SerializationInfo\"/> that holds the serialized object data about the exception being thrown.</param>\n            <param name=\"context\">The <see cref=\"T:System.Runtime.Serialization.StreamingContext\"/> that contains contextual information about the source or destination.</param>\n            <exception cref=\"T:System.ArgumentNullException\">The <paramref name=\"info\"/> parameter is null. </exception>\n            <exception cref=\"T:System.Runtime.Serialization.SerializationException\">The class name is null or <see cref=\"P:System.Exception.HResult\"/> is zero (0). </exception>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.JsonSchemaGenerator\">\n            <summary>\n            <para>\n            Generates a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from a specified <see cref=\"T:System.Type\"/>.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchemaGenerator.UndefinedSchemaIdHandling\">\n            <summary>\n            Gets or sets how undefined schemas are handled by the serializer.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchemaGenerator.ContractResolver\">\n            <summary>\n            Gets or sets the contract resolver.\n            </summary>\n            <value>The contract resolver.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaGenerator.Generate(System.Type)\">\n            <summary>\n            Generate a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from the specified type.\n            </summary>\n            <param name=\"type\">The type to generate a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> generated from the specified type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaGenerator.Generate(System.Type,Newtonsoft.Json.Schema.JsonSchemaResolver)\">\n            <summary>\n            Generate a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from the specified type.\n            </summary>\n            <param name=\"type\">The type to generate a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from.</param>\n            <param name=\"resolver\">The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaResolver\"/> used to resolve schema references.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> generated from the specified type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaGenerator.Generate(System.Type,System.Boolean)\">\n            <summary>\n            Generate a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from the specified type.\n            </summary>\n            <param name=\"type\">The type to generate a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from.</param>\n            <param name=\"rootSchemaNullable\">Specify whether the generated root <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> will be nullable.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> generated from the specified type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaGenerator.Generate(System.Type,Newtonsoft.Json.Schema.JsonSchemaResolver,System.Boolean)\">\n            <summary>\n            Generate a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from the specified type.\n            </summary>\n            <param name=\"type\">The type to generate a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from.</param>\n            <param name=\"resolver\">The <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaResolver\"/> used to resolve schema references.</param>\n            <param name=\"rootSchemaNullable\">Specify whether the generated root <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> will be nullable.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> generated from the specified type.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.JsonSchemaResolver\">\n            <summary>\n            <para>\n            Resolves <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> from an id.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.JsonSchemaResolver.LoadedSchemas\">\n            <summary>\n            Gets or sets the loaded schemas.\n            </summary>\n            <value>The loaded schemas.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaResolver.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaResolver\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Schema.JsonSchemaResolver.GetSchema(System.String)\">\n            <summary>\n            Gets a <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> for the specified reference.\n            </summary>\n            <param name=\"reference\">The id.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/> for the specified reference.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.JsonSchemaType\">\n            <summary>\n            <para>\n            The value types allowed by the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchema\"/>.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.None\">\n            <summary>\n            No type specified.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.String\">\n            <summary>\n            String type.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.Float\">\n            <summary>\n            Float type.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.Integer\">\n            <summary>\n            Integer type.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.Boolean\">\n            <summary>\n            Boolean type.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.Object\">\n            <summary>\n            Object type.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.Array\">\n            <summary>\n            Array type.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.Null\">\n            <summary>\n            Null type.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.JsonSchemaType.Any\">\n            <summary>\n            Any type.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.UndefinedSchemaIdHandling\">\n            <summary>\n            <para>\n            Specifies undefined schema Id handling options for the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaGenerator\"/>.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.UndefinedSchemaIdHandling.None\">\n            <summary>\n            Do not infer a schema Id.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.UndefinedSchemaIdHandling.UseTypeName\">\n            <summary>\n            Use the .NET type name as the schema Id.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.Schema.UndefinedSchemaIdHandling.UseAssemblyQualifiedName\">\n            <summary>\n            Use the assembly qualified .NET type name as the schema Id.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.ValidationEventArgs\">\n            <summary>\n            <para>\n            Returns detailed information related to the <see cref=\"T:Newtonsoft.Json.Schema.ValidationEventHandler\"/>.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.ValidationEventArgs.Exception\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Schema.JsonSchemaException\"/> associated with the validation error.\n            </summary>\n            <value>The JsonSchemaException associated with the validation error.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.ValidationEventArgs.Path\">\n            <summary>\n            Gets the path of the JSON location where the validation error occurred.\n            </summary>\n            <value>The path of the JSON location where the validation error occurred.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Schema.ValidationEventArgs.Message\">\n            <summary>\n            Gets the text description corresponding to the validation error.\n            </summary>\n            <value>The text description.</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Schema.ValidationEventHandler\">\n            <summary>\n            <para>\n            Represents the callback method that will handle JSON schema validation events and the <see cref=\"T:Newtonsoft.Json.Schema.ValidationEventArgs\"/>.\n            </para>\n            <note type=\"caution\">\n            JSON Schema validation has been moved to its own package. See <see href=\"http://www.newtonsoft.com/jsonschema\">http://www.newtonsoft.com/jsonschema</see> for more details.\n            </note>\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy\">\n            <summary>\n            A snake case naming strategy.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy.#ctor(System.Boolean,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy\"/> class.\n            </summary>\n            <param name=\"processDictionaryKeys\">\n            A flag indicating whether dictionary keys should be processed.\n            </param>\n            <param name=\"overrideSpecifiedNames\">\n            A flag indicating whether explicitly specified property names should be processed,\n            e.g. a property name customized with a <see cref=\"T:Newtonsoft.Json.JsonPropertyAttribute\"/>.\n            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy.ResolvePropertyName(System.String)\">\n            <summary>\n            Resolves the specified property name.\n            </summary>\n            <param name=\"name\">The property name to resolve.</param>\n            <returns>The resolved property name.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy\">\n            <summary>\n            A camel case naming strategy.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy.#ctor(System.Boolean,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy\"/> class.\n            </summary>\n            <param name=\"processDictionaryKeys\">\n            A flag indicating whether dictionary keys should be processed.\n            </param>\n            <param name=\"overrideSpecifiedNames\">\n            A flag indicating whether explicitly specified property names should be processed,\n            e.g. a property name customized with a <see cref=\"T:Newtonsoft.Json.JsonPropertyAttribute\"/>.\n            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.CamelCaseNamingStrategy.ResolvePropertyName(System.String)\">\n            <summary>\n            Resolves the specified property name.\n            </summary>\n            <param name=\"name\">The property name to resolve.</param>\n            <returns>The resolved property name.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver\">\n            <summary>\n            Resolves member mappings for a type, camel casing property names.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver\"/> class.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.DefaultContractResolver\">\n            <summary>\n            Used by <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> to resolves a <see cref=\"T:Newtonsoft.Json.Serialization.JsonContract\"/> for a given <see cref=\"T:System.Type\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.DefaultContractResolver.DynamicCodeGeneration\">\n            <summary>\n            Gets a value indicating whether members are being get and set using dynamic code generation.\n            This value is determined by the runtime permissions available.\n            </summary>\n            <value>\n            \t<c>true</c> if using dynamic code generation; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.DefaultContractResolver.DefaultMembersSearchFlags\">\n            <summary>\n            Gets or sets the default members search flags.\n            </summary>\n            <value>The default members search flags.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.DefaultContractResolver.SerializeCompilerGeneratedMembers\">\n            <summary>\n            Gets or sets a value indicating whether compiler generated members should be serialized.\n            </summary>\n            <value>\n            \t<c>true</c> if serialized compiler generated members; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.DefaultContractResolver.IgnoreSerializableInterface\">\n            <summary>\n            Gets or sets a value indicating whether to ignore the <see cref=\"T:System.Runtime.Serialization.ISerializable\"/> interface when serializing and deserializing types.\n            </summary>\n            <value>\n            \t<c>true</c> if the <see cref=\"T:System.Runtime.Serialization.ISerializable\"/> interface will be ignored when serializing and deserializing types; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.DefaultContractResolver.IgnoreSerializableAttribute\">\n            <summary>\n            Gets or sets a value indicating whether to ignore the <see cref=\"T:System.SerializableAttribute\"/> attribute when serializing and deserializing types.\n            </summary>\n            <value>\n            \t<c>true</c> if the <see cref=\"T:System.SerializableAttribute\"/> attribute will be ignored when serializing and deserializing types; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.DefaultContractResolver.NamingStrategy\">\n            <summary>\n            Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized.\n            </summary>\n            <value>The naming strategy used to resolve how property names and dictionary keys are serialized.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.DefaultContractResolver\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.#ctor(System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.DefaultContractResolver\"/> class.\n            </summary>\n            <param name=\"shareCache\">\n            If set to <c>true</c> the <see cref=\"T:Newtonsoft.Json.Serialization.DefaultContractResolver\"/> will use a cached shared with other resolvers of the same type.\n            Sharing the cache will significantly improve performance with multiple resolver instances because expensive reflection will only\n            happen once. This setting can cause unexpected behavior if different instances of the resolver are suppose to produce different\n            results. When set to false it is highly recommended to reuse <see cref=\"T:Newtonsoft.Json.Serialization.DefaultContractResolver\"/> instances with the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(System.Type)\">\n            <summary>\n            Resolves the contract for a given type.\n            </summary>\n            <param name=\"type\">The type to resolve a contract for.</param>\n            <returns>The contract for a given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.GetSerializableMembers(System.Type)\">\n            <summary>\n            Gets the serializable members for the type.\n            </summary>\n            <param name=\"objectType\">The type to get serializable members for.</param>\n            <returns>The serializable members for the type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(System.Type)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonObjectContract\"/> for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonObjectContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateConstructorParameters(System.Reflection.ConstructorInfo,Newtonsoft.Json.Serialization.JsonPropertyCollection)\">\n            <summary>\n            Creates the constructor parameters.\n            </summary>\n            <param name=\"constructor\">The constructor to create properties for.</param>\n            <param name=\"memberProperties\">The type's member properties.</param>\n            <returns>Properties for the given <see cref=\"T:System.Reflection.ConstructorInfo\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreatePropertyFromConstructorParameter(Newtonsoft.Json.Serialization.JsonProperty,System.Reflection.ParameterInfo)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> for the given <see cref=\"T:System.Reflection.ParameterInfo\"/>.\n            </summary>\n            <param name=\"matchingMemberProperty\">The matching member property.</param>\n            <param name=\"parameterInfo\">The constructor parameter.</param>\n            <returns>A created <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> for the given <see cref=\"T:System.Reflection.ParameterInfo\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContractConverter(System.Type)\">\n            <summary>\n            Resolves the default <see cref=\"T:Newtonsoft.Json.JsonConverter\" /> for the contract.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>The contract's default <see cref=\"T:Newtonsoft.Json.JsonConverter\" />.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateDictionaryContract(System.Type)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonDictionaryContract\"/> for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonDictionaryContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateArrayContract(System.Type)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonArrayContract\"/> for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonArrayContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreatePrimitiveContract(System.Type)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonPrimitiveContract\"/> for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonPrimitiveContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateLinqContract(System.Type)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonLinqContract\"/> for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonLinqContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateISerializableContract(System.Type)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonISerializableContract\"/> for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonISerializableContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateDynamicContract(System.Type)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonDynamicContract\"/> for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonDynamicContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateStringContract(System.Type)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonStringContract\"/> for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonStringContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(System.Type)\">\n            <summary>\n            Determines which contract type is created for the given type.\n            </summary>\n            <param name=\"objectType\">Type of the object.</param>\n            <returns>A <see cref=\"T:Newtonsoft.Json.Serialization.JsonContract\"/> for the given type.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateProperties(System.Type,Newtonsoft.Json.MemberSerialization)\">\n            <summary>\n            Creates properties for the given <see cref=\"T:Newtonsoft.Json.Serialization.JsonContract\"/>.\n            </summary>\n            <param name=\"type\">The type to create properties for.</param>\n            /// <param name=\"memberSerialization\">The member serialization mode for the type.</param>\n            <returns>Properties for the given <see cref=\"T:Newtonsoft.Json.Serialization.JsonContract\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateMemberValueProvider(System.Reflection.MemberInfo)\">\n            <summary>\n            Creates the <see cref=\"T:Newtonsoft.Json.Serialization.IValueProvider\"/> used by the serializer to get and set values from a member.\n            </summary>\n            <param name=\"member\">The member.</param>\n            <returns>The <see cref=\"T:Newtonsoft.Json.Serialization.IValueProvider\"/> used by the serializer to get and set values from a member.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateProperty(System.Reflection.MemberInfo,Newtonsoft.Json.MemberSerialization)\">\n            <summary>\n            Creates a <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> for the given <see cref=\"T:System.Reflection.MemberInfo\"/>.\n            </summary>\n            <param name=\"memberSerialization\">The member's parent <see cref=\"T:Newtonsoft.Json.MemberSerialization\"/>.</param>\n            <param name=\"member\">The member to create a <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> for.</param>\n            <returns>A created <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> for the given <see cref=\"T:System.Reflection.MemberInfo\"/>.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.ResolvePropertyName(System.String)\">\n            <summary>\n            Resolves the name of the property.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <returns>Resolved name of the property.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveDictionaryKey(System.String)\">\n            <summary>\n            Resolves the key of the dictionary. By default <see cref=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.ResolvePropertyName(System.String)\"/> is used to resolve dictionary keys.\n            </summary>\n            <param name=\"dictionaryKey\">Key of the dictionary.</param>\n            <returns>Resolved key of the dictionary.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultContractResolver.GetResolvedPropertyName(System.String)\">\n            <summary>\n            Gets the resolved name of the property.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <returns>Name of the property.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.DefaultNamingStrategy\">\n            <summary>\n            The default naming strategy. Property names and dictionary keys are unchanged.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultNamingStrategy.ResolvePropertyName(System.String)\">\n            <summary>\n            Resolves the specified property name.\n            </summary>\n            <param name=\"name\">The property name to resolve.</param>\n            <returns>The resolved property name.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.DefaultSerializationBinder\">\n            <summary>\n            The default serialization binder used when resolving and loading classes from type names.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultSerializationBinder.BindToType(System.String,System.String)\">\n            <summary>\n            When overridden in a derived class, controls the binding of a serialized object to a type.\n            </summary>\n            <param name=\"assemblyName\">Specifies the <see cref=\"T:System.Reflection.Assembly\"/> name of the serialized object.</param>\n            <param name=\"typeName\">Specifies the <see cref=\"T:System.Type\"/> name of the serialized object.</param>\n            <returns>\n            The type of the object the formatter creates a new instance of.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DefaultSerializationBinder.BindToName(System.Type,System.String@,System.String@)\">\n            <summary>\n            When overridden in a derived class, controls the binding of a serialized object to a type.\n            </summary>\n            <param name=\"serializedType\">The type of the object the formatter creates a new instance of.</param>\n            <param name=\"assemblyName\">Specifies the <see cref=\"T:System.Reflection.Assembly\"/> name of the serialized object. </param>\n            <param name=\"typeName\">Specifies the <see cref=\"T:System.Type\"/> name of the serialized object. </param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.DiagnosticsTraceWriter\">\n            <summary>\n            Represents a trace writer that writes to the application's <see cref=\"T:System.Diagnostics.TraceListener\"/> instances.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.DiagnosticsTraceWriter.LevelFilter\">\n            <summary>\n            Gets the <see cref=\"T:System.Diagnostics.TraceLevel\"/> that will be used to filter the trace messages passed to the writer.\n            For example a filter level of <code>Info</code> will exclude <code>Verbose</code> messages and include <code>Info</code>,\n            <code>Warning</code> and <code>Error</code> messages.\n            </summary>\n            <value>\n            The <see cref=\"T:System.Diagnostics.TraceLevel\"/> that will be used to filter the trace messages passed to the writer.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DiagnosticsTraceWriter.Trace(System.Diagnostics.TraceLevel,System.String,System.Exception)\">\n            <summary>\n            Writes the specified trace level, message and optional exception.\n            </summary>\n            <param name=\"level\">The <see cref=\"T:System.Diagnostics.TraceLevel\"/> at which to write this trace.</param>\n            <param name=\"message\">The trace message.</param>\n            <param name=\"ex\">The trace exception. This parameter is optional.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.DynamicValueProvider\">\n            <summary>\n            Get and set values for a <see cref=\"T:System.Reflection.MemberInfo\"/> using dynamic methods.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DynamicValueProvider.#ctor(System.Reflection.MemberInfo)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.DynamicValueProvider\"/> class.\n            </summary>\n            <param name=\"memberInfo\">The member info.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DynamicValueProvider.SetValue(System.Object,System.Object)\">\n            <summary>\n            Sets the value.\n            </summary>\n            <param name=\"target\">The target to set the value on.</param>\n            <param name=\"value\">The value to set on the target.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(System.Object)\">\n            <summary>\n            Gets the value.\n            </summary>\n            <param name=\"target\">The target to get the value from.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ErrorContext\">\n            <summary>\n            Provides information surrounding an error.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.ErrorContext.Error\">\n            <summary>\n            Gets the error.\n            </summary>\n            <value>The error.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.ErrorContext.OriginalObject\">\n            <summary>\n            Gets the original object that caused the error.\n            </summary>\n            <value>The original object that caused the error.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.ErrorContext.Member\">\n            <summary>\n            Gets the member that caused the error.\n            </summary>\n            <value>The member that caused the error.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.ErrorContext.Path\">\n            <summary>\n            Gets the path of the JSON location where the error occurred.\n            </summary>\n            <value>The path of the JSON location where the error occurred.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.ErrorContext.Handled\">\n            <summary>\n            Gets or sets a value indicating whether this <see cref=\"T:Newtonsoft.Json.Serialization.ErrorContext\"/> is handled.\n            </summary>\n            <value><c>true</c> if handled; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ErrorEventArgs\">\n            <summary>\n            Provides data for the Error event.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.ErrorEventArgs.CurrentObject\">\n            <summary>\n            Gets the current object the error event is being raised against.\n            </summary>\n            <value>The current object the error event is being raised against.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.ErrorEventArgs.ErrorContext\">\n            <summary>\n            Gets the error context.\n            </summary>\n            <value>The error context.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ErrorEventArgs.#ctor(System.Object,Newtonsoft.Json.Serialization.ErrorContext)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.ErrorEventArgs\"/> class.\n            </summary>\n            <param name=\"currentObject\">The current object.</param>\n            <param name=\"errorContext\">The error context.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ExpressionValueProvider\">\n            <summary>\n            Get and set values for a <see cref=\"T:System.Reflection.MemberInfo\"/> using dynamic methods.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ExpressionValueProvider.#ctor(System.Reflection.MemberInfo)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.ExpressionValueProvider\"/> class.\n            </summary>\n            <param name=\"memberInfo\">The member info.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ExpressionValueProvider.SetValue(System.Object,System.Object)\">\n            <summary>\n            Sets the value.\n            </summary>\n            <param name=\"target\">The target to set the value on.</param>\n            <param name=\"value\">The value to set on the target.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(System.Object)\">\n            <summary>\n            Gets the value.\n            </summary>\n            <param name=\"target\">The target to get the value from.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.IAttributeProvider\">\n            <summary>\n            Provides methods to get attributes.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IAttributeProvider.GetAttributes(System.Boolean)\">\n            <summary>\n            Returns a collection of all of the attributes, or an empty collection if there are no attributes.\n            </summary>\n            <param name=\"inherit\">When true, look up the hierarchy chain for the inherited custom attribute.</param>\n            <returns>A collection of <see cref=\"T:System.Attribute\"/>s, or an empty collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IAttributeProvider.GetAttributes(System.Type,System.Boolean)\">\n            <summary>\n            Returns a collection of attributes, identified by type, or an empty collection if there are no attributes.\n            </summary>\n            <param name=\"attributeType\">The type of the attributes.</param>\n            <param name=\"inherit\">When true, look up the hierarchy chain for the inherited custom attribute.</param>\n            <returns>A collection of <see cref=\"T:System.Attribute\"/>s, or an empty collection.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.IContractResolver\">\n            <summary>\n            Used by <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> to resolves a <see cref=\"T:Newtonsoft.Json.Serialization.JsonContract\"/> for a given <see cref=\"T:System.Type\"/>.\n            </summary>\n            <example>\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\SerializationTests.cs\" region=\"ReducingSerializedJsonSizeContractResolverObject\" title=\"IContractResolver Class\" />\n              <code lang=\"cs\" source=\"..\\Src\\Newtonsoft.Json.Tests\\Documentation\\SerializationTests.cs\" region=\"ReducingSerializedJsonSizeContractResolverExample\" title=\"IContractResolver Example\" />\n            </example>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IContractResolver.ResolveContract(System.Type)\">\n            <summary>\n            Resolves the contract for a given type.\n            </summary>\n            <param name=\"type\">The type to resolve a contract for.</param>\n            <returns>The contract for a given type.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.NamingStrategy\">\n            <summary>\n            A base class for resolving how property names and dictionary keys are serialized.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.NamingStrategy.ProcessDictionaryKeys\">\n            <summary>\n            A flag indicating whether dictionary keys should be processed.\n            Defaults to <c>false</c>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.NamingStrategy.OverrideSpecifiedNames\">\n            <summary>\n            A flag indicating whether explicitly specified property names,\n            e.g. a property name customized with a <see cref=\"T:Newtonsoft.Json.JsonPropertyAttribute\"/>, should be processed.\n            Defaults to <c>false</c>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.NamingStrategy.GetPropertyName(System.String,System.Boolean)\">\n            <summary>\n            Gets the serialized name for a given property name.\n            </summary>\n            <param name=\"name\">The initial property name.</param>\n            <param name=\"hasSpecifiedName\">A flag indicating whether the property has had a name explicitly specfied.</param>\n            <returns>The serialized property name.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.NamingStrategy.GetDictionaryKey(System.String)\">\n            <summary>\n            Gets the serialized key for a given dictionary key.\n            </summary>\n            <param name=\"key\">The initial dictionary key.</param>\n            <returns>The serialized dictionary key.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.NamingStrategy.ResolvePropertyName(System.String)\">\n            <summary>\n            Resolves the specified property name.\n            </summary>\n            <param name=\"name\">The property name to resolve.</param>\n            <returns>The resolved property name.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.IReferenceResolver\">\n            <summary>\n            Used to resolve references when serializing and deserializing JSON by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IReferenceResolver.ResolveReference(System.Object,System.String)\">\n            <summary>\n            Resolves a reference to its object.\n            </summary>\n            <param name=\"context\">The serialization context.</param>\n            <param name=\"reference\">The reference to resolve.</param>\n            <returns>The object that</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IReferenceResolver.GetReference(System.Object,System.Object)\">\n            <summary>\n            Gets the reference for the sepecified object.\n            </summary>\n            <param name=\"context\">The serialization context.</param>\n            <param name=\"value\">The object to get a reference for.</param>\n            <returns>The reference to the object.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IReferenceResolver.IsReferenced(System.Object,System.Object)\">\n            <summary>\n            Determines whether the specified object is referenced.\n            </summary>\n            <param name=\"context\">The serialization context.</param>\n            <param name=\"value\">The object to test for a reference.</param>\n            <returns>\n            \t<c>true</c> if the specified object is referenced; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IReferenceResolver.AddReference(System.Object,System.String,System.Object)\">\n            <summary>\n            Adds a reference to the specified object.\n            </summary>\n            <param name=\"context\">The serialization context.</param>\n            <param name=\"reference\">The reference.</param>\n            <param name=\"value\">The object to reference.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ITraceWriter\">\n            <summary>\n            Represents a trace writer.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.ITraceWriter.LevelFilter\">\n            <summary>\n            Gets the <see cref=\"T:System.Diagnostics.TraceLevel\"/> that will be used to filter the trace messages passed to the writer.\n            For example a filter level of <code>Info</code> will exclude <code>Verbose</code> messages and include <code>Info</code>,\n            <code>Warning</code> and <code>Error</code> messages.\n            </summary>\n            <value>The <see cref=\"T:System.Diagnostics.TraceLevel\"/> that will be used to filter the trace messages passed to the writer.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ITraceWriter.Trace(System.Diagnostics.TraceLevel,System.String,System.Exception)\">\n            <summary>\n            Writes the specified trace level, message and optional exception.\n            </summary>\n            <param name=\"level\">The <see cref=\"T:System.Diagnostics.TraceLevel\"/> at which to write this trace.</param>\n            <param name=\"message\">The trace message.</param>\n            <param name=\"ex\">The trace exception. This parameter is optional.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.IValueProvider\">\n            <summary>\n            Provides methods to get and set values.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IValueProvider.SetValue(System.Object,System.Object)\">\n            <summary>\n            Sets the value.\n            </summary>\n            <param name=\"target\">The target to set the value on.</param>\n            <param name=\"value\">The value to set on the target.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.IValueProvider.GetValue(System.Object)\">\n            <summary>\n            Gets the value.\n            </summary>\n            <param name=\"target\">The target to get the value from.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonArrayContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonArrayContract.CollectionItemType\">\n            <summary>\n            Gets the <see cref=\"T:System.Type\"/> of the collection items.\n            </summary>\n            <value>The <see cref=\"T:System.Type\"/> of the collection items.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonArrayContract.IsMultidimensionalArray\">\n            <summary>\n            Gets a value indicating whether the collection type is a multidimensional array.\n            </summary>\n            <value><c>true</c> if the collection type is a multidimensional array; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonArrayContract.OverrideCreator\">\n            <summary>\n            Gets or sets the function used to create the object. When set this function will override <see cref=\"P:Newtonsoft.Json.Serialization.JsonContract.DefaultCreator\"/>.\n            </summary>\n            <value>The function used to create the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonArrayContract.HasParameterizedCreator\">\n            <summary>\n            Gets a value indicating whether the creator has a parameter with the collection values.\n            </summary>\n            <value><c>true</c> if the creator has a parameter with the collection values; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonArrayContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonArrayContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonContainerContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContainerContract.ItemConverter\">\n            <summary>\n            Gets or sets the default collection items <see cref=\"T:Newtonsoft.Json.JsonConverter\" />.\n            </summary>\n            <value>The converter.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContainerContract.ItemIsReference\">\n            <summary>\n            Gets or sets a value indicating whether the collection items preserve object references.\n            </summary>\n            <value><c>true</c> if collection items preserve object references; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContainerContract.ItemReferenceLoopHandling\">\n            <summary>\n            Gets or sets the collection item reference loop handling.\n            </summary>\n            <value>The reference loop handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContainerContract.ItemTypeNameHandling\">\n            <summary>\n            Gets or sets the collection item type name handling.\n            </summary>\n            <value>The type name handling.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonContainerContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonContainerContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.SerializationCallback\">\n            <summary>\n            Handles <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> serialization callback events.\n            </summary>\n            <param name=\"o\">The object that raised the callback event.</param>\n            <param name=\"context\">The streaming context.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.SerializationErrorCallback\">\n            <summary>\n            Handles <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/> serialization error callback events.\n            </summary>\n            <param name=\"o\">The object that raised the callback event.</param>\n            <param name=\"context\">The streaming context.</param>\n            <param name=\"errorContext\">The error context.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ExtensionDataSetter\">\n            <summary>\n            Sets extension data for an object during deserialization.\n            </summary>\n            <param name=\"o\">The object to set extension data on.</param>\n            <param name=\"key\">The extension data key.</param>\n            <param name=\"value\">The extension data value.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ExtensionDataGetter\">\n            <summary>\n            Gets extension data for an object during serialization.\n            </summary>\n            <param name=\"o\">The object to set extension data on.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.UnderlyingType\">\n            <summary>\n            Gets the underlying type for the contract.\n            </summary>\n            <value>The underlying type for the contract.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.CreatedType\">\n            <summary>\n            Gets or sets the type created during deserialization.\n            </summary>\n            <value>The type created during deserialization.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.IsReference\">\n            <summary>\n            Gets or sets whether this type contract is serialized as a reference.\n            </summary>\n            <value>Whether this type contract is serialized as a reference.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.Converter\">\n            <summary>\n            Gets or sets the default <see cref=\"T:Newtonsoft.Json.JsonConverter\" /> for this contract.\n            </summary>\n            <value>The converter.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnDeserializedCallbacks\">\n            <summary>\n            Gets or sets all methods called immediately after deserialization of the object.\n            </summary>\n            <value>The methods called immediately after deserialization of the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnDeserializingCallbacks\">\n            <summary>\n            Gets or sets all methods called during deserialization of the object.\n            </summary>\n            <value>The methods called during deserialization of the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnSerializedCallbacks\">\n            <summary>\n            Gets or sets all methods called after serialization of the object graph.\n            </summary>\n            <value>The methods called after serialization of the object graph.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnSerializingCallbacks\">\n            <summary>\n            Gets or sets all methods called before serialization of the object.\n            </summary>\n            <value>The methods called before serialization of the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnErrorCallbacks\">\n            <summary>\n            Gets or sets all method called when an error is thrown during the serialization of the object.\n            </summary>\n            <value>The methods called when an error is thrown during the serialization of the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnDeserialized\">\n            <summary>\n            Gets or sets the method called immediately after deserialization of the object.\n            </summary>\n            <value>The method called immediately after deserialization of the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnDeserializing\">\n            <summary>\n            Gets or sets the method called during deserialization of the object.\n            </summary>\n            <value>The method called during deserialization of the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnSerialized\">\n            <summary>\n            Gets or sets the method called after serialization of the object graph.\n            </summary>\n            <value>The method called after serialization of the object graph.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnSerializing\">\n            <summary>\n            Gets or sets the method called before serialization of the object.\n            </summary>\n            <value>The method called before serialization of the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.OnError\">\n            <summary>\n            Gets or sets the method called when an error is thrown during the serialization of the object.\n            </summary>\n            <value>The method called when an error is thrown during the serialization of the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.DefaultCreator\">\n            <summary>\n            Gets or sets the default creator method used to create the object.\n            </summary>\n            <value>The default creator method used to create the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonContract.DefaultCreatorNonPublic\">\n            <summary>\n            Gets or sets a value indicating whether the default creator is non public.\n            </summary>\n            <value><c>true</c> if the default object creator is non-public; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonDictionaryContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonDictionaryContract.PropertyNameResolver\">\n            <summary>\n            Gets or sets the property name resolver.\n            </summary>\n            <value>The property name resolver.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonDictionaryContract.DictionaryKeyResolver\">\n            <summary>\n            Gets or sets the dictionary key resolver.\n            </summary>\n            <value>The dictionary key resolver.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonDictionaryContract.DictionaryKeyType\">\n            <summary>\n            Gets the <see cref=\"T:System.Type\"/> of the dictionary keys.\n            </summary>\n            <value>The <see cref=\"T:System.Type\"/> of the dictionary keys.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonDictionaryContract.DictionaryValueType\">\n            <summary>\n            Gets the <see cref=\"T:System.Type\"/> of the dictionary values.\n            </summary>\n            <value>The <see cref=\"T:System.Type\"/> of the dictionary values.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonDictionaryContract.OverrideCreator\">\n            <summary>\n            Gets or sets the function used to create the object. When set this function will override <see cref=\"P:Newtonsoft.Json.Serialization.JsonContract.DefaultCreator\"/>.\n            </summary>\n            <value>The function used to create the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonDictionaryContract.HasParameterizedCreator\">\n            <summary>\n            Gets a value indicating whether the creator has a parameter with the dictionary values.\n            </summary>\n            <value><c>true</c> if the creator has a parameter with the dictionary values; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonDictionaryContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonDictionaryContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonDynamicContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonDynamicContract.Properties\">\n            <summary>\n            Gets the object's properties.\n            </summary>\n            <value>The object's properties.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonDynamicContract.PropertyNameResolver\">\n            <summary>\n            Gets or sets the property name resolver.\n            </summary>\n            <value>The property name resolver.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonDynamicContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonDynamicContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonISerializableContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonISerializableContract.ISerializableCreator\">\n            <summary>\n            Gets or sets the ISerializable object constructor.\n            </summary>\n            <value>The ISerializable object constructor.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonISerializableContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonISerializableContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonLinqContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonLinqContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonLinqContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonObjectContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.MemberSerialization\">\n            <summary>\n            Gets or sets the object member serialization.\n            </summary>\n            <value>The member object serialization.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.ItemRequired\">\n            <summary>\n            Gets or sets a value that indicates whether the object's properties are required.\n            </summary>\n            <value>\n            \tA value indicating whether the object's properties are required.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.Properties\">\n            <summary>\n            Gets the object's properties.\n            </summary>\n            <value>The object's properties.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.ConstructorParameters\">\n            <summary>\n            Gets the constructor parameters required for any non-default constructor\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.CreatorParameters\">\n            <summary>\n            Gets a collection of <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> instances that define the parameters used with <see cref=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.OverrideCreator\"/>.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.OverrideConstructor\">\n            <summary>\n            Gets or sets the override constructor used to create the object.\n            This is set when a constructor is marked up using the\n            JsonConstructor attribute.\n            </summary>\n            <value>The override constructor.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.ParametrizedConstructor\">\n            <summary>\n            Gets or sets the parametrized constructor used to create the object.\n            </summary>\n            <value>The parametrized constructor.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.OverrideCreator\">\n            <summary>\n            Gets or sets the function used to create the object. When set this function will override <see cref=\"P:Newtonsoft.Json.Serialization.JsonContract.DefaultCreator\"/>.\n            This function is called with a collection of arguments which are defined by the <see cref=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.CreatorParameters\"/> collection.\n            </summary>\n            <value>The function used to create the object.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.ExtensionDataSetter\">\n            <summary>\n            Gets or sets the extension data setter.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.ExtensionDataGetter\">\n            <summary>\n            Gets or sets the extension data getter.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonObjectContract.ExtensionDataValueType\">\n            <summary>\n            Gets or sets the extension data value type.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonObjectContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonObjectContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonPrimitiveContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonPrimitiveContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonPrimitiveContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonProperty\">\n            <summary>\n            Maps a JSON property to a .NET member or constructor parameter.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.PropertyName\">\n            <summary>\n            Gets or sets the name of the property.\n            </summary>\n            <value>The name of the property.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.DeclaringType\">\n            <summary>\n            Gets or sets the type that declared this property.\n            </summary>\n            <value>The type that declared this property.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.Order\">\n            <summary>\n            Gets or sets the order of serialization of a member.\n            </summary>\n            <value>The numeric order of serialization.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.UnderlyingName\">\n            <summary>\n            Gets or sets the name of the underlying member or parameter.\n            </summary>\n            <value>The name of the underlying member or parameter.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ValueProvider\">\n            <summary>\n            Gets the <see cref=\"T:Newtonsoft.Json.Serialization.IValueProvider\"/> that will get and set the <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> during serialization.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Serialization.IValueProvider\"/> that will get and set the <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> during serialization.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.AttributeProvider\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.Serialization.IAttributeProvider\"/> for this property.\n            </summary>\n            <value>The <see cref=\"T:Newtonsoft.Json.Serialization.IAttributeProvider\"/> for this property.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.PropertyType\">\n            <summary>\n            Gets or sets the type of the property.\n            </summary>\n            <value>The type of the property.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.Converter\">\n            <summary>\n            Gets or sets the <see cref=\"T:Newtonsoft.Json.JsonConverter\" /> for the property.\n            If set this converter takes presidence over the contract converter for the property type.\n            </summary>\n            <value>The converter.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.MemberConverter\">\n            <summary>\n            Gets or sets the member converter.\n            </summary>\n            <value>The member converter.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.Ignored\">\n            <summary>\n            Gets or sets a value indicating whether this <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> is ignored.\n            </summary>\n            <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.Readable\">\n            <summary>\n            Gets or sets a value indicating whether this <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> is readable.\n            </summary>\n            <value><c>true</c> if readable; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.Writable\">\n            <summary>\n            Gets or sets a value indicating whether this <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> is writable.\n            </summary>\n            <value><c>true</c> if writable; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.HasMemberAttribute\">\n            <summary>\n            Gets or sets a value indicating whether this <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> has a member attribute.\n            </summary>\n            <value><c>true</c> if has a member attribute; otherwise, <c>false</c>.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.DefaultValue\">\n            <summary>\n            Gets the default value.\n            </summary>\n            <value>The default value.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.Required\">\n            <summary>\n            Gets or sets a value indicating whether this <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> is required.\n            </summary>\n            <value>A value indicating whether this <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> is required.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.IsReference\">\n            <summary>\n            Gets or sets a value indicating whether this property preserves object references.\n            </summary>\n            <value>\n            \t<c>true</c> if this instance is reference; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.NullValueHandling\">\n            <summary>\n            Gets or sets the property null value handling.\n            </summary>\n            <value>The null value handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.DefaultValueHandling\">\n            <summary>\n            Gets or sets the property default value handling.\n            </summary>\n            <value>The default value handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ReferenceLoopHandling\">\n            <summary>\n            Gets or sets the property reference loop handling.\n            </summary>\n            <value>The reference loop handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ObjectCreationHandling\">\n            <summary>\n            Gets or sets the property object creation handling.\n            </summary>\n            <value>The object creation handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.TypeNameHandling\">\n            <summary>\n            Gets or sets or sets the type name handling.\n            </summary>\n            <value>The type name handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ShouldSerialize\">\n            <summary>\n            Gets or sets a predicate used to determine whether the property should be serialize.\n            </summary>\n            <value>A predicate used to determine whether the property should be serialize.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ShouldDeserialize\">\n            <summary>\n            Gets or sets a predicate used to determine whether the property should be deserialized.\n            </summary>\n            <value>A predicate used to determine whether the property should be deserialized.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.GetIsSpecified\">\n            <summary>\n            Gets or sets a predicate used to determine whether the property should be serialized.\n            </summary>\n            <value>A predicate used to determine whether the property should be serialized.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.SetIsSpecified\">\n            <summary>\n            Gets or sets an action used to set whether the property has been deserialized.\n            </summary>\n            <value>An action used to set whether the property has been deserialized.</value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonProperty.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ItemConverter\">\n            <summary>\n            Gets or sets the converter used when serializing the property's collection items.\n            </summary>\n            <value>The collection's items converter.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ItemIsReference\">\n            <summary>\n            Gets or sets whether this property's collection items are serialized as a reference.\n            </summary>\n            <value>Whether this property's collection items are serialized as a reference.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ItemTypeNameHandling\">\n            <summary>\n            Gets or sets the the type name handling used when serializing the property's collection items.\n            </summary>\n            <value>The collection's items type name handling.</value>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.JsonProperty.ItemReferenceLoopHandling\">\n            <summary>\n            Gets or sets the the reference loop handling used when serializing the property's collection items.\n            </summary>\n            <value>The collection's items reference loop handling.</value>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonPropertyCollection\">\n            <summary>\n            A collection of <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> objects.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonPropertyCollection.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonPropertyCollection\"/> class.\n            </summary>\n            <param name=\"type\">The type.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonPropertyCollection.GetKeyForItem(Newtonsoft.Json.Serialization.JsonProperty)\">\n            <summary>\n            When implemented in a derived class, extracts the key from the specified element.\n            </summary>\n            <param name=\"item\">The element from which to extract the key.</param>\n            <returns>The key for the specified element.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonPropertyCollection.AddProperty(Newtonsoft.Json.Serialization.JsonProperty)\">\n            <summary>\n            Adds a <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> object.\n            </summary>\n            <param name=\"property\">The property to add to the collection.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonPropertyCollection.GetClosestMatchProperty(System.String)\">\n            <summary>\n            Gets the closest matching <see cref=\"T:Newtonsoft.Json.Serialization.JsonProperty\"/> object.\n            First attempts to get an exact case match of propertyName and then\n            a case insensitive match.\n            </summary>\n            <param name=\"propertyName\">Name of the property.</param>\n            <returns>A matching property if found.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonPropertyCollection.GetProperty(System.String,System.StringComparison)\">\n            <summary>\n            Gets a property by property name.\n            </summary>\n            <param name=\"propertyName\">The name of the property to get.</param>\n            <param name=\"comparisonType\">Type property name string comparison.</param>\n            <returns>A matching property if found.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.JsonStringContract\">\n            <summary>\n            Contract details for a <see cref=\"T:System.Type\"/> used by the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonStringContract.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.JsonStringContract\"/> class.\n            </summary>\n            <param name=\"underlyingType\">The underlying type for the contract.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.JsonTypeReflector.CreateJsonConverterInstance(System.Type,System.Object[])\">\n            <summary>\n            Lookup and create an instance of the JsonConverter type described by the argument.\n            </summary>\n            <param name=\"converterType\">The JsonConverter type to create.</param>\n            <param name=\"converterArgs\">Optional arguments to pass to an initializing constructor of the JsonConverter.\n            If null, the default constructor is used.</param>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.MemoryTraceWriter\">\n            <summary>\n            Represents a trace writer that writes to memory. When the trace message limit is\n            reached then old trace messages will be removed as new messages are added.\n            </summary>\n        </member>\n        <member name=\"P:Newtonsoft.Json.Serialization.MemoryTraceWriter.LevelFilter\">\n            <summary>\n            Gets the <see cref=\"T:System.Diagnostics.TraceLevel\"/> that will be used to filter the trace messages passed to the writer.\n            For example a filter level of <code>Info</code> will exclude <code>Verbose</code> messages and include <code>Info</code>,\n            <code>Warning</code> and <code>Error</code> messages.\n            </summary>\n            <value>\n            The <see cref=\"T:System.Diagnostics.TraceLevel\"/> that will be used to filter the trace messages passed to the writer.\n            </value>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.MemoryTraceWriter.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.MemoryTraceWriter\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.MemoryTraceWriter.Trace(System.Diagnostics.TraceLevel,System.String,System.Exception)\">\n            <summary>\n            Writes the specified trace level, message and optional exception.\n            </summary>\n            <param name=\"level\">The <see cref=\"T:System.Diagnostics.TraceLevel\"/> at which to write this trace.</param>\n            <param name=\"message\">The trace message.</param>\n            <param name=\"ex\">The trace exception. This parameter is optional.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.MemoryTraceWriter.GetTraceMessages\">\n            <summary>\n            Returns an enumeration of the most recent trace messages.\n            </summary>\n            <returns>An enumeration of the most recent trace messages.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.MemoryTraceWriter.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> of the most recent trace messages.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> of the most recent trace messages.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ObjectConstructor`1\">\n            <summary>\n            Represents a method that constructs an object.\n            </summary>\n            <typeparam name=\"T\">The object type to create.</typeparam>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.OnErrorAttribute\">\n            <summary>\n            When applied to a method, specifies that the method is called when an error occurs serializing an object.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ReflectionAttributeProvider\">\n            <summary>\n            Provides methods to get attributes from a <see cref=\"T:System.Type\"/>, <see cref=\"T:System.Reflection.MemberInfo\"/>, <see cref=\"T:System.Reflection.ParameterInfo\"/> or <see cref=\"T:System.Reflection.Assembly\"/>.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ReflectionAttributeProvider.#ctor(System.Object)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.ReflectionAttributeProvider\"/> class.\n            </summary>\n            <param name=\"attributeProvider\">The instance to get attributes for. This parameter should be a <see cref=\"T:System.Type\"/>, <see cref=\"T:System.Reflection.MemberInfo\"/>, <see cref=\"T:System.Reflection.ParameterInfo\"/> or <see cref=\"T:System.Reflection.Assembly\"/>.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ReflectionAttributeProvider.GetAttributes(System.Boolean)\">\n            <summary>\n            Returns a collection of all of the attributes, or an empty collection if there are no attributes.\n            </summary>\n            <param name=\"inherit\">When true, look up the hierarchy chain for the inherited custom attribute.</param>\n            <returns>A collection of <see cref=\"T:System.Attribute\"/>s, or an empty collection.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ReflectionAttributeProvider.GetAttributes(System.Type,System.Boolean)\">\n            <summary>\n            Returns a collection of attributes, identified by type, or an empty collection if there are no attributes.\n            </summary>\n            <param name=\"attributeType\">The type of the attributes.</param>\n            <param name=\"inherit\">When true, look up the hierarchy chain for the inherited custom attribute.</param>\n            <returns>A collection of <see cref=\"T:System.Attribute\"/>s, or an empty collection.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Serialization.ReflectionValueProvider\">\n            <summary>\n            Get and set values for a <see cref=\"T:System.Reflection.MemberInfo\"/> using reflection.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ReflectionValueProvider.#ctor(System.Reflection.MemberInfo)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Newtonsoft.Json.Serialization.ReflectionValueProvider\"/> class.\n            </summary>\n            <param name=\"memberInfo\">The member info.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ReflectionValueProvider.SetValue(System.Object,System.Object)\">\n            <summary>\n            Sets the value.\n            </summary>\n            <param name=\"target\">The target to set the value on.</param>\n            <param name=\"value\">The value to set on the target.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Serialization.ReflectionValueProvider.GetValue(System.Object)\">\n            <summary>\n            Gets the value.\n            </summary>\n            <param name=\"target\">The target to get the value from.</param>\n            <returns>The value.</returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.StringEscapeHandling\">\n            <summary>\n            Specifies how strings are escaped when writing JSON text.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.StringEscapeHandling.Default\">\n            <summary>\n            Only control characters (e.g. newline) are escaped.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.StringEscapeHandling.EscapeNonAscii\">\n            <summary>\n            All non-ASCII and control characters (e.g. newline) are escaped.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.StringEscapeHandling.EscapeHtml\">\n            <summary>\n            HTML (&lt;, &gt;, &amp;, &apos;, &quot;) and control characters (e.g. newline) are escaped.\n            </summary>\n        </member>\n        <member name=\"T:Newtonsoft.Json.TypeNameHandling\">\n            <summary>\n            Specifies type name handling options for the <see cref=\"T:Newtonsoft.Json.JsonSerializer\"/>.\n            </summary>\n            <remarks>\n            <see cref=\"T:Newtonsoft.Json.TypeNameHandling\"/> should be used with caution when your application deserializes JSON from an external source.\n            Incoming types should be validated with a custom <see cref=\"T:System.Runtime.Serialization.SerializationBinder\"/>\n            when deserializing with a value other than <c>TypeNameHandling.None</c>.\n            </remarks>\n        </member>\n        <member name=\"F:Newtonsoft.Json.TypeNameHandling.None\">\n            <summary>\n            Do not include the .NET type name when serializing types.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.TypeNameHandling.Objects\">\n            <summary>\n            Include the .NET type name when serializing into a JSON object structure.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.TypeNameHandling.Arrays\">\n            <summary>\n            Include the .NET type name when serializing into a JSON array structure.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.TypeNameHandling.All\">\n            <summary>\n            Always include the .NET type name when serializing.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.TypeNameHandling.Auto\">\n            <summary>\n            Include the .NET type name when the type of the object being serialized is not the same as its declared type.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.CollectionUtils.IsNullOrEmpty``1(System.Collections.Generic.ICollection{``0})\">\n            <summary>\n            Determines whether the collection is null or empty.\n            </summary>\n            <param name=\"collection\">The collection.</param>\n            <returns>\n            \t<c>true</c> if the collection is null or empty; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.CollectionUtils.AddRange``1(System.Collections.Generic.IList{``0},System.Collections.Generic.IEnumerable{``0})\">\n            <summary>\n            Adds the elements of the specified collection to the specified generic IList.\n            </summary>\n            <param name=\"initial\">The list to add to.</param>\n            <param name=\"collection\">The collection of elements to add.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ConvertUtils.ConvertOrCast(System.Object,System.Globalization.CultureInfo,System.Type)\">\n            <summary>\n            Converts the value to the specified type. If the value is unable to be converted, the\n            value is checked whether it assignable to the specified type.\n            </summary>\n            <param name=\"initialValue\">The value to convert.</param>\n            <param name=\"culture\">The culture to use when converting.</param>\n            <param name=\"targetType\">The type to convert or cast the value to.</param>\n            <returns>\n            The converted type. If conversion was unsuccessful, the initial value\n            is returned if assignable to the target type.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.DynamicProxyMetaObject`1.CallMethodWithResult(System.String,System.Dynamic.DynamicMetaObjectBinder,System.Linq.Expressions.Expression[],Newtonsoft.Json.Utilities.DynamicProxyMetaObject{`0}.Fallback,Newtonsoft.Json.Utilities.DynamicProxyMetaObject{`0}.Fallback)\">\n            <summary>\n            Helper method for generating a MetaObject which calls a\n            specific method on Dynamic that returns a result\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.DynamicProxyMetaObject`1.CallMethodReturnLast(System.String,System.Dynamic.DynamicMetaObjectBinder,System.Linq.Expressions.Expression[],Newtonsoft.Json.Utilities.DynamicProxyMetaObject{`0}.Fallback)\">\n            <summary>\n            Helper method for generating a MetaObject which calls a\n            specific method on Dynamic, but uses one of the arguments for\n            the result.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.DynamicProxyMetaObject`1.CallMethodNoResult(System.String,System.Dynamic.DynamicMetaObjectBinder,System.Linq.Expressions.Expression[],Newtonsoft.Json.Utilities.DynamicProxyMetaObject{`0}.Fallback)\">\n            <summary>\n            Helper method for generating a MetaObject which calls a\n            specific method on Dynamic, but uses one of the arguments for\n            the result.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.DynamicProxyMetaObject`1.GetRestrictions\">\n            <summary>\n            Returns a Restrictions object which includes our current restrictions merged\n            with a restriction limiting our type\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.EnumUtils.GetNamesAndValues``1\">\n            <summary>\n            Gets a dictionary of the names and values of an Enum type.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.EnumUtils.GetNamesAndValues``1(System.Type)\">\n            <summary>\n            Gets a dictionary of the names and values of an Enum type.\n            </summary>\n            <param name=\"enumType\">The enum type to get names and values for.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ReflectionUtils.GetCollectionItemType(System.Type)\">\n            <summary>\n            Gets the type of the typed collection's items.\n            </summary>\n            <param name=\"type\">The type.</param>\n            <returns>The type of the typed collection's items.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ReflectionUtils.GetMemberUnderlyingType(System.Reflection.MemberInfo)\">\n            <summary>\n            Gets the member's underlying type.\n            </summary>\n            <param name=\"member\">The member.</param>\n            <returns>The underlying type of the member.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ReflectionUtils.IsIndexedProperty(System.Reflection.MemberInfo)\">\n            <summary>\n            Determines whether the member is an indexed property.\n            </summary>\n            <param name=\"member\">The member.</param>\n            <returns>\n            \t<c>true</c> if the member is an indexed property; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ReflectionUtils.IsIndexedProperty(System.Reflection.PropertyInfo)\">\n            <summary>\n            Determines whether the property is an indexed property.\n            </summary>\n            <param name=\"property\">The property.</param>\n            <returns>\n            \t<c>true</c> if the property is an indexed property; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ReflectionUtils.GetMemberValue(System.Reflection.MemberInfo,System.Object)\">\n            <summary>\n            Gets the member's value on the object.\n            </summary>\n            <param name=\"member\">The member.</param>\n            <param name=\"target\">The target object.</param>\n            <returns>The member's value on the object.</returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ReflectionUtils.SetMemberValue(System.Reflection.MemberInfo,System.Object,System.Object)\">\n            <summary>\n            Sets the member's value on the target object.\n            </summary>\n            <param name=\"member\">The member.</param>\n            <param name=\"target\">The target.</param>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ReflectionUtils.CanReadMemberValue(System.Reflection.MemberInfo,System.Boolean)\">\n            <summary>\n            Determines whether the specified MemberInfo can be read.\n            </summary>\n            <param name=\"member\">The MemberInfo to determine whether can be read.</param>\n            /// <param name=\"nonPublic\">if set to <c>true</c> then allow the member to be gotten non-publicly.</param>\n            <returns>\n            \t<c>true</c> if the specified MemberInfo can be read; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.ReflectionUtils.CanSetMemberValue(System.Reflection.MemberInfo,System.Boolean,System.Boolean)\">\n            <summary>\n            Determines whether the specified MemberInfo can be set.\n            </summary>\n            <param name=\"member\">The MemberInfo to determine whether can be set.</param>\n            <param name=\"nonPublic\">if set to <c>true</c> then allow the member to be set non-publicly.</param>\n            <param name=\"canSetReadOnly\">if set to <c>true</c> then allow the member to be set if read-only.</param>\n            <returns>\n            \t<c>true</c> if the specified MemberInfo can be set; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.Utilities.StringBuffer\">\n            <summary>\n            Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer.\n            </summary>\n        </member>\n        <member name=\"M:Newtonsoft.Json.Utilities.StringUtils.IsWhiteSpace(System.String)\">\n            <summary>\n            Determines whether the string is all white space. Empty string will return false.\n            </summary>\n            <param name=\"s\">The string to test whether it is all white space.</param>\n            <returns>\n            \t<c>true</c> if the string is all white space; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:Newtonsoft.Json.WriteState\">\n            <summary>\n            Specifies the state of the <see cref=\"T:Newtonsoft.Json.JsonWriter\"/>.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.WriteState.Error\">\n            <summary>\n            An exception has been thrown, which has left the <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> in an invalid state.\n            You may call the <see cref=\"M:Newtonsoft.Json.JsonWriter.Close\"/> method to put the <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> in the <c>Closed</c> state.\n            Any other <see cref=\"T:Newtonsoft.Json.JsonWriter\"/> method calls results in an <see cref=\"T:System.InvalidOperationException\"/> being thrown. \n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.WriteState.Closed\">\n            <summary>\n            The <see cref=\"M:Newtonsoft.Json.JsonWriter.Close\"/> method has been called. \n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.WriteState.Object\">\n            <summary>\n            An object is being written. \n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.WriteState.Array\">\n            <summary>\n            A array is being written.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.WriteState.Constructor\">\n            <summary>\n            A constructor is being written.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.WriteState.Property\">\n            <summary>\n            A property is being written.\n            </summary>\n        </member>\n        <member name=\"F:Newtonsoft.Json.WriteState.Start\">\n            <summary>\n            A write method has not been called.\n            </summary>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "README.adoc",
    "content": "= Doom Launcher\n\nhttps://ci.appveyor.com/project/hobomaster22/doomlauncher[image:https://ci.appveyor.com/api/projects/status/github/nstlaurent/doomlauncher?svg=true[Build status]]\n\nimage:https://api.codacy.com/project/badge/Grade/f77deda96cfb4b90a201d09cb0014009[link=\"https://app.codacy.com/manual/nstlaurent/DoomLauncher?utm_source=github.com&utm_medium=referral&utm_content=nstlaurent/DoomLauncher&utm_campaign=Badge_Grade_Settings\"]\n\nDoom Launcher is a _Doom_ frontend for Windows PC. Instead of being a\nsimple utility to launch your files, it serves as database for all your\n_Doom_ engine games and mods. It can be compared to https://www.quaddicted.com/tools/quake_injector[Quake Injector],\na popular tool for _Quake_.\n\nimage::https://i.imgur.com/TIg4kNK.png[IWads Tile View Showcase]\nLarge tile view for IWads tab. IWADs such as _Freedoom_ and _Heretic_ can be played with Doom Launcher.\n\nimage::https://i.imgur.com/mYqC1QO.png[Custom Files Tile View Showcase]\nLarge tile view for a custom tag named \"Playing\". Doom Launcher can play custom mapsets such as Eviternity, Back to Saturn X, Plutonia 2, and more!\n\n== Features\n\n* Direct download and metadata update from /idgames (through API).\n* Add ZIP archives containing WAD/PK3/DEH/TXT files.\n* Automatic scraping of title, author, release date and description\nfrom included text files.\n* Automatically load files when selecting an IWAD or source port.\n* Add comments and ratings for files.\n* Import screenshots directly from a source port into the database.\n* Maintain demos and saved games (DSG/ZDS supported).\n* Set launch parameters and warp into any map in a file.\n* Select specific files within a ZIP archive.\n* Tag files with custom colored tags.\n* Screen filters to simulate CRT monitors.\n* Record play-statistics for each map completed in a play session.\nSupported source ports includes ZDoom, PrBoom+, CNDoom, Chocolate Doom,\nand Crispy Doom.\n* Automatic daily database backups (SQLite database files).\n* Create shortcuts to quickly launch files.\n\nMany more features are documented in the Help file. Please read it if\nyou have any concerns regarding certain features.\n\nDoom Launcher is written by Hobomaster22 in C# and requires .NET 4.5.\nIf you want to report bugs or suggest features, submit issues to\nthe GitHub repository. To contribute to Doom Launcher, fork a\ncopy of the repository and submit your changes via a pull request.\n\n== Building Doom Launcher\n\nDownload a copy of the repository onto your Windows system and open up\nthe solution file on Visual Studio. Visual Studio 2017 or later is\nrecommended. You may create new unit tests to help verify that your\nchanges work before submitting them.\n\nDoom Launcher currently supports Windows 7 and later. Mac and Linux are\nunsupported.\n\nIn order to build the Setup module for Visual Studio 2022, you may need to separately install \nsupport for Installer projects: \nhttps://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2022InstallerProjects \n\n\n== Development Tools\n\nSQLite Browser. Great tool for viewing and editing the DoomLauncher.sqlite database: \nhttps://sqlitebrowser.org/\n\nSonarLint. A great code analysis extension for Visual Studio. Highly recommended and used for most of Doom Launcher's development:\nhttps://www.sonarlint.org/visualstudio/\n\n== Doom Launcher Links\n\nGitHub Repository: https://github.com/nstlaurent/DoomLauncher\n\nDoomworld Thread: https://www.doomworld.com/vb/doom-general/69346-doom-launcher-doom-frontend-database/\n\nRealm667: https://realm667.com/index.php/en/kunena/doom-launcher \n"
  },
  {
    "path": "RELEASENOTES.md",
    "content": "# 3.9.0\n\n## Features:\n\n## Bug Fixes:\n- Address winrar vulnerability with relative file paths\n- Fix utility form hiding Save/Cancel buttons\n"
  },
  {
    "path": "Setup/EnableLaunchApplication.js",
    "content": "// EnableLaunchApplication.js <msi-file>\n// Performs a post-build fixup of an msi to launch a specific file when the install has completed\n\n// Configurable values\nvar checkboxChecked = true;                     // Is the checkbox on the finished dialog checked by default?\nvar checkboxText = \"Launch [ProductName]\";      // Text for the checkbox on the finished dialog\nvar filename = \"DoomLauncher.exe\";       // The name of the executable to launch - change this to match the file you want to launch at the end of your setup\n\n// Constant values from Windows Installer\nvar msiOpenDatabaseModeTransact = 1;\n\nvar msiViewModifyInsert         = 1;\nvar msiViewModifyUpdate         = 2;\nvar msiViewModifyAssign         = 3;\nvar msiViewModifyReplace        = 4;\nvar msiViewModifyDelete         = 6;\n\nif (WScript.Arguments.Length != 1)\n{\n        WScript.StdErr.WriteLine(WScript.ScriptName + \" file\");\n        WScript.Quit(1);\n}\n\nvar filespec = WScript.Arguments(0);\nvar installer = WScript.CreateObject(\"WindowsInstaller.Installer\");\nvar database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);\n\nvar sql;\nvar view;\nvar record;\n\ntry\n{\n        var fileId = FindFileIdentifier(database, filename);\n        if (!fileId)\n                throw \"Unable to find '\" + filename + \"' in File table\";\n\n        WScript.Echo(\"Updating the Control table...\");\n        // Modify the Control_Next of BannerBmp control to point to the new CheckBox\n        sql = \"SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BannerBmp'\";\n        view = database.OpenView(sql);\n        view.Execute();\n        record = view.Fetch();\n        record.StringData(11) = \"CheckboxLaunch\";\n        view.Modify(msiViewModifyReplace, record);\n        view.Close();\n\n        // Insert the new CheckBox control\n        // sql = \"INSERT INTO `Control` (`Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help`) VALUES ('FinishedForm', 'CheckboxLaunch', 'CheckBox', '9', '201', '343', '12', '3', 'LAUNCHAPP', '{\\\\VSI_MS_Sans_Serif13.0_0_0}\" + checkboxText + \"', 'CloseButton', '|')\";\n        sql = \"INSERT INTO `Control` (`Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help`) VALUES ('FinishedForm', 'CheckboxLaunch', 'CheckBox', '9', '201', '343', '12', '3', 'LAUNCHAPP', '{\\\\VSI_MS_Sans_Serif13.0_0_0}\" + checkboxText + \"', 'Line1', '|')\";\n\t\tview = database.OpenView(sql);\n        view.Execute();\n        view.Close();\n\n        WScript.Echo(\"Updating the ControlEvent table...\");\n        // Modify the Order of the EndDialog event of the FinishedForm to 1\n        sql = \"SELECT `Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering` FROM `ControlEvent` WHERE `Dialog_`='FinishedForm' AND `Event`='EndDialog'\";\n        view = database.OpenView(sql);\n        view.Execute();\n        record = view.Fetch();\n        record.IntegerData(6) = 1;\n        view.Modify(msiViewModifyReplace, record);\n        view.Close();\n\n        // Insert the Event to launch the application\n        sql = \"INSERT INTO `ControlEvent` (`Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering`) VALUES ('FinishedForm', 'CloseButton', 'DoAction', 'VSDCA_Launch', 'LAUNCHAPP=1', '0')\";\n        view = database.OpenView(sql);\n        view.Execute();\n        view.Close();\n\n        WScript.Echo(\"Updating the CustomAction table...\");\n        // Insert the custom action to launch the application when finished\n        sql = \"INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) VALUES ('VSDCA_Launch', '210', '\" + fileId + \"', '')\";\n        view = database.OpenView(sql);\n        view.Execute();\n        view.Close();\n\n        if (checkboxChecked)\n        {\n                WScript.Echo(\"Updating the Property table...\");\n                // Set the default value of the CheckBox\n                sql = \"INSERT INTO `Property` (`Property`, `Value`) VALUES ('LAUNCHAPP', '1')\";\n                view = database.OpenView(sql);\n                view.Execute();\n                view.Close();\n        }\n\n        database.Commit();\n}\ncatch(e)\n{\n        WScript.StdErr.WriteLine(e);\n        WScript.Quit(1);\n}\n\nfunction FindFileIdentifier(database, fileName)\n{\n        // First, try to find the exact file name\n        var sql = \"SELECT `File` FROM `File` WHERE `FileName`='\" + fileName + \"'\";\n        var view = database.OpenView(sql);\n        view.Execute();\n        var record = view.Fetch();\n        if (record)\n        {\n                var value = record.StringData(1);\n                view.Close();\n                return value;\n        }\n        view.Close();\n\n        // The file may be in SFN|LFN format.  Look for a filename in this case next\n        sql = \"SELECT `File`, `FileName` FROM `File`\";\n        view = database.OpenView(sql);\n        view.Execute();\n        record = view.Fetch();\n        while (record)\n        {\n                if (StringEndsWith(record.StringData(2), \"|\" + fileName))\n                {\n                        var value = record.StringData(1);\n                        view.Close();\n                        return value;\n                }\n\n                record = view.Fetch();\n        }\n        view.Close();\n}\n\nfunction StringEndsWith(str, value)\n{\n        if (str.length < value.length)\n                return false;\n\n        return (str.indexOf(value, str.length - value.length) != -1);\n}"
  },
  {
    "path": "Setup/Setup.vdproj",
    "content": "﻿\"DeployProject\"\n{\n\"VSVersion\" = \"3:800\"\n\"ProjectType\" = \"8:{978C614F-708E-4E1A-B201-565925725DBA}\"\n\"IsWebType\" = \"8:FALSE\"\n\"ProjectName\" = \"8:Setup\"\n\"LanguageId\" = \"3:1033\"\n\"CodePage\" = \"3:1252\"\n\"UILanguageId\" = \"3:1033\"\n\"SccProjectName\" = \"8:\"\n\"SccLocalPath\" = \"8:\"\n\"SccAuxPath\" = \"8:\"\n\"SccProvider\" = \"8:\"\n    \"Hierarchy\"\n    {\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_1C93A3EC442FFDADD64CDB667BDAD615\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_21428D848FA27A1FD153A4AF7A69EBDF\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_3EFFB1D4728D71DE53D6382742470624\"\n        \"OwnerKey\" = \"8:_1C93A3EC442FFDADD64CDB667BDAD615\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_414E5D336CA68B1036F857F024A3C6EE\"\n        \"OwnerKey\" = \"8:_B1CA06F4B4E252B91130AB980E18DA3A\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_414E5D336CA68B1036F857F024A3C6EE\"\n        \"OwnerKey\" = \"8:_21428D848FA27A1FD153A4AF7A69EBDF\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_414E5D336CA68B1036F857F024A3C6EE\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_47ED56C7EB324440D431476CFC4B464F\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_47ED56C7EB324440D431476CFC4B464F\"\n        \"OwnerKey\" = \"8:_A10269FC379C147CCB8769DE2D6F9F7D\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_47ED56C7EB324440D431476CFC4B464F\"\n        \"OwnerKey\" = \"8:_ABE333C419918B2BF59661AE04BCC362\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_4C299C0D4D6FACA0FC44E97E3C17127E\"\n        \"OwnerKey\" = \"8:_414E5D336CA68B1036F857F024A3C6EE\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_4C299C0D4D6FACA0FC44E97E3C17127E\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_5DB2DA7BE02309DAFE869508B8075705\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_63E4F764E8B041E59FDBB33BE88C745C\"\n        \"OwnerKey\" = \"8:_UNDEFINED\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_63F541A093684BECBF8F162892F5DDA4\"\n        \"OwnerKey\" = \"8:_UNDEFINED\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_74FC6FAABD4108DF17921DE769C87250\"\n        \"OwnerKey\" = \"8:_D3A03CE7A6A10218D50538ABC3F286D4\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_793F4759666A25557CFCC0B97E0B4887\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_96F6698AADF846BC8304AE597FD426CE\"\n        \"OwnerKey\" = \"8:_UNDEFINED\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_9A83643D15D94C130995E27924600F76\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_A10269FC379C147CCB8769DE2D6F9F7D\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_A13D3674ED2FB9924FD359296BC077FE\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_A213F9066FBE0CFB6B1BBC5E912D196E\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_A665674D765D7FDCEA2A0EB6F5D6A9DA\"\n        \"OwnerKey\" = \"8:_B1CA06F4B4E252B91130AB980E18DA3A\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_A665674D765D7FDCEA2A0EB6F5D6A9DA\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_A665674D765D7FDCEA2A0EB6F5D6A9DA\"\n        \"OwnerKey\" = \"8:_414E5D336CA68B1036F857F024A3C6EE\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_A8200F3634D437B54C477CEC4774A818\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_ABE333C419918B2BF59661AE04BCC362\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_B1CA06F4B4E252B91130AB980E18DA3A\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_B518A3AC4C66E28527F62B0FC4B34AD2\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_BF7618CDF7DD398B31A670E17C6A462A\"\n        \"OwnerKey\" = \"8:_414E5D336CA68B1036F857F024A3C6EE\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_BF7618CDF7DD398B31A670E17C6A462A\"\n        \"OwnerKey\" = \"8:_5DB2DA7BE02309DAFE869508B8075705\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_BF7618CDF7DD398B31A670E17C6A462A\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_CA115A09384060BEEC500614FAFF40C6\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_CD74C87BD809123E1A5229D324317104\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_D3A03CE7A6A10218D50538ABC3F286D4\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_D3D41A0E7A164D13BC1D3D21BF885195\"\n        \"OwnerKey\" = \"8:_UNDEFINED\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_E4970A73CC6B52AE551FFEEDB2D14E93\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_E4970A73CC6B52AE551FFEEDB2D14E93\"\n        \"OwnerKey\" = \"8:_CA115A09384060BEEC500614FAFF40C6\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_E4970A73CC6B52AE551FFEEDB2D14E93\"\n        \"OwnerKey\" = \"8:_A10269FC379C147CCB8769DE2D6F9F7D\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_E53668B26E65467EA92586BA68363BBA\"\n        \"OwnerKey\" = \"8:_UNDEFINED\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_F331CB5D2789C9E642B9E8FB101942BD\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_F8E515DA6830450C9C12B875F513E6B2\"\n        \"OwnerKey\" = \"8:_UNDEFINED\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"OwnerKey\" = \"8:_UNDEFINED\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_21428D848FA27A1FD153A4AF7A69EBDF\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_5DB2DA7BE02309DAFE869508B8075705\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_CA115A09384060BEEC500614FAFF40C6\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_A10269FC379C147CCB8769DE2D6F9F7D\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_E4970A73CC6B52AE551FFEEDB2D14E93\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_B1CA06F4B4E252B91130AB980E18DA3A\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_414E5D336CA68B1036F857F024A3C6EE\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_BF7618CDF7DD398B31A670E17C6A462A\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_4C299C0D4D6FACA0FC44E97E3C17127E\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_A665674D765D7FDCEA2A0EB6F5D6A9DA\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_A8200F3634D437B54C477CEC4774A818\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_1C93A3EC442FFDADD64CDB667BDAD615\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_3EFFB1D4728D71DE53D6382742470624\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_F331CB5D2789C9E642B9E8FB101942BD\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_CD74C87BD809123E1A5229D324317104\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_ABE333C419918B2BF59661AE04BCC362\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_47ED56C7EB324440D431476CFC4B464F\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_A13D3674ED2FB9924FD359296BC077FE\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_793F4759666A25557CFCC0B97E0B4887\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_A213F9066FBE0CFB6B1BBC5E912D196E\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_D3A03CE7A6A10218D50538ABC3F286D4\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_74FC6FAABD4108DF17921DE769C87250\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_9A83643D15D94C130995E27924600F76\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_B518A3AC4C66E28527F62B0FC4B34AD2\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n    }\n    \"Configurations\"\n    {\n        \"Debug\"\n        {\n        \"DisplayName\" = \"8:Debug\"\n        \"IsDebugOnly\" = \"11:TRUE\"\n        \"IsReleaseOnly\" = \"11:FALSE\"\n        \"OutputFilename\" = \"8:Debug\\\\DoomLauncher.msi\"\n        \"PackageFilesAs\" = \"3:2\"\n        \"PackageFileSize\" = \"3:-2147483648\"\n        \"CabType\" = \"3:1\"\n        \"Compression\" = \"3:2\"\n        \"SignOutput\" = \"11:FALSE\"\n        \"CertificateFile\" = \"8:\"\n        \"PrivateKeyFile\" = \"8:\"\n        \"TimeStampServer\" = \"8:\"\n        \"InstallerBootstrapper\" = \"3:2\"\n            \"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}\"\n            {\n            \"Enabled\" = \"11:TRUE\"\n            \"PromptEnabled\" = \"11:TRUE\"\n            \"PrerequisitesLocation\" = \"2:1\"\n            \"Url\" = \"8:\"\n            \"ComponentsUrl\" = \"8:\"\n                \"Items\"\n                {\n                    \"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2\"\n                    {\n                    \"Name\" = \"8:Microsoft .NET Framework 4.7.2 (x86 and x64)\"\n                    \"ProductCode\" = \"8:.NETFramework,Version=v4.7.2\"\n                    }\n                }\n            }\n        }\n        \"Release\"\n        {\n        \"DisplayName\" = \"8:Release\"\n        \"IsDebugOnly\" = \"11:FALSE\"\n        \"IsReleaseOnly\" = \"11:TRUE\"\n        \"OutputFilename\" = \"8:Release\\\\DoomLauncher.msi\"\n        \"PackageFilesAs\" = \"3:2\"\n        \"PackageFileSize\" = \"3:-2147483648\"\n        \"CabType\" = \"3:1\"\n        \"Compression\" = \"3:2\"\n        \"SignOutput\" = \"11:FALSE\"\n        \"CertificateFile\" = \"8:\"\n        \"PrivateKeyFile\" = \"8:\"\n        \"TimeStampServer\" = \"8:\"\n        \"InstallerBootstrapper\" = \"3:2\"\n            \"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}\"\n            {\n            \"Enabled\" = \"11:TRUE\"\n            \"PromptEnabled\" = \"11:TRUE\"\n            \"PrerequisitesLocation\" = \"2:1\"\n            \"Url\" = \"8:\"\n            \"ComponentsUrl\" = \"8:\"\n                \"Items\"\n                {\n                    \"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2\"\n                    {\n                    \"Name\" = \"8:Microsoft .NET Framework 4.7.2 (x86 and x64)\"\n                    \"ProductCode\" = \"8:.NETFramework,Version=v4.7.2\"\n                    }\n                }\n            }\n        }\n    }\n    \"Deployable\"\n    {\n        \"CustomAction\"\n        {\n        }\n        \"DefaultFeature\"\n        {\n        \"Name\" = \"8:DefaultFeature\"\n        \"Title\" = \"8:\"\n        \"Description\" = \"8:\"\n        }\n        \"ExternalPersistence\"\n        {\n            \"LaunchCondition\"\n            {\n                \"{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_1101EDA8E6114AF5AA607FADF3EEE1CE\"\n                {\n                \"Name\" = \"8:.NET Framework\"\n                \"Message\" = \"8:[VSDNETMSG]\"\n                \"FrameworkVersion\" = \"8:.NETFramework,Version=v4.7.2\"\n                \"AllowLaterVersions\" = \"11:FALSE\"\n                \"InstallUrl\" = \"8:http://go.microsoft.com/fwlink/?LinkId=863262\"\n                }\n            }\n        }\n        \"File\"\n        {\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1C93A3EC442FFDADD64CDB667BDAD615\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:Octokit, Version=0.50.0.0, Culture=neutral, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_1C93A3EC442FFDADD64CDB667BDAD615\"\n                    {\n                    \"Name\" = \"8:Octokit.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:Octokit.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_21428D848FA27A1FD153A4AF7A69EBDF\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:WadReader, Version=3.8.0.0, Culture=neutral, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_21428D848FA27A1FD153A4AF7A69EBDF\"\n                    {\n                    \"Name\" = \"8:WadReader.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:WadReader.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3EFFB1D4728D71DE53D6382742470624\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:TRUE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_3EFFB1D4728D71DE53D6382742470624\"\n                    {\n                    \"Name\" = \"8:System.Net.Http.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Net.Http.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_414E5D336CA68B1036F857F024A3C6EE\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_414E5D336CA68B1036F857F024A3C6EE\"\n                    {\n                    \"Name\" = \"8:System.Memory.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Memory.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_47ED56C7EB324440D431476CFC4B464F\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_47ED56C7EB324440D431476CFC4B464F\"\n                    {\n                    \"Name\" = \"8:EntityFramework.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:EntityFramework.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4C299C0D4D6FACA0FC44E97E3C17127E\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_4C299C0D4D6FACA0FC44E97E3C17127E\"\n                    {\n                    \"Name\" = \"8:System.Numerics.Vectors.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Numerics.Vectors.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5DB2DA7BE02309DAFE869508B8075705\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Text.Encoding.CodePages, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_5DB2DA7BE02309DAFE869508B8075705\"\n                    {\n                    \"Name\" = \"8:System.Text.Encoding.CodePages.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Text.Encoding.CodePages.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_63E4F764E8B041E59FDBB33BE88C745C\"\n            {\n            \"SourcePath\" = \"8:..\\\\DoomLauncher\\\\Help.pdf\"\n            \"TargetName\" = \"8:Help.pdf\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_63F541A093684BECBF8F162892F5DDA4\"\n            {\n            \"SourcePath\" = \"8:..\\\\DoomLauncher\\\\DoomLauncher.sqlite\"\n            \"TargetName\" = \"8:DoomLauncher.sqlite\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_9B4D77A4535A4C37862948F60E306337\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_74FC6FAABD4108DF17921DE769C87250\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:TRUE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.IO.Compression, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_74FC6FAABD4108DF17921DE769C87250\"\n                    {\n                    \"Name\" = \"8:System.IO.Compression.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.IO.Compression.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_793F4759666A25557CFCC0B97E0B4887\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:Equin.ApplicationFramework.BindingListView, Version=1.4.9419.14939, Culture=neutral, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_793F4759666A25557CFCC0B97E0B4887\"\n                    {\n                    \"Name\" = \"8:Equin.ApplicationFramework.BindingListView.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:Equin.ApplicationFramework.BindingListView.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_96F6698AADF846BC8304AE597FD426CE\"\n            {\n            \"SourcePath\" = \"8:..\\\\DoomLauncher\\\\TileImages\\\\DoomLauncherTileSmall.png\"\n            \"TargetName\" = \"8:DoomLauncherTileSmall.png\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_C51A08AA1501484EB70A3FA6F7D31F44\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9A83643D15D94C130995E27924600F76\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.IO.Compression, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\n                \"ScatterAssemblies\"\n                {\n                    \"_9A83643D15D94C130995E27924600F76\"\n                    {\n                    \"Name\" = \"8:System.IO.Compression.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.IO.Compression.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A10269FC379C147CCB8769DE2D6F9F7D\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Data.SQLite.EF6, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_A10269FC379C147CCB8769DE2D6F9F7D\"\n                    {\n                    \"Name\" = \"8:System.Data.SQLite.EF6.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Data.SQLite.EF6.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A13D3674ED2FB9924FD359296BC077FE\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:CheckBoxComboBox, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_A13D3674ED2FB9924FD359296BC077FE\"\n                    {\n                    \"Name\" = \"8:CheckBoxComboBox.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:CheckBoxComboBox.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A213F9066FBE0CFB6B1BBC5E912D196E\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"\n                \"ScatterAssemblies\"\n                {\n                    \"_A213F9066FBE0CFB6B1BBC5E912D196E\"\n                    {\n                    \"Name\" = \"8:System.Net.Http.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Net.Http.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A665674D765D7FDCEA2A0EB6F5D6A9DA\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_A665674D765D7FDCEA2A0EB6F5D6A9DA\"\n                    {\n                    \"Name\" = \"8:System.Buffers.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Buffers.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A8200F3634D437B54C477CEC4774A818\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:SevenZipSharp, Version=0.64.3890.29348, Culture=neutral, PublicKeyToken=20de82c62b055c88, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_A8200F3634D437B54C477CEC4774A818\"\n                    {\n                    \"Name\" = \"8:SevenZipSharp.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:SevenZipSharp.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_ABE333C419918B2BF59661AE04BCC362\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_ABE333C419918B2BF59661AE04BCC362\"\n                    {\n                    \"Name\" = \"8:EntityFramework.SqlServer.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:EntityFramework.SqlServer.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_B1CA06F4B4E252B91130AB980E18DA3A\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:SharpCompress, Version=0.31.0.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_B1CA06F4B4E252B91130AB980E18DA3A\"\n                    {\n                    \"Name\" = \"8:SharpCompress.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:SharpCompress.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_B518A3AC4C66E28527F62B0FC4B34AD2\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Collections.Specialized, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"\n                \"ScatterAssemblies\"\n                {\n                    \"_B518A3AC4C66E28527F62B0FC4B34AD2\"\n                    {\n                    \"Name\" = \"8:System.Collections.Specialized.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Collections.Specialized.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BF7618CDF7DD398B31A670E17C6A462A\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_BF7618CDF7DD398B31A670E17C6A462A\"\n                    {\n                    \"Name\" = \"8:System.Runtime.CompilerServices.Unsafe.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Runtime.CompilerServices.Unsafe.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CA115A09384060BEEC500614FAFF40C6\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Data.SQLite.Linq, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_CA115A09384060BEEC500614FAFF40C6\"\n                    {\n                    \"Name\" = \"8:System.Data.SQLite.Linq.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Data.SQLite.Linq.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CD74C87BD809123E1A5229D324317104\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:Gameloop.Vdf, Version=0.6.2.0, Culture=neutral, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_CD74C87BD809123E1A5229D324317104\"\n                    {\n                    \"Name\" = \"8:Gameloop.Vdf.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:Gameloop.Vdf.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D3A03CE7A6A10218D50538ABC3F286D4\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"\n                \"ScatterAssemblies\"\n                {\n                    \"_D3A03CE7A6A10218D50538ABC3F286D4\"\n                    {\n                    \"Name\" = \"8:System.IO.Compression.FileSystem.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.IO.Compression.FileSystem.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D3D41A0E7A164D13BC1D3D21BF885195\"\n            {\n            \"SourcePath\" = \"8:..\\\\DoomLauncher\\\\DoomLauncher.ico\"\n            \"TargetName\" = \"8:DoomLauncher.ico\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E4970A73CC6B52AE551FFEEDB2D14E93\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:System.Data.SQLite, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_E4970A73CC6B52AE551FFEEDB2D14E93\"\n                    {\n                    \"Name\" = \"8:System.Data.SQLite.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:System.Data.SQLite.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E53668B26E65467EA92586BA68363BBA\"\n            {\n            \"SourcePath\" = \"8:..\\\\DoomLauncher\\\\TileImages\\\\DoomLauncherTile.png\"\n            \"TargetName\" = \"8:DoomLauncherTile.png\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_C51A08AA1501484EB70A3FA6F7D31F44\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_F331CB5D2789C9E642B9E8FB101942BD\"\n            {\n            \"AssemblyRegister\" = \"3:1\"\n            \"AssemblyIsInGAC\" = \"11:FALSE\"\n            \"AssemblyAsmDisplayName\" = \"8:Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\"\n                \"ScatterAssemblies\"\n                {\n                    \"_F331CB5D2789C9E642B9E8FB101942BD\"\n                    {\n                    \"Name\" = \"8:Newtonsoft.Json.dll\"\n                    \"Attributes\" = \"3:512\"\n                    }\n                }\n            \"SourcePath\" = \"8:Newtonsoft.Json.dll\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:TRUE\"\n            \"IsolateTo\" = \"8:\"\n            }\n            \"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F8E515DA6830450C9C12B875F513E6B2\"\n            {\n            \"SourcePath\" = \"8:..\\\\DoomLauncher\\\\bin\\\\Release\\\\x64\\\\SQLite.Interop.dll\"\n            \"TargetName\" = \"8:SQLite.Interop.dll\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"IsolateTo\" = \"8:\"\n            }\n        }\n        \"FileType\"\n        {\n        }\n        \"Folder\"\n        {\n            \"{1525181F-901A-416C-8A58-119130FE478E}:_A30BDE48063D40559A4AA683AD667FA8\"\n            {\n            \"Name\" = \"8:#1915\"\n            \"AlwaysCreate\" = \"11:FALSE\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Property\" = \"8:AppDataFolder\"\n                \"Folders\"\n                {\n                    \"{9EF0B969-E518-4E46-987F-47570745A589}:_9B4D77A4535A4C37862948F60E306337\"\n                    {\n                    \"Name\" = \"8:DoomLauncher\"\n                    \"AlwaysCreate\" = \"11:FALSE\"\n                    \"Condition\" = \"8:\"\n                    \"Transitive\" = \"11:FALSE\"\n                    \"Property\" = \"8:_7DC055EFD29D4888A87A26EAFEE910F2\"\n                        \"Folders\"\n                        {\n                            \"{9EF0B969-E518-4E46-987F-47570745A589}:_C51A08AA1501484EB70A3FA6F7D31F44\"\n                            {\n                            \"Name\" = \"8:TileImages\"\n                            \"AlwaysCreate\" = \"11:FALSE\"\n                            \"Condition\" = \"8:\"\n                            \"Transitive\" = \"11:FALSE\"\n                            \"Property\" = \"8:_57DC2A5EDC2441C2A67D5AE7844953B3\"\n                                \"Folders\"\n                                {\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n            \"{1525181F-901A-416C-8A58-119130FE478E}:_B56F790FDFAF46A29FFB44FBE969E6D8\"\n            {\n            \"Name\" = \"8:#1919\"\n            \"AlwaysCreate\" = \"11:FALSE\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Property\" = \"8:ProgramMenuFolder\"\n                \"Folders\"\n                {\n                }\n            }\n            \"{1525181F-901A-416C-8A58-119130FE478E}:_BAF67D21DFBD46829DB043058C22639C\"\n            {\n            \"Name\" = \"8:#1916\"\n            \"AlwaysCreate\" = \"11:FALSE\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Property\" = \"8:DesktopFolder\"\n                \"Folders\"\n                {\n                }\n            }\n            \"{3C67513D-01DD-4637-8A68-80971EB9504F}:_FBFCC08B40C94547A700104B2C2BD264\"\n            {\n            \"DefaultLocation\" = \"8:[ProgramFilesFolder]\\\\[ProductName]\"\n            \"Name\" = \"8:#1925\"\n            \"AlwaysCreate\" = \"11:FALSE\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Property\" = \"8:TARGETDIR\"\n                \"Folders\"\n                {\n                }\n            }\n        }\n        \"LaunchCondition\"\n        {\n        }\n        \"Locator\"\n        {\n        }\n        \"MsiBootstrapper\"\n        {\n        \"LangId\" = \"3:1033\"\n        \"RequiresElevation\" = \"11:FALSE\"\n        }\n        \"Product\"\n        {\n        \"Name\" = \"8:Microsoft Visual Studio\"\n        \"ProductName\" = \"8:Doom Launcher\"\n        \"ProductCode\" = \"8:{BC9120A6-2D1C-4667-9DC6-2372631A353E}\"\n        \"PackageCode\" = \"8:{5039230A-92D2-4A7B-8BC7-63BEDF91E30B}\"\n        \"UpgradeCode\" = \"8:{CAFDF197-4B50-4AFE-BCFE-0432710657F1}\"\n        \"AspNetVersion\" = \"8:2.0.50727.0\"\n        \"RestartWWWService\" = \"11:FALSE\"\n        \"RemovePreviousVersions\" = \"11:TRUE\"\n        \"DetectNewerInstalledVersion\" = \"11:TRUE\"\n        \"InstallAllUsers\" = \"11:FALSE\"\n        \"ProductVersion\" = \"8:3.8.1\"\n        \"Manufacturer\" = \"8:Doom Launcher\"\n        \"ARPHELPTELEPHONE\" = \"8:\"\n        \"ARPHELPLINK\" = \"8:https://github.com/nstlaurent/DoomLauncher\"\n        \"Title\" = \"8:Doom Launcher\"\n        \"Subject\" = \"8:\"\n        \"ARPCONTACT\" = \"8:Doom Launcher\"\n        \"Keywords\" = \"8:\"\n        \"ARPCOMMENTS\" = \"8:\"\n        \"ARPURLINFOABOUT\" = \"8:https://github.com/nstlaurent/DoomLauncher\"\n        \"ARPPRODUCTICON\" = \"8:_D3D41A0E7A164D13BC1D3D21BF885195\"\n        \"ARPIconIndex\" = \"3:0\"\n        \"SearchPath\" = \"8:\"\n        \"UseSystemSearchPath\" = \"11:TRUE\"\n        \"TargetPlatform\" = \"3:1\"\n        \"PreBuildEvent\" = \"8:\"\n        \"PostBuildEvent\" = \"8:cscript.exe \\\"$(ProjectDir)EnableLaunchApplication.js\\\" \\\"$(BuiltOuputPath)\\\"\"\n        \"RunPostBuildEvent\" = \"3:0\"\n        }\n        \"Registry\"\n        {\n            \"HKLM\"\n            {\n                \"Keys\"\n                {\n                    \"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6B123DB311874B56BC86F2A8DF5F3CBD\"\n                    {\n                    \"Name\" = \"8:Software\"\n                    \"Condition\" = \"8:\"\n                    \"AlwaysCreate\" = \"11:FALSE\"\n                    \"DeleteAtUninstall\" = \"11:FALSE\"\n                    \"Transitive\" = \"11:FALSE\"\n                        \"Keys\"\n                        {\n                            \"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F27AE53B80AC491290867BAC6434DF65\"\n                            {\n                            \"Name\" = \"8:[Manufacturer]\"\n                            \"Condition\" = \"8:\"\n                            \"AlwaysCreate\" = \"11:FALSE\"\n                            \"DeleteAtUninstall\" = \"11:FALSE\"\n                            \"Transitive\" = \"11:FALSE\"\n                                \"Keys\"\n                                {\n                                }\n                                \"Values\"\n                                {\n                                }\n                            }\n                        }\n                        \"Values\"\n                        {\n                        }\n                    }\n                }\n            }\n            \"HKCU\"\n            {\n                \"Keys\"\n                {\n                    \"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C2E9A6715DB74966B4CAF78055881C9A\"\n                    {\n                    \"Name\" = \"8:Software\"\n                    \"Condition\" = \"8:\"\n                    \"AlwaysCreate\" = \"11:FALSE\"\n                    \"DeleteAtUninstall\" = \"11:FALSE\"\n                    \"Transitive\" = \"11:FALSE\"\n                        \"Keys\"\n                        {\n                            \"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E0C062D5235D447BB3D7253F6A9212E4\"\n                            {\n                            \"Name\" = \"8:[Manufacturer]\"\n                            \"Condition\" = \"8:\"\n                            \"AlwaysCreate\" = \"11:FALSE\"\n                            \"DeleteAtUninstall\" = \"11:FALSE\"\n                            \"Transitive\" = \"11:FALSE\"\n                                \"Keys\"\n                                {\n                                }\n                                \"Values\"\n                                {\n                                }\n                            }\n                        }\n                        \"Values\"\n                        {\n                        }\n                    }\n                }\n            }\n            \"HKCR\"\n            {\n                \"Keys\"\n                {\n                }\n            }\n            \"HKU\"\n            {\n                \"Keys\"\n                {\n                }\n            }\n            \"HKPU\"\n            {\n                \"Keys\"\n                {\n                }\n            }\n        }\n        \"Sequences\"\n        {\n        }\n        \"Shortcut\"\n        {\n            \"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_02E60DB2622949319196B5232F111A59\"\n            {\n            \"Name\" = \"8:Doom Launcher\"\n            \"Arguments\" = \"8:\"\n            \"Description\" = \"8:\"\n            \"ShowCmd\" = \"3:1\"\n            \"IconIndex\" = \"3:0\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Target\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n            \"Folder\" = \"8:_BAF67D21DFBD46829DB043058C22639C\"\n            \"WorkingFolder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Icon\" = \"8:_D3D41A0E7A164D13BC1D3D21BF885195\"\n            \"Feature\" = \"8:\"\n            }\n            \"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_168056505F944161A3AF990F9BBF606E\"\n            {\n            \"Name\" = \"8:Doom Launcher\"\n            \"Arguments\" = \"8:\"\n            \"Description\" = \"8:\"\n            \"ShowCmd\" = \"3:1\"\n            \"IconIndex\" = \"3:0\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Target\" = \"8:_FECC9E8503254BEAAAEB23AD08285AF7\"\n            \"Folder\" = \"8:_B56F790FDFAF46A29FFB44FBE969E6D8\"\n            \"WorkingFolder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Icon\" = \"8:_D3D41A0E7A164D13BC1D3D21BF885195\"\n            \"Feature\" = \"8:\"\n            }\n        }\n        \"UserInterface\"\n        {\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_0F0846073CA34A55A00E70F82404341E\"\n            {\n            \"Name\" = \"8:#1901\"\n            \"Sequence\" = \"3:2\"\n            \"Attributes\" = \"3:2\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A5E698F392D24B01A8A5FCF3299D180C\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Progress\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminProgressDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"ShowProgress\"\n                            {\n                            \"Name\" = \"8:ShowProgress\"\n                            \"DisplayName\" = \"8:#1009\"\n                            \"Description\" = \"8:#1109\"\n                            \"Type\" = \"3:5\"\n                            \"ContextData\" = \"8:1;True=1;False=0\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:0\"\n                            \"Value\" = \"3:1\"\n                            \"DefaultValue\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_39CDF33039E843DB90F748C59AFE477E\"\n            {\n            \"UseDynamicProperties\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdUserInterface.wim\"\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_464C61E00BC24857BFD2079873DA3AD2\"\n            {\n            \"Name\" = \"8:#1902\"\n            \"Sequence\" = \"3:1\"\n            \"Attributes\" = \"3:3\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_25813063E9634D6FA002919DC10995ED\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Finished\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdFinishedDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"UpdateText\"\n                            {\n                            \"Name\" = \"8:UpdateText\"\n                            \"DisplayName\" = \"8:#1058\"\n                            \"Description\" = \"8:#1158\"\n                            \"Type\" = \"3:15\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:1\"\n                            \"Value\" = \"8:#1258\"\n                            \"DefaultValue\" = \"8:#1258\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_72D9FECC5E434397A41E249261136160\"\n            {\n            \"Name\" = \"8:#1901\"\n            \"Sequence\" = \"3:1\"\n            \"Attributes\" = \"3:2\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_BFC54B4D0DE74551A5E313C2F929D039\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Progress\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdProgressDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"ShowProgress\"\n                            {\n                            \"Name\" = \"8:ShowProgress\"\n                            \"DisplayName\" = \"8:#1009\"\n                            \"Description\" = \"8:#1109\"\n                            \"Type\" = \"3:5\"\n                            \"ContextData\" = \"8:1;True=1;False=0\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:0\"\n                            \"Value\" = \"3:1\"\n                            \"DefaultValue\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_7F07C70E02A04427938A3B53C3FD4003\"\n            {\n            \"Name\" = \"8:#1900\"\n            \"Sequence\" = \"3:2\"\n            \"Attributes\" = \"3:1\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_140589FE107B46FF9D841D6761BFB76F\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Welcome\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminWelcomeDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"CopyrightWarning\"\n                            {\n                            \"Name\" = \"8:CopyrightWarning\"\n                            \"DisplayName\" = \"8:#1002\"\n                            \"Description\" = \"8:#1102\"\n                            \"Type\" = \"3:3\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:2\"\n                            \"Value\" = \"8:\"\n                            \"DefaultValue\" = \"8:#1202\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"Welcome\"\n                            {\n                            \"Name\" = \"8:Welcome\"\n                            \"DisplayName\" = \"8:#1003\"\n                            \"Description\" = \"8:#1103\"\n                            \"Type\" = \"3:3\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:1\"\n                            \"Value\" = \"8:#1203\"\n                            \"DefaultValue\" = \"8:#1203\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_AB8429EF68D945268941A73B6A6EF126\"\n                    {\n                    \"Sequence\" = \"3:300\"\n                    \"DisplayName\" = \"8:Confirm Installation\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminConfirmDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C4FD201642BC47AF867B77AADFEB6B7E\"\n                    {\n                    \"Sequence\" = \"3:200\"\n                    \"DisplayName\" = \"8:Installation Folder\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminFolderDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_BE766F3F95F64D538F731118812C9C19\"\n            {\n            \"Name\" = \"8:#1902\"\n            \"Sequence\" = \"3:2\"\n            \"Attributes\" = \"3:3\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_198CB92FBBAC45EEB49710B202ECE826\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Finished\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminFinishedDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_F22B87893EA54E47829025A8B33918F0\"\n            {\n            \"UseDynamicProperties\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdBasicDialogs.wim\"\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_FA9BAFDFAB7A4BE184271A7E7816D0A0\"\n            {\n            \"Name\" = \"8:#1900\"\n            \"Sequence\" = \"3:1\"\n            \"Attributes\" = \"3:1\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A4BA3AF7E28F4A799BA9C63C9520FEDC\"\n                    {\n                    \"Sequence\" = \"3:300\"\n                    \"DisplayName\" = \"8:Confirm Installation\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdConfirmDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B5C46140174D49FBB846CFED0048D83B\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Welcome\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdWelcomeDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"CopyrightWarning\"\n                            {\n                            \"Name\" = \"8:CopyrightWarning\"\n                            \"DisplayName\" = \"8:#1002\"\n                            \"Description\" = \"8:#1102\"\n                            \"Type\" = \"3:3\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:2\"\n                            \"Value\" = \"8:\"\n                            \"DefaultValue\" = \"8:#1202\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"Welcome\"\n                            {\n                            \"Name\" = \"8:Welcome\"\n                            \"DisplayName\" = \"8:#1003\"\n                            \"Description\" = \"8:#1103\"\n                            \"Type\" = \"3:3\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:1\"\n                            \"Value\" = \"8:#1203\"\n                            \"DefaultValue\" = \"8:#1203\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FF2A45A0F11D4970B085D61A75CF9835\"\n                    {\n                    \"Sequence\" = \"3:200\"\n                    \"DisplayName\" = \"8:Installation Folder\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdFolderDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"InstallAllUsersVisible\"\n                            {\n                            \"Name\" = \"8:InstallAllUsersVisible\"\n                            \"DisplayName\" = \"8:#1059\"\n                            \"Description\" = \"8:#1159\"\n                            \"Type\" = \"3:5\"\n                            \"ContextData\" = \"8:1;True=1;False=0\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:0\"\n                            \"Value\" = \"3:1\"\n                            \"DefaultValue\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        \"MergeModule\"\n        {\n        }\n        \"ProjectOutput\"\n        {\n            \"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FECC9E8503254BEAAAEB23AD08285AF7\"\n            {\n            \"SourcePath\" = \"8:..\\\\DoomLauncher\\\\obj\\\\Debug\\\\DoomLauncher.exe\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_FBFCC08B40C94547A700104B2C2BD264\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"IsolateTo\" = \"8:\"\n            \"ProjectOutputGroupRegister\" = \"3:1\"\n            \"OutputConfiguration\" = \"8:\"\n            \"OutputGroupCanonicalName\" = \"8:Built\"\n            \"OutputProjectGuid\" = \"8:{938B529A-9AFD-4AE0-9F0F-5CB9527AD2F1}\"\n            \"ShowKeyOutput\" = \"11:TRUE\"\n                \"ExcludeFilters\"\n                {\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"UnitTest\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"UnitTest\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"2e593d49-b240-49be-9e9d-5dd1250eedf3\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "UnitTest/Resources/TestSteamInstall/config/libraryfolders.vdf",
    "content": "\"libraryfolders\"\n{\n\t\"0\"\n\t{\n\t\t\"irrelevantStuff\"\t\t\"blah\"\n\t\t\"path\"\t\t\"Resources\\\\TestSteamLibrary1\"\n\t\t\"apps\"\n\t\t{\n\t\t\t\"48700\"\t\t\"4947778366\"\n\t\t\t\"228980\"\t\t\"383082318\"\n\t\t}\n\t\t\"whatevs\"\t\t\"010101010\"\n\t}\n\t\"1\"\n\t{\n\t\t\"path\"\t\t\"Resources\\\\TestSteamLibrary2\"\n\t\t\"apps\"\n\t\t{\n\t\t\t\"70\"\t\t\"589449723\"\n\t\t\t\"220\"\t\t\"3831084326\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/appmanifest_2280.acf",
    "content": "\"AppState\"\n{\n\t\"blahblah\"\t\t\"123\"\n\t\"appid\"\t\t\"2280\"\n\t\"name\"\t\t\"DOOM + DOOM II\"\n\t\"installdir\"\t\t\"TestDoom\"\n\t\"irrelevantInfo\"\t\t\"99999998\"\n}\n"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/appmanifest_2390.acf",
    "content": "\"AppState\"\n{\n\t\"something\"\t\t\"xxx\"\n\t\"appid\"\t\t\"2390\"\n\t\"name\"\t\t\"Heretic\"\n\t\"installdir\"\t\t\"TestHeretic\"\n\t\"nonsense\"\t\t\"33333434\"\n}\n"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestDoom/base/doom.wad",
    "content": "doom.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestDoom/rerelease/doom2.wad",
    "content": "doom2.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestDoom/rerelease/id1.wad",
    "content": "id1.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestDoom/rerelease/masterlevels.wad",
    "content": "masterlevels.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestDoom/rerelease/nerve.wad",
    "content": "nerve.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestDoom/rerelease/plutonia.wad",
    "content": "plutonia.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestDoom/rerelease/sigil.wad",
    "content": "sigil.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestDoom/rerelease/tnt.wad",
    "content": "tnt.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary1/steamapps/common/TestHeretic/base/heretic.wad",
    "content": "heretic.wad"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary2/steamapps/appmanifest_2360.acf",
    "content": "\"AppState\"\n{\n\t\"ignoreme\"\t\t\"xxxxx\"\n\t\"appid\"\t\t\"2360\"\n\t\"name\"\t\t\"Hexen\"\n\t\"installdir\"\t\t\"TestHexen\"\n\t\"ignoremetoo\"\t\t\"yyy\"\n}\n"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary2/steamapps/appmanifest_2390.acf",
    "content": "\"AppState\"\n{\n\t\"something\"\t\t\"xxx\"\n\t\"appid\"\t\t\"2390\"\n\t\"name\"\t\t\"Heretic\"\n\t\"installdir\"\t\t\"TestHeretic\"\n\t\"nonsense\"\t\t\"33333434\"\n}\n"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary2/steamapps/common/TestHeretic/base/heretic.wad",
    "content": "heretic.wad (library2)"
  },
  {
    "path": "UnitTest/Resources/TestSteamLibrary2/steamapps/common/TestHexen/base/hexen.wad",
    "content": "hexen.wad"
  },
  {
    "path": "UnitTest/TestInit.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing DoomLauncher;\nusing UnitTest.Tests;\nusing System.IO;\n\nnamespace UnitTest\n{\n    [TestClass]\n    static class TestInit\n    {\n        [AssemblyInitialize()]\n        public static void TestInitialize(TestContext testContext)\n        {\n            DbDataSourceAdapter adapter = (DbDataSourceAdapter)TestUtil.CreateAdapter();\n\n            DataCache.Instance.Init(adapter);\n\n            VersionHandler versionHandler = new VersionHandler(adapter.DataAccess, adapter, new AppConfiguration(adapter));\n            versionHandler.HandleVersionUpdate();\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/Helpers/DirectoriesConfiguration.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.Config;\n\nnamespace UnitTest.Tests\n{\n    class DirectoriesConfiguration : IDirectoriesConfiguration\n    {\n        public LauncherPath GameFileDirectory { get; set; }\n\n        public LauncherPath ScreenshotDirectory { get; set; }\n\n        public LauncherPath SaveGameDirectory { get; set; }\n\n        public LauncherPath TempDirectory { get; set; }\n\n        public LauncherPath DemoDirectory { get; set; }\n\n        public LauncherPath ThumbnailDirectory { get; set; }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/Helpers/Tree.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace UnitTest.Tests\n{\n    public class Tree\n    {\n        public string Name { get; }\n\n        public byte[] Content { get; }\n\n        public string ContentString =>\n            Encoding.UTF7.GetString(Content);\n\n        public List<Tree> Children { get; }\n\n        public bool HasChildren => Children.Count > 0;\n\n        public Tree(string name, params Tree[] children) : this(name, name, children)\n        {\n\n        }\n\n        public Tree(string name, byte[] content, params Tree[] children)\n        {\n            Name = name;\n            Content = content;\n            Children = children.ToList();\n        }\n\n        public Tree(string name, string content, params Tree[] children)\n        {\n            Name = name;\n            Content = Encoding.UTF7.GetBytes(content);\n            Children = children.ToList();\n        }\n    }\n}"
  },
  {
    "path": "UnitTest/Tests/Helpers/TreeEntry.cs",
    "content": "﻿using DoomLauncher;\nusing System;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    public class TreeEntry : AbstractArchiveEntry\n    {\n        public Tree Tree { get; }\n\n        public TreeEntry(Tree tree)\n        {\n            Tree = tree;\n        }\n\n        public TreeReader GetTreeReader()\n        {\n            if (Tree.HasChildren)\n                return new TreeReader(Tree);\n            else\n                return null;\n        }\n\n        public override long Length => Tree.Content.Length;\n\n        public override string Name => Tree.Name;\n\n        public override string FullName => Name;\n\n        public override bool ExtractRequired => false;\n\n        public override bool IsDirectory => false;\n\n        public override void ExtractToFile(string file, bool overwrite = false)\n        {\n            throw new NotImplementedException();\n        }\n\n        public override string GetNameWithoutExtension() => Name;\n\n        public override void Read(byte[] buffer, int offset, int length)\n        {\n            Tree.Content.Take(buffer.Length).ToArray().CopyTo(buffer, offset);\n        }\n    }\n}"
  },
  {
    "path": "UnitTest/Tests/Helpers/TreeReader.cs",
    "content": "﻿using DoomLauncher;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    public class TreeReader : IArchiveReader\n    {\n        public static int TreeReadersCreated { get; set; }\n        public static int TreeReadersDisposed { get; set; }\n\n        public Tree Tree { get; }\n\n        public TreeReader(Tree tree)\n        {\n            Tree = tree;\n            TreeReadersCreated++;\n        }\n\n        public IEnumerable<IArchiveEntry> Entries =>\n            Tree.Children.Select(tree => new TreeEntry(tree));\n\n        public bool EntriesHaveExtensions => false;\n\n        public void Dispose()\n        {\n            TreeReadersDisposed++;\n        }\n    }\n}"
  },
  {
    "path": "UnitTest/Tests/TestArchives.cs",
    "content": "﻿using DoomLauncher;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestArchives\n    {\n        [DllImport(\"kernel32.dll\", BestFitMapping = false, ThrowOnUnmappableChar = true)]\n        public static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string fileName);\n\n        [TestMethod]\n        public void TestCompressedArchives()\n        {\n            string[] files = new string[] { \"archive.zip\", \"archive.rar\", \"archive.7z\" };\n            // Unit test architecture may not match so we have to check load failure\n            ArchiveReader.SetSevenZipInteropLibrary(Path.Combine(\"x64\", \"7z.dll\"));\n            if (LoadLibrary(ArchiveReader.SevenZipInteropLibrary) == IntPtr.Zero)\n                ArchiveReader.SetSevenZipInteropLibrary(Path.Combine(\"x86\", \"7z.dll\"));\n\n            foreach (string file in files)\n            {\n                using (IArchiveReader archive = ArchiveReader.Create(Path.Combine(\"Resources\", file)))\n                {\n                    List<IArchiveEntry> entries = archive.Entries.OrderBy(x => x.FullName).ToList();\n                    int index = 0;\n                    // .NET zip implementation doesn't include the first folder as an entry...\n                    if (archive is ZipArchiveReader)\n                    {\n                        Assert.AreEqual(5, entries.Count);\n                    }\n                    else\n                    {\n                        Assert.AreEqual(6, entries.Count);\n                        Assert.AreEqual(\"Folder/\", GetFullPath(entries[0]));\n                        Assert.IsTrue(entries[0].IsDirectory);\n                        index = 1;\n                    }\n\n                    Assert.AreEqual(\"Folder/SubFolder/\", GetFullPath(entries[index]));\n                    Assert.IsTrue(entries[index].IsDirectory);\n\n                    Assert.AreEqual(\"Folder/SubFolder/othertextfile.txt\", GetFullPath(entries[index + 1]));\n                    Assert.IsFalse(entries[index + 1].IsDirectory);\n\n                    Assert.AreEqual(\"Folder/switch.WAD\", GetFullPath(entries[index + 2]));\n                    Assert.IsFalse(entries[index + 2].IsDirectory);\n\n                    Assert.AreEqual(\"Folder/textfile.txt\", GetFullPath(entries[index + 3]));\n                    Assert.IsFalse(entries[index + 3].IsDirectory);\n\n                    Assert.AreEqual(\"mapinfo.txt\", GetFullPath(entries[index + 4]));\n                    Assert.IsFalse(entries[index + 4].IsDirectory);\n                }\n            }\n        }\n\n        private static string GetFullPath(IArchiveEntry entry)\n        {\n            string path = entry.FullName.Replace(\"\\\\\", \"/\");\n            if (entry.IsDirectory && !path.EndsWith(\"/\"))\n                path += \"/\";\n            return path;\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestAutomaticSteamCheck.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing DoomLauncher.GameStores;\nusing DoomLauncher;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.DataSources;\nusing System.Threading.Tasks;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestAutomaticSteamCheck\n    {\n        private IDataSourceAdapter database;\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = TestUtil.CreateAdapter();\n        }\n\n        [TestCleanup]\n        public void CleanDatabase()\n        {\n            var dataAccess = ((DbDataSourceAdapter)database).DataAccess;\n            dataAccess.ExecuteNonQuery(\"delete from GameFiles\");\n        }\n\n        [TestMethod]\n        public async Task AddGamesFromSteam_IgnoresWadsThatAreAlreadyThere()\n        {\n            // Already existing files\n            database.InsertGameFile(new GameFile() { FileName = @\"C:\\gamefiles\\doom.zip\" });\n            database.InsertGameFile(new GameFile() { FileName = \"sigil.wad\" });\n\n            var gameStoreFiles = new GameStoreFiles(\n                new List<string>() { @\"C:\\SteamLib1\\Ultimate Doom\\doom.wad\", @\"C:\\SteamLib1\\Ultimate Doom\\doom2.wad\" },\n                new List<string>() { @\"C:\\SteamLib1\\Ultimate Doom\\sigil.wad\", @\"C:\\SteamLib1\\Ultimate Doom\\id1.wad\" },\n                null);\n\n            var automaticSteamCheck = new AutomaticGameStoreCheck(() => gameStoreFiles, database);\n            List<string> loadedIwads = new List<string>();\n            List<string> loadedPwads = new List<string>();\n            string loadedDoom64Exe = null;\n\n            await automaticSteamCheck.LoadGamesFromGameStores(\n                async list => loadedIwads = list, \n                async list => loadedPwads = list,\n                async exe => loadedDoom64Exe = exe);\n\n            Assert.IsTrue(loadedIwads.Exists(file => file.Equals(@\"C:\\SteamLib1\\Ultimate Doom\\doom2.wad\")));\n            Assert.IsFalse(loadedIwads.Exists(file => file.Equals(@\"C:\\SteamLib1\\Ultimate Doom\\doom.wad\"))); // Already exists\n            Assert.IsTrue(loadedPwads.Exists(file => file.Equals(@\"C:\\SteamLib1\\Ultimate Doom\\id1.wad\")));\n            Assert.IsFalse(loadedPwads.Exists(file => file.Equals(@\"C:\\SteamLib1\\Ultimate Doom\\sigil.wad\"))); // Already exists\n        }\n\n        [TestMethod]\n        public async Task AddGamesFromSteam_DoesNothingIfNoIwads()\n        {\n            var gameStoreFiles = new GameStoreFiles(\n                new List<string>(), // No IWads\n                new List<string>() { @\"C:\\SteamLib1\\Ultimate Doom\\sigil.wad\" },\n                null);\n\n            var automaticSteamCheck = new AutomaticGameStoreCheck(() => gameStoreFiles, database);\n            bool didTheIwadThing = false;\n            bool didThePwadThing = false;\n            bool didTheDoom64Thing = false;\n\n            await automaticSteamCheck.LoadGamesFromGameStores(\n                async list => didTheIwadThing = true,\n                async list => didThePwadThing = true,\n                async exe => didTheDoom64Thing = true);\n\n            Assert.IsTrue(didThePwadThing);\n            Assert.IsFalse(didTheIwadThing);\n            Assert.IsFalse(didTheDoom64Thing);\n        }\n\n        [TestMethod]\n        public async Task AddGamesFromSteam_DoesNothingIfNoPwads()\n        {\n            // Steam library containing \"Ultimate Doom\"\n            var gameStoreFiles = new GameStoreFiles(\n                new List<string>() { @\"C:\\SteamLib1\\Ultimate Doom\\doom2.wad\" }, \n                new List<string>(),\n                null); // No PWads\n\n            var automaticSteamCheck = new AutomaticGameStoreCheck(() => gameStoreFiles, database);\n            bool didTheIwadThing = false;\n            bool didThePwadThing = false;\n            bool didTheDoom64Thing = false;\n\n            await automaticSteamCheck.LoadGamesFromGameStores(\n                async list => didTheIwadThing = true,\n                async list => didThePwadThing = true,\n                async exe => didTheDoom64Thing = true);\n\n            Assert.IsFalse(didThePwadThing);\n            Assert.IsTrue(didTheIwadThing);\n            Assert.IsFalse(didTheDoom64Thing);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestCldDemoParser.cs",
    "content": "﻿using DoomLauncher.Demo;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.IO;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestCldDemoParser\n    {\n        [TestMethod]\n        public void TestCldDemoParserFile()\n        {\n            string file = \"zandemo.cld\";\n            File.Copy(Path.Combine(\"Resources\", file), file, true);\n\n            IDemoParser parser = DemoUtil.GetDemoParser(file);\n\n            Assert.IsNotNull(parser);\n\n            string[] files = parser.GetRequiredFiles();\n            Assert.AreEqual(\"doom2.wad\", files[0]);\n            Assert.AreEqual(\"pyrrhic_.wad\", files[1]);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestCnDoomStats.cs",
    "content": "﻿using System;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing DoomLauncher;\nusing DoomLauncher.DataSources;\nusing System.IO;\nusing System.Collections.Generic;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestCnDoomStats\n    {\n        private readonly List<NewStatisticsEventArgs> m_args = new List<NewStatisticsEventArgs>();\n        [Ignore]\n        [TestMethod]\n        public void TestCnDoomStatFile()\n        {\n            string file = @\"                       Competition Doom 2.0.3.2\nZ_Init: Init zone memory allocation daemon. \nzone memory: 029C0020, 2000000 allocated for zone\nV_Init: allocate screens.\nM_LoadDefaults: Load system defaults.\nsaving config in default.cfg\nW_Init: Init WADfiles.\n adding C:\\DoomLauncher\\GameFiles\\Temp\\DOOM.WAD\n===========================================================================\n                           The Ultimate DOOM\n===========================================================================\n Competition Doom is free software, covered by the GNU General Public\n License.  There is NO warranty; not even for MERCHANTABILITY or FITNESS\n FOR A PARTICULAR PURPOSE. You are welcome to change and distribute\n copies under certain conditions. See the source for more information.\n===========================================================================\nI_Init: Setting up machine state.\nNET_Init: Init network subsystem.\nM_Init: Init miscellaneous info.\nR_Init: Init DOOM refresh daemon - ..........................\nP_Init: Init Playloop state.\nS_Init: Setting up sound.\nD_CheckNetGame: Checking network game status.\nstartskill 2  deathmatch: 0  startmap: 1  startepisode: 1\nplayer 1 of 1 (1 nodes)\nEmulating the behavior of the 'Ultimate Doom' executable.\nHU_Init: Setting up heads up display.\nST_Init: Init status bar.\nI_InitGraphics: Windowboxed (1280x960 within 1920x1080)\nI_InitStretchTables: Generating lookup tables....\nI_InitGraphics: Windowboxed (1280x960 within 1920x1080)\n\n### E1M1 ######################################\n#                                             #\n#   Time:  00:22.57       Kills:     3/6      #\n#  Items:     8/37      Secrets:     1/3      #\n#                                             #\n################### Total time: 00:00:22.57 ###\n\n### E1M2 ######################################\n#                                             #\n#   Time:  00:45.20       Kills:     4/41     #\n#  Items:     6/42      Secrets:     3/6      #\n#                                             #\n################### Total time: 00:01:07.77 ###\n\n### MAP11 #####################################\n#                                             #\n#   Time:  05:03.23       Kills:    82/71     #\n#  Items:    19/21      Secrets:     2/3      #\n#                                             #\n################### Total time: 00:05:03.23 ###\n\";\n\n            CNDoomStatsReader statsReader = new CNDoomStatsReader(new GameFile() { GameFileID = 1 }, \"stdout.txt\");\n            statsReader.NewStastics += StatsReader_NewStastics;\n            File.WriteAllText(\"stdout.txt\", file);\n            statsReader.ReadNow();\n\n            Assert.AreEqual(3, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"E1M1\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(3, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(6, m_args[0].Statistics.TotalKills);\n\n            Assert.AreEqual(8, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(37, m_args[0].Statistics.TotalItems);\n\n            Assert.AreEqual(1, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[0].Statistics.TotalSecrets);\n\n            Assert.AreEqual(22.57f, m_args[0].Statistics.LevelTime);\n\n            Assert.AreEqual(\"E1M2\", m_args[1].Statistics.MapName);\n            Assert.AreEqual(4, m_args[1].Statistics.KillCount);\n            Assert.AreEqual(41, m_args[1].Statistics.TotalKills);\n\n            Assert.AreEqual(6, m_args[1].Statistics.ItemCount);\n            Assert.AreEqual(42, m_args[1].Statistics.TotalItems);\n\n            Assert.AreEqual(3, m_args[1].Statistics.SecretCount);\n            Assert.AreEqual(6, m_args[1].Statistics.TotalSecrets);\n\n            Assert.AreEqual(45.20f, m_args[1].Statistics.LevelTime);\n\n            //Kill count should not exceed total\n            Assert.AreEqual(\"MAP11\", m_args[2].Statistics.MapName);\n            Assert.AreEqual(71, m_args[2].Statistics.KillCount);\n            Assert.AreEqual(71, m_args[2].Statistics.TotalKills);\n\n            Assert.AreEqual(19, m_args[2].Statistics.ItemCount);\n            Assert.AreEqual(21, m_args[2].Statistics.TotalItems);\n\n            Assert.AreEqual(2, m_args[2].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[2].Statistics.TotalSecrets);\n\n            Assert.AreEqual(303.23f, m_args[2].Statistics.LevelTime);\n        }\n\n        private void StatsReader_NewStastics(object sender, NewStatisticsEventArgs e)\n        {\n            m_args.Add(e);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestDirectoryAdapter.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestDirectoryAdapter\n    {\n        private static string s_testdir = \"TestAdapterDirectory\";\n\n        private static string[] s_testfilenames =\n            new string[]\n            {\n                \"test1.zip\",\n                \"file.zip\",\n                \"another_file.zip\",\n                \"doom_file.zip\",\n                \"doom_mod.zip\"\n            };\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            if (Directory.Exists(s_testdir))\n                Directory.Delete(s_testdir, true);\n            Directory.CreateDirectory(s_testdir);\n            Array.ForEach(s_testfilenames, x => CreateZip(x));\n        }\n\n        private static void CreateZip(string x)\n        {\n            using (var zip = ZipFile.Open(Path.Combine(s_testdir, x), ZipArchiveMode.Create))\n            {\n                zip.CreateEntry(\"file1.txt\");\n            }\n        }\n\n        [TestMethod]\n        public void TestFileCount()\n        {\n            DirectoryDataSourceAdapter adapter = CreateAdapter();\n            Assert.AreEqual(s_testfilenames.Length, adapter.GetGameFilesCount());\n        }\n\n        [TestMethod]\n        public void TestFileNames()\n        {\n            DirectoryDataSourceAdapter adapter = CreateAdapter();\n            var filenames = adapter.GetGameFileNames();\n\n            Assert.AreEqual(s_testfilenames.Length, filenames.Count());\n\n            foreach (var file in s_testfilenames)\n                Assert.IsTrue(filenames.Contains(file));\n        }\n\n        [TestMethod]\n        public void TestGetFiles()\n        {\n            DirectoryDataSourceAdapter adapter = CreateAdapter();\n            var gameFiles = adapter.GetGameFiles();\n\n            Assert.AreEqual(s_testfilenames.Length, gameFiles.Count());\n\n            foreach (var file in s_testfilenames)\n                Assert.IsNotNull(gameFiles.FirstOrDefault(x => x.FileName == file));\n        }\n\n        [TestMethod]\n        public void TestGetFile()\n        {\n            DirectoryDataSourceAdapter adapter = CreateAdapter();\n            var gameFile = adapter.GetGameFile(s_testfilenames[0]);\n\n            Assert.IsNotNull(gameFile);\n            Assert.AreEqual(s_testfilenames[0], gameFile.FileName);\n\n            gameFile = adapter.GetGameFile(\"garbagefile.zip\");\n            Assert.IsNull(gameFile);\n        }\n\n        [TestMethod]\n        public void TestGetFilesOptions()\n        {\n            DirectoryDataSourceAdapter adapter = CreateAdapter();\n            GameFileGetOptions options = new GameFileGetOptions(2); //limit is the only support option\n            var gameFiles = adapter.GetGameFiles(options);\n\n            Assert.AreEqual(2, gameFiles.Count());\n        }\n\n        [TestMethod]\n        public void TestDeleteFile()\n        {\n            DirectoryDataSourceAdapter adapter = CreateAdapter();\n\n            Assert.AreEqual(s_testfilenames.Length, adapter.GetGameFilesCount());\n\n            adapter.DeleteGameFile(new GameFile() { FileName = s_testfilenames[0] });\n            Assert.AreEqual(s_testfilenames.Length - 1, adapter.GetGameFilesCount());\n        }\n\n        private static DirectoryDataSourceAdapter CreateAdapter()\n        {\n            return new DirectoryDataSourceAdapter(new LauncherPath(s_testdir)); ;\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestDirectoryArchive.cs",
    "content": "﻿using DoomLauncher;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestDirectoryArchive\n    {\n        [TestMethod]\n        public void TestData()\n        {\n            string file = \"Directory.zip\";\n            TestUtil.CopyResourceFile(file);\n            ZipArchive za = ZipFile.OpenRead(file);\n            string dir = \"TestDirectory\";\n            if (Directory.Exists(dir))\n                Directory.Delete(dir, true);\n            za.ExtractToDirectory(dir);\n\n            DirectoryArchiveReader directoryArchive = new DirectoryArchiveReader(dir);\n            var entries = directoryArchive.Entries;\n\n            Assert.AreEqual(13, entries.Count());\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"map01.wad\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"map02.wad\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"map03.wad\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"map01.mid\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"map02.mid\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"map03.mid\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"tex1.png\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"tex2.png\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"tex3.png\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"sound1.wav\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"mapinfo.txt\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"sndinfo.txt\")));\n            Assert.IsNotNull(entries.FirstOrDefault(x => x.Name.Equals(\"textures.txt\")));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestDoom64SyncAction.cs",
    "content": "﻿using DoomLauncher.Interfaces;\nusing DoomLauncher;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing DoomLauncher.Handlers.Sync;\nusing DoomLauncher.DataSources;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestDoom64SyncAction\n    {\n        private IDataSourceAdapter database;\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = TestUtil.CreateAdapter();\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_IdentifiesDoom64FileFromMapInfo()\n        {\n            var syncAction = new Doom64SyncAction(database);\n            \n            GameFile file = new GameFile { GameFileID = 1 };\n            var mapInfoData = new string[] { \"classtype = something\" };\n\n            var result = syncAction.ApplyToGameFile(file, null, mapInfoData);\n\n            Assert.IsFalse(result.Failed);\n            Assert.IsTrue(file.IsDoom64);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_IdentifiesNonDoom64FileFromMapInfo()\n        {\n            var syncAction = new Doom64SyncAction(database);\n\n            GameFile file = new GameFile { GameFileID = 1 };\n            var mapInfoData = new string[] { \"somethingElse = something\" };\n\n            var result = syncAction.ApplyToGameFile(file, null, mapInfoData);\n\n            Assert.IsFalse(result.Failed);\n            Assert.IsFalse(file.IsDoom64);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_LinksDoom64GameFileWithDoom64IWad()\n        {\n            var syncAction = new Doom64SyncAction(database);\n            GameFile file = new GameFile { GameFileID = 1 };\n            var mapInfoData = new string[] { \"classtype = something\" };\n\n            IGameFile doom64IWad = database.GetGameFile(\"doom64.zip\");\n            if (doom64IWad != null)\n            {\n                database.DeleteGameFile(doom64IWad);\n            }\n            IGameFile newDoom64IWad = new GameFile { GameFileID = 777, FileName = \"doom64.zip\", IWadID = 666 };\n            database.InsertGameFile(newDoom64IWad);\n\n            var result = syncAction.ApplyToGameFile(file, null, mapInfoData);\n\n            Assert.IsFalse(result.Failed);\n            Assert.AreEqual(666, file.IWadID);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestDoom64TitlePicSyncAction.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Handlers.Sync;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.IO;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestDoom64TitlePicSyncAction\n    {\n        [TestMethod]\n        public void ApplyGameFile_FindsDoom64TitlePic()\n        {\n            var gameFile = new GameFile()\n            {\n                GameFileID = 11,\n                FileName = \"horizon.zip\"\n            };\n            var syncAction = new Doom64TitlePicSyncAction();\n            var reader = ArchiveReader.Create(Path.Combine(\"Resources\", \"doom64_with_titlepic.zip\"));\n\n            var result = syncAction.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.IsTrue(result.GetTitlePic(gameFile, out _));\n        }\n\n        [TestMethod]\n        public void ApplyGameFile_DoesntFindOtherImages()\n        {\n            var gameFile = new GameFile()\n            {\n                GameFileID = 44,\n                FileName = \"blah.zip\"\n            };\n            var syncAction = new Doom64TitlePicSyncAction();\n            var reader = ArchiveReader.Create(Path.Combine(\"Resources\", \"doom64_without_titlepic.zip\"));\n\n            var result = syncAction.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.IsFalse(result.GetTitlePic(gameFile, out _));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestDsgSave.cs",
    "content": "﻿using DoomLauncher.SaveGame;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestDsgSave\n    {\n        [TestMethod]\n        public void TestPrBoomSave()\n        {\n            string save1 = \"prboomsave1.dsg\";\n            TestUtil.CopyResourceFile(save1);\n\n            DsgSaveGameReader reader = new DsgSaveGameReader(save1);\n\n            Assert.AreEqual(\"NEW2\", reader.GetName());\n        }\n\n        [TestMethod]\n        public void TestChocolateDoomSave()\n        {\n            string save1 = \"chocosave1.dsg\";\n            TestUtil.CopyResourceFile(save1);\n\n            DsgSaveGameReader reader = new DsgSaveGameReader(save1);\n\n            Assert.AreEqual(\"CHOCOTESTTESTTESTTESTTE\", reader.GetName());\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestFile.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestFile\n    {\n        private IDataSourceAdapter database;\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = TestUtil.CreateAdapter();\n        }\n\n        [TestCleanup]\n        public void CleanDatabase()\n        {\n            var dataAccess = ((DbDataSourceAdapter)database).DataAccess;\n            dataAccess.ExecuteNonQuery(\"delete from Files\");\n        }\n\n        [TestMethod]\n        public void GetFiles_GameFile_ReturnsMatchingFiles()\n        {\n\n            var gameFileId = 37;\n\n            var file1 = \n                new FileData \n                {\n                    FileName = \"Rabbits.txt\",\n                    FileTypeID = FileType.SaveGame,\n                    FileOrder = 33,\n                    Description = \"Furry creatures\",\n                    DateCreated = DateTime.Parse(\"2/1/2018\"),\n                    GameFileID = gameFileId,\n                    SourcePortID = 2,\n                    OriginalFileName = \"Bunnies.txt\",\n                    OriginalFilePath = \"lagomorphs\\\\Bunnies.txt\",\n                    UserTitle = \"All about rabbits\",\n                    UserDescription = \"I didn't understand it\",\n                    Map = \"zzz\"\n                };\n\n            var file2 =\n                new FileData\n                {\n                    FileName = \"unreal.txt\",\n                    FileTypeID = FileType.TileImage,\n                    FileOrder = 2,\n                    Description = \"Tim Sweeney's revenge\",\n                    DateCreated = DateTime.Parse(\"5/6/1996\"),\n                    GameFileID = gameFileId,\n                    SourcePortID = 8,\n                    OriginalFileName = \"unrealio_dealio.txt\",\n                    OriginalFilePath = \"whynot\\\\unrealio_dealio.txt\",\n                    UserTitle = \"The truth about Unreal Tournament\",\n                    UserDescription = \"A gripping tale\",\n                    Map = \"aaa\"\n                };\n\n            var wrongFile =\n                new FileData\n                {\n                    FileName = \"wrong.txt\",\n                    FileTypeID = FileType.Unknown,\n                    FileOrder = 2,\n                    Description = \"Wrong file\",\n                    DateCreated = DateTime.Parse(\"1/7/1991\"),\n                    GameFileID = -1,\n                    SourcePortID = 9,\n                    OriginalFileName = \"wrongity_wrong.txt\",\n                    OriginalFilePath = \"bad\\\\wrongity_wrong.txt\",\n                    UserTitle = \"It's wrong\",\n                    UserDescription = \"Don't use this one\",\n                    Map = \"666\"\n                };\n\n            database.InsertFile(file1);\n            database.InsertFile(file2);\n            database.InsertFile(wrongFile);\n\n            var files = database.GetFiles(new GameFile { GameFileID = gameFileId });\n            Assert.AreEqual(2, files.Count());\n\n            var retrieved1 = files.Where(x => x.FileName.Equals(file1.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(file1, retrieved1, \"FileID\"));\n\n            var retrieved2 = files.Where(x => x.FileName.Equals(file2.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(file2, retrieved2, \"FileID\"));\n\n            Assert.AreEqual(0, files.Where(x => x.FileName.Equals(wrongFile.FileName)).Count());\n        }\n\n        [TestMethod]\n        public void GetFiles_GameFile_FileType_ReturnsMatchingFiles()\n        {\n            var gameFileId = 999;\n            FileType fileType = FileType.Thumbnail;\n\n            var file1 =\n                new FileData\n                {\n                    FileName = \"red.txt\",\n                    FileTypeID = fileType,\n                    FileOrder = 24,\n                    Description = \"A redulent color\",\n                    DateCreated = DateTime.Parse(\"9/3/2033\"),\n                    GameFileID = gameFileId,\n                    SourcePortID = 2,\n                    OriginalFileName = \"hongse.txt\",\n                    OriginalFilePath = \"colors\\\\hongse.txt\",\n                    UserTitle = \"It's another color\",\n                    UserDescription = \"Primary color, a bit angry\",\n                    Map = \"yyy\"\n                };\n\n            var wrongGameIdFile =\n                new FileData\n                {\n                    FileName = \"wrong.txt\",\n                    FileTypeID = fileType,\n                    FileOrder = 2,\n                    Description = \"Wrong file\",\n                    DateCreated = DateTime.Parse(\"1/7/1991\"),\n                    GameFileID = 444,\n                    SourcePortID = 9,\n                    OriginalFileName = \"wrongity_wrong.txt\",\n                    OriginalFilePath = \"bad\\\\wrongity_wrong.txt\",\n                    UserTitle = \"Wrong game ID\",\n                    UserDescription = \"Don't use this one\",\n                    Map = \"666\"\n                };\n\n            var wrongFileTypeFile =\n                new FileData\n                {\n                    FileName = \"false.txt\",\n                    FileTypeID = FileType.SaveGame,\n                    FileOrder = 3,\n                    Description = \"False, tricksy file\",\n                    DateCreated = DateTime.Parse(\"3/8/2000\"),\n                    GameFileID = gameFileId,\n                    SourcePortID = 8,\n                    OriginalFileName = \"this_aint_it.txt\",\n                    OriginalFilePath = \"incorrect\\\\this_aint_it.txt\",\n                    UserTitle = \"Wrong file type\",\n                    UserDescription = \"Absolutely not\",\n                    Map = \"667\"\n                };\n\n            database.InsertFile(file1);\n            database.InsertFile(wrongGameIdFile);\n            database.InsertFile(wrongFileTypeFile);\n\n            var files = database.GetFiles(new GameFile { GameFileID = gameFileId }, fileType);\n\n            Assert.AreEqual(1, files.Count());\n\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(file1, files.First(), \"FileID\"));\n        }\n\n        [TestMethod]\n        public void GetFiles_NoArgs_ReturnsAllFiles()\n        {\n            var file1 =\n                new FileData\n                {\n                    FileName = \"hippo.txt\",\n                    FileTypeID = FileType.Demo,\n                    FileOrder = 3,\n                    Description = \"river horse\",\n                    DateCreated = DateTime.Parse(\"6/9/2033\"),\n                    GameFileID = 555,\n                    SourcePortID = 2,\n                    OriginalFileName = \"hippopotamus.txt\",\n                    OriginalFilePath = \"animals\\\\hippopotamus.txt\",\n                    UserTitle = \"I like hippos\",\n                    UserDescription = \"They are very hungry\",\n                    Map = \"hjkl\"\n                };\n\n            var file2 =\n                new FileData\n                {\n                    FileName = \"giraffe.txt\",\n                    FileTypeID = FileType.Screenshot,\n                    FileOrder = 9,\n                    Description = \"long neck deer\",\n                    DateCreated = DateTime.Parse(\"1/1/1992\"),\n                    GameFileID = 553,\n                    SourcePortID = 6,\n                    OriginalFileName = \"giraffe_pattern.txt\",\n                    OriginalFilePath = \"animals\\\\giraffe_pattern.txt\",\n                    UserTitle = \"Long neck giraffe\",\n                    UserDescription = \"Why are their necks so long\",\n                    Map = \"aaa\"\n                };\n\n            database.InsertFile(file1);\n            database.InsertFile(file2);\n\n            var files = database.GetFiles();\n\n            Assert.AreEqual(2, files.Count());\n\n            var retrieved1 = files.Where(x => x.FileName.Equals(file1.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(file1, retrieved1, \"FileID\"));\n\n            var retrieved2 = files.Where(x => x.FileName.Equals(file2.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(file2, retrieved2, \"FileID\"));\n        }\n\n        [TestMethod]\n        public void GetFiles_FileType_ReturnsMatchingFiles()\n        {\n            var file1 =\n                new FileData\n                {\n                    FileName = \"cacodemon.txt\",\n                    FileTypeID = FileType.Demo,\n                    FileOrder = 1,\n                    Description = \"red floaty boi\",\n                    DateCreated = DateTime.Parse(\"1/2/2011\"),\n                    GameFileID = 236,\n                    SourcePortID = 2,\n                    OriginalFileName = \"caco.txt\",\n                    OriginalFilePath = \"monsters\\\\caco.txt\",\n                    UserTitle = \"The fanciest demon\",\n                    UserDescription = \"Three double shotty hits on a good day\",\n                    Map = \"yyy\"\n                };\n\n            var file2 =\n                new FileData\n                {\n                    FileName = \"imp.txt\",\n                    FileTypeID = FileType.Demo,\n                    FileOrder = 1,\n                    Description = \"brown fella\",\n                    DateCreated = DateTime.Parse(\"3/6/1998\"),\n                    GameFileID = 353,\n                    SourcePortID = 8,\n                    OriginalFileName = \"impy.txt\",\n                    OriginalFilePath = \"monsters\\\\impy.txt\",\n                    UserTitle = \"One shotty blast\",\n                    UserDescription = \"Two if you miss\",\n                    Map = \"yyy\"\n                };\n\n            var wrongFile =\n                new FileData\n                {\n                    FileName = \"oops.txt\",\n                    FileTypeID = FileType.Thumbnail,\n                    FileOrder = 8,\n                    Description = \"wrong file type\",\n                    DateCreated = DateTime.Parse(\"5/3/1997\"),\n                    GameFileID = 222,\n                    SourcePortID = 9,\n                    OriginalFileName = \"whoops.txt\",\n                    OriginalFilePath = \"ohno\\\\whoops.txt\",\n                    UserTitle = \"Very much the wrong one\",\n                    UserDescription = \"no way\",\n                    Map = \"www\"\n                };\n\n            database.InsertFile(file1);\n            database.InsertFile(file2);\n            database.InsertFile(wrongFile);\n\n            var files = database.GetFiles(FileType.Demo);\n\n            Assert.AreEqual(2, files.Count());\n\n            var retrieved1 = files.Where(x => x.FileName.Equals(file1.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(file1, retrieved1, \"FileID\"));\n\n            var retrieved2 = files.Where(x => x.FileName.Equals(file2.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(file2, retrieved2, \"FileID\"));\n        }\n\n        [TestMethod]\n        public void UpdateFile_UpdatesTheRightFieldsInTheRightFile()\n        {\n            var file1 =\n                new FileData\n                {\n                    FileName = \"pain_elemental.txt\",\n                    FileTypeID = FileType.SaveGame,\n                    FileOrder = 11,\n                    Description = \"brown caco\",\n                    DateCreated = DateTime.Parse(\"11/7/2004\"),\n                    GameFileID = 222,\n                    SourcePortID = 2,\n                    OriginalFileName = \"paine.txt\",\n                    OriginalFilePath = \"monsters\\\\paine.txt\",\n                    UserTitle = \"What if a demon shot more demons out of its mouth\",\n                    UserDescription = \"What if a pain elemental shot more pain elementals out of its mouth\",\n                    Map = \"s34\"\n                };\n\n            var wrongFile =\n                new FileData\n                {\n                    FileName = \"hellknight.txt\",\n                    FileTypeID = FileType.Screenshot,\n                    FileOrder = 2,\n                    Description = \"the cheapest monster\",\n                    DateCreated = DateTime.Parse(\"1/3/2007\"),\n                    GameFileID = 222,\n                    SourcePortID = 5,\n                    OriginalFileName = \"hk.txt\",\n                    OriginalFilePath = \"monsters\\\\hk.txt\",\n                    UserTitle = \"Change the color, ship it\",\n                    UserDescription = \"Deadlines are deadlines\",\n                    Map = \"ooo\"\n                };\n\n            database.InsertFile(file1);\n            database.InsertFile(wrongFile);\n\n            // Need to fetch so that the primary key is populated.\n            var savedFiles = database.GetFiles(new GameFile { GameFileID = 222 });\n            var savedFile1 = savedFiles.Where(x => x.FileName.Equals(file1.FileName)).First();\n\n            // Update every updatable field with new value\n            savedFile1.SourcePortID = 33;\n            savedFile1.Description = \"New Description\";\n            savedFile1.FileOrder = 44;\n            savedFile1.DateCreated = new DateTime(2011, 3, 2);\n            savedFile1.UserTitle = \"New UserTitle\";\n            savedFile1.UserDescription = \"New UserDescription\";\n            savedFile1.Map = \"New map\";\n            database.UpdateFile(savedFile1);\n\n            var updatedFiles = database.GetFiles(new GameFile { GameFileID = 222 });\n\n            // Values were updated in that record\n            var retrieved1 = updatedFiles.Where(x => x.FileID.Equals(savedFile1.FileID)).First();\n            Assert.AreEqual(file1.FileName, retrieved1.FileName);\n            Assert.AreEqual(33, retrieved1.SourcePortID);\n            Assert.AreEqual(\"New Description\", retrieved1.Description);\n            Assert.AreEqual(44, retrieved1.FileOrder);\n            Assert.AreEqual(new DateTime(2011, 3, 2), retrieved1.DateCreated);\n            Assert.AreEqual(\"New UserTitle\", retrieved1.UserTitle);\n            Assert.AreEqual(\"New UserDescription\", retrieved1.UserDescription);\n            Assert.AreEqual(\"New map\", retrieved1.Map);\n\n            // The other record was unaffected\n            var retrieved2 = updatedFiles.Where(x => x.FileName.Equals(wrongFile.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(wrongFile, retrieved2, \"FileID\"));\n        }\n\n        [TestMethod]\n        public void DeleteFile_FileID_DeletesJustThatFile()\n        {\n            var file1 =\n                new FileData\n                {\n                    FileName = \"chaingunner.txt\",\n                    FileTypeID = FileType.Demo,\n                    FileOrder = 5,\n                    Description = \"Bastard hitscanner\",\n                    DateCreated = DateTime.Parse(\"7/11/2006\"),\n                    GameFileID = 123,\n                    SourcePortID = 9,\n                    OriginalFileName = \"chaingun_dude.txt\",\n                    OriginalFilePath = \"monsters\\\\chaingun_dude.txt\",\n                    UserTitle = \"I hate this guy\",\n                    UserDescription = \"Kill them kill them\",\n                    Map = \"E1M2\"\n                };\n\n            var wrongFile =\n                new FileData\n                {\n                    FileName = \"wrongo.txt\",\n                    FileTypeID = FileType.TileImage,\n                    FileOrder = 99,\n                    Description = \"Something else\",\n                    DateCreated = DateTime.Parse(\"11/7/1921\"),\n                    GameFileID = 123,\n                    SourcePortID = 88,\n                    OriginalFileName = \"nope.txt\",\n                    OriginalFilePath = \"bad\\\\nope.txt\",\n                    UserTitle = \"Yeah nah\",\n                    UserDescription = \"Womp womp womp\",\n                    Map = \"555\"\n                };\n\n            database.InsertFile(file1);\n            database.InsertFile(wrongFile);\n\n            // Need to fetch so that the primary key is populated.\n            var savedFiles = database.GetFiles();\n            var savedFile1 = savedFiles.Where(x => x.FileName.Equals(file1.FileName)).First();\n\n            database.DeleteFile(savedFile1);\n\n            var files = database.GetFiles();\n\n            Assert.AreEqual(1, files.Count());\n            Assert.AreEqual(wrongFile.FileName, files.First().FileName);\n        }\n\n        [TestMethod]\n        public void DeleteFile_GameFileID_DeletesMatchingFiles()\n        {\n            var file1 =\n                new FileData\n                {\n                    FileName = \"pinky_demon.txt\",\n                    FileTypeID = FileType.Thumbnail,\n                    FileOrder = 8,\n                    Description = \"oink\",\n                    DateCreated = DateTime.Parse(\"04/06/2008\"),\n                    GameFileID = 777,\n                    SourcePortID = 9,\n                    OriginalFileName = \"pinky.txt\",\n                    OriginalFilePath = \"monsters\\\\pinky.txt\",\n                    UserTitle = \"Should be called piggy demon am I right\",\n                    UserDescription = \"Use a rocket for the dumbest suicide imaginable\",\n                    Map = \"E1M3\"\n                };\n\n            var file2 =\n                new FileData\n                {\n                    FileName = \"revenant.txt\",\n                    FileTypeID = FileType.SaveGame,\n                    FileOrder = 10,\n                    Description = \"evil bastard\",\n                    DateCreated = DateTime.Parse(\"1/1/2014\"),\n                    GameFileID = 777,\n                    SourcePortID = 8,\n                    OriginalFileName = \"rev.txt\",\n                    OriginalFilePath = \"monsters\\\\rev.txt\",\n                    UserTitle = \"Awful horrible demon\",\n                    UserDescription = \"Kill it before it kills you\",\n                    Map = \"E2M4\"\n                };\n\n            var wrongFile =\n                new FileData\n                {\n                    FileName = \"wrongy.txt\",\n                    FileTypeID = FileType.Demo,\n                    FileOrder = 99,\n                    Description = \"Naaaah\",\n                    DateCreated = DateTime.Parse(\"7/2/1933\"),\n                    GameFileID = 11,\n                    SourcePortID = 60,\n                    OriginalFileName = \"bah.txt\",\n                    OriginalFilePath = \"bad\\\\bah.txt\",\n                    UserTitle = \"bah humbug\",\n                    UserDescription = \"Don't pick me\",\n                    Map = \"MAP04\"\n                };\n\n            database.InsertFile(file1);\n            database.InsertFile(file2);\n            database.InsertFile(wrongFile);\n\n            database.DeleteFile(new GameFile { GameFileID = 777 });\n\n            var files = database.GetFiles();\n\n            Assert.AreEqual(1, files.Count());\n            Assert.AreEqual(wrongFile.FileName, files.First().FileName);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestFileDetector.cs",
    "content": "﻿using DoomLauncher;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.IO;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestFileDetector\n    {\n        private NewFileDetector m_detector;\n        private static string s_testFileDir = \"testfiles\";\n\n        [TestInitialize]\n        public void Init()\n        {\n            m_detector = new NewFileDetector(new string[] { \".zds\", \".dsg\" }, s_testFileDir);\n\n            if (Directory.Exists(s_testFileDir))\n                Directory.Delete(s_testFileDir, true);\n\n            Directory.CreateDirectory(s_testFileDir);\n        }\n\n        [TestCleanup]\n        public void Cleanup()\n        {\n            Directory.Delete(s_testFileDir, true);\n        }\n\n        private static void CreateTestFile(string filename)\n        {\n            File.WriteAllText(Path.Combine(s_testFileDir, filename), string.Empty);\n        }\n\n        private static void UpdateTestFile(string filename)\n        {\n            File.WriteAllText(Path.Combine(s_testFileDir, filename), \"test\");\n        }\n\n        private static void DeleteTestFile(string filename)\n        {\n            File.Delete(Path.Combine(s_testFileDir, filename));\n        }\n\n        private static bool ContainsFile(string[] filenames, string filename)\n        {\n            return filenames.Any(x => Path.GetFileName(x) == filename);\n        }\n\n        [TestMethod]\n        public void TestEmpty()\n        {\n            m_detector.StartDetection();\n\n            Assert.AreEqual(0, m_detector.GetNewFiles().Length);\n            Assert.AreEqual(0, m_detector.GetModifiedFiles().Length);\n        }\n\n        [TestMethod]\n        public void TestNew()\n        {\n            m_detector.StartDetection();\n\n            CreateTestFile(\"test1.zds\");\n\n            Assert.AreEqual(1, m_detector.GetNewFiles().Length);\n            Assert.IsTrue(ContainsFile(m_detector.GetNewFiles(), \"test1.zds\"));\n\n            CreateTestFile(\"test1.dsg\");\n\n            Assert.AreEqual(2, m_detector.GetNewFiles().Length);\n            Assert.IsTrue(ContainsFile(m_detector.GetNewFiles(), \"test1.dsg\"));\n        }\n\n        [TestMethod]\n        public void TestNewWithExisting()\n        {\n            CreateTestFile(\"test1.zds\");\n            CreateTestFile(\"test1.dsg\");\n\n            m_detector.StartDetection();\n\n            Assert.AreEqual(0, m_detector.GetNewFiles().Length);\n            Assert.AreEqual(0, m_detector.GetModifiedFiles().Length);\n\n            CreateTestFile(\"test2.zds\");\n\n            Assert.AreEqual(1, m_detector.GetNewFiles().Length);\n            Assert.IsTrue(ContainsFile(m_detector.GetNewFiles(), \"test2.zds\"));\n        }\n\n        [Ignore]\n        [TestMethod]\n        public void TestModified()\n        {\n            CreateTestFile(\"test1.zds\");\n            CreateTestFile(\"test1.dsg\");\n\n            m_detector.StartDetection();\n\n            UpdateTestFile(\"test1.zds\");\n            Assert.AreEqual(0, m_detector.GetNewFiles().Length);\n            Assert.AreEqual(1, m_detector.GetModifiedFiles().Length);\n            Assert.IsTrue(ContainsFile(m_detector.GetModifiedFiles(), \"test1.zds\"));\n\n            CreateTestFile(\"test2.zds\");\n            UpdateTestFile(\"test1.dsg\");\n\n            Assert.AreEqual(1, m_detector.GetNewFiles().Length);\n            Assert.AreEqual(2, m_detector.GetModifiedFiles().Length);\n            Assert.IsTrue(ContainsFile(m_detector.GetModifiedFiles(), \"test1.dsg\"));\n            Assert.IsTrue(ContainsFile(m_detector.GetNewFiles(), \"test2.zds\"));\n        }\n\n        [TestMethod]\n        public void TestDelete()\n        {\n            CreateTestFile(\"test1.zds\");\n            CreateTestFile(\"test1.dsg\");\n\n            m_detector.StartDetection();\n            Assert.AreEqual(0, m_detector.GetNewFiles().Length);\n\n            DeleteTestFile(\"test1.zds\");\n            Assert.AreEqual(1, m_detector.GetDeletedFiles().Length);\n            Assert.IsTrue(ContainsFile(m_detector.GetDeletedFiles(), \"test1.zds\"));\n\n            DeleteTestFile(\"test1.dsg\");\n            Assert.AreEqual(2, m_detector.GetDeletedFiles().Length);\n            Assert.IsTrue(ContainsFile(m_detector.GetDeletedFiles(), \"test1.dsg\"));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestGameConfSyncAction.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Handlers.Sync;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestGameConfSyncAction\n    {\n        private DbDataSourceAdapter database;\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = (DbDataSourceAdapter)TestUtil.CreateAdapter();\n        }\n\n        [TestCleanup]\n        public void Cleanup()\n        {\n            database.DataAccess.ExecuteNonQuery(\"delete from IWads\");\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_SetsTitle()\n        {\n            GameFile gameFile = new GameFile \n            { \n                GameFileID = 1,\n                Title = \"Wrong Title\",\n            };\n\n            Tree files = new Tree(\"root\", new Tree(\"GAMECONF\", \n                \"{\\\"data\\\": { \\\"title\\\": \\\"Bingo Bongo\\\" }} \"));\n            var reader = new TreeReader(files);\n            var action = new GameConfSyncAction(database);\n\n            action.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.AreEqual(\"Bingo Bongo\", gameFile.Title);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_SetsAuthor()\n        {\n            GameFile gameFile = new GameFile\n            {\n                GameFileID = 1,\n                Author = \"Wrong Author\",\n            };\n\n            Tree files = new Tree(\"root\", new Tree(\"GAMECONF\",\n                \"{\\\"data\\\": { \\\"author\\\": \\\"Bob the Dog\\\" }} \"));\n            var reader = new TreeReader(files);\n            var action = new GameConfSyncAction(database);\n\n            action.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.AreEqual(\"Bob the Dog\", gameFile.Author);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_SetsDescription()\n        {\n            GameFile gameFile = new GameFile\n            {\n                GameFileID = 1,\n                Description = \"Wrong Description\",\n            };\n\n            Tree files = new Tree(\"root\", new Tree(\"GAMECONF\",\n                \"{\\\"data\\\": { \\\"description\\\": \\\"A fancy dog.\\\" }} \"));\n            var reader = new TreeReader(files);\n            var action = new GameConfSyncAction(database);\n\n            action.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.AreEqual(\"A fancy dog.\", gameFile.Description);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_SetsIwad()\n        {\n            GameFile gameFile = new GameFile\n            {\n                GameFileID = 1,\n            };\n\n            database.InsertIWad(new IWadData { Name = \"doom2.zip\" });\n            var iwadId = database.GetIWads().FirstOrDefault(x => x.Name == \"doom2.zip\").IWadID;\n\n            Tree files = new Tree(\"root\", new Tree(\"GAMECONF\",\n                \"{\\\"data\\\": { \\\"iwad\\\": \\\"doom2.wad\\\" }} \"));\n            var reader = new TreeReader(files);\n            var action = new GameConfSyncAction(database);\n\n            action.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.AreEqual(iwadId, gameFile.IWadID);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_IgnoresAbsentGAMECONF()\n        {\n            GameFile gameFile = new GameFile\n            {\n                GameFileID = 1,\n                Title = \"Old Title\",\n            };\n\n            Tree files = new Tree(\"root\", new Tree(\"WADINFO\",\n                \"{\\\"data\\\": { \\\"title\\\": \\\"Eviternity\\\" }} \"));\n            var reader = new TreeReader(files);\n            var action = new GameConfSyncAction(database);\n\n            action.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.AreEqual(\"Old Title\", gameFile.Title);\n        }\n\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestGameFile.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Newtonsoft.Json.Converters;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestGameFile\n    {\n        private IDataSourceAdapter database;\n\n        private GameFile CreateGameFile(string filename, int salt)\n        {\n            DateTime dt = DateTime.Parse(\"1/1/17\");\n\n            GameFile gameFile = new GameFile\n            {\n                FileName = filename,\n                Author = \"the author\" + salt,\n                Description = \"the description\" + salt,\n                Title = \"the title\" + salt,\n                Comments = \"the comments\" + salt,\n                ReleaseDate = dt,\n                Downloaded = dt,\n                LastPlayed = dt,\n                IWadID = 22 + salt,\n                Rating = 33 + salt,\n                MinutesPlayed = 44 + salt,\n                MapCount = 55 + salt,\n                SourcePortID = 66 + salt,\n                SettingsExtraParams = \"the extra params\" + salt,\n                SettingsFiles = \"the settings files\" + salt,\n                SettingsFilesIWAD = \"the settings files iwad\" + salt,\n                SettingsFilesSourcePort = \"the settings files source port\" + salt,\n                SettingsMap = \"the settings map\" + salt,\n                SettingsSkill = \"the settings skill\" + salt,\n                SettingsSpecificFiles = \"the settings specific files\" + salt,\n                SettingsGameProfileID = 567 + salt\n            };\n\n            return gameFile;\n        }\n\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = TestUtil.CreateAdapter();\n        }\n\n        [TestCleanup]\n        public void CleanDatabase()\n        {\n            var dataAccess = ((DbDataSourceAdapter)database).DataAccess;\n            dataAccess.ExecuteNonQuery(\"delete from GameFiles\");\n        }\n\n        [TestMethod]\n        public void GetGameFiles_ReturnsAllGameFiles ()\n        {\n            var gameFile1 = new GameFile\n            {\n                FileName = \"cacodemon.png\",\n                Author = \"John Romero\",\n                Description = \"Red ball of fury\",\n                Title = \"Cacodemon image\",\n                Comments = \"Hi res\",\n                ReleaseDate = DateTime.Parse(\"2/1/2018\"),\n                Downloaded = DateTime.Parse(\"3/5/2024\"),\n                LastPlayed = DateTime.Parse(\"4/5/2024\"),\n                IWadID = 9,\n                Rating = 4,\n                MinutesPlayed = 55,\n                MapCount = 4,\n                SourcePortID = 3,\n                SettingsExtraParams = \"extra\",\n                SettingsFiles = \"settings file\",\n                SettingsFilesIWAD = \"settings file iwad\",\n                SettingsFilesSourcePort = \"settings file sp\",\n                SettingsMap = \"settings map\",\n                SettingsSkill = \"settings skill\",\n                SettingsSpecificFiles = \"ssf\",\n                SettingsGameProfileID = 44\n            };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile\n            {\n                FileName = \"baron.png\",\n                Author = \"Bobby Prince\",\n                Description = \"tough but fair\",\n                Title = \"Baron of Hell\",\n                Comments = \"Made from clay models\",\n                ReleaseDate = null,\n                Downloaded = null,\n                LastPlayed = null,\n                IWadID = null,\n                Rating = null,\n                MinutesPlayed = 4,\n                MapCount = null,\n                SourcePortID = null,\n                SettingsExtraParams = \"aaa\",\n                SettingsFiles = \"bbb\",\n                SettingsFilesIWAD = \"ccc\",\n                SettingsFilesSourcePort = \"ddd\",\n                SettingsMap = \"eee\",\n                SettingsSkill = \"fff\",\n                SettingsSpecificFiles = \"ggg\",\n                SettingsGameProfileID = null\n            };\n            database.InsertGameFile(gameFile2);\n\n            var gameFiles = database.GetGameFiles();\n\n            Assert.AreEqual(gameFiles.Count(), 2);\n            Assert.AreEqual(database.GetGameFiles().Count(), 2);\n            Assert.AreEqual(database.GetGameFilesCount(), 2);\n            Assert.AreEqual(database.GetGameFileNames().Count(), 2);\n\n            var retrieved1 = gameFiles.Where(x => x.FileName.Equals(gameFile1.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(gameFile1, retrieved1, \"GameFileID\"));\n\n            var retrieved2 = gameFiles.Where(x => x.FileName.Equals(gameFile2.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(gameFile2, retrieved2, \"GameFileID\"));\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Options_ReturnsTheSpecifiedFields()\n        {\n            var gameFile1 = CreateGameFile(\"keen.zip\", 0);\n            gameFile1.Map = \"Dangerous Dave\";\n            database.InsertGameFile(gameFile1);\n\n            var fields = new GameFileFieldType[] \n            { \n                GameFileFieldType.Filename, \n                GameFileFieldType.Map \n            };\n\n            var options = new GameFileGetOptions(fields);\n\n            var gameFiles = database.GetGameFiles(options);\n            Assert.AreEqual(1, gameFiles.Count());\n\n            var retrievedGameFile1 = gameFiles.First();\n            Assert.AreEqual(\"\", retrievedGameFile1.Description);\n            Assert.IsNull(retrievedGameFile1.Rating);\n            Assert.AreEqual(gameFile1.FileName, retrievedGameFile1.FileName);\n            Assert.AreEqual(gameFile1.Map, retrievedGameFile1.Map);\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Options_ReturnsMatching()\n        {\n            var gameFile1 = CreateGameFile(\"dukenukem.zip\", 1);\n            gameFile1.Rating = 5;\n            gameFile1.Comments = \"righto!!!\";\n            database.InsertGameFile(gameFile1);\n\n            var wrongGameFile = CreateGameFile(\"jazzjackrabbit.zip\", 2);\n            database.InsertGameFile(wrongGameFile);\n\n            var options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.Filename, \"dukenukem.zip\"));\n\n            var retrievedGameFiles = database.GetGameFiles(options);\n\n            Assert.AreEqual(1, retrievedGameFiles.Count());\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(gameFile1, retrievedGameFiles.First(), \"GameFileID\"));\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Options_ReturnsLike()\n        {\n            var gameFile1 = CreateGameFile(\"banana.zip\", 3);\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = CreateGameFile(\"banano.zip\", 4);\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = CreateGameFile(\"zanany.zip\", 5);\n            database.InsertGameFile(gameFile3);\n\n            var wrongGameFile = CreateGameFile(\"cucumber.zip\", 6);\n            database.InsertGameFile(wrongGameFile);\n\n            var options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.Filename, GameFileSearchOp.Like, \"%anan%\"));\n\n            var retrievedGameFiles = database.GetGameFiles(options);\n\n            Assert.AreEqual(3, retrievedGameFiles.Count());\n\n            var retrievedGameFile1 = retrievedGameFiles.Where(x => x.FileName.Equals(gameFile1.FileName)).FirstOrDefault();\n            Assert.IsNotNull(retrievedGameFile1);\n\n            var retrievedGameFile2 = retrievedGameFiles.Where(x => x.FileName.Equals(gameFile2.FileName)).FirstOrDefault();\n            Assert.IsNotNull(retrievedGameFile2);\n\n            var retrievedGameFile3 = retrievedGameFiles.Where(x => x.FileName.Equals(gameFile3.FileName)).FirstOrDefault();\n            Assert.IsNotNull(retrievedGameFile3);\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Options_ReturnsNotMatching()\n        {\n            var gameFile1 = CreateGameFile(\"batman.zip\", 7);\n            gameFile1.Comments = \"b\";\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = CreateGameFile(\"robin.zip\", 8);\n            gameFile2.Comments = \"r\";\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = CreateGameFile(\"joker.zip\", 9);\n            gameFile3.Comments = \"j\";\n            database.InsertGameFile(gameFile3);\n\n            var options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.Comments, GameFileSearchOp.NotEqual, \"r\"));\n            var retrievedGameFiles = database.GetGameFiles(options);\n\n            Assert.AreEqual(2, retrievedGameFiles.Count());\n\n            var retrievedGameFile1 = retrievedGameFiles.Where(x => x.FileName.Equals(gameFile1.FileName)).FirstOrDefault();\n            Assert.IsNotNull(retrievedGameFile1);\n\n            var retrievedGameFile3 = retrievedGameFiles.Where(x => x.FileName.Equals(gameFile3.FileName)).FirstOrDefault();\n            Assert.IsNotNull(retrievedGameFile3);\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Options_ReturnsLessThan()\n        {\n            var gameFile1 = CreateGameFile(\"harpo.zip\", 10);\n            gameFile1.Rating = 1;\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = CreateGameFile(\"groucho.zip\", 11);\n            gameFile2.Rating = 2;\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = CreateGameFile(\"chico.zip\", 12);\n            gameFile3.Rating = 3;\n            database.InsertGameFile(gameFile3);\n\n            var options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.Rating, GameFileSearchOp.LessThan, \"3\"));\n            var retrievedGameFiles = database.GetGameFiles(options);\n\n            Assert.AreEqual(2, retrievedGameFiles.Count());\n\n            var retrievedGameFile1 = retrievedGameFiles.Where(x => x.FileName.Equals(gameFile1.FileName)).FirstOrDefault();\n            Assert.IsNotNull(retrievedGameFile1);\n\n            var retrievedGameFile2 = retrievedGameFiles.Where(x => x.FileName.Equals(gameFile2.FileName)).FirstOrDefault();\n            Assert.IsNotNull(retrievedGameFile2);\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Options_ReturnsGreaterThan()\n        {\n            var gameFile1 = CreateGameFile(\"green.zip\", 13);\n            gameFile1.MapCount = 5;\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = CreateGameFile(\"blue.zip\", 14);\n            gameFile2.MapCount = 6;\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = CreateGameFile(\"red.zip\", 15);\n            gameFile3.MapCount = null;\n            database.InsertGameFile(gameFile3);\n\n            var options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.MapCount, GameFileSearchOp.GreaterThan, \"5\"));\n            var retrievedGameFiles = database.GetGameFiles(options);\n\n            Assert.AreEqual(1, retrievedGameFiles.Count());\n\n            var retrievedGameFile2 = retrievedGameFiles.Where(x => x.FileName.Equals(gameFile2.FileName)).FirstOrDefault();\n            Assert.AreEqual(gameFile2.FileName, \"blue.zip\");\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Options_ReturnsMatchingWithSelectedFields()\n        {\n            var gameFile1 = CreateGameFile(\"doomslayer.zip\", 16);\n            gameFile1.Map = \"E1M1\";\n            gameFile1.Author = \"Adrian Carmack\";\n            database.InsertGameFile(gameFile1);\n\n            var wrongGameFile = CreateGameFile(\"animalcrossing.zip\", 16);\n            database.InsertGameFile(wrongGameFile);\n\n            var fields = new GameFileFieldType[]\n            {\n                GameFileFieldType.Map,\n                GameFileFieldType.Author\n            };\n\n            var options = new GameFileGetOptions(fields, new GameFileSearchField(GameFileFieldType.Filename, \"doomslayer.zip\"));\n\n            var retrievedGameFiles = database.GetGameFiles(options);\n\n            Assert.AreEqual(1, retrievedGameFiles.Count());\n\n            var retrievedGameFile1 = retrievedGameFiles.First();\n            Assert.AreEqual(gameFile1.Map, retrievedGameFile1.Map);\n            Assert.AreEqual(gameFile1.Author, retrievedGameFile1.Author);\n        }\n\n        [TestMethod]\n        public void GetGameFile_ReturnsGameFileWithMatchingFilename()\n        {\n            var gameFile1 = CreateGameFile(\"blah.zip\", 17);\n            database.InsertGameFile(gameFile1);\n\n            var wrongGameFile = CreateGameFile(\"wrongwrongwrong.zip\", 18);\n            database.InsertGameFile(wrongGameFile);\n\n            var retrievedGameFile = database.GetGameFile(\"blah.zip\");\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(gameFile1, retrievedGameFile, \"GameFileID\"));\n        }\n\n        [TestMethod]\n        public void UpdateGameFile_UpdatesFields()\n        {\n            var gameFile1 = CreateGameFile(\"explosion.zip\", 20);\n            database.InsertGameFile(gameFile1);\n\n            var wrongGameFile = CreateGameFile(\"notme.zip\", 21);\n            database.InsertGameFile(wrongGameFile);\n\n            var savedGameFile1 = database.GetGameFile(\"explosion.zip\");\n            savedGameFile1.Comments = \"Hi\";\n            savedGameFile1.Description = \"Good stuff\";\n            savedGameFile1.MinutesPlayed = 444;\n\n            database.UpdateGameFile(savedGameFile1);\n\n            var retrievedGameFile1 = database.GetGameFile(\"explosion.zip\");\n            Assert.IsTrue(TestUtil.AllFieldsEqual(savedGameFile1, retrievedGameFile1));\n\n            var retrievedWrongGameFile = database.GetGameFile(\"notme.zip\");\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(wrongGameFile, retrievedWrongGameFile, \"GameFileID\"));\n        }\n\n        [TestMethod]\n        public void UpdateGameFile_UpdatesOnlySpecifiedFields()\n        {\n            var gameFile1 = CreateGameFile(\"rabbit.zip\", 22);\n            gameFile1.Comments = \"Don't update this\";\n            gameFile1.Description = \"Update me\";\n            database.InsertGameFile(gameFile1);\n\n            var wrongGameFile = CreateGameFile(\"incorrect.zip\", 23);\n            database.InsertGameFile(wrongGameFile);\n\n            var savedGameFile1 = database.GetGameFile(\"rabbit.zip\");\n            savedGameFile1.Description = \"The new value\";\n            savedGameFile1.Comments = \"Should be ignored\";\n\n            database.UpdateGameFile(savedGameFile1, new GameFileFieldType[] { GameFileFieldType.Description });\n\n            var retrievedGameFile1 = database.GetGameFile(\"rabbit.zip\");\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(gameFile1, retrievedGameFile1, \"Description\", \"GameFileID\"));\n            Assert.AreEqual(\"The new value\", retrievedGameFile1.Description);\n\n            var retrievedWrongGameFile = database.GetGameFile(\"incorrect.zip\");\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(wrongGameFile, retrievedWrongGameFile, \"GameFileID\"));\n        }\n\n        [TestMethod]\n        public void DeleteGameFile_DeletesExistingGameFile()\n        {\n            var gameFile1 = CreateGameFile(\"deleteme.zip\", 24);\n            database.InsertGameFile(gameFile1);\n\n            var wrongGameFile = CreateGameFile(\"keepme.zip\", 25);\n            database.InsertGameFile(wrongGameFile);\n\n            var savedGameFile1 = database.GetGameFile(\"deleteme.zip\");\n\n            database.DeleteGameFile(savedGameFile1);\n\n            var retrievedGameFiles = database.GetGameFiles();\n\n            Assert.AreEqual(1, retrievedGameFiles.Count());\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(wrongGameFile, retrievedGameFiles.First(), \"GameFileID\"));\n        }\n\n        [TestMethod]\n        public void UpdateGameFile_UpdatesConditionally()\n        {\n            var gameFile1 = CreateGameFile(\"right1.zip\", 26);\n            gameFile1.Author = \"Michael Abrash\";\n            gameFile1.Comments = \"replace me\";\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = CreateGameFile(\"right2.zip\", 27);\n            gameFile2.Author = \"Michael Abrash\";\n            gameFile2.Comments = \"replace me too\";\n            database.InsertGameFile(gameFile2);\n\n            var wrongGameFile = CreateGameFile(\"wrongo.zip\", 28);\n            wrongGameFile.Author = \"Scott Miller\";\n            wrongGameFile.Comments = \"don't replace me\";\n            database.InsertGameFile(wrongGameFile);\n\n            //Note: This function is only used in SourcePortViewForm.cs\n            database.UpdateGameFiles(GameFileFieldType.Author, GameFileFieldType.Comments, \"Michael Abrash\", \"The new comments\");\n\n            var retrievedGameFile1 = database.GetGameFile(\"right1.zip\");\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(gameFile1, retrievedGameFile1, \"GameFileID\", \"Comments\"));\n            Assert.AreEqual(\"The new comments\", retrievedGameFile1.Comments);\n\n            var retrievedGameFile2 = database.GetGameFile(\"right2.zip\");\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(gameFile2, retrievedGameFile2, \"GameFileID\", \"Comments\"));\n            Assert.AreEqual(\"The new comments\", retrievedGameFile2.Comments);\n\n            var retrievedWrongGameFile = database.GetGameFile(\"wrongo.zip\");\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(wrongGameFile, retrievedWrongGameFile, \"GameFileID\"));\n        }\n\n        [TestMethod]\n        public void ArchiveExists_RecognisesManagedGameFiles()\n        {\n            var gameFilesPath = new LauncherPath(\"GameFiles\");\n\n            var madeUpGameFile = CreateGameFile(\"madeup.zip\", 14);\n            Assert.IsFalse(madeUpGameFile.IsUnmanaged());\n            Assert.IsFalse(madeUpGameFile.ArchiveExists(gameFilesPath));\n\n            var gameFileInArchive = CreateGameFile(\"realthing.zip\", 77);\n            File.Create(Path.Combine(gameFilesPath.GetFullPath(), \"realthing.zip\")).Close();\n\n            Assert.IsFalse(gameFileInArchive.IsUnmanaged());\n            Assert.IsTrue(gameFileInArchive.ArchiveExists(gameFilesPath));\n        }\n\n        [TestMethod]\n        public void ArchiveExists_RecognisesUnmanagedGameFiles()\n        {\n            var gameFilesPath = new LauncherPath(\"GameFiles\");\n            var resourcesPath = new LauncherPath(\"Resources\");\n\n            var madeUpGameFile = CreateGameFile(Path.Combine(resourcesPath.GetFullPath(), \"does-not-exist.zip\"), 999);\n            Assert.IsTrue(madeUpGameFile.IsUnmanaged());\n            Assert.IsFalse(madeUpGameFile.ArchiveExists(gameFilesPath));\n\n            // Resources\\pyrrhic.zip is a file that exists in the testing folder\n            var gameFileUnmanaged = CreateGameFile(Path.Combine(resourcesPath.GetFullPath(), \"pyrrhic.zip\"), 999);\n            Assert.IsTrue(gameFileUnmanaged.IsUnmanaged());\n            Assert.IsTrue(gameFileUnmanaged.ArchiveExists(gameFilesPath));\n        }\n\n        [TestMethod]\n        public void ArchiveExists_RecognisesUnmanagedGameDirectories()\n        {\n            var gameFilesPath = new LauncherPath(\"GameFiles\");\n            var resourcesPath = new LauncherPath(\"Resources\");\n\n            // Resources\\TestSteamInstall is a directory that exists in the testing folder\n            var gameFileDirectory = CreateGameFile(Path.Combine(resourcesPath.GetFullPath(), \"TestSteamInstall\"), 999);\n            Assert.IsTrue(gameFileDirectory.IsDirectory());\n            Assert.IsTrue(gameFileDirectory.ArchiveExists(gameFilesPath));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestGameFileTags.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Newtonsoft.Json.Converters;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestGameFileTags\n    {\n        private IDataSourceAdapter database;\n\n        private GameFile CreateGameFile(string filename)\n        {\n            DateTime dt = DateTime.Parse(\"1/1/17\");\n\n            GameFile gameFile = new GameFile\n            {\n                FileName = filename,\n                Author = \"the author\",\n                Description = \"the description\",\n                Title = \"the title\",\n                Comments = \"the comments\",\n                ReleaseDate = dt,\n                Downloaded = dt,\n                LastPlayed = dt,\n                IWadID = 22,\n                Rating = 33,\n                MinutesPlayed = 44,\n                MapCount = 55,\n                SourcePortID = 66,\n                SettingsExtraParams = \"the extra params\",\n                SettingsFiles = \"the settings files\",\n                SettingsFilesIWAD = \"the settings files iwad\",\n                SettingsFilesSourcePort = \"the settings files source port\",\n                SettingsMap = \"the settings map\",\n                SettingsSkill = \"the settings skill\",\n                SettingsSpecificFiles = \"the settings specific files\",\n                SettingsGameProfileID = 567\n            };\n\n            return gameFile;\n        }\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = TestUtil.CreateAdapter();\n        }\n\n        [TestCleanup]\n        public void CleanDatabase()\n        {\n            var dataAccess = ((DbDataSourceAdapter)database).DataAccess;\n            dataAccess.ExecuteNonQuery(\"delete from GameFiles\");\n            dataAccess.ExecuteNonQuery(\"delete from Tags\");\n            dataAccess.ExecuteNonQuery(\"delete from TagMapping\");\n        }\n\n        [TestMethod]\n        public void GetTags_ReturnsAllTags()\n        {\n            var gameFile1 = CreateGameFile(\"foo.zip\");\n\n            var tag1 = new TagData\n            {\n                Name = \"Cool maps\",\n                HasTab = true,\n                HasColor = true,\n                Color = 0xff00ff,\n                ExcludeFromOtherTabs = true,\n            };\n\n            var tag2 = new TagData\n            {\n                Name = \"Cool bananas\",\n                HasTab = false,\n                HasColor = false,\n                Color = null,\n                ExcludeFromOtherTabs = false,\n            };\n\n\n            database.InsertTag(tag1);\n            database.InsertTag(tag2);\n\n            var tags = database.GetTags();\n\n            var retrievedTag1 = tags.Where(x => x.Name.Equals(tag1.Name)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(tag1, retrievedTag1, \"TagID\"));\n\n            var retrievedTag2 = tags.Where(x => x.Name.Equals(tag2.Name)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(tag2, retrievedTag2, \"TagID\"));\n        }\n\n        [TestMethod]\n        public void GetTagMappings_ReturnsAllTagMappings()\n        {\n            var tagMapping1 = new TagMapping\n            {\n                TagID = 1,\n                FileID = 2\n            };\n\n            var tagMapping2 = new TagMapping\n            {\n                TagID = 77,\n                FileID = 44\n            };\n\n            database.InsertTagMapping(tagMapping1);\n            database.InsertTagMapping(tagMapping2);\n\n            var tagMappings = database.GetTagMappings();\n\n            var retrievedTagMapping1 = tagMappings.Where(x => x.TagID.Equals(tagMapping1.TagID)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqual(tagMapping1, retrievedTagMapping1));\n\n            var retrievedTagMapping2 = tagMappings.Where(x => x.TagID.Equals(tagMapping2.TagID)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqual(tagMapping2, retrievedTagMapping2));\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Tag_ReturnsMatchingGameFiles()\n        {\n            var taggedFile = CreateGameFile(\"taggy.zip\");\n            var wrongFile = CreateGameFile(\"wrong.zip\");\n\n            var tag = new TagData { Name = \"Fave\" };\n\n            database.InsertGameFile(taggedFile);\n            database.InsertGameFile(wrongFile);\n            database.InsertTag(tag);\n\n            var retrievedGameFile1 = database.GetGameFile(\"taggy.zip\");\n            var retrievedTag = database.GetTags().First();\n\n            database.InsertTagMapping(new TagMapping()\n            {\n                TagID = retrievedTag.TagID,\n                FileID = (int)retrievedGameFile1.GameFileID\n            });\n\n            var retrievedGameFiles = database.GetGameFiles(retrievedTag);\n            Assert.AreEqual(1, retrievedGameFiles.Count());\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(taggedFile, retrievedGameFiles.First(), \"GameFileID\"));\n        }\n\n        [TestMethod]\n        public void GetGameFiles_Options_Tag_ReturnsMatchingTaggedGameFiles()\n        {\n            var rightTaggedFile = CreateGameFile(\"right_tagged.zip\");\n            rightTaggedFile.Description = \"Robots\";\n\n            var rightUntaggedFile = CreateGameFile(\"right_untagged.zip\");\n            rightUntaggedFile.Description = \"Robots\";\n\n            var wrongTaggedFile = CreateGameFile(\"wrong_tagged.zip\");\n            var wrongUntaggedFile = CreateGameFile(\"wrong_untagged.zip\");\n\n            var tag = new TagData { Name = \"Wow\" };\n\n            database.InsertGameFile(rightTaggedFile);\n            database.InsertGameFile(rightUntaggedFile);\n            database.InsertGameFile(wrongTaggedFile);\n            database.InsertGameFile(wrongUntaggedFile);\n            database.InsertTag(tag);\n\n            var retrievedRightTaggedFile = database.GetGameFile(\"right_tagged.zip\");\n            var retrievedWrongTaggedFile = database.GetGameFile(\"wrong_tagged.zip\");\n            var retrievedTag = database.GetTags().First();\n\n            database.InsertTagMapping(new TagMapping()\n            {\n                TagID = retrievedTag.TagID,\n                FileID = (int)retrievedRightTaggedFile.GameFileID\n            });\n\n            database.InsertTagMapping(new TagMapping()\n            {\n                TagID = retrievedTag.TagID,\n                FileID = (int)retrievedWrongTaggedFile.GameFileID\n            });\n\n            var options = new GameFileGetOptions(new GameFileSearchField(GameFileFieldType.Description, GameFileSearchOp.Equal, \"Robots\"));\n            var retrievedGameFiles = database.GetGameFiles(options, retrievedTag);\n\n\n            Assert.AreEqual(1, retrievedGameFiles.Count());\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(rightTaggedFile, retrievedGameFiles.First(), \"GameFileID\"));\n        }\n\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestGameInfoSyncAction.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Handlers.Sync;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestGameInfoSyncAction\n    {\n        [TestMethod]\n        public void ApplyToGameFile_FindsTitleInGAMEINFO()\n        {\n            var gameFile = new GameFile()\n            {\n                FileName = \"blah.wad\"\n            };\n\n            var syncAction = new GameInfoSyncAction();\n\n            Tree files = new Tree(\"root\", new Tree(\"GAMEINFO\", \"IWAD = \\\"blah.wad\\\"\\nSTARTUPTITLE  = \\\"The Big Tree\\\"\\nSOMETHING_ELSE = blah\"));\n            var reader = new TreeReader(files);\n\n            var result = syncAction.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.AreEqual(\"The Big Tree\", gameFile.Title);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_FindsTitleInGAMEINFOTxt()\n        {\n            var gameFile = new GameFile()\n            {\n                FileName = \"blah.wad\"\n            };\n\n            var syncAction = new GameInfoSyncAction();\n\n            Tree files = new Tree(\"root\", new Tree(\"GAMEINFO.txt\", \"IWAD = \\\"blah.wad\\\"\\nSTARTUPTITLE  = \\\"The Big Banana\\\"\\nSOMETHING_ELSE = blah\"));\n            var reader = new TreeReader(files);\n\n            var result = syncAction.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.AreEqual(\"The Big Banana\", gameFile.Title);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_DoesntFindsTitleInAFileCalledSomethingElse()\n        {\n            var gameFile = new GameFile()\n            {\n                FileName = \"blah.wad\"\n            };\n\n            var syncAction = new GameInfoSyncAction();\n\n            Tree files = new Tree(\"root\", new Tree(\"GAMEINF\", \"IWAD = \\\"blah.wad\\\"\\nSTARTUPTITLE  = \\\"The Big Banana\\\"\\nSOMETHING_ELSE = blah\"));\n            var reader = new TreeReader(files);\n\n            var result = syncAction.ApplyToGameFile(gameFile, reader, new string[0]);\n\n            Assert.IsTrue(string.IsNullOrEmpty(gameFile.Title));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestGameLauncher.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.Adapters.Launch;\nusing DoomLauncher.Config;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n\n    [TestClass]\n    public class TestGameLauncher\n    {\n        private static readonly string LocalFile1 = @\"Local\\file1.wad\";\n        private static readonly string LocalIwad1 = @\"Local\\iwad1.wad\";\n\n        [TestInitialize]\n        public void Init()\n        {\n            CreateDirectoriesAndFiles();\n        }\n\n        [TestCleanup]\n        public void Cleanup()\n        {\n            if (Directory.Exists(\"Temp\"))\n                Directory.Delete(\"Temp\", true);\n        }\n\n        [TestMethod]\n        public void TestWarp()\n        {\n            for(int i = 0; i < 4; i++)\n            {\n                for(int j = 0; j < 9; j++)\n                {\n                    string map = string.Format(\"E{0}M{1}\", i + 1, j + 1);\n                    Assert.AreEqual(GenericSourcePortFlavor.BuildWarpParameter(map), string.Format(\" -warp {0} {1}\", i + 1, j + 1));\n                }\n            }\n\n            for(int i = 0; i < 32; i++)\n            {\n                string map = null;\n                if (i + 1 > 9)\n                    map = string.Format(\"MAP{0}\", i + 1);\n                else\n                    map = string.Format(\"MAP0{0}\", i + 1);\n\n                Assert.AreEqual(GenericSourcePortFlavor.BuildWarpParameter(map), string.Format(\" -warp {0}\", i + 1));\n            }\n\n            Assert.AreEqual(\" -warp 0\", GenericSourcePortFlavor.BuildWarpParameter(\"MAP00\"));\n        }\n\n        [TestMethod]\n        public void TestMap()\n        {\n            Assert.AreEqual(\" +map START\", GenericSourcePortFlavor.BuildWarpParameter(\"START\"));\n            Assert.AreEqual(\" +map MAPSTART\", GenericSourcePortFlavor.BuildWarpParameter(\"MAPSTART\"));\n            Assert.AreEqual(\" +map MAP01START\", GenericSourcePortFlavor.BuildWarpParameter(\"MAP01START\"));\n            Assert.AreEqual(\" +map MAP1\", GenericSourcePortFlavor.BuildWarpParameter(\"MAP1\"));\n            Assert.AreEqual(\" +map MAP001\", GenericSourcePortFlavor.BuildWarpParameter(\"MAP001\"));\n        }\n\n        [TestMethod]\n        public void TestParameters()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            GameLauncher launcher = new GameLauncher(directories);\n\n            //test .wad and deh\n            string launch = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), GetTestPort(\".wad,.deh\"), false).LaunchString;\n            string check = string.Format(\"-file \\\"{0}\\\"  -deh \\\"{1}\\\"\",\n                Path.Combine(Directory.GetCurrentDirectory(), \"Temp\", \"test1.wad\"),\n                Path.Combine(Directory.GetCurrentDirectory(), \"Temp\", \"test1.deh\"));\n            Assert.AreEqual(check.Trim(), launch.Trim());\n\n            Assert.IsTrue(File.Exists(Path.Combine(directories.TempDirectory.GetFullPath(), \"test1.wad\")));\n            Assert.IsTrue(File.Exists(Path.Combine(directories.TempDirectory.GetFullPath(), \"test1.deh\")));\n\n            //.wad only\n            launch = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), GetTestPort(\".wad\"), false).LaunchString;\n            check = string.Format(\"-file \\\"{0}\\\"\",\n                Path.Combine(Directory.GetCurrentDirectory(), \"Temp\", \"test1.wad\"));\n            Assert.AreEqual(check.Trim(), launch.Trim());\n        }\n\n        \n\n        [TestMethod]\n        public void TestExtractFalse()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var features = new List<ILaunchFeature>()\n            {\n                new GameFilesLaunchFeature(new List<IGameFile>() { GetTestFile() }, null, false)\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n\n            launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), GetTestPort(\".wad,.deh\"), false);\n\n            Assert.IsFalse(File.Exists(Path.Combine(directories.TempDirectory.GetFullPath(), \"test1.wad\")));\n            Assert.IsFalse(File.Exists(Path.Combine(directories.TempDirectory.GetFullPath(), \"test1.deh\")));\n        }\n\n        [TestMethod]\n        public void TestParametersSourcePortExtraParams()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var features = new List<ILaunchFeature>()\n            {\n                new ExtraParametersLaunchFeature(\"-extra\", false)\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n\n            var port = GetTestPort(\".wad,.deh\");\n            port.ExtraParameters = \"-extra\";\n\n            string launch = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), port, false).LaunchString;\n            string check = string.Format(\"-file \\\"{0}\\\"  -deh \\\"{1}\\\" -extra\",\n                Path.Combine(Directory.GetCurrentDirectory(), \"Temp\", \"test1.wad\"),\n                Path.Combine(Directory.GetCurrentDirectory(), \"Temp\", \"test1.deh\"));\n            Assert.AreEqual(check.Trim(), launch.Trim());\n\n            Assert.IsTrue(File.Exists(Path.Combine(directories.TempDirectory.GetFullPath(), \"test1.wad\")));\n            Assert.IsTrue(File.Exists(Path.Combine(directories.TempDirectory.GetFullPath(), \"test1.deh\")));\n        }\n\n        [TestMethod]\n        public void TestSkillAndMap()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var features = new List<ILaunchFeature>()\n            {\n                new MapSkillLaunchFeature(\"MAP01\", \"3\")\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n            var port = GetPrBoomTestPort(\".wad,.deh\");\n\n            var launch = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), port, false).LaunchString;\n            Assert.IsTrue(launch.Contains(\"-skill 3\"));\n            Assert.IsTrue(launch.Contains(\"-warp 1\"));\n        }\n\n        [TestMethod]\n        public void TestSkillAndMapZdoom()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var features = new List<ILaunchFeature>()\n            {\n                new MapSkillLaunchFeature(\"MAP01\", \"3\")\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n            var port = GetTestPort(\".wad,.deh\");\n\n            var launch = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), port, false).LaunchString;\n            Assert.IsTrue(launch.Contains(\"-skill 3\"));\n            Assert.IsTrue(launch.Contains(\"+map MAP01\"));\n        }\n\n        [TestMethod]\n        public void TestRecord()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var features = new List<ILaunchFeature>()\n            {\n                new RecordLaunchFeature()\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n            var parameters = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), GetTestPort(\".wad,.deh\"), false);\n\n            Assert.IsNotNull(parameters.RecordedFileName);\n            Assert.IsTrue(parameters.LaunchString.Contains(string.Concat(\"-record \\\"\", parameters.RecordedFileName, \"\\\"\")));\n        }\n\n        [TestMethod]\n        public void TestPlayDemo()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            string demofile = Path.Combine(directories.TempDirectory.GetFullPath(), \"testplay.lmp\");\n            var features = new List<ILaunchFeature>()\n            {\n                new PlayDemoLaunchFeature(demofile)\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n            var parameters = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), GetTestPort(\".wad,.deh\"), false);\n            //the file doesn't exist\n            Assert.IsTrue(parameters.Failed);\n            Assert.IsNotNull(parameters.ErrorMessage);\n\n            File.WriteAllText(demofile, \"test\");\n            var launch = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), GetTestPort(\".wad,.deh\"), false).LaunchString;\n            Assert.IsTrue(launch.Contains(string.Concat(\"-playdemo \\\"\", demofile, \"\\\"\")));\n        }\n\n        [TestMethod]\n        public void TestAdditionalFiles()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var additionalFiles = GetTestFiles().Skip(1).ToList();\n            var features = new List<ILaunchFeature>()\n            {\n                new GameFilesLaunchFeature(additionalFiles, null)\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n            string launch = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), GetTestPort(\".wad,.pk3,.deh\"), false).LaunchString;\n\n            //-file parameters should be together, then -deh files should be together\n            string check = string.Format(\" -file \\\"{0}\\\\Temp\\\\test2.wad\\\" \\\"{0}\\\\Temp\\\\test2.pk3\\\" \\\"{0}\\\\Temp\\\\test3.wad\\\" \\\"{0}\\\\Temp\\\\test3.pk3\\\" \\\"{0}\\\\Temp\\\\test4.wad\\\" \\\"{0}\\\\Temp\\\\test4.pk3\\\" \\\"{0}\\\\Temp\\\\test1.wad\\\" \\\"{0}\\\\Temp\\\\test1.pk3\\\"  -deh \\\"{0}\\\\Temp\\\\test2.deh\\\" \\\"{0}\\\\Temp\\\\test3.deh\\\" \\\"{0}\\\\Temp\\\\test4.deh\\\" \\\"{0}\\\\Temp\\\\test1.deh\\\" \",\n                Directory.GetCurrentDirectory());\n            Assert.AreEqual(check.Trim(), launch.Trim());\n\n            var tempPath = directories.TempDirectory.GetFullPath();\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test2.wad\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test3.wad\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test4.wad\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test1.wad\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test2.deh\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test3.deh\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test4.deh\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test1.deh\")));\n        }\n\n        [TestMethod]\n        public void TestBadFile()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            GameLauncher launcher = new GameLauncher(directories);\n            var parameters = launcher.GetLaunchParameters(new GameFile() { FileName = \"bad.zip\" }, GetAddFiles(), GetTestPort(\".wad,.deh\"), false);\n\n            Assert.IsTrue(parameters.Failed);\n            Assert.IsNotNull(parameters.ErrorMessage);\n            Assert.IsTrue(parameters.ErrorMessage.Contains(\"bad.zip\"));\n        }\n\n        [TestMethod]\n        public void TestBadAdditionalFile()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var additionalFiles = new List<IGameFile> { new GameFile() { FileName = \"badadd.zip\" } };\n            var features = new List<ILaunchFeature>()\n            {\n                new GameFilesLaunchFeature(additionalFiles, null)\n            };\n\n            GameLauncher adapter = new GameLauncher(directories, features);\n\n            var parameters = adapter.GetLaunchParameters(GetTestFile(), GetAddFiles(), GetTestPort(\".wad,.deh\"), false);\n            Assert.IsTrue(parameters.Failed);\n            Assert.IsNotNull(parameters.ErrorMessage);\n            Assert.IsTrue(parameters.ErrorMessage.Contains(\"badadd.zip\"));\n        }\n\n        [TestMethod]\n        public void TestIndividualFiles()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            string[] wads;\n            using (ZipArchive za = ZipFile.OpenRead(Path.Combine(\"GameFiles\", GetTestFiles().First().FileName)))\n                wads = za.Entries.Where(x => Path.GetExtension(x.Name) == \".wad\").Select(x => x.FullName).ToArray();\n\n            var features = new List<ILaunchFeature>()\n            {\n                new GameFilesLaunchFeature(null, wads.ToList<string>())\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n\n            var parameters = launcher.GetLaunchParameters(GetTestFiles().First(), GetAddFiles(), GetTestPort(\".wad,.deh\"), false);\n            Assert.IsNull(parameters.ErrorMessage);\n            Assert.IsTrue(parameters.LaunchString.Contains(\".wad\"));\n            Assert.IsFalse(parameters.LaunchString.Contains(\".deh\"));\n        }\n\n        [TestMethod]\n        public void TestIndividualFilesMultiple()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n\n            List<string> wads = new List<string>();\n\n            using (ZipArchive za = ZipFile.OpenRead(Path.Combine(\"GameFiles\", GetTestFiles().First().FileName)))\n                wads.AddRange(za.Entries.Where(x => Path.GetExtension(x.Name) == \".wad\").Select(x => x.FullName));\n\n            using (ZipArchive za = ZipFile.OpenRead(Path.Combine(\"GameFiles\", GetTestFiles().Skip(1).First().FileName)))\n                wads.AddRange(za.Entries.Where(x => Path.GetExtension(x.Name) == \".wad\").Select(x => x.FullName));\n\n            using (ZipArchive za = ZipFile.OpenRead(Path.Combine(\"GameFiles\", GetTestFiles().Skip(2).First().FileName)))\n                wads.AddRange(za.Entries.Where(x => Path.GetExtension(x.Name) == \".wad\").Select(x => x.FullName));\n\n            //this is test4.zip and it will NOT be added to the additional files list\n            using (ZipArchive za = ZipFile.OpenRead(Path.Combine(\"GameFiles\", GetTestFiles().Skip(3).First().FileName)))\n                wads.AddRange(za.Entries.Where(x => Path.GetExtension(x.Name) == \".wad\").Select(x => x.FullName));\n\n            var additionalFiles = GetTestFiles().Skip(1).Take(2).ToList(); //test2.wad, test3.wad only\n\n            var features = new List<ILaunchFeature>()\n            {\n                new GameFilesLaunchFeature(additionalFiles, wads)\n            };\n            GameLauncher launcher = new GameLauncher(directories, features);\n\n            var parameters = launcher.GetLaunchParameters(GetTestFiles().First(), GetAddFiles(), GetTestPort(\".wad,.deh\"), false);\n\n            Assert.IsNull(parameters.ErrorMessage);\n            Assert.IsTrue(parameters.LaunchString.Contains(\"test1.wad\"));\n            Assert.IsTrue(parameters.LaunchString.Contains(\"test2.wad\"));\n            Assert.IsTrue(parameters.LaunchString.Contains(\"test3.wad\"));\n            Assert.IsFalse(parameters.LaunchString.Contains(\"test4.wad\"));\n            Assert.IsFalse(parameters.LaunchString.Contains(\".deh\"));\n\n            var tempPath = directories.TempDirectory.GetFullPath();\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test1.wad\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test2.wad\")));\n            Assert.IsTrue(File.Exists(Path.Combine(tempPath, \"test3.wad\")));\n            Assert.IsFalse(File.Exists(Path.Combine(tempPath, \"test4.wad\")));\n            Assert.IsFalse(File.Exists(Path.Combine(tempPath, \"test1.deh\")));\n            Assert.IsFalse(File.Exists(Path.Combine(tempPath, \"test2.deh\")));\n            Assert.IsFalse(File.Exists(Path.Combine(tempPath, \"test3.deh\")));\n            Assert.IsFalse(File.Exists(Path.Combine(tempPath, \"test4.deh\")));\n        }\n\n        [TestMethod]\n        public void TestIndividualPathedFiles()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var specialFiles = new List<string> { Path.Combine(\"data\", \"test.wad\") };\n            var features = new List<ILaunchFeature>()\n            {\n                new GameFilesLaunchFeature(null, specialFiles)\n            };\n\n            GameLauncher adapter = new GameLauncher(directories, features);\n\n            IGameFile gameFile = new GameFile() { FileName = \"testpathed.zip\" };\n\n            var parameters = adapter.GetLaunchParameters(gameFile, GetAddFiles(), GetTestPort(\".wad,.deh\"), false);\n\n            Assert.IsNull(parameters.ErrorMessage);\n            Assert.IsTrue(parameters.LaunchString.Contains(\"test.wad\"));\n            Assert.IsTrue(File.Exists(Path.Combine(directories.TempDirectory.GetFullPath(), \"test.wad\")));\n        }\n\n        [TestMethod]\n        public void TestExtraWithStats()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var features = new List<ILaunchFeature>()\n            {\n                new ExtraParametersLaunchFeature(\"-extratest\", false),\n                new SourcePortExtraParametersLaunchFeature(),\n                new StatisticsReaderLaunchFeature()\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n            var boomPort = GetPrBoomTestPort(\".wad,.deh\");\n            boomPort.ExtraParameters = \"-boomextra\";\n\n            string launch = launcher.GetLaunchParameters(GetTestFile(), GetAddFiles(), boomPort, false).LaunchString;\n\n            Assert.IsTrue(launch.Contains(\" -extratest \"));\n            Assert.IsTrue(launch.Contains(\" -boomextra \"));\n            Assert.IsTrue(launch.Contains(\" -levelstat\"));\n        }\n\n        [TestMethod]\n        public void RelativeUnmanagedFiles()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var iwad = new GameFile() { FileName = LocalIwad1 };\n            var features = new List<ILaunchFeature>()\n            {\n                new IWadLaunchFeature(iwad)\n            };\n\n            GameLauncher launcher = new GameLauncher(directories, features);\n\n            var port = GetPrBoomTestPort(\".wad,.deh\");\n\n            var gameFile = new GameFile() { FileName = LocalFile1 };\n            string launch = launcher.GetLaunchParameters(gameFile, GetAddFiles(), port, false).LaunchString;\n            string check = string.Format(\"-iwad \\\"{0}\\\" -file \\\"{1}\\\"\",\n                Path.Combine(Directory.GetCurrentDirectory(), LocalIwad1),\n                Path.Combine(Directory.GetCurrentDirectory(), LocalFile1));\n            Assert.AreEqual(check, launch);\n        }\n\n        [TestMethod]\n        public void VariableReplacements()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var iwad = new GameFile() { FileName = LocalIwad1 };\n            var features = new List<ILaunchFeature>()\n            {\n                new ExtraParametersLaunchFeature(\"-savedir $iwad/$filename\", false),\n                new IWadLaunchFeature(iwad)\n            };\n\n            var launcher = new GameLauncher(directories,features);\n            var port = GetPrBoomTestPort(\".wad,.deh\");\n\n            var gameFile = new GameFile() { FileName = LocalFile1 };\n            var launch = launcher.GetLaunchParameters(gameFile, GetAddFiles(), port, false).LaunchString;\n            Assert.IsTrue(launch.Contains(\"-savedir iwad1/file1\"));\n        }\n\n        [TestMethod]\n        public void ExtraParametersOnly()\n        {\n            IDirectoriesConfiguration directories = new DirectoriesConfiguration()\n            {\n                GameFileDirectory = new LauncherPath(\"GameFiles\"),\n                TempDirectory = new LauncherPath(\"Temp\")\n            };\n\n            var iwad = new GameFile() { FileName = LocalIwad1 };\n            var features = new List<ILaunchFeature>()\n            {\n                new ExtraParametersLaunchFeature(\"-blah -blob\", true),\n                new IWadLaunchFeature(iwad),\n                new MapSkillLaunchFeature(\"E1M2\", null)\n            };\n\n            var launcher = new GameLauncher(directories, features);\n            var port = GetPrBoomTestPort(\".wad,.deh\");\n            var gameFile = new GameFile() { FileName = LocalFile1 };\n            var launch = launcher.GetLaunchParameters(gameFile, GetAddFiles(), port, false).LaunchString;\n            Assert.IsTrue(launch.Contains(\"-blah -blob\"));\n            Assert.IsFalse(launch.Contains(\"E1M2\")); \n            Assert.IsFalse(launch.Contains(\"iwad\"));\n        }\n\n        private void CreateDirectoriesAndFiles()\n        {\n            if (Directory.Exists(\"GameFiles\"))\n                Directory.Delete(\"GameFiles\", true);\n            if (Directory.Exists(\"Temp\"))\n                Directory.Delete(\"Temp\", true);\n            if (Directory.Exists(\"SourcePorts\"))\n                Directory.Delete(\"SourcePorts\", true);\n            if (Directory.Exists(\"Local\"))\n                Directory.Delete(\"Local\", true);\n\n            Directory.CreateDirectory(\"GameFiles\");\n            CreateTestFiles();\n            CreateTestPathedFile();\n\n            Directory.CreateDirectory(\"Local\");\n            CreateRelativeFiles();\n\n            Directory.CreateDirectory(\"Temp\");\n\n            Directory.CreateDirectory(\"SourcePorts\");\n            File.WriteAllBytes(@\"SourcePorts\\zdoom.exe\", new byte[] { });\n        }\n\n        private static void CreateTestPathedFile()\n        {\n            string filename = @\"GameFiles\\testpathed.zip\";\n            if (File.Exists(filename))\n                File.Delete(filename);\n\n            using (ZipArchive za = ZipFile.Open(filename, ZipArchiveMode.Create))\n            {\n                string writeFile = Path.Combine(@\"GameFiles\\\", \"test.wad\");\n                File.WriteAllBytes(writeFile, new byte[] { });\n\n                za.CreateEntryFromFile(writeFile, Path.Combine(\"data\", \"test.wad\"));\n            }\n        }\n\n        private static void CreateTestFiles()\n        {\n            for (int i = 1; i < 5; i++)\n            {\n                string[] files = new string[] { string.Format(\"test{0}.wad\", i), string.Format(\"test{0}.deh\", i), string.Format(\"test{0}.pk3\", i), string.Format(\"test{0}.txt\", i) };\n\n                string filename = string.Format(@\"GameFiles\\test{0}.zip\", i);\n                if (File.Exists(filename))\n                    File.Delete(filename);\n\n                using (ZipArchive za = ZipFile.Open(filename, ZipArchiveMode.Create))\n                {\n                    foreach (string file in files)\n                    {\n                        string writeFile = Path.Combine(@\"GameFiles\\\", file);\n                        File.WriteAllBytes(writeFile, new byte[] { });\n\n                        za.CreateEntryFromFile(writeFile, file);\n                    }\n                }\n            }\n        }\n\n        private void CreateRelativeFiles()\n        {\n            File.WriteAllText(LocalFile1, \"\");\n            File.WriteAllText(LocalIwad1, \"\");\n        }\n\n        private static List<IGameFile> GetTestFiles()\n        {\n            List<IGameFile> files = new List<IGameFile>();\n            for (int i = 1; i < 5; i++)\n                files.Add(new GameFile { FileName = string.Format(\"test{0}.zip\", i) });\n            return files;\n        }\n\n        private static IGameFile GetTestFile()\n        {\n            return new GameFile { FileName = \"test1.zip\" };\n        }\n\n        private static IGameFile[] GetAddFiles()\n        {\n            return Array.Empty<IGameFile>();\n        }\n\n        private static ISourcePortData GetTestPort(string extensions)\n        {\n            return new SourcePortData { Executable = \"zdoom.exe\", Directory = new LauncherPath(\"SourcePorts\"), SupportedExtensions = extensions, FileOption = \"-file\" };\n        }\n\n        private static ISourcePortData GetPrBoomTestPort(string extensions)\n        {\n            return new SourcePortData { Executable = \"prboom-plus.exe\", Directory = new LauncherPath(\"SourcePorts\"), SupportedExtensions = extensions, FileOption = \"-file\" };\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestGameProfile.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestGameProfile\n    {\n        private static string[] IgnoreFields = new[] { nameof(GameProfile.GameProfileID) };\n\n        [TestMethod]\n        public void TestGameProfileData()\n        {\n            var adapter = TestUtil.CreateAdapter();\n            TestUtil.CleanDatabase(adapter);\n            TestInsert();\n            TestGameProfileSelect();\n            TestGameProfileUpdate();\n            TestGameProfileDelete();\n        }\n\n        [TestMethod]\n        public void TestGlobalGameProfileData()\n        {\n            var adapter = TestUtil.CreateAdapter();\n            TestUtil.CleanDatabase(adapter);\n            var globalProfile1 = GameProfile.CreateGlobalProfile(\"Global Profile 1\");\n            var globalProfile2 = GameProfile.CreateGlobalProfile(\"Global Profile 2\");\n            SetFields(globalProfile1);\n            SetFields(globalProfile2);\n\n            adapter.InsertGameProfile(globalProfile1);\n            adapter.InsertGameProfile(globalProfile2);\n\n            TestInsert();\n\n            var globalProfiles = adapter.GetGlobalGameProfiles().ToList();\n            Assert.AreEqual(2, globalProfiles.Count);\n            Assert.AreEqual(\"Global Profile 1\", globalProfiles[0].Name);\n            Assert.AreEqual(\"Global Profile 2\", globalProfiles[1].Name);\n            globalProfile1 = (GameProfile)globalProfiles[0];\n            globalProfile2 = (GameProfile)globalProfiles[1];\n\n            globalProfile1.Name = \"Updated Global Profile 1\";\n            globalProfile2.Name = \"Updated Global Profile 2\";\n            adapter.UpdateGameProfile(globalProfile1);\n            adapter.UpdateGameProfile(globalProfile2);\n            globalProfiles = adapter.GetGlobalGameProfiles().ToList();\n            Assert.AreEqual(2, globalProfiles.Count);\n            Assert.AreEqual(\"Updated Global Profile 1\", globalProfiles[0].Name);\n            Assert.AreEqual(\"Updated Global Profile 2\", globalProfiles[1].Name);\n\n            adapter.DeleteGameProfile(globalProfile1.GameProfileID);\n            globalProfiles = adapter.GetGlobalGameProfiles().ToList();\n            Assert.AreEqual(1, globalProfiles.Count);\n            Assert.AreEqual(\"Updated Global Profile 2\", globalProfiles[0].Name);\n        }\n\n        public void TestInsert()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            foreach (var profile in CreateTestProfiles())\n                adapter.InsertGameProfile(profile);\n        }\n\n        public void TestGameProfileSelect()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var testProfiles = CreateTestProfiles();\n\n            foreach (var profile in testProfiles)\n            {\n                var profiles = adapter.GetGameProfiles(profile.GameFileID.Value).ToList();\n                Assert.AreEqual(1, profiles.Count);\n                Assert.IsTrue(TestUtil.AllFieldsEqual(profile, profiles.First(), IgnoreFields));\n            }\n        }\n\n        public void TestGameProfileUpdate()\n        {\n            List<IGameProfile> profiles = new List<IGameProfile>();\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var allTestProfiles = CreateTestProfiles();\n            foreach (var profile in allTestProfiles)\n                profiles.AddRange(adapter.GetGameProfiles(profile.GameFileID.Value));\n\n            foreach (var profile in profiles)\n            {\n                profile.Name += profile.Name;\n                profile.SourcePortID += profile.SourcePortID;\n                profile.IWadID += profile.IWadID;\n                profile.SettingsExtraParams += profile.SettingsExtraParams;\n                profile.SettingsFiles += profile.SettingsFiles;\n                profile.SettingsFilesIWAD += profile.SettingsFilesIWAD;\n                profile.SettingsFilesSourcePort += profile.SettingsFilesSourcePort;\n                profile.SettingsMap += profile.SettingsMap;\n                profile.SettingsSkill += profile.SettingsSkill;\n                profile.SettingsSpecificFiles += profile.SettingsSpecificFiles;\n                profile.SettingsStat = !profile.SettingsStat;\n                profile.SettingsSaved = !profile.SettingsSaved;\n\n                adapter.UpdateGameProfile(profile);\n\n                var testProfiles = adapter.GetGameProfiles(profile.GameFileID.Value).ToList();\n                Assert.AreEqual(1, testProfiles.Count);\n                Assert.IsTrue(TestUtil.AllFieldsEqual(profile, testProfiles.First(), IgnoreFields));\n            }\n        }\n\n        public void TestGameProfileDelete()\n        {\n            List<IGameProfile> testProfiles = new List<IGameProfile>();\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var allTestProfiles = CreateTestProfiles();\n            foreach (var profile in allTestProfiles)\n                testProfiles.AddRange(adapter.GetGameProfiles(profile.GameFileID.Value));\n\n            foreach (var profile in testProfiles)\n            {\n                var profiles = adapter.GetGameProfiles(profile.GameFileID.Value).ToList();\n                Assert.AreEqual(1, profiles.Count);\n\n                adapter.DeleteGameProfile(profile.GameProfileID);\n                profiles = adapter.GetGameProfiles(profile.GameFileID.Value).ToList();\n                Assert.AreEqual(0, profiles.Count);\n            }\n        }\n\n        private List<IGameProfile> CreateTestProfiles()\n        {\n            List<IGameProfile> profiles = new List<IGameProfile>();\n            for (int i = 0; i < 10; i++)\n            {\n                profiles.Add(new GameProfile()\n                {\n                    GameProfileID = i + 1,\n                    GameFileID = i,\n                    Name = i.ToString(),\n                    SourcePortID = i,\n                    IWadID = i,\n                    SettingsExtraParams = i.ToString(),\n                    SettingsFiles = i.ToString(),\n                    SettingsFilesIWAD = i.ToString(),\n                    SettingsFilesSourcePort = i.ToString(),\n                    SettingsMap = i.ToString(),\n                    SettingsSkill = i.ToString(),\n                    SettingsSpecificFiles = i.ToString(),\n                    SettingsStat = false,\n                    SettingsSaved = false\n                });\n            }\n\n            return profiles;\n        }\n\n        private void SetFields(IGameProfile gameProfile)\n        {\n            gameProfile.SourcePortID = 1;\n            gameProfile.IWadID = 1;\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestGameProfileUtil.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing System.Diagnostics.Contracts;\nusing DoomLauncher.Handlers;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestGameProfileUtil\n    {\n        [TestMethod]\n        public void GetAllProfiles()\n        {\n            var adapter = TestUtil.CreateAdapter();\n            TestUtil.CleanDatabase(adapter);\n            foreach (var profile in CreateTestProfiles(1, new [] { \"Test 1\", \"A Profile\", \"Mods\" }))\n                adapter.InsertGameProfile(profile);\n            foreach (var profile in CreateTestProfiles(2, new[] { \"New Profile\", \"Doom\", \"Mega Profile\", \"Another one\" }))\n                adapter.InsertGameProfile(profile);\n\n            var globalProfile1 = GameProfile.CreateGlobalProfile(\"Z Global Profile 1\");\n            var globalProfile2 = GameProfile.CreateGlobalProfile(\"A Global Profile 2\");\n            SetFields(globalProfile1);\n            SetFields(globalProfile2);\n\n            adapter.InsertGameProfile(globalProfile1);\n            adapter.InsertGameProfile(globalProfile2);\n\n            var profiles = GameProfileUtil.GetAllProfiles(adapter, new GameFile { GameFileID = 1 }, out var globalProfiles);\n            Assert.AreEqual(6, profiles.Count);\n            Assert.AreEqual(2, globalProfiles.Count);\n\n            // Global profiles first sorted by name, then default with game file profiles\n            Assert.AreEqual(profiles[0].Name, \"A Global Profile 2\");\n            Assert.AreEqual(profiles[1].Name, \"Z Global Profile 1\");\n            Assert.AreEqual(profiles[2].Name, \"Default Profile\");\n            Assert.AreEqual(profiles[3].Name, \"A Profile\");\n            Assert.AreEqual(profiles[4].Name, \"Mods\");\n            Assert.AreEqual(profiles[5].Name, \"Test 1\");\n\n            profiles = GameProfileUtil.GetAllProfiles(adapter, new GameFile { GameFileID = 2 }, out globalProfiles);\n            Assert.AreEqual(7, profiles.Count);\n            Assert.AreEqual(2, globalProfiles.Count);\n\n            Assert.AreEqual(profiles[0].Name, \"A Global Profile 2\");\n            Assert.AreEqual(profiles[1].Name, \"Z Global Profile 1\");\n            Assert.AreEqual(profiles[2].Name, \"Default Profile\");\n            Assert.AreEqual(profiles[3].Name, \"Another one\");\n            Assert.AreEqual(profiles[4].Name, \"Doom\");\n            Assert.AreEqual(profiles[5].Name, \"Mega Profile\");\n            Assert.AreEqual(profiles[6].Name, \"New Profile\");\n\n            profiles = GameProfileUtil.GetAllProfiles(adapter, new GameFile { GameFileID = 3 }, out globalProfiles);\n            Assert.AreEqual(3, profiles.Count);\n            Assert.AreEqual(2, globalProfiles.Count);\n            Assert.AreEqual(profiles[0].Name, \"A Global Profile 2\");\n            Assert.AreEqual(profiles[1].Name, \"Z Global Profile 1\");\n            Assert.AreEqual(profiles[2].Name, \"Default Profile\");\n\n            var gameFile= new GameFile { GameFileID = 1 };\n            Assert.IsTrue(GameProfileUtil.NameExists(adapter, gameFile, globalProfiles,\n                profiles[0].GameProfileID, \"z Global Profile 1\"));\n            Assert.IsFalse(GameProfileUtil.NameExists(adapter, gameFile, globalProfiles,\n                profiles[0].GameProfileID, \"z Global Profile 3**\"));\n            Assert.IsTrue(GameProfileUtil.NameExists(adapter, gameFile, globalProfiles,\n                profiles[0].GameProfileID, GameFile.DefaultProfileName));\n            Assert.IsTrue(GameProfileUtil.NameExists(adapter, gameFile, globalProfiles,\n                profiles[0].GameProfileID, \"mods\"));\n            Assert.IsFalse(GameProfileUtil.NameExists(adapter, gameFile, globalProfiles,\n                profiles[0].GameProfileID, \"new profile test\"));\n\n            TestUtil.CleanDatabase(adapter);\n        }\n\n        private List<IGameProfile> CreateTestProfiles(int gameFileId, string[] names)\n        {\n            List<IGameProfile> profiles = new List<IGameProfile>();\n            int i = 1000;\n            foreach (var name in names)\n            {\n                profiles.Add(new GameProfile()\n                {\n                    GameProfileID = i + 1,\n                    GameFileID = gameFileId,\n                    Name = name,\n                    SourcePortID = i,\n                    IWadID = i,\n                    SettingsExtraParams = i.ToString(),\n                    SettingsFiles = i.ToString(),\n                    SettingsFilesIWAD = i.ToString(),\n                    SettingsFilesSourcePort = i.ToString(),\n                    SettingsMap = i.ToString(),\n                    SettingsSkill = i.ToString(),\n                    SettingsSpecificFiles = i.ToString(),\n                    SettingsStat = false,\n                    SettingsSaved = false\n                });\n                i++;\n            }\n            return profiles;\n        }\n\n        private void SetFields(IGameProfile gameProfile)\n        {\n            gameProfile.SourcePortID = 1;\n            gameProfile.IWadID = 1;\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestGameStoreFiles.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing DoomLauncher.GameStores;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestGameStoreFiles\n    {\n        [TestMethod]\n        public void Combine_AddsLists()\n        {\n            var gameStoreFiles1 = new GameStoreFiles(new List<string> { \"a.wad\", \"b.wad\" }, new List<string> { \"x.wad\" }, null);\n            var gameStoreFiles2 = new GameStoreFiles(new List<string> { \"c.wad\" }, new List<string> { \"y.wad\", \"z.wad\" }, null);\n\n            var result = gameStoreFiles1.Combine(gameStoreFiles2);\n\n            Assert.IsTrue(new List<string> { \"a.wad\", \"b.wad\", \"c.wad\" }.SequenceEqual(result.InstalledIWads));\n            Assert.IsTrue(new List<string> { \"x.wad\", \"y.wad\", \"z.wad\" }.SequenceEqual(result.InstalledPWads));\n        }\n\n        [TestMethod]\n        public void Combine_AddsListsIgnoringDuplicates()\n        {\n            var gameStoreFiles1 = new GameStoreFiles(new List<string> { @\"base\\a.wad\", \"b.wad\" }, new List<string> { @\"base\\x.wad\" }, null);\n            var gameStoreFiles2 = new GameStoreFiles(new List<string> { @\"release\\a.wad\" }, new List<string> { @\"release\\x.wad\", \"z.wad\" }, null);\n\n            var result = gameStoreFiles1.Combine(gameStoreFiles2);\n\n\n            Assert.IsTrue(new List<string> { @\"base\\a.wad\", \"b.wad\" }.SequenceEqual(result.InstalledIWads));\n            Assert.IsTrue(new List<string> { @\"base\\x.wad\", \"z.wad\" }.SequenceEqual(result.InstalledPWads));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestIWad.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestIWad\n    {\n        private IIWadDataSourceAdapter database;\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = TestUtil.CreateAdapter();\n        }\n\n        [TestCleanup]\n        public void CleanDatabase()\n        {\n            var dataAccess = ((DbDataSourceAdapter)database).DataAccess;\n            dataAccess.ExecuteNonQuery(\"delete from IWads\");\n        }\n\n        [TestMethod]\n        public void GetIWads_ReturnsAllIWads()\n        {\n            var iWad1 = new IWadData()\n            {\n                FileName = \"Doom.wad\",\n                Name = \"Doom\",\n                GameFileID = 1\n            };\n\n            var iWad2 = new IWadData()\n            {\n                FileName = \"Doom2.wad\",\n                Name = \"Doom II\",\n                GameFileID = 2\n            };\n\n            database.InsertIWad(iWad1);\n            database.InsertIWad(iWad2);\n\n            var iWads = database.GetIWads();\n            Assert.AreEqual(2, iWads.Count());\n\n            var retrieved1 = iWads.Where(x => x.FileName.Equals(iWad1.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(iWad1, retrieved1, \"IWadID\"));\n\n            var retrieved2 = iWads.Where(x => x.FileName.Equals(iWad2.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(iWad2, retrieved2, \"IWadID\"));\n        }\n\n        [TestMethod]\n        public void GetIWad_GetsIWadForGameFileID()\n        {\n            var iWad1 = new IWadData()\n            {\n                FileName = \"Heretic.wad\",\n                Name = \"Heretic\",\n                GameFileID = 5\n            };\n\n            database.InsertIWad(iWad1);\n\n            var retrievedIWad = database.GetIWad(5);\n\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(iWad1, retrievedIWad, \"IWadID\"));\n        }\n\n        [TestMethod]\n        public void DeleteIWad_DeletesTheIWad()\n        {\n            var iWad1 = new IWadData()\n            {\n                FileName = \"plutonia.wad\",\n                Name = \"The Plutonia Experiment\",\n                GameFileID = 3\n            };\n\n            var wrongIWad = new IWadData()\n            {\n                FileName = \"tnt.wad\",\n                Name = \"TNT Evilution\",\n                GameFileID = 4\n            };\n\n            database.InsertIWad(iWad1);\n            database.InsertIWad(wrongIWad);\n\n            // Need to fetch so that the primary key is populated.\n            var savedIWad1 = database.GetIWad(3);\n            database.DeleteIWad(savedIWad1);\n\n            var iWads = database.GetIWads();\n            Assert.AreEqual(1, iWads.Count());\n\n            var retrieved2 = iWads.First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(wrongIWad, retrieved2, \"IWadID\"));\n        }\n\n        [TestMethod]\n        public void UpdateIWad_UpdatesTheRightFieldsInTheRightIWad()\n        {\n            var iWad1 = new IWadData()\n            {\n                FileName = \"heretic.wad\",\n                Name = \"Heretic\",\n                GameFileID = 5\n            };\n\n            var wrongIWad = new IWadData()\n            {\n                FileName = \"chex.wad\",\n                Name = \"Chex Quest\",\n                GameFileID = 6\n            };\n\n            database.InsertIWad(iWad1);\n            database.InsertIWad(wrongIWad);\n\n            // Need to fetch so that the primary key is populated.\n            var savedIWad1 = database.GetIWad(5);\n            savedIWad1.FileName = \"daikatana.wad\";\n            savedIWad1.Name = \"Daikatana\";\n            savedIWad1.GameFileID = 7;\n            database.UpdateIWad(savedIWad1);\n\n            var updatedIWads = database.GetIWads();\n            Assert.AreEqual(2, updatedIWads.Count());\n\n            var retrieved1 = updatedIWads.Where(x => x.IWadID.Equals(savedIWad1.IWadID)).First();\n            Assert.AreEqual(\"daikatana.wad\", retrieved1.FileName);\n            Assert.AreEqual(\"Daikatana\", retrieved1.Name);\n            Assert.AreEqual(7, retrieved1.GameFileID);\n\n            var retrieved2 = updatedIWads.Where(x => x.FileName.Equals(wrongIWad.FileName)).First();\n            Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(wrongIWad, retrieved2, \"IWadID\"));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestIWadTitlesSyncAction.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Handlers.Sync;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestIWadTitlesSyncAction\n    {\n        [TestMethod]\n        public void ApplyToGameFile_ReplacesTitleOfIWads()\n        {\n            IGameFile gameFile = new GameFile\n            {\n                FileName = \"heretic.zip\",\n                Title = \"Wrong title\"\n            };\n\n            var action = new IWadTitlesSyncAction();\n            action.ApplyToGameFile(gameFile, null, null);\n\n            Assert.AreEqual(\"Heretic: Shadow of the Serpent Riders\", gameFile.Title);\n\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_DoesntReplaceTitleOfNonIWads()\n        {\n            IGameFile gameFile = new GameFile\n            {\n                FileName = \"floom.zip\",\n                Title = \"blah\"\n            };\n\n            var action = new IWadTitlesSyncAction();\n            action.ApplyToGameFile(gameFile, null, null);\n\n            Assert.AreEqual(\"blah\", gameFile.Title);\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestIdGamesFileParser.cs",
    "content": "﻿using DoomLauncher.Handlers.Sync;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Globalization;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestIdGamesFileParser\n    {\n        private static string[] s_formats = new string[] { \"dd/M/yy\", \"dd/MM/yyyy\", \"dd MMMM yyyy\" };\n\n        [TestMethod]\n        public void TestEmpty()\n        {\n            IdGamesTextFileParser parser = new IdGamesTextFileParser(s_formats);\n            var info = parser.Parse(string.Empty);\n\n            Assert.AreEqual(string.Empty, info.Title);\n            Assert.AreEqual(string.Empty, info.Author);\n            Assert.AreEqual(null, info.ReleaseDate);\n            Assert.AreEqual(string.Empty, info.Description);\n        }\n\n        [TestMethod]\n        public void TestBadDates()\n        {\n            IdGamesTextFileParser parser = new IdGamesTextFileParser(s_formats);\n\n            var info = parser.Parse(\"Release date: this is garbage\");\n            Assert.AreEqual(null, info.ReleaseDate);\n\n            parser.Parse(\"Release date: \");\n            Assert.AreEqual(null, info.ReleaseDate);\n\n            parser.Parse(\"Release date:\");\n            Assert.AreEqual(null, info.ReleaseDate);\n\n            parser.Parse(\"Release date: 1234\");\n            Assert.AreEqual(null, info.ReleaseDate);\n        }\n\n        [TestMethod]\n        public void TestDates()\n        {\n            IdGamesTextFileParser parser = new IdGamesTextFileParser(s_formats);\n\n            string[] dates = new string[]\n            {\n                \"Release date : 5/April/16\",\n                \"Release date:4/05/2016\",\n                \" Release date: 4.05.2016\",\n                \" Release date: 4 05 2016\",\n                \"Date finished: 5 April 2016\",\n                \"release Date: April 5th 2016\",\n                \"Release date: April 5th, 2016\",\n                \"Release date: April 5th 16\",\n                \"Release date: junk 5 April 2016 junk\",\n            };\n\n            DateTime assert = DateTime.Parse(\"4/5/2016\", CultureInfo.InvariantCulture);\n\n            foreach (string date in dates)\n            {\n                var info = parser.Parse(date);\n                Assert.AreEqual(info.ReleaseDate, assert);\n            }\n        }\n\n        [TestMethod]\n        public void TestStrings()\n        {\n            string test = @\"===========================================================================\n                        Advanced engine needed  : PrBoom+ or GZdoom.\n                        Primary purpose         : Deathmatch\n                        ===========================================================================\n                        TitLe                   : Onslaught DM 3 (v.1.1)\n                        Filename                : onsl3.wad\n                        Release DATE            : 01/17/07\n                        AUTHORS                 : Hobomaster22, Ak-01\n                        dEsCrIpTioN             : 21 head to head deathmatch maps with faced paced action.  This is a 1on1 specific mapset. For FFA more than 4 players is not recommended.\";\n\n            IdGamesTextFileParser parser = new IdGamesTextFileParser(s_formats);\n            var info = parser.Parse(test);\n\n            Assert.AreEqual(\"Onslaught DM 3 (v.1.1)\", info.Title);\n            Assert.AreEqual(DateTime.Parse(\"01/17/07\", CultureInfo.InvariantCulture), info.ReleaseDate);\n            Assert.AreEqual(\"Hobomaster22, Ak-01\", info.Author); //Could be Author: or Authors:\n            Assert.AreEqual(\"21 head to head deathmatch maps with faced paced action.  This is a 1on1 specific mapset. For FFA more than 4 players is not recommended.\", info.Description);\n\n            test = test.Replace(\"AUTHORS\", \"AUTHOR\");\n            parser.Parse(test);\n            Assert.AreEqual(\"Onslaught DM 3 (v.1.1)\", info.Title);\n            Assert.AreEqual(DateTime.Parse(\"01/17/07\", CultureInfo.InvariantCulture), info.ReleaseDate);\n            Assert.AreEqual(\"Hobomaster22, Ak-01\", info.Author); //Could be Author: or Authors:\n            Assert.AreEqual(\"21 head to head deathmatch maps with faced paced action.  This is a 1on1 specific mapset. For FFA more than 4 players is not recommended.\", info.Description);\n\n            test = @\"===========================================================================\n                    Primary purpose         : Deathmatch\n                    ===========================================================================\n                    TitLe                   : \n                    Filename                : \n                    Release DATE            : \n                    AUTHORS                 : \n                    dEsCrIpTioN             : \";\n            info = parser.Parse(test);\n            Assert.AreEqual(string.Empty, info.Title);\n            Assert.AreEqual(null, info.ReleaseDate);\n            Assert.AreEqual(string.Empty, info.Author);\n            Assert.AreEqual(string.Empty, info.Description);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestIdGamesTextInfo.cs",
    "content": "﻿using DoomLauncher.Handlers.Sync;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestIdGamesTextInfo\n    {\n\n        [TestMethod]\n        public void TestQualityInfoCountsNonNullNonWhitespace()\n        {\n            var info1 = new IdGamesTextInfo(null, \"  \", null, \"\", null);\n            Assert.AreEqual(0, info1.QualityScore);\n\n            var info2 = new IdGamesTextInfo(\"Eviternity\", \"\", null, null, null);\n            Assert.AreEqual(1, info2.QualityScore);\n\n            var info3 = new IdGamesTextInfo(\"Jenesis\", \"James \\\"Jimmy\\\" Paddock\", null, \"   \", \"    \");\n            Assert.AreEqual(2, info3.QualityScore);\n\n            var info4 = new IdGamesTextInfo(\"Pirate Doom!\", \"Arch\", new DateTime(2014, 6, 18), \"   \", \"\");\n            Assert.AreEqual(3, info4.QualityScore);\n\n            var info5 = new IdGamesTextInfo(\"My House\", \"Steve Nelson\", new DateTime(2023, 3, 2), \"Just a normal regular wad just hanging out\", null);\n            Assert.AreEqual(4, info5.QualityScore);\n        }\n\n        [TestMethod]\n        public void NullStringsBecomeEmptyStrings()\n        {\n            var info = new IdGamesTextInfo(null, null, null, null, null);\n            Assert.AreEqual(\"\", info.Title);\n            Assert.AreEqual(\"\", info.Author);\n            Assert.AreEqual(\"\", info.Description);\n        }\n\n        [TestMethod]\n        public void Combine_PrefersOurFields()\n        {\n            var info1 = new IdGamesTextInfo(\"Fancy Lands\", \"Rufus Wallykins\", null, \"Does not exist\", \"Doom 2\");\n            var info2 = new IdGamesTextInfo(\"ignoreme\", \"ignore me\", new DateTime(2024, 5, 3), \"IGNORE ME\", \"Doom\");\n\n            var result1 = info1.Combine(info2);\n            Assert.AreEqual(new IdGamesTextInfo(\"Fancy Lands\", \"Rufus Wallykins\", new DateTime(2024, 5, 3), \"Does not exist\", \"Doom 2\"), result1);\n\n            var result2 = info2.Combine(info1);\n            Assert.AreEqual(info2, result2);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestIgnoreRarExploit.cs",
    "content": "﻿using DoomLauncher.Archive.Rar;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestIgnoreRarExploit\n    {\n        [TestMethod]\n        public void RarFileWithRelativePathIsIgnored()\n        {\n            // Contains calc.exe file pointed to ../../../../Microsoft/Windows/Start Menu/Programs/Startup/poc.bat\n            using (RarArchiveReader reader = new RarArchiveReader(\"Resources/poc.rar\"))\n            {\n                Assert.AreEqual(0, reader.Entries.Count());\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestKnownWadsSyncAction.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Handlers.Sync;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestKnownWadsSyncAction\n    {\n        IDataSourceAdapter database;\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = TestUtil.CreateAdapter();\n        }\n\n        [TestCleanup]\n        public void Cleanup()\n        {\n            var dataAccess = ((DbDataSourceAdapter)database).DataAccess;\n            dataAccess.ExecuteNonQuery(\"delete from IWads\");\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_DoesNothingToUnknownGameFile()\n        {\n            var action = new KnownWadsSyncAction(database);\n\n            var gameFile = new GameFile()\n            {\n                FileName = \"Unknown.zip\",\n                Title = \"MyTitle\"\n            };\n\n            action.ApplyToGameFile(gameFile, null, null);\n\n            Assert.AreEqual(\"MyTitle\", gameFile.Title);\n            Assert.IsNull(gameFile.IWadID);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_SetsTheTitleForHexDD()\n        {\n            var action = new KnownWadsSyncAction(database);\n\n            var gameFile = new GameFile()\n            {\n                FileName = \"hexdd.zip\",\n                Title = \"Replace me\"\n            };\n\n            action.ApplyToGameFile(gameFile, null, null);\n\n            Assert.AreEqual(\"Hexen: Deathkings of the Dark Citadel\", gameFile.Title);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_SetsTheHexenIWadForHexDD()\n        {\n            var action = new KnownWadsSyncAction(database);\n\n            IIWadData hexenIwad = new IWadData() { FileName = \"hexen.wad\" };\n            database.InsertIWad(hexenIwad);\n            hexenIwad = database.GetIWads().FirstOrDefault(iwad => iwad.FileNameBase.Equals(\"hexen\"));\n            Assert.IsNotNull(hexenIwad);\n            Assert.IsNotNull(hexenIwad.IWadID);\n\n            var gameFile = new GameFile()\n            {\n                FileName = \"hexdd.zip\",\n                Title = \"Replace me\"\n            };\n\n            action.ApplyToGameFile(gameFile, null, null);\n\n            Assert.AreEqual(hexenIwad.IWadID, gameFile.IWadID);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestLaunchParameters.cs",
    "content": "﻿using DoomLauncher.Adapters.Launch;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestLaunchParameters\n    {\n        [TestMethod]\n        public void Combine_AppendsTwoParams()\n        {\n            var a = LaunchParameters.Param(\"a\");\n            var b = LaunchParameters.Param(\"b\");\n\n            var result = a.Combine(b);\n            Assert.AreEqual(\"a b\", result.LaunchString);\n        }\n\n        [TestMethod]\n        public void Combine_EmptyHasNoEffect()\n        {\n            var a = LaunchParameters.Param(\"blah\");\n\n            Assert.AreEqual(\"blah\", a.Combine(LaunchParameters.EMPTY).LaunchString);\n            Assert.AreEqual(\"blah\", LaunchParameters.EMPTY.Combine(a).LaunchString);\n        }\n\n        [TestMethod]\n        public void Combine_TakesTheFirstRecordedFile()\n        {\n            var a = LaunchParameters.EMPTY.WithRecordedFileName(\"recording.file\");\n            var b = LaunchParameters.EMPTY.WithRecordedFileName(\"other.file\");\n\n            var result = a.Combine(b);\n\n            Assert.AreEqual(\"recording.file\", result.RecordedFileName);\n        }\n\n        [TestMethod]\n        public void Combine_TakesRecordedFileIfNotAlreadyPresent()\n        {\n            var a = LaunchParameters.Param(\"p1\");\n            var b = LaunchParameters.EMPTY.WithRecordedFileName(\"therecording.file\");\n\n            var result = a.Combine(b);\n\n            Assert.AreEqual(\"therecording.file\", result.RecordedFileName);\n        }\n\n        [TestMethod]\n        public void Combine_ExclusiveParameterIgnoresOtherParameters()\n        {\n            var a = LaunchParameters.Param(\"a\");\n            var b = LaunchParameters.Param(\"b\");\n            var c = LaunchParameters.ExclusiveParam(\"c\");\n            var d = LaunchParameters.Param(\"d\");\n\n            var result = a.Combine(b).Combine(c).Combine(d);\n            Assert.AreEqual(\"c\", result.LaunchString);\n        }\n\n        [TestMethod]\n        public void Combine_KeepsTheFailure()\n        {\n            var failed1 = LaunchParameters.Failure(\"WRONG!\");\n            var failed2 = LaunchParameters.Failure(\"NO!\");\n            var ok = LaunchParameters.Param(\"ok\");\n\n            var result1 = failed1.Combine(ok);\n            Assert.IsTrue(result1.Failed);\n            Assert.AreEqual(\"WRONG!\", result1.ErrorMessage);\n\n            var result2 = ok.Combine(failed2);\n            Assert.IsTrue(result2.Failed);\n            Assert.AreEqual(\"NO!\", result2.ErrorMessage);\n        }\n\n        [TestMethod]\n        public void Combine_StacksVariableReplacements()\n        {\n            var param1 = LaunchParameters.EMPTY.WithVariableReplacement(\"filename\", \"bongo.wad\");\n            var param2 = LaunchParameters.EMPTY.WithVariableReplacement(\"iwad\", \"freedoom.wad\");\n            var appliedParam = LaunchParameters.Param(\"$somethingElse $filename needs $iwad\");\n            var result1 = appliedParam.Combine(param1).Combine(param2);\n            var result2 = param2.Combine(param1).Combine(appliedParam);\n            var result3 = param1.Combine(appliedParam).Combine(param2);\n\n            Assert.AreEqual(\"$somethingElse bongo.wad needs freedoom.wad\", result1.LaunchString);\n            Assert.AreEqual(\"$somethingElse bongo.wad needs freedoom.wad\", result2.LaunchString);\n            Assert.AreEqual(\"$somethingElse bongo.wad needs freedoom.wad\", result3.LaunchString);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestLauncherPath.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.Handlers;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.IO;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestLauncherPath\n    {\n        [TestMethod]\n        public void TestPaths()\n        {\n            string folder = \"relativepath\\\\\";\n            LauncherPath path = new LauncherPath(folder);\n\n            Assert.AreEqual(folder, path.GetPossiblyRelativePath());\n            Assert.AreEqual(Path.Combine(Directory.GetCurrentDirectory(), folder), path.GetFullPath());\n\n            folder = Path.Combine(\"\\\\subdir\", \"relativepath\\\\\");\n            string newfolder = Path.Combine(Directory.GetCurrentDirectory(), folder);\n\n            path = new LauncherPath(newfolder);\n\n            Assert.AreEqual(folder, path.GetPossiblyRelativePath());\n            Assert.AreEqual(Path.Combine(Directory.GetCurrentDirectory(), folder), path.GetFullPath());\n        }\n\n        [TestMethod]\n        public void LauncherPathFile()\n        {\n            string file = \"C:\\\\directory\\\\files\\\\file.zip\";\n            var launcherPath = new LauncherPath(file);\n            Assert.AreEqual(file, launcherPath.GetFullPath());\n            Assert.AreEqual(file, launcherPath.GetPossiblyRelativePath());\n        }\n\n        [TestMethod]\n        public void LauncherPathRelativeFile()\n        {\n            string relative = \"files\\\\file.zip\";\n            string file = Path.Combine(Directory.GetCurrentDirectory(), relative);\n            var launcherPath = new LauncherPath(file);\n            Assert.AreEqual(file, launcherPath.GetFullPath());\n            Assert.AreEqual(relative, launcherPath.GetPossiblyRelativePath());\n        }\n\n        [TestMethod]\n        public void GetRelativeDirectory()\n        {\n            string relative = \"something\\\\local\\\\\";\n            string path = Path.Combine(Directory.GetCurrentDirectory(), relative);\n            var launcherPath = new LauncherPath(path);\n            Assert.AreEqual(path, launcherPath.GetFullPath());\n            Assert.AreEqual(\"something\\\\local\", launcherPath.GetPossiblyRelativePath());\n        }\n\n        [TestMethod]\n        public void Empty()\n        {\n            var launcherPath = new LauncherPath(string.Empty);\n            Assert.AreEqual(string.Empty, launcherPath.GetFullPath());\n            Assert.AreEqual(string.Empty, launcherPath.GetPossiblyRelativePath());\n        }\n\n        [TestMethod]\n        public void PartiallyQualified()\n        {\n            Assert.IsTrue(PathExtensions.IsPartiallyQualified(\"somefile\"));\n            Assert.IsTrue(PathExtensions.IsPartiallyQualified(\"somefile\\\\\"));\n            Assert.IsTrue(PathExtensions.IsPartiallyQualified(\"\\\\somefile\"));\n            Assert.IsTrue(PathExtensions.IsPartiallyQualified(\"\\\\somefile\\\\\"));\n\n            Assert.IsFalse(PathExtensions.IsPartiallyQualified(\"c:\\\\somefile\"));\n            Assert.IsFalse(PathExtensions.IsPartiallyQualified(\"c:\\\\somefile\\\\\"));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestLevelstat.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestLevelstat\n    {\n        private readonly List<NewStatisticsEventArgs> m_args = new List<NewStatisticsEventArgs>();\n\n        [TestMethod]\n        public void TestLevelstatFile()\n        {\n            string stats = @\"MAP01 - 0:04.23 (0:04)  K: 12/123  I: 5/33  S: 0/1 \nMAP02 - 0:03.83 (0:07)  K: 23/234  I: 7/28  S: 1/2 \";\n\n            File.WriteAllText(\"statfile.txt\", stats);\n\n            LevelstatReader statsReader = new LevelstatReader(new GameFile() { GameFileID = 1 }, \"statfile.txt\");\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.ReadNow();\n\n            Assert.AreEqual(2, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"MAP01\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(12, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(123, m_args[0].Statistics.TotalKills);\n\n            Assert.AreEqual(5, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(33, m_args[0].Statistics.TotalItems);\n\n            Assert.AreEqual(0, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(1, m_args[0].Statistics.TotalSecrets);\n\n            Assert.AreEqual(4.23f, m_args[0].Statistics.LevelTime);\n\n            Assert.AreEqual(\"MAP02\", m_args[1].Statistics.MapName);\n            Assert.AreEqual(23, m_args[1].Statistics.KillCount);\n            Assert.AreEqual(234, m_args[1].Statistics.TotalKills);\n\n            Assert.AreEqual(7, m_args[1].Statistics.ItemCount);\n            Assert.AreEqual(28, m_args[1].Statistics.TotalItems);\n\n            Assert.AreEqual(1, m_args[1].Statistics.SecretCount);\n            Assert.AreEqual(2, m_args[1].Statistics.TotalSecrets);\n\n            Assert.AreEqual(3.83f, m_args[1].Statistics.LevelTime);\n\n            //Add another level, should one be one new level read\n            stats = @\"MAP01 - 0:04.23 (0:04)  K: 12/123  I: 5/33  S: 0/1 \nMAP02 - 0:03.83 (0:07)  K: 23/234  I: 7/28  S: 1/2 \nMAP03 - 0:04.83 (0:07)  K: 123/1234  I: 22/50  S: 2/2\";\n\n            File.WriteAllText(\"statfile.txt\", stats);\n            statsReader.ReadNow();\n\n            Assert.AreEqual(3, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"MAP03\", m_args[2].Statistics.MapName);\n            Assert.AreEqual(123, m_args[2].Statistics.KillCount);\n            Assert.AreEqual(1234, m_args[2].Statistics.TotalKills);\n\n            Assert.AreEqual(22, m_args[2].Statistics.ItemCount);\n            Assert.AreEqual(50, m_args[2].Statistics.TotalItems);\n\n            Assert.AreEqual(2, m_args[2].Statistics.SecretCount);\n            Assert.AreEqual(2, m_args[2].Statistics.TotalSecrets);\n\n            Assert.AreEqual(4.83f, m_args[2].Statistics.LevelTime);\n        }\n\n        [TestMethod]\n        public void TestLevelstatFileMultiRead()\n        {\n            string stats = @\"MAP01 - 0:13.66 (0:13)  K:  8/19  I: 3/9   S:3/5 \nMAP02 - 0:24.20 (0:37)  K: 12/70  I: 10/20  S: 0/1 \nMAP03 - 0:35.51 (1:12)  K: 14/56  I: 8/9   S: 0/1 \n\";\n\n            File.WriteAllText(\"statfile.txt\", stats);\n\n            LevelstatReader statsReader = new LevelstatReader(new GameFile() { GameFileID = 1 }, \"statfile.txt\");\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.ReadNow();\n\n            Assert.AreEqual(3, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"MAP01\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(8, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(19, m_args[0].Statistics.TotalKills);\n\n            Assert.AreEqual(3, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(9, m_args[0].Statistics.TotalItems);\n\n            Assert.AreEqual(3, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(5, m_args[0].Statistics.TotalSecrets);\n\n            Assert.AreEqual(13.66f, m_args[0].Statistics.LevelTime);\n\n            Assert.AreEqual(\"MAP02\", m_args[1].Statistics.MapName);\n            Assert.AreEqual(12, m_args[1].Statistics.KillCount);\n            Assert.AreEqual(70, m_args[1].Statistics.TotalKills);\n\n            Assert.AreEqual(10, m_args[1].Statistics.ItemCount);\n            Assert.AreEqual(20, m_args[1].Statistics.TotalItems);\n\n            Assert.AreEqual(0, m_args[1].Statistics.SecretCount);\n            Assert.AreEqual(1, m_args[1].Statistics.TotalSecrets);\n\n            Assert.AreEqual(24.2f, m_args[1].Statistics.LevelTime);\n\n            Assert.AreEqual(\"MAP03\", m_args[2].Statistics.MapName);\n            Assert.AreEqual(14, m_args[2].Statistics.KillCount);\n            Assert.AreEqual(56, m_args[2].Statistics.TotalKills);\n\n            Assert.AreEqual(8, m_args[2].Statistics.ItemCount);\n            Assert.AreEqual(9, m_args[2].Statistics.TotalItems);\n\n            Assert.AreEqual(0, m_args[2].Statistics.SecretCount);\n            Assert.AreEqual(1, m_args[2].Statistics.TotalSecrets);\n\n            Assert.AreEqual(35.51f, m_args[2].Statistics.LevelTime);\n        }\n\n        [TestMethod]\n        public void TestLevelstatHours()\n        {\n            string stats = @\"MAP04 - 1:05:50.80 (1:28:46)  K: 207/206  I: 66/66  S: 1/1\";\n\n            File.WriteAllText(\"statfile.txt\", stats);\n\n            LevelstatReader statsReader = new LevelstatReader(new GameFile() { GameFileID = 1 }, \"statfile.txt\");\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.ReadNow();\n\n            Assert.AreEqual(1, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"MAP04\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(206, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(206, m_args[0].Statistics.TotalKills);\n\n            Assert.AreEqual(66, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(66, m_args[0].Statistics.TotalItems);\n\n            Assert.AreEqual(1, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(1, m_args[0].Statistics.TotalSecrets);\n\n            Assert.AreEqual(3950.80004882813f, m_args[0].Statistics.LevelTime);\n        }\n\n        private void StatsReader_NewStastics(object sender, NewStatisticsEventArgs e)\n        {\n            m_args.Add(e);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestLoadFiles.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Handlers;\nusing DoomLauncher.Interfaces;\nusing DoomLauncher.SourcePort;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Newtonsoft.Json.Converters;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestLoadFiles\n    {\n        IDataSourceAdapter database;\n\n        [TestInitialize]\n        public void Initialize()\n        {\n            database = TestUtil.CreateAdapter();\n        }\n\n        [TestCleanup]\n        public void CleanDatabase()\n        {\n            var dataAccess = ((DbDataSourceAdapter)database).DataAccess;\n            dataAccess.ExecuteNonQuery(\"delete from GameFiles\");\n            dataAccess.ExecuteNonQuery(\"delete from IWads\");\n            dataAccess.ExecuteNonQuery(\"delete from SourcePorts\");\n        }\n\n        [TestMethod]\n        public void GetIWadFiles_ReturnsFilesDirectlyAssociatedWithTheIWad()\n        {\n            var gameProfile = new GameFile\n            {\n                FileName = \"foo.wad\",\n                SettingsFilesIWAD = \"green.wad;blue.wad\"\n            };\n            database.InsertGameFile(gameProfile);\n\n            var gameFile1 = new GameFile // Won't get used\n            { \n                FileName = \"whocares.wad\",\n                SettingsFilesIWAD = \"nope.wad\"\n            }; \n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"green.wad\" };\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = new GameFile { FileName = \"blue.wad\" };\n            database.InsertGameFile(gameFile3);\n\n            var wrongGameFile = new GameFile { FileName = \"nope.wad\" };\n            database.InsertGameFile(wrongGameFile);\n\n            var fileLoadHandler = new FileLoadHandler(database, gameFile1, gameProfile);\n            var iwadFiles = fileLoadHandler.GetIWadFiles();\n            Assert.AreEqual(2, iwadFiles.Count);\n            Assert.IsTrue(iwadFiles.Exists(x => x.FileName.Equals(\"green.wad\")));\n            Assert.IsTrue(iwadFiles.Exists(x => x.FileName.Equals(\"blue.wad\")));\n\n            Assert.IsFalse(fileLoadHandler.IsIWadFile(gameProfile));\n            Assert.IsFalse(fileLoadHandler.IsIWadFile(gameFile1));\n            Assert.IsFalse(fileLoadHandler.IsIWadFile(wrongGameFile));\n            Assert.IsTrue(fileLoadHandler.IsIWadFile(gameFile2));\n            Assert.IsTrue(fileLoadHandler.IsIWadFile(gameFile3));\n        }\n\n\n        [TestMethod]\n        public void GetIWadFiles_ReturnsFilesIndirectlyAssociatedWithTheIWad()\n        {\n            // if the iwad has a file attached to it because of a source port, that file should not be included when the iwad is selected\n            // e.g. GZDoom has noendgame.wad User launched DOOM2.WAD with GZDoom. This adds noendgame to the additional files of DOOM2.WAD.\n            // if the user selects DOOM2.WAD with another file (and not GZDoom as the port), noendgame.wad should not be added\n\n\n            var iwadGameFile = InsertIWadAndGameFile(\"DOOM2.zip\", \n                settingsFiles: \"rightfile.zip;ignoreme1.zip\", \n                settingsFilesSourcePort: \"ignoreme1.zip\"); // Should cancel out the same file in SettingsFiles\n\n            var gameProfile = new GameFile\n            {\n                FileName = \"profile.wad\",\n                SettingsFilesIWAD = \"ignoreme2.wad\", // Should get ignored because there is an IWadID\n                IWadID = iwadGameFile.IWadID\n\n            };\n            database.InsertGameFile(gameProfile);\n\n            var gameFile1 = new GameFile // Not used to find the IWAD additional files\n            {\n                FileName = \"whoCares.wad\",\n                SettingsFilesIWAD = \"ignoreme3.wad\",\n                IWadID = iwadGameFile.IWadID\n\n            };\n            database.InsertGameFile(gameFile1);\n\n            var rightFile = new GameFile { FileName = \"rightfile.zip\" };\n            database.InsertGameFile(rightFile);\n\n            var ignoreFile1 = new GameFile { FileName = \"ignoreme1.zip\" };\n            database.InsertGameFile(ignoreFile1);\n\n            var ignoreFile2 = new GameFile { FileName = \"ignoreme2.zip\" };\n            database.InsertGameFile(ignoreFile2);\n\n            var ignoreFile3 = new GameFile { FileName = \"ignoreme3.zip\" };\n            database.InsertGameFile(ignoreFile3);\n\n\n            var fileLoadHandler = new FileLoadHandler(database, gameFile1, gameProfile);\n            var iwadFiles = fileLoadHandler.GetIWadFiles();\n            Assert.AreEqual(1, iwadFiles.Count);\n            Assert.AreEqual(\"rightfile.zip\", iwadFiles.First().FileName);\n            Assert.IsTrue(fileLoadHandler.IsIWadFile(rightFile));\n            Assert.IsFalse(fileLoadHandler.IsIWadFile(gameFile1));\n            Assert.IsFalse(fileLoadHandler.IsIWadFile(ignoreFile1));\n            Assert.IsFalse(fileLoadHandler.IsIWadFile(ignoreFile2));\n            Assert.IsFalse(fileLoadHandler.IsIWadFile(ignoreFile3));\n            Assert.IsFalse(fileLoadHandler.IsIWadFile(iwadGameFile));\n        }\n\n        [TestMethod]\n        public void GetSourcePortFiles_ReturnsFilesAssociatedWithTheSourcePort()\n        {\n            var gameProfile = new GameFile\n            {\n                FileName = \"blah.wad\",\n                SettingsFilesSourcePort = \"a.wad;b.wad\"\n            };\n            database.InsertGameFile(gameProfile);\n\n            var gameFile1 = new GameFile { FileName = \"ignore me.wad\" };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"a.wad\" };\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = new GameFile { FileName = \"b.wad\" };\n            database.InsertGameFile(gameFile3);\n\n            var fileLoadHandler = new FileLoadHandler(database, gameFile1, gameProfile);\n            var sourcePortFiles = fileLoadHandler.GetSourcePortFiles();\n            Assert.AreEqual(2, sourcePortFiles.Count);\n            Assert.IsTrue(sourcePortFiles.Exists(x => x.FileName.Equals(\"a.wad\")));\n            Assert.IsTrue(sourcePortFiles.Exists(x => x.FileName.Equals(\"b.wad\")));\n            Assert.IsFalse(fileLoadHandler.IsSourcePortFile(gameFile1));\n            Assert.IsFalse(fileLoadHandler.IsSourcePortFile(gameProfile));\n            Assert.IsTrue(fileLoadHandler.IsSourcePortFile(gameFile2));\n            Assert.IsTrue(fileLoadHandler.IsSourcePortFile(gameFile3));\n        }\n\n        [TestMethod]\n        public void GetCurrentAdditionalFiles_ReturnsAssociatedFiles()\n        {\n            var gameProfile = new GameFile\n            {\n                FileName = \"PROFILE.wad\",\n                SettingsFiles = \"first.wad;second.wad\"\n            };\n            database.InsertGameFile(gameProfile);\n\n            var gameFile1 = new GameFile \n            { \n                FileName = \"myhouse.wad\",\n                SettingsFiles = \"nope.wad;nah.wad\" // These should be ignored\n            };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"first.wad\" };\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = new GameFile { FileName = \"second.wad\" };\n            database.InsertGameFile(gameFile3);\n\n            var wrongGameFile = new GameFile { FileName = \"random.wad\" };\n            database.InsertGameFile(wrongGameFile);\n\n            var fileLoadHandler = new FileLoadHandler(database, gameFile1, gameProfile);\n            var currentAdditionalFiles = fileLoadHandler.GetCurrentAdditionalFiles();\n\n            Assert.AreEqual(3, currentAdditionalFiles.Count());\n            Assert.IsTrue(currentAdditionalFiles.Exists(x => x.FileName.Equals(\"myhouse.wad\")));\n            Assert.IsTrue(currentAdditionalFiles.Exists(x => x.FileName.Equals(\"first.wad\")));\n            Assert.IsTrue(currentAdditionalFiles.Exists(x => x.FileName.Equals(\"second.wad\")));\n        }\n\n        [TestMethod]\n        public void CalculateAdditionalFiles_IfNoIWadThenClearIWadAndSourcePortFiles()\n        {\n            var gameProfile = new GameFile\n            {\n                FileName = \"the_profile.wad\",\n                SettingsFilesSourcePort = \"sauce_port.zip\",\n                SettingsFilesIWAD = \"eye_wad.zip\"\n            };\n            database.InsertGameFile(gameProfile);\n\n            var gameFile1 = new GameFile { FileName = \"file IGNORE.wad\" };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"sauce_port IGNORE.wad\" };\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = new GameFile { FileName = \"eye_wad IGNORE.wad\" };\n            database.InsertGameFile(gameFile3);\n\n            var fileLoadHandler = new FileLoadHandler(database, gameFile1, gameProfile);\n            fileLoadHandler.CalculateAdditionalFiles(null, null);\n\n            Assert.AreEqual(0, fileLoadHandler.GetIWadFiles().Count);\n            Assert.AreEqual(0, fileLoadHandler.GetSourcePortFiles().Count);\n        }\n\n        [TestMethod]\n        public void CalculateAdditionalFiles_IfIWadIsGameFileThenIgnoreIWadAdditionalFiles()\n        {\n            // This was a bug, for an iwad like DOOM2 Doom Launcher sets the SettingsFile to DOOM2.WAD if the user loaded it.\n            // We need to exclude this when using DOOM2 as the iwad for another file\n\n            var gameProfile = new GameFile { FileName = \"game-profiley.wad\" };\n            database.InsertGameFile(gameProfile);\n\n            var iwadGameFile = InsertIWadAndGameFile(\"iwad.zip\",\n                settingsFiles: \"chooseme.zip;ignoreme.zip\",\n                settingsFilesSourcePort: \"ignoreme.zip\"); // Should cancel out the same file in SettingsFiles\n\n            var gameFile1 = new GameFile { FileName = \"chooseme.zip\" };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"ignoreme.zip\" };\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = new GameFile { FileName = \"secondone.zip\" };\n            database.InsertGameFile(gameFile3);\n\n            var sourcePort1 = new SourcePortData { Name = \"Floom\", SettingsFiles = \"secondone.zip\" };\n            database.InsertSourcePort(sourcePort1);\n\n            var fileLoadHandler = new FileLoadHandler(database, iwadGameFile, gameProfile);\n\n            fileLoadHandler.CalculateAdditionalFiles(iwadGameFile, sourcePort1);\n\n            Assert.AreEqual(0, fileLoadHandler.GetIWadFiles().Count);\n\n            Assert.AreEqual(1, fileLoadHandler.GetSourcePortFiles().Count);\n            Assert.AreEqual(\"secondone.zip\", fileLoadHandler.GetSourcePortFiles().First().FileName);\n        }\n\n        [TestMethod]\n        public void CalculateAdditionalFiles_IfIWadIsNotGameFileThenTakeIWadAdditionalFiles()\n        {\n            var gameProfile = new GameFile { FileName = \"game-profilex.wad\" };\n            database.InsertGameFile(gameProfile);\n\n            var iwadGameFile = InsertIWadAndGameFile(\"iwady.zip\",\n                settingsFiles: \"choosemee.zip;ignoremee.zip\",\n                settingsFilesSourcePort: \"ignoremee.zip\"); // Should cancel out the same file in SettingsFiles\n\n            var theGameFile = new GameFile { FileName = \"the-game-file.zip\" };\n            database.InsertGameFile(theGameFile);\n\n            var gameFile1 = new GameFile { FileName = \"choosemee.zip\" };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"ignoremee.zip\" };\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = new GameFile { FileName = \"2nd-one.zip\" };\n            database.InsertGameFile(gameFile3);\n\n            var sourcePort1 = new SourcePortData { Name = \"Broom\", SettingsFiles = \"2nd-one.zip\" };\n            database.InsertSourcePort(sourcePort1);\n\n            var fileLoadHandler = new FileLoadHandler(database, theGameFile, gameProfile);\n\n            fileLoadHandler.CalculateAdditionalFiles(iwadGameFile, sourcePort1);\n\n            Assert.AreEqual(1, fileLoadHandler.GetIWadFiles().Count);\n            Assert.AreEqual(\"choosemee.zip\", fileLoadHandler.GetIWadFiles().First().FileName);\n\n            Assert.AreEqual(1, fileLoadHandler.GetSourcePortFiles().Count);\n            Assert.AreEqual(\"2nd-one.zip\", fileLoadHandler.GetSourcePortFiles().First().FileName);\n        }\n\n        [TestMethod]\n        public void CalculateAdditionalFiles_CorrectlyExcludesThePreviousResults()\n        {\n            // Set up first calculation\n            var gameProfile = new GameFile { FileName = \"the-game-profile.wad\" };\n            database.InsertGameFile(gameProfile);\n\n            var theGameFile = new GameFile { FileName = \"GAME_FILE.zip\" };\n            database.InsertGameFile(theGameFile);\n\n            var iwadGameFile1 = InsertIWadAndGameFile(\"IWAD1.zip\",\n                settingsFiles: \"right1.zip;right2.zip;wrong1.zip\",\n                settingsFilesSourcePort: \"wrong1.zip\"); // Should cancel out the same file in SettingsFiles\n\n            var sourcePort1 = new SourcePortData { Name = \"Broom\", SettingsFiles = \"sp_right3.zip\" };\n            database.InsertSourcePort(sourcePort1);\n\n            var gameFile1 = new GameFile { FileName = \"right1.zip\" };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"right2.zip\" };\n            database.InsertGameFile(gameFile2);\n\n            var gameFile3 = new GameFile { FileName = \"sp_right3.zip\" };\n            database.InsertGameFile(gameFile3);\n\n            var gameFile4 = new GameFile { FileName = \"wrong1.zip\" };\n            database.InsertGameFile(gameFile4);\n\n            var fileLoadHandler = new FileLoadHandler(database, theGameFile, gameProfile);\n\n            // First calculation\n            fileLoadHandler.CalculateAdditionalFiles(iwadGameFile1, sourcePort1);\n\n            // Additional files includes the game file, plus the added ones\n            var additionalFiles1 = fileLoadHandler.GetCurrentAdditionalFiles();\n            Assert.AreEqual(4, additionalFiles1.Count);\n            Assert.IsTrue(additionalFiles1.Exists(x => x.FileName.Equals(\"GAME_FILE.zip\"))); \n            Assert.IsTrue(additionalFiles1.Exists(x => x.FileName.Equals(\"right1.zip\")));\n            Assert.IsTrue(additionalFiles1.Exists(x => x.FileName.Equals(\"right2.zip\")));\n            Assert.IsTrue(additionalFiles1.Exists(x => x.FileName.Equals(\"sp_right3.zip\")));\n\n            // They are all new except the game file, which was already there since creation\n            var newAdditionalFiles1 = fileLoadHandler.GetCurrentAdditionalNewFiles();\n            Assert.AreEqual(3, newAdditionalFiles1.Count);\n            Assert.IsTrue(newAdditionalFiles1.Exists(x => x.FileName.Equals(\"right1.zip\")));\n            Assert.IsTrue(newAdditionalFiles1.Exists(x => x.FileName.Equals(\"right2.zip\")));\n            Assert.IsTrue(newAdditionalFiles1.Exists(x => x.FileName.Equals(\"sp_right3.zip\")));\n\n            // Set up second calculation\n            var iwadGameFile2 = InsertIWadAndGameFile(\"IWAD2.zip\",\n                settingsFiles: \"right1.zip;NEWRIGHT.ZIP;wrong1.zip\", // NEWRIGHT.ZIP instead of right2.zip\n                settingsFilesSourcePort: \"wrong1.zip\"); // Should cancel out the same file in SettingsFiles\n\n            var sourcePort2 = new SourcePortData { Name = \"Vroom\", SettingsFiles = \"sp_right3.zip\" }; // Same as the other one\n            database.InsertSourcePort(sourcePort2);\n\n            var gameFile5 = new GameFile { FileName = \"NEWRIGHT.ZIP\" };\n            database.InsertGameFile(gameFile5);\n\n            // Second calculation\n            fileLoadHandler.CalculateAdditionalFiles(iwadGameFile2, sourcePort2);\n\n            // Now has NEWRIGHT.ZIP instead of right2.zip\n            var additionalFiles2 = fileLoadHandler.GetCurrentAdditionalFiles();\n            Assert.AreEqual(4, additionalFiles2.Count);\n            Assert.IsTrue(additionalFiles2.Exists(x => x.FileName.Equals(\"GAME_FILE.zip\")));\n            Assert.IsTrue(additionalFiles2.Exists(x => x.FileName.Equals(\"right1.zip\")));\n            Assert.IsTrue(additionalFiles2.Exists(x => x.FileName.Equals(\"NEWRIGHT.ZIP\")));\n            Assert.IsTrue(additionalFiles2.Exists(x => x.FileName.Equals(\"sp_right3.zip\")));\n\n            // Only NEWRIGHT.ZIP is new now\n            var newAdditionalFiles2 = fileLoadHandler.GetCurrentAdditionalNewFiles();\n            Assert.AreEqual(1, newAdditionalFiles2.Count);\n            Assert.AreEqual(\"NEWRIGHT.ZIP\", newAdditionalFiles2.First().FileName); // Only this one is new since the first calculation\n        }\n\n        [TestMethod]\n        public void CalculateAdditionalFiles_AdditionalFilesAreOrderedByIWadFilesThenByEarliest()\n        {\n            // Set up first calculation\n            var gameProfile = new GameFile\n            {\n                FileName = \"GAME_PROFILE.wad\",\n                SettingsFiles = \"og_yes1.zip;og_yes2.zip\"\n            };\n            database.InsertGameFile(gameProfile);\n\n            var theGameFile = new GameFile { FileName = \"THE_GAME_FILE.zip\" };\n            database.InsertGameFile(theGameFile);\n\n            var gameFile1 = new GameFile { FileName = \"og_yes1.zip\" };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"og_yes2.zip\" };\n            database.InsertGameFile(gameFile2);\n\n            var fileLoadHandler = new FileLoadHandler(database, theGameFile, gameProfile);\n\n            // First calculation\n            fileLoadHandler.CalculateAdditionalFiles(null, null);\n            Assert.AreEqual(3, fileLoadHandler.GetCurrentAdditionalFiles().Count());\n\n            // Set up second calculation\n            var iwadGameFile1 = InsertIWadAndGameFile(\"IWAD1.zip\",\n                settingsFiles: \"iw_yes3.zip;iw_yes4.zip\",\n                settingsFilesSourcePort: \"\");\n\n            var sourcePort1 = new SourcePortData { Name = \"GLoom\", SettingsFiles = \"sp_yes5.zip;sp_yes6.zip\" };\n            database.InsertSourcePort(sourcePort1);\n\n            var gameFile3 = new GameFile { FileName = \"iw_yes3.zip\" };\n            database.InsertGameFile(gameFile3);\n\n            var gameFile4 = new GameFile { FileName = \"iw_yes4.zip\" };\n            database.InsertGameFile(gameFile4);\n\n            var gameFile5 = new GameFile { FileName = \"sp_yes5.zip\" };\n            database.InsertGameFile(gameFile5);\n\n            var gameFile6 = new GameFile { FileName = \"sp_yes6.zip\" };\n            database.InsertGameFile(gameFile6);\n\n            // Second calculation\n            fileLoadHandler.CalculateAdditionalFiles(iwadGameFile1, sourcePort1);\n\n            var additionalFiles1 = fileLoadHandler.GetCurrentAdditionalFiles();\n            Assert.AreEqual(7, additionalFiles1.Count());\n\n            // IWad files are first\n            Assert.AreEqual(\"iw_yes3.zip\", additionalFiles1[0].FileName);\n            Assert.AreEqual(\"iw_yes4.zip\", additionalFiles1[1].FileName);\n\n            // The GameFile was the first original file\n            Assert.AreEqual(\"THE_GAME_FILE.zip\", additionalFiles1[2].FileName);\n\n            // Files from the first calculation are next\n            Assert.AreEqual(\"og_yes1.zip\", additionalFiles1[3].FileName);\n            Assert.AreEqual(\"og_yes2.zip\", additionalFiles1[4].FileName);\n\n            // Then the rest\n            Assert.AreEqual(\"sp_yes5.zip\", additionalFiles1[5].FileName);\n            Assert.AreEqual(\"sp_yes6.zip\", additionalFiles1[6].FileName);\n        }\n\n        [TestMethod]\n        public void Reset_RestoresAdditionalFilesToCreationState()\n        {\n            // Set up creation state\n            var gameProfile = new GameFile\n            {\n                FileName = \"the-game-profile.wad\",\n                SettingsFiles = \"file1.zip;file2.zip\"\n            };\n            database.InsertGameFile(gameProfile);\n\n            var theGameFile = new GameFile { FileName = \"the-game-file.zip\" };\n            database.InsertGameFile(theGameFile);\n\n            var gameFile1 = new GameFile { FileName = \"file1.zip\" };\n            database.InsertGameFile(gameFile1);\n\n            var gameFile2 = new GameFile { FileName = \"file2.zip\" };\n            database.InsertGameFile(gameFile2);\n\n            var fileLoadHandler = new FileLoadHandler(database, theGameFile, gameProfile);\n            Assert.AreEqual(3, fileLoadHandler.GetCurrentAdditionalFiles().Count);\n\n            // Set up new state\n            var iwadGameFile1 = InsertIWadAndGameFile(\"the-iwad.zip\",\n                settingsFiles: \"new1.zip;new2.zip\",\n                settingsFilesSourcePort: \"\");\n\n            var gameFile3 = new GameFile { FileName = \"new1.zip\" };\n            database.InsertGameFile(gameFile3);\n\n            var gameFile4 = new GameFile { FileName = \"new2.zip\" };\n            database.InsertGameFile(gameFile4);\n\n            fileLoadHandler.CalculateAdditionalFiles(iwadGameFile1, null);\n            Assert.AreEqual(5, fileLoadHandler.GetCurrentAdditionalFiles().Count);\n\n            // Reset original state\n            fileLoadHandler.Reset();\n            var additionalFiles = fileLoadHandler.GetCurrentAdditionalFiles();\n            Assert.AreEqual(3, additionalFiles.Count());\n            Assert.IsTrue(additionalFiles.Exists(x => x.FileName.Equals(\"the-game-file.zip\")));\n            Assert.IsTrue(additionalFiles.Exists(x => x.FileName.Equals(\"file1.zip\")));\n            Assert.IsTrue(additionalFiles.Exists(x => x.FileName.Equals(\"file2.zip\")));\n        }\n\n        private IGameFile InsertIWadAndGameFile(String fileName, String settingsFiles, String settingsFilesSourcePort)\n        {\n            IGameFile iwadGameFile = new GameFile\n            {\n                FileName = fileName,\n                SettingsFiles = settingsFiles,\n                SettingsFilesSourcePort = settingsFilesSourcePort\n            };\n            database.InsertGameFile(iwadGameFile);\n            iwadGameFile = database.GetGameFile(fileName);\n\n            IIWadData iwad1 = new IWadData\n            {\n                Name = fileName,\n                GameFileID = iwadGameFile.GameFileID\n            };\n            database.InsertIWad(iwad1);\n            iwad1 = database.GetIWad((int)iwadGameFile.GameFileID);\n            iwadGameFile.IWadID = iwad1.IWadID;\n            database.UpdateGameFile(iwadGameFile);\n\n            return iwadGameFile;\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestMapLumps.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing WadReader;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestMapLumps\n    {\n        [TestMethod]\n        public void TestMap()\n        {\n            List<FileLump> lumps = CreateMapSetLumps(\"MAP01\");\n            List<FileLump> mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n        \n            Assert.AreEqual(1, mapLumps.Count);\n            Assert.AreEqual(\"MAP01\", mapLumps.First().Name);\n        }\n\n        [TestMethod]\n        public void TestMapWithExtra()\n        {\n            List<FileLump> lumps = CreateMapSetLumps(\"MAP01\");\n\n            lumps.Insert(0, new FileLump(\"JUNK\"));\n            for (int i = 0; i < 10; i++)\n                lumps.Add(new FileLump(\"LUMP\" + i.ToString()));\n\n            List<FileLump> mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n\n            Assert.AreEqual(1, mapLumps.Count);\n            Assert.AreEqual(\"MAP01\", mapLumps.First().Name);\n        }\n\n        [TestMethod]\n        public void TestMultipleMaps()\n        {\n            string[] maps = new string[] { \"MAP01\", \"MAP02\", \"MAP03\", \"MAP04\", \"MAP05\", \"MAP06\" };\n            List<FileLump> lumps = new List<FileLump>();\n\n            Array.ForEach(maps, x => lumps.AddRange(CreateMapSetLumps(x)));\n\n            List<FileLump> mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n            \n            Assert.AreEqual(maps.Length, mapLumps.Count);\n            Assert.AreEqual(maps.Length, mapLumps.Count(x => maps.Contains(x.Name)));\n        }\n\n        [TestMethod]\n        public void TestNonStandardMapNames()\n        {\n            string[] maps = new string[] { \"MYMAP\", \"ZMAP1\", \"XMAP2\", \"ANOTHERMAP\", \"WHOCARES\", \"LOOKATME\" };\n            List<FileLump> lumps = new List<FileLump>();\n\n            Array.ForEach(maps, x => lumps.AddRange(CreateMapSetLumps(x)));\n\n            List<FileLump> mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n\n            Assert.AreEqual(maps.Length, mapLumps.Count);\n            Assert.AreEqual(maps.Length, mapLumps.Count(x => maps.Contains(x.Name)));\n        }\n\n        [TestMethod]\n        public void TestMultipleMapsWithExtra()\n        {\n            string[] maps = new string[] { \"MAP01\", \"MAP02\", \"MAP03\", \"MAP04\", \"MAP05\", \"MAP06\" };\n            List<FileLump> lumps = new List<FileLump>();\n\n            foreach(var map in maps)\n            {\n                lumps.AddRange(CreateMapSetLumps(map));\n                for (int i = 0; i < 10; i++)\n                    lumps.Add(new FileLump(\"LUMP\" + i.ToString()));\n            }\n\n            for (int i = 0; i < 10; i++)\n                lumps.Add(new FileLump(\"LUMP\" + i.ToString()));\n\n            List<FileLump> mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n\n            Assert.AreEqual(maps.Length, mapLumps.Count);\n            Assert.AreEqual(maps.Length, mapLumps.Count(x => maps.Contains(x.Name)));\n        }\n\n        [TestMethod]\n        public void TestBadMapLump()\n        {\n            List<FileLump> lumps = CreateMapSetLumps(\"MAP01\");\n            lumps.Insert(2, new FileLump(\"BADLUMP\"));\n            List<FileLump> mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n\n            //MAP01 should not pass, but BADLUMP will because it has at least 5 valid map lumps\n            Assert.AreEqual(1, mapLumps.Count);\n            Assert.AreEqual(\"BADLUMP\", mapLumps.First().Name);\n        }\n\n        [TestMethod]\n        public void TestBadMapLumpNoMap()\n        {\n            List<FileLump> lumps = CreateMapSetLumps(\"MAP01\");\n            lumps.Insert(4, new FileLump(\"BADLUMP\"));\n            List<FileLump> mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n\n            //requires at least 5 valid map lumps to pass, inserting BADLUMP in the middle will fail both\n            Assert.AreEqual(0, mapLumps.Count);\n        }\n\n        [TestMethod]\n        public void TestUdmf()\n        {\n            List<FileLump> lumps = CreateLumps(new string[] { \"MAP01\", \"TEXTMAP\", \"ZNODES\", \"ENDMAP\"  });\n            List<FileLump> mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n\n            Assert.AreEqual(1, mapLumps.Count);\n            Assert.AreEqual(\"MAP01\", mapLumps.First().Name);\n\n            lumps.AddRange(CreateLumps(new string[] { \"WHOCARES\", \"MAP02\", \"TEXTMAP\", \"ZNODES\", \"REJECT\", \"DIALOGUE\", \"ENDMAP\", \"JUNK\" }));\n            mapLumps = WadFileReader.GetMapMarkerLumps(lumps);\n\n            Assert.AreEqual(2, mapLumps.Count);\n            Assert.AreEqual(\"MAP01\", mapLumps[0].Name);\n            Assert.AreEqual(\"MAP02\", mapLumps[1].Name);\n        }\n\n        private List<FileLump> CreateMapSetLumps(string mapName)\n        {\n            return CreateLumps(new string[] { mapName, \"THINGS\", \"LINEDEFS\", \"SIDEDEFS\", \"VERTEXES\", \"SEGS\", \"SECTORS\", \"GL_NODES\", \"GL_ANY\" });\n        }\n\n        private List<FileLump> CreateLumps(string[] names)\n        {\n            List<FileLump> ret = new List<FileLump>();\n            Array.ForEach(names, x => ret.Add(new FileLump(x)));\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestMapStringSyncAction.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Handlers.Sync;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.IO;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestMapStringSyncAction\n    {\n        [TestMethod]\n        public void MapString()\n        {\n            var mapInfo = @\"\n                map map01 {\n                    music = \"\"test1\"\"\n                }\n\n                MAP MAP02 {\n                    music = \"\"test2\"\"\n                }\n            \";\n\n            var frag = new MapStringSyncAction(new LauncherPath(Directory.GetCurrentDirectory()));\n            var gameFile = new GameFile();\n            frag.ApplyToGameFile(gameFile, null, new string[] { mapInfo });\n\n            Assert.AreEqual(\"map01, MAP02\", gameFile.Map);\n            Assert.AreEqual(2, gameFile.MapCount);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestRecursiveArchiveReader.cs",
    "content": "﻿using DoomLauncher;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Linq;\nusing DoomLauncher.Archive;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestRecursiveArchiveReader\n    {\n        [TestInitialize]\n        public void Initialize()\n        {\n            TreeReader.TreeReadersCreated = 0;\n            TreeReader.TreeReadersDisposed = 0;\n        }\n\n        private IArchiveReader GetReaderFromEntry(IArchiveEntry entry) =>\n            (entry as TreeEntry)?.GetTreeReader();\n\n        [TestMethod]\n        public void EntriesIncludesNextLevelDown()\n        {\n            var tree = new Tree(\"wads\",\n                new Tree(\"wads/a\"),\n                new Tree(\"wads/b\"),\n                new Tree(\"wads/id\",\n                    new Tree(\"wads/id/c\"),\n                    new Tree(\"wads/id/d\")));\n\n            IArchiveReader root = new TreeReader(tree);\n            var reader = new RecursiveArchiveReader(root, GetReaderFromEntry);\n            var entryNames = reader.Entries.Select(e => e.Name).ToList();\n\n            Assert.AreEqual(5, entryNames.Count);\n            Assert.AreEqual(\"wads/a\", entryNames[0]);\n            Assert.AreEqual(\"wads/b\", entryNames[1]);\n            Assert.AreEqual(\"wads/id\", entryNames[2]);\n            Assert.AreEqual(\"wads/id/c\", entryNames[3]);\n            Assert.AreEqual(\"wads/id/d\", entryNames[4]);\n\n        }\n\n        [TestMethod]\n        public void EntriesRespectUnderlyingLaziness()\n        {\n            var tree = new Tree(\"fruit\",\n                new Tree(\"apple\"),\n                new Tree(\"banana\"),\n                new Tree(\"berries\", \n                    new Tree(\"strawberry\"), \n                    new Tree(\"cherry\"), \n                    new Tree(\"ILLEGAL\")),\n                new Tree(\"ILLEGAL\"));\n\n            IArchiveReader root = new TreeReader(tree);\n            var reader = new RecursiveArchiveReader(root, (entry) =>\n            {\n                if (entry.Name == \"ILLEGAL\")\n                    throw new Exception(\"YOU WEREN'T SUPPOSED TO LOOK AT THIS ONE!\");\n                else\n                    return GetReaderFromEntry(entry);\n            });\n            var entryNames = reader.Entries.Take(5).Select(e => e.Name).ToList();\n            Assert.AreEqual(5, entryNames.Count);\n            Assert.AreEqual(\"apple\", entryNames[0]);\n            Assert.AreEqual(\"banana\", entryNames[1]);\n            Assert.AreEqual(\"berries\", entryNames[2]);\n            Assert.AreEqual(\"strawberry\", entryNames[3]);\n            Assert.AreEqual(\"cherry\", entryNames[4]);\n        }\n\n        [TestMethod]\n        public void DisposeRecursiveReaderDisposesAllTheChildReaders()\n        {\n            var tree = new Tree(\"wads\", // 1st TreeReader\n                new Tree(\"wads/a\"),\n                new Tree(\"wads/b\"),\n                new Tree(\"wads/id\", // 2nd TreeReader\n                    new Tree(\"wads/id/c\"),\n                    new Tree(\"wads/id/d\")));\n\n            Assert.AreEqual(0, TreeReader.TreeReadersCreated);\n            Assert.AreEqual(0, TreeReader.TreeReadersDisposed);\n\n            IArchiveReader root = new TreeReader(tree);\n\n            Assert.AreEqual(1, TreeReader.TreeReadersCreated);\n            Assert.AreEqual(0, TreeReader.TreeReadersDisposed);\n\n            using (var reader = new RecursiveArchiveReader(root, GetReaderFromEntry))\n            {\n                var makeItExplicit = reader.Entries.ToList();\n            }\n\n            Assert.AreEqual(2, TreeReader.TreeReadersCreated);\n            Assert.AreEqual(2, TreeReader.TreeReadersDisposed);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestSourcePort.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestSourcePort\n    { \n        private List<ISourcePortData> CreateTestSourcePorts()\n        {\n            List<ISourcePortData> sourcePorts = new List<ISourcePortData>();\n            for (int i = 0; i < 10; i++)\n            {\n                sourcePorts.Add(\n                    new DoomLauncher.DataSources.SourcePortData()\n                    {\n                        SourcePortID = i + 1,\n                        Name = \"test\" + i.ToString(),\n                        Executable = \"test\" + i.ToString(),\n                        FileOption = \"test\" + i.ToString(),\n                        SettingsFiles = \"test\" + i.ToString(),\n                        SupportedExtensions = \"test\" + i.ToString(),\n                        Directory = new LauncherPath(i.ToString()),\n                        AltSaveDirectory = new LauncherPath(i.ToString()),\n                        LaunchType = i > 6 ? SourcePortLaunchType.Utility : SourcePortLaunchType.SourcePort,\n                        ExtraParameters = \"test\" + i.ToString()\n                    }\n                );\n            }\n            return sourcePorts;\n        }\n\n        public void Clear()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            foreach (var sourcePort in adapter.GetSourcePorts())\n                adapter.DeleteSourcePort(sourcePort);\n            foreach (var utility in adapter.GetUtilities())\n                adapter.DeleteSourcePort(utility);\n        }\n\n        [TestMethod]\n        public void TestSourcePortData()\n        {\n            Clear();\n            TestInsert();\n            TestGetSourcePorts();\n            TestUpdate();\n            TestDelete();\n        }\n\n        public void TestInsert()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var sourcePorts = CreateTestSourcePorts();\n            foreach (var port in sourcePorts)\n                adapter.InsertSourcePort(port);\n\n            Assert.AreEqual(sourcePorts.Count(x => x.LaunchType == SourcePortLaunchType.SourcePort), \n                adapter.GetSourcePorts().Count());\n            Assert.AreEqual(sourcePorts.Count(x => x.LaunchType == SourcePortLaunchType.Utility), \n                adapter.GetUtilities().Count());\n        }\n\n        public void TestGetSourcePorts()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var sourcePorts = adapter.GetSourcePorts();\n            var utilites = adapter.GetUtilities();\n\n            Assert.AreEqual(7, sourcePorts.Count());\n            Assert.AreEqual(3, utilites.Count());\n\n            List<ISourcePortData> allSourcePorts = new List<ISourcePortData>();\n            allSourcePorts.AddRange(sourcePorts);\n            allSourcePorts.AddRange(utilites);\n\n            var testSourcePorts = CreateTestSourcePorts();\n    \n            foreach(var testSourcePort in testSourcePorts)\n            {\n                var port = allSourcePorts.First(x => x.Name.Equals(testSourcePort.Name));\n                Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(testSourcePort, port, nameof(ISourcePortData.SourcePortID)));\n            }\n        }\n\n        public void TestGetSourcePort()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n\n            var testSourcePorts = CreateTestSourcePorts();\n\n            foreach (var testSourcePort in testSourcePorts)\n            {\n                var dbPort = adapter.GetSourcePort(testSourcePort.SourcePortID);\n                Assert.IsNotNull(dbPort);\n                Assert.IsTrue(TestUtil.AllFieldsEqualIgnore(testSourcePort, dbPort, nameof(ISourcePortData.SourcePortID)));\n            }\n        }\n\n        public void TestUpdate()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n\n            List<ISourcePortData> allSourcePorts = new List<ISourcePortData>();\n            allSourcePorts.AddRange(adapter.GetSourcePorts());\n            allSourcePorts.AddRange(adapter.GetUtilities());\n\n            int somenumber = 100;\n\n            foreach(var sourcePort in allSourcePorts)\n            {\n                sourcePort.Directory = new LauncherPath(sourcePort.Directory.GetPossiblyRelativePath() + somenumber.ToString());\n                sourcePort.Name += somenumber.ToString();\n                sourcePort.SettingsFiles += somenumber.ToString();\n                sourcePort.SupportedExtensions += somenumber.ToString();\n\n                adapter.UpdateSourcePort(sourcePort);\n\n                var dbPort = adapter.GetSourcePort(sourcePort.SourcePortID);\n                Assert.IsNotNull(dbPort);\n                Assert.IsTrue(TestUtil.AllFieldsEqual(sourcePort, dbPort));\n            }\n        }\n\n        public void TestDelete()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n\n            List<ISourcePortData> allSourcePorts = new List<ISourcePortData>();\n            allSourcePorts.AddRange(adapter.GetSourcePorts());\n            allSourcePorts.AddRange(adapter.GetUtilities());\n\n            int count = allSourcePorts.Count;\n\n            foreach (var sourcePort in allSourcePorts)\n            {\n                adapter.DeleteSourcePort(sourcePort);\n                count--;\n                Assert.AreEqual(count, adapter.GetSourcePorts().Count() + adapter.GetUtilities().Count());\n                Assert.IsNull(adapter.GetSourcePort(sourcePort.SourcePortID));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestSpecificFiles.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.IO;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestSpecificFiles\n    {\n        private static readonly string ResourceFolder = \"Resources\";\n        private static readonly string[] SupportedExtensions = new string[] { \".wad\", };\n\n        [TestMethod]\n        public void ZipFileManaged()\n        {\n            IGameFile gameFile = CreateGameFile(Path.Combine(ResourceFolder, \"pyrrhic.zip\"), managed: true);\n            string[] files = SpecificFilesForm.GetSupportedFiles(ResourceFolder, gameFile, SupportedExtensions);\n\n            Assert.IsFalse(gameFile.IsDirectory());\n            Assert.IsFalse(gameFile.IsUnmanaged());\n            Assert.AreEqual(1, files.Length);\n            Assert.AreEqual(\"pyrrhic_.wad\", files[0]);\n        }\n\n        [TestMethod]\n        public void ZipFileUnmanaged()\n        {\n            // Unmanaged zip files should still extract contents like normal\n            string path = Path.GetFullPath(Path.Combine(ResourceFolder, \"pyrrhic.zip\"));\n            IGameFile gameFile = CreateGameFile(path, managed: false);\n            string[] files = SpecificFilesForm.GetSupportedFiles(ResourceFolder, gameFile, SupportedExtensions);\n\n            Assert.IsFalse(gameFile.IsDirectory());\n            Assert.IsTrue(gameFile.IsUnmanaged());\n            Assert.AreEqual(1, files.Length);\n            Assert.AreEqual(\"pyrrhic_.wad\", files[0]);\n        }\n\n        [TestMethod]\n        public void Pk3FileUnmanaged()\n        {\n            // A pk3 is a zip, but should not have contents extracted\n            string path = Path.GetFullPath(Path.Combine(ResourceFolder, \"testpk3.pk3\"));\n            IGameFile gameFile = CreateGameFile(path, managed: false);\n            string[] files = SpecificFilesForm.GetSupportedFiles(ResourceFolder, gameFile, SupportedExtensions);\n\n            Assert.IsFalse(gameFile.IsDirectory());\n            Assert.IsTrue(gameFile.IsUnmanaged());\n            Assert.AreEqual(1, files.Length);\n            Assert.AreEqual(path, files[0]);\n        }\n\n        [TestMethod]\n        public void UnmanagedFile()\n        {\n            // The extension doesn't matter, it's unamanged so it should be added\n            TestUtil.ExtractResourceToDirectory(\"pyrrhic.zip\", \"Doom\");\n            string path = Path.GetFullPath(Path.Combine(\"Doom\", \"pyrrhic_.wad\"));\n            IGameFile gameFile = CreateGameFile(path, managed: false);\n            string[] files = SpecificFilesForm.GetSupportedFiles(\"Doom\", gameFile, SupportedExtensions);\n\n            Assert.IsFalse(gameFile.IsDirectory());\n            Assert.IsTrue(gameFile.IsUnmanaged());\n            Assert.AreEqual(1, files.Length);\n            Assert.AreEqual(path, files[0]);\n        }\n\n        [TestMethod]\n        public void Folder()\n        {\n            // Extension doesn't matter, it's an unmanaged folder so it should be added\n            TestUtil.ExtractResourceToDirectory(\"pyrrhic.zip\", \"Doom\");\n            string path = Path.GetFullPath(\"Doom\");\n            IGameFile gameFile = CreateGameFile(path, managed: false);\n            string[] files = SpecificFilesForm.GetSupportedFiles(\"Doom\", gameFile, SupportedExtensions);\n\n            Assert.IsTrue(gameFile.IsDirectory());\n            Assert.IsTrue(gameFile.IsUnmanaged());\n            Assert.AreEqual(1, files.Length);\n            Assert.AreEqual(path, files[0]);\n        }\n\n        private static IGameFile CreateGameFile(string path, bool managed)\n        {\n            string filename = managed ? Path.GetFileName(path) : path;\n\n            return new GameFile()\n            {\n                FileName = filename,                \n            };\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestStartupImageSyncAction.cs",
    "content": "﻿using DoomLauncher.DataSources;\nusing DoomLauncher.Handlers.Sync;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.IO;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestStartupImageSyncAction\n    {\n        [TestMethod]\n        public void ApplyToGameFile_CanProcessPNGImages()\n        {\n            var gameFile = new GameFile\n            {\n                FileName = \"blahblah.wad\"\n            };\n\n            byte[] pngBytes = File.ReadAllBytes(@\"resources\\happy.png\");\n\n            Tree files = new Tree(\"root\", new Tree(\"STARTUP\", pngBytes));\n            var reader = new TreeReader(files);\n\n            var syncAction = new StartupImageSyncAction();\n            var result = syncAction.ApplyToGameFile(gameFile, reader, null);\n\n            Assert.IsTrue(result.GetTitlePic(gameFile, out _));\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_CanProcessPlanarImages()\n        {\n            var gameFile = new GameFile\n            {\n                FileName = \"wad_with_planar.wad\"\n            };\n\n            byte[] planarBytes = File.ReadAllBytes(@\"resources\\planarimage.dat\");\n\n            Tree files = new Tree(\"root\", new Tree(\"STARTUP.dat\", planarBytes));\n            var reader = new TreeReader(files);\n\n            var syncAction = new StartupImageSyncAction();\n            var result = syncAction.ApplyToGameFile(gameFile, reader, null);\n\n            Assert.IsTrue(result.GetTitlePic(gameFile, out _));\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_IgnoreStartupDotWad()\n        {\n            var gameFile = new GameFile\n            {\n                FileName = \"wad_with_planar.wad\"\n            };\n\n            byte[] planarBytes = File.ReadAllBytes(@\"resources\\planarimage.dat\");\n\n            Tree files = new Tree(\"root\", new Tree(\"STARTUP.wad\", planarBytes));\n            var reader = new TreeReader(files);\n\n            var syncAction = new StartupImageSyncAction();\n            var result = syncAction.ApplyToGameFile(gameFile, reader, null);\n\n            Assert.IsFalse(result.GetTitlePic(gameFile, out _));\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_IgnoresStrifeStartupImage()\n        {\n            var gameFile = new GameFile\n            {\n                FileName = \"wad_with_planar.wad\"\n            };\n\n            byte[] planarBytes = File.ReadAllBytes(@\"resources\\planarimage.dat\");\n\n            Tree files = new Tree(\"root\", new Tree(\"STARTUP0\", planarBytes));\n            var reader = new TreeReader(files);\n\n            var syncAction = new StartupImageSyncAction();\n            var result = syncAction.ApplyToGameFile(gameFile, reader, null);\n\n            Assert.IsFalse(result.GetTitlePic(gameFile, out _));\n        }\n\n\n        [TestMethod]\n        public void ApplyToGameFile_NonsenseDoesntProduceAnImage()\n        {\n            var gameFile = new GameFile\n            {\n                FileName = \"wadname.wad\"\n            };\n\n            byte[] planarBytes = File.ReadAllBytes(@\"resources\\planarimage.dat\");\n\n            Tree files = new Tree(\"root\", new Tree(\"STARTUP.blah\", new byte[] { 0x01, 0x02, 0x03, 0xab, 0xcd }));\n            var reader = new TreeReader(files);\n\n            var syncAction = new StartupImageSyncAction();\n            var result = syncAction.ApplyToGameFile(gameFile, reader, null);\n\n            Assert.IsFalse(result.GetTitlePic(gameFile, out _));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestStatdump.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Statistics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestStatdump\n    {\n        private readonly List<NewStatisticsEventArgs> m_args = new List<NewStatisticsEventArgs>();\n\n        [TestMethod]\n        public void TestStatdumpFileSingle()\n        {\n            string file = @\"===========================================\nE1M1 / MAP01\n===========================================\n\nTime: 0:22 (par: 0:30)\n\nPlayer 1 (Green):\n\tKills: 5 / 6 (83%)\n\tItems: 3 / 37 (8%)\n\tSecrets: 0 / 3 (0%)\n\";\n\n            StatdumpReader statsReader = new StatdumpReader(new GameFile() { GameFileID = 1 }, \"stats.txt\");\n            statsReader.NewStastics += statsReader_NewStastics;\n\n            File.WriteAllText(\"stats.txt\", file);\n            statsReader.ReadNow();\n\n            Assert.AreEqual(1, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"E1M1/MAP01\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(5, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(6, m_args[0].Statistics.TotalKills);\n            Assert.AreEqual(3, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(37, m_args[0].Statistics.TotalItems);\n            Assert.AreEqual(0, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[0].Statistics.TotalSecrets);\n            Assert.AreEqual(22.0f, m_args[0].Statistics.LevelTime);\n        }\n\n        [TestMethod]\n        public void TestStatdumpFileMultiple()\n        {\n            string file = @\"===========================================\nE1M1\n===========================================\n\nTime: 0:20 (par: 0:30)\n\nPlayer 1 (Green):\n\tKills: 5 / 6 (83%)\n\tItems: 8 / 37 (21%)\n\tSecrets: 1 / 3 (0%)\n\n===========================================\nE1M2\n===========================================\n\nTime: 12:23 (par: 1:15)\n\nPlayer 1 (Green):\n\tKills: 13 / 41 (31%)\n\tItems: 12 / 42 (2%)\n\tSecrets: 3/ 6 (0%)\n\";\n\n            StatdumpReader statsReader = new StatdumpReader(new GameFile() { GameFileID = 1 }, \"stats.txt\");\n            statsReader.NewStastics += statsReader_NewStastics;\n\n            File.WriteAllText(\"stats.txt\", file);\n            statsReader.ReadNow();\n\n            Assert.AreEqual(2, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"E1M1\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(5, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(6, m_args[0].Statistics.TotalKills);\n            Assert.AreEqual(8, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(37, m_args[0].Statistics.TotalItems);\n            Assert.AreEqual(1, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[0].Statistics.TotalSecrets);\n            Assert.AreEqual(20.0f, m_args[0].Statistics.LevelTime);\n\n            Assert.AreEqual(\"E1M2\", m_args[1].Statistics.MapName);\n            Assert.AreEqual(13, m_args[1].Statistics.KillCount);\n            Assert.AreEqual(41, m_args[1].Statistics.TotalKills);\n            Assert.AreEqual(12, m_args[1].Statistics.ItemCount);\n            Assert.AreEqual(42, m_args[1].Statistics.TotalItems);\n            Assert.AreEqual(3, m_args[1].Statistics.SecretCount);\n            Assert.AreEqual(6, m_args[1].Statistics.TotalSecrets);\n            Assert.AreEqual(743.0f, m_args[1].Statistics.LevelTime);\n        }\n\n        [TestMethod]\n        public void TestStatdumpFileZero()\n        {\n            string file = @\"===========================================\nMAP30\n===========================================\n\nTime: 0:21 (par: 3:00)\n\nPlayer 1 (Green):\n\tKills: 0\n\tItems: 1 / 6 (16%)\n\tSecrets: 0\n\";\n\n            StatdumpReader statsReader = new StatdumpReader(new GameFile() { GameFileID = 1 }, \"stats.txt\");\n            statsReader.NewStastics += statsReader_NewStastics;\n\n            File.WriteAllText(\"stats.txt\", file);\n            statsReader.ReadNow();\n\n            Assert.AreEqual(1, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"MAP30\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(0, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(0, m_args[0].Statistics.TotalKills);\n            Assert.AreEqual(1, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(6, m_args[0].Statistics.TotalItems);\n            Assert.AreEqual(0, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(0, m_args[0].Statistics.TotalSecrets);\n            Assert.AreEqual(21.0f, m_args[0].Statistics.LevelTime);\n        }\n\n        [TestMethod]\n        public void TestStatdumpFileKills()\n        {\n            string file = @\"===========================================\nMAP11\n===========================================\n\nTime: 6:39 (par: 3:30)\n\nPlayer 1 (Green):\n\tKills: 78 / 71 (109%)\n\tItems: 21 / 21 (100%)\n\tSecrets: 3 / 3 (100%)\n\";\n\n            StatdumpReader statsReader = new StatdumpReader(new GameFile() { GameFileID = 1 }, \"stats.txt\");\n            statsReader.NewStastics += statsReader_NewStastics;\n\n            File.WriteAllText(\"stats.txt\", file);\n            statsReader.ReadNow();\n\n            Assert.AreEqual(1, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            //Check that the kill count does not exceed total kills\n            Assert.AreEqual(\"MAP11\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(71, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(71, m_args[0].Statistics.TotalKills);\n            Assert.AreEqual(21, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(21, m_args[0].Statistics.TotalItems);\n            Assert.AreEqual(3, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[0].Statistics.TotalSecrets);\n            Assert.AreEqual(399.0f, m_args[0].Statistics.LevelTime);\n        }\n\n        [TestMethod]\n        public void TestStatdumpNegative()\n        {\n            string file = @\"===========================================\nMAP11\n===========================================\n\nTime: 88:18 (par: 0:00)\n\nPlayer 1 (Green):\n\tKills: 620 / 601 (-5%)\n\tItems: 502 / 551 (-27%)\n\tSecrets: 10 / 11 (90%)\n\";\n\n            StatdumpReader statsReader = new StatdumpReader(new GameFile() { GameFileID = 1 }, \"stats.txt\");\n            statsReader.NewStastics += statsReader_NewStastics;\n\n            File.WriteAllText(\"stats.txt\", file);\n            statsReader.ReadNow();\n\n            Assert.AreEqual(1, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            //Check that the kill count does not exceed total kills\n            Assert.AreEqual(\"MAP11\", m_args[0].Statistics.MapName);\n            Assert.AreEqual(601, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(601, m_args[0].Statistics.TotalKills); // Total kills are capped\n            Assert.AreEqual(502, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(551, m_args[0].Statistics.TotalItems);\n            Assert.AreEqual(10, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(11, m_args[0].Statistics.TotalSecrets);\n            Assert.AreEqual(5298.0f, m_args[0].Statistics.LevelTime);\n        }\n\n        private void statsReader_NewStastics(object sender, DoomLauncher.NewStatisticsEventArgs e)\n        {\n            m_args.Add(e);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestStats.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestStats\n    {\n        private List<IStatsData> CreateStatsData()\n        {\n            List<IStatsData> stats = new List<IStatsData>();\n            for (int i = 0; i < 10; i++)\n            {\n                stats.Add(\n                    new StatsData()\n                    {\n                        StatID = i + 1,\n                        GameFileID = i,\n                        ItemCount = i,\n                        TotalItems = i,\n                        KillCount = i,\n                        TotalKills = i,\n                        SecretCount = i,\n                        TotalSecrets = i,\n                        LevelTime = i,\n                        SourcePortID = i,\n                        SaveFile = i.ToString(),\n                        MapName = i.ToString(),\n                        RecordTime = new DateTime(2019, 1, 1, i, 0, 0),\n                    }\n                );\n            }\n            return stats;\n        }\n\n        [TestMethod]\n        public void TestStatData()\n        {\n            TestInsert();\n            TestGet();\n            TestUpdate();\n            TestDelete();\n        }\n        \n        public void TestInsert()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var stats = CreateStatsData();\n            foreach (var stat in stats)\n                adapter.InsertStats(stat);\n\n            Assert.AreEqual(stats.Count, adapter.GetStats().Count());\n        }\n        \n        public void TestGet()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var testStats = CreateStatsData();\n            var stats = adapter.GetStats();\n\n            foreach (var testStat in testStats)\n            {\n                var stat = stats.First(x => x.StatID == testStat.StatID);\n                Assert.AreEqual(testStat, stat);\n            }\n        }\n        \n        public void TestUpdate()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var stats = adapter.GetStats();\n\n            var updateStat = stats.First();\n            updateStat.SourcePortID = 1000;\n\n            adapter.UpdateStats(updateStat);\n\n            Assert.AreEqual(updateStat, adapter.GetStats().First(x => x.StatID == updateStat.StatID));\n        }\n        \n        public void TestDelete()\n        {\n            IDataSourceAdapter adapter = TestUtil.CreateAdapter();\n            var stats = adapter.GetStats();\n            int count = stats.Count();\n\n            var sourcePortStat = stats.First();\n            adapter.DeleteStats(new SourcePortData() { SourcePortID = sourcePortStat.SourcePortID });\n            count--;\n\n            Assert.AreEqual(count, adapter.GetStats().Count());\n            stats = adapter.GetStats();\n\n            foreach(var stat in stats)\n            {\n                adapter.DeleteStats(stat.StatID);\n                count--;\n                Assert.AreEqual(count, adapter.GetStats().Count());\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestSteamLoader.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing DoomLauncher.GameStores;\nusing System.Linq;\nusing static DoomLauncher.GameStores.StoreGameLoader;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestSteamLoader\n    {\n        \n        [TestMethod]\n        public void LoadFromPath_FindsExpectedWads()\n        {\n            // Assuming fixtures:\n\n            // SteamGame.ULTIMATE_DOOM:\n            // TestSteamLibrary1 / steamapps / common / TestDoom\n\n\n            GameFinder finder = _ => @\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\";\n\n            var gameStoreFiles = StoreGameLoader.LoadStoreGame(StoreGame.ULTIMATE_DOOM, @\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\");\n\n            var iwads = gameStoreFiles.InstalledIWads;\n            Assert.AreEqual(4, iwads.Count);\n            Assert.IsTrue(iwads.Exists(x => x.Contains(\"doom.wad\")));\n            Assert.IsTrue(iwads.Exists(x => x.Contains(\"doom2.wad\")));\n            Assert.IsTrue(iwads.Exists(x => x.Contains(\"plutonia.wad\")));\n            Assert.IsTrue(iwads.Exists(x => x.Contains(\"tnt.wad\")));\n\n            var pwads = gameStoreFiles.InstalledPWads;\n            Assert.AreEqual(4, pwads.Count);\n            Assert.IsTrue(pwads.Exists(x => x.Contains(\"nerve.wad\")));\n            Assert.IsTrue(pwads.Exists(x => x.Contains(\"id1.wad\")));\n            Assert.IsTrue(pwads.Exists(x => x.Contains(\"masterlevels.wad\")));\n            Assert.IsTrue(pwads.Exists(x => x.Contains(\"sigil.wad\")));\n        }\n\n        [TestMethod]\n        public void LoadFromPath_ReturnsEmptyFilesIfDirectoryNotFound()\n        {\n            var gameStoreFiles = StoreGameLoader.LoadStoreGame(StoreGame.ULTIMATE_DOOM, @\"Resources\\DoesNotExist\");\n            Assert.AreEqual(gameStoreFiles, GameStoreFiles.EMPTY);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestSyncLibraryHandler.cs",
    "content": "﻿using DoomLauncher;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Drawing;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing DoomLauncher.Handlers.Sync;\nusing System.Collections.Generic;\nusing DoomLauncher.Interfaces;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestSyncLibraryHandler\n    {\n        private static readonly string s_filedir = \"TestSyncDir\";\n        private static readonly string s_tempdir = \"TestSyncDirTemp\";\n\n        private IDataSourceAdapter database;\n\n        [TestInitialize]\n        public void Init()\n        {\n            database = TestUtil.CreateAdapter();\n            Cleanup();\n            Directory.CreateDirectory(s_filedir);\n            Directory.CreateDirectory(s_tempdir);\n        }\n\n        [TestCleanup]\n        public void Cleanup()\n        {\n            var gameFiles = database.GetGameFiles();\n            gameFiles.ToList().ForEach(x => database.DeleteGameFile(x));\n\n            if (Directory.Exists(s_filedir))\n                Directory.Delete(s_filedir, true);\n            if (Directory.Exists(s_tempdir))\n                Directory.Delete(s_tempdir, true);\n        }\n\n        [TestMethod]\n        public void TestSyncSingleFile()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n            Assert.AreEqual(0, database.GetGameFilesCount());\n\n            string file = \"uroburos.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            var syncResult = handler.SyncManyFiles(new string[] { \"uroburos.zip\" });\n\n            Assert.AreEqual(1, syncResult.AddedGameFiles.Count);\n            Assert.AreEqual(file, syncResult.AddedGameFiles[0].FileName);\n            Assert.AreEqual(1, database.GetGameFilesCount());\n            var gameFile = database.GetGameFiles().First();\n\n            Assert.AreEqual(file, gameFile.FileName);\n            Assert.AreEqual(\"MAP01\", gameFile.Map);\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Title));\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Author));\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Description));\n            Assert.IsNotNull(gameFile.ReleaseDate);\n            Assert.IsNotNull(gameFile.Downloaded);\n        }\n\n        [TestMethod]\n        public void TestSyncMultiFile()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n            Assert.AreEqual(0, database.GetGameFilesCount());\n\n            string[] files = new string[] { \"uroburos.zip\", \"pyrrhic.zip\" };\n            Array.ForEach(files, x => File.Copy(Path.Combine(\"Resources\", x), Path.Combine(s_filedir, x)));\n\n            var syncResult = handler.SyncManyFiles(files);\n\n            Assert.AreEqual(2, syncResult.AddedGameFiles.Count);\n            Assert.AreEqual(2, database.GetGameFilesCount());\n\n            var gameFiles = database.GetGameFiles();\n            var gameFile = gameFiles.First(x => x.FileName == files[0]);\n\n            Assert.AreEqual(\"uroburos.zip\", gameFile.FileName);\n            Assert.AreEqual(\"MAP01\", gameFile.Map);\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Title));\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Author));\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Description));\n            Assert.IsNotNull(gameFile.ReleaseDate);\n            Assert.IsNotNull(gameFile.Downloaded);\n\n            gameFile = gameFiles.First(x => x.FileName == files[1]);\n            Assert.AreEqual(\"pyrrhic.zip\", gameFile.FileName);\n            Assert.AreEqual(\"MAP01, MAP02, MAP03, MAP04, MAP05, MAP06, MAP07, MAP08, MAP09, MAP10, MAP11, MAP12, MAP13, MAP14, MAP15\", gameFile.Map);\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Title));\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Author));\n            Assert.IsFalse(string.IsNullOrEmpty(gameFile.Description));\n            Assert.IsNotNull(gameFile.ReleaseDate);\n            Assert.IsNotNull(gameFile.Downloaded);\n        }\n\n        [TestMethod]\n        public void TestMapInfo()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n            Assert.AreEqual(0, database.GetGameFilesCount());\n\n            string file = \"joymaps1.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            handler.SyncManyFiles(new string[] { file });\n\n            Assert.AreEqual(1, database.GetGameFilesCount());\n            var gameFile = database.GetGameFiles().First();\n\n            Assert.AreEqual(\"MAP01, MAP02, MAP03, MAP04, MAP05, MAP06, MAP07, MAP08, MAP09, MAP10, MAP11, MAP12, MAP13, MAP14, MAP15\", gameFile.Map);\n        }\n\n        [TestMethod]\n        public void TestMapInfoInclude()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n            Assert.AreEqual(0, database.GetGameFilesCount());\n\n            string file = \"mapinfo.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            handler.SyncManyFiles(new string[] { file });\n\n            Assert.AreEqual(1, database.GetGameFilesCount());\n            var gameFile = database.GetGameFiles().First();\n\n            string maps = \"E1M1, E1M2, E1M3, E1M4, E1M5, E1M6, E1M7, E1M8, E1M9, E2M1, E2M2, E2M3, E2M4, E2M5, E2M6, E2M7, E2M8, E2M9, E3M1, E3M2, E3M3, E3M4, E3M5, E3M6, E3M7, E3M8, E3M9, E4M1, E4M2, E4M3, E4M4, E4M5, E4M6, E4M7, E4M8, E4M9, MAP01, MAP02, MAP03, MAP04, MAP05, MAP06, MAP07, MAP08, MAP09, MAP10, MAP11, MAP12, MAP13, MAP14, MAP15, MAP16, MAP17, MAP18, MAP19, MAP20, MAP21, MAP22, MAP23, MAP24, MAP25, MAP26, MAP27, MAP28, MAP29, MAP30, MAP31, MAP32, NV_MAP01, NV_MAP02, NV_MAP03, NV_MAP04, NV_MAP05, NV_MAP06, NV_MAP07, NV_MAP08, NV_MAP09, ML_MAP01, ML_MAP02, ML_MAP03, ML_MAP04, ML_MAP05, ML_MAP06, ML_MAP07, ML_MAP08, ML_MAP09, ML_MAP10, ML_MAP11, ML_MAP12, ML_MAP13, ML_MAP14, ML_MAP15, ML_MAP16, ML_MAP17, ML_MAP18, ML_MAP19, ML_MAP20, ML_MAP21, TEST00, TN_MAP01, TN_MAP02, TN_MAP03, TN_MAP04, TN_MAP05, TN_MAP06, TN_MAP07, TN_MAP08, TN_MAP09, TN_MAP10, TN_MAP11, TN_MAP12, TN_MAP13, TN_MAP14, TN_MAP15, TN_MAP16, TN_MAP17, TN_MAP18, TN_MAP19, TN_MAP20, TN_MAP21, TN_MAP22, TN_MAP23, TN_MAP24, TN_MAP25, TN_MAP26, TN_MAP27, TN_MAP28, TN_MAP29, TN_MAP30, TN_MAP31, TN_MAP32, PL_MAP01, PL_MAP02, PL_MAP03, PL_MAP04, PL_MAP05, PL_MAP06, PL_MAP07, PL_MAP08, PL_MAP09, PL_MAP10, PL_MAP11, PL_MAP12, PL_MAP13, PL_MAP14, PL_MAP15, PL_MAP16, PL_MAP17, PL_MAP18, PL_MAP19, PL_MAP20, PL_MAP21, PL_MAP22, PL_MAP23, PL_MAP24, PL_MAP25, PL_MAP26, PL_MAP27, PL_MAP28, PL_MAP29, PL_MAP30, PL_MAP31, PL_MAP32\";\n            Assert.AreEqual(maps, gameFile.Map);\n        }\n\n        [TestMethod]\n        public void TestNonDoom64FileIsntDoom64()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n\n            string file = \"mapinfo.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            handler.SyncManyFiles(new string[] { file });\n\n            var gameFile = database.GetGameFiles().First();\n\n            Assert.IsFalse(gameFile.IsDoom64);\n        }\n\n        [TestMethod]\n        public void TestDoom64FileIsDoom64()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n\n            string file = \"mapinfo_doom64.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            handler.SyncManyFiles(new string[] { file });\n\n            var gameFile = database.GetGameFiles().First();\n\n            Assert.IsTrue(gameFile.IsDoom64);\n        }\n\n        [TestMethod]\n        public void TestMapsMultiFile()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n            Assert.AreEqual(0, database.GetGameFilesCount());\n\n            string file = \"pyrrhicmaps.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            handler.SyncManyFiles(new string[] { file });\n\n            Assert.AreEqual(1, database.GetGameFilesCount());\n            var gameFile = database.GetGameFiles().First();\n\n            //each map (MAP01, MAP02, and MAP03) is it's own wad, make sure they are all found\n            Assert.AreEqual(\"MAP01, MAP02, MAP03\", gameFile.Map);\n        }\n\n        [TestMethod]\n        public void UnmanagedWadGetsMapString()\n        {\n            string file = \"simple.wad\";\n            string fullPathFile = Path.Combine(Directory.GetCurrentDirectory(), s_filedir, file);\n\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(false, FileManagement.Unmanaged);\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n\n            var syncResult = handler.SyncManyFiles(new string[] { fullPathFile });\n            Assert.AreEqual(1, syncResult.AddedGameFiles.Count);\n\n            Assert.AreEqual(\"MAP01\", syncResult.AddedGameFiles[0].Map);\n        }\n\n        [TestMethod]\n        public void TestSyncUpdate()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n            Assert.AreEqual(0, database.GetGameFilesCount());\n\n            string file = \"joymaps1.zip\";\n            File.Copy(Path.Combine(\"Resources\", \"joymaps1.zip\"), Path.Combine(s_filedir, \"joymaps1.zip\"));\n            var syncResult = handler.SyncManyFiles(new string[] { \"joymaps1.zip\" });\n\n            Assert.AreEqual(1, syncResult.AddedGameFiles.Count);\n            Assert.AreEqual(1, database.GetGameFilesCount());\n            var gameFile = database.GetGameFiles().First();\n\n            Assert.AreEqual(\"MAP01, MAP02, MAP03, MAP04, MAP05, MAP06, MAP07, MAP08, MAP09, MAP10, MAP11, MAP12, MAP13, MAP14, MAP15\", gameFile.Map);\n            Assert.AreEqual(\"The Joy of Mapping #1\", gameFile.Title);\n            Assert.AreEqual(\"Jimmy & Various\", gameFile.Author);\n            Assert.IsTrue(gameFile.Description.StartsWith(\"This was a livestreamed communal mapping session\"));\n            Assert.AreEqual(gameFile.ReleaseDate, DateTime.Parse(\"8/1/2016\", CultureInfo.InvariantCulture));\n\n            File.Copy(Path.Combine(\"Resources\", \"uroburos.zip\"), Path.Combine(s_filedir, \"joymaps1.zip\"), true);\n            var syncResult2 = handler.SyncManyFiles(new string[] { \"joymaps1.zip\" });\n\n            Assert.AreEqual(0, syncResult2.AddedGameFiles.Count);\n            Assert.AreEqual(1, syncResult2.UpdatedGameFiles.Count);\n            Assert.AreEqual(\"joymaps1.zip\", syncResult2.UpdatedGameFiles[0].FileName);\n            Assert.AreEqual(1, database.GetGameFilesCount());\n            gameFile = database.GetGameFiles().First();\n\n            Assert.AreEqual(gameFile.FileName, file);\n            Assert.AreEqual(\"MAP01\", gameFile.Map);\n            Assert.AreEqual(\"Uroburos\", gameFile.Title);\n            Assert.AreEqual(\"hobomaster22\", gameFile.Author);\n            Assert.IsTrue(gameFile.Description.StartsWith(\"A 1on1 map\"));\n            Assert.AreEqual(gameFile.ReleaseDate, DateTime.Parse(\"3/5/2005\", CultureInfo.InvariantCulture));\n        }\n\n        [TestMethod]\n        public void TestInUse()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n            Assert.AreEqual(0, database.GetGameFilesCount());\n\n            string file = \"uroburos.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n\n            var syncResult = SyncResult.EMPTY;\n            using (var reader = File.OpenWrite(Path.Combine(s_filedir, file))) //lock file\n            {\n                syncResult = handler.SyncManyFiles(new string[] { file });\n            }\n\n            Assert.AreEqual(1, database.GetGameFilesCount());\n            Assert.AreEqual(1, syncResult.InvalidFiles.Count);\n            Assert.AreEqual(file, syncResult.InvalidFiles[0].FileName);\n        }\n\n        [TestMethod]\n        public void TestCorruptZip()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler();\n            Assert.AreEqual(0, database.GetGameFilesCount());\n\n            string file = \"bad.zip\";\n            File.WriteAllText(Path.Combine(s_filedir, file), \"bad data\");\n\n            var syncResult = handler.SyncManyFiles(new string[] { file });\n\n            Assert.AreEqual(1, database.GetGameFilesCount());\n            Assert.AreEqual(1, syncResult.InvalidFiles.Count);\n            Assert.AreEqual(file, syncResult.InvalidFiles[0].FileName);\n        }\n\n        [TestMethod]\n        public void TestDoomImageTitlepicWad()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(true);\n\n            string file = \"uroburos.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n\n            var syncResult = handler.SyncManyFiles(new string[] { file });\n\n            Assert.AreEqual(1, syncResult.AddedGameFiles.Count);\n            bool hasTitlepic = syncResult.GetTitlePic(syncResult.AddedGameFiles[0], out Image titlepic);\n            Assert.IsTrue(hasTitlepic);\n            Assert.AreEqual(320, titlepic.Width);\n            Assert.AreEqual(200, titlepic.Height);\n        }\n\n        [TestMethod]\n        public void TestLargeDoomImageTitlepicWad()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(true);\n\n            string file = \"pyrrhic.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            var syncResult = handler.SyncManyFiles(new string[] { file });\n\n            Assert.AreEqual(1, syncResult.AddedGameFiles.Count);\n            bool hasTitlepic = syncResult.GetTitlePic(syncResult.AddedGameFiles[0], out Image titlepic);\n            Assert.IsTrue(hasTitlepic);\n            Assert.AreEqual(640, titlepic.Width);\n            Assert.AreEqual(400, titlepic.Height);\n        }\n\n        [TestMethod]\n        public void TestPngTitlepicPk3()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(true);\n\n            string file = \"joymaps1.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            var syncResult = handler.SyncManyFiles(new string[] { file });\n\n            Assert.AreEqual(1, syncResult.AddedGameFiles.Count);\n            bool hasTitlepic = syncResult.GetTitlePic(syncResult.AddedGameFiles[0], out Image titlepic);\n            Assert.IsTrue(hasTitlepic);\n            Assert.AreEqual(320, titlepic.Width);\n            Assert.AreEqual(200, titlepic.Height);\n        }\n\n        [TestMethod]\n        public void TestTilepicZMapInfo()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(true);\n\n            string file = \"zmapinfo.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            var syncResult = handler.SyncManyFiles(new string[] { file });\n\n            Assert.AreEqual(1, syncResult.AddedGameFiles.Count);\n            bool hasTitlepic = syncResult.GetTitlePic(syncResult.AddedGameFiles[0], out Image titlepic);\n            Assert.IsTrue(hasTitlepic);\n            Assert.AreEqual(478, titlepic.Width);\n            Assert.AreEqual(313, titlepic.Height);\n        }\n\n        [TestMethod]\n        public void TestMultipleTitlepicFiles()\n        {\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(true);\n\n            string file = \"pyrrhic.zip\";\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file));\n            string file2 = \"joymaps1.zip\";\n            File.Copy(Path.Combine(\"Resources\", file2), Path.Combine(s_filedir, file2));\n            var syncResult = handler.SyncManyFiles(new string[] { file, file2 });\n\n            Assert.AreEqual(2, syncResult.AddedGameFiles.Count);\n\n            bool hasTitlepic = syncResult.GetTitlePic(syncResult.AddedGameFiles[0], out Image pyrrhicTitlepic);\n            Assert.IsTrue(hasTitlepic);\n   \n            Assert.AreEqual(640, pyrrhicTitlepic.Width);\n            Assert.AreEqual(400, pyrrhicTitlepic.Height);\n\n            hasTitlepic = syncResult.GetTitlePic(syncResult.AddedGameFiles[1], out Image joymapsTitlepic);\n            Assert.IsTrue(hasTitlepic);\n\n            Assert.AreEqual(320, joymapsTitlepic.Width);\n            Assert.AreEqual(200, joymapsTitlepic.Height);\n        }\n\n        [TestMethod]\n        public void UnmanagedFiles()\n        {\n            string file = \"simple.wad\";\n            string file1 = \"file1.wad\";\n            string file2 = \"file2.wad\";\n            string fullPathFile1 = Path.Combine(Directory.GetCurrentDirectory(), s_filedir, file1);\n            string fullPathFile2 = Path.Combine(Directory.GetCurrentDirectory(), s_filedir, file2);\n\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(false, FileManagement.Unmanaged);\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file1));\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file2));\n\n            // Change directory to force ignore relative paths\n            string dir = Directory.GetCurrentDirectory();\n            Directory.SetCurrentDirectory(s_filedir);\n            var syncResult = handler.SyncManyFiles(new string[] { fullPathFile1, fullPathFile2 });\n            Assert.AreEqual(2, syncResult.AddedGameFiles.Count);\n            Directory.SetCurrentDirectory(dir);\n\n            Assert.AreEqual(fullPathFile1, syncResult.AddedGameFiles[0].FileName);\n            Assert.AreEqual(fullPathFile2, syncResult.AddedGameFiles[1].FileName);\n        }\n\n        [TestMethod]\n        public void UnmanagedRelativeFiles()\n        {\n            string file = \"simple.wad\";\n            string file1 = \"file1.wad\";\n            string file2 = \"file2.wad\";\n            string fullPathFile1 = Path.Combine(Directory.GetCurrentDirectory(), s_filedir, file1);\n            string fullPathFile2 = Path.Combine(Directory.GetCurrentDirectory(), s_filedir, file2);\n\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(false, FileManagement.Unmanaged);\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file1));\n            File.Copy(Path.Combine(\"Resources\", file), Path.Combine(s_filedir, file2));\n\n            var syncResult = handler.SyncManyFiles(new string[] { fullPathFile1, fullPathFile2 });\n            Assert.AreEqual(2, syncResult.AddedGameFiles.Count);\n\n            Assert.AreEqual(Path.Combine(s_filedir, file1), syncResult.AddedGameFiles[0].FileName);\n            Assert.AreEqual(Path.Combine(s_filedir, file2), syncResult.AddedGameFiles[1].FileName);\n        }\n\n        [TestMethod]\n        public void WadLumpWithBadChars()\n        {\n            string file1 = \"pathtest.zip\";\n\n            SyncLibraryHandler handler = CreateSyncLibraryHandler(false, FileManagement.Managed);\n            File.Copy(Path.Combine(\"Resources\", file1), Path.Combine(s_filedir, file1));\n\n            var syncResult = handler.SyncManyFiles(new string[] { file1 });\n            Assert.AreEqual(1, syncResult.AddedGameFiles.Count);\n            Assert.AreEqual(0, syncResult.InvalidFiles.Count);\n\n            var addedFile = syncResult.AddedGameFiles[0];\n            Assert.AreEqual(addedFile.Map, \"MAP01\");\n        }\n\n        private SyncLibraryHandler CreateSyncLibraryHandler(bool pullTitlepic = false, FileManagement fileManagement = FileManagement.Managed)\n        {\n            var directories = new DirectoriesConfiguration \n            { \n                GameFileDirectory = new LauncherPath(s_filedir),\n                TempDirectory = new LauncherPath(s_tempdir)\n            };\n\n            var dateParseFormats = new string[] { \"dd/M/yy\", \"dd/MM/yyyy\", \"dd MMMM yyyy\" };\n\n            var syncActions = new List<ISyncAction>()\n            {\n                new TextFileSyncAction(new IdGamesTextFileParser(dateParseFormats).Parse),\n                new Doom64SyncAction(database),\n                new MapStringSyncAction(directories.TempDirectory)\n            };\n\n            if (pullTitlepic)\n                syncActions.Add(new TitlePicSyncAction(database, DataCache.Instance.DefaultPalette, DataCache.Instance.HexenPalette, DataCache.Instance.HereticPalette));\n\n            return new SyncLibraryHandler(database, CreateDirectoryAdapater(), directories, fileManagement, syncActions);\n        }\n\n        private static DirectoryDataSourceAdapter CreateDirectoryAdapater()\n        {\n            return new DirectoryDataSourceAdapter(new LauncherPath(\"TestSyncDir\"));\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestTextFileSyncAction.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Handlers.Sync;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestTextFileSyncAction\n    {\n\n        [TestMethod]\n        public void ApplyToGameFile_ChoosesHighestQualityAnswers()\n        {\n            IGameFile gameFile = new GameFile()\n            {\n                FileName = \"banana.wad\"\n            };\n            Tree files = new Tree(\"root\", new Tree(\"child1.txt\"), new Tree(\"child2.txt\"));\n\n            var syncAction = new TextFileSyncAction(str =>\n            {\n                switch (str)\n                {\n                    case \"child1.txt\":\n                        return new IdGamesTextInfo(\"Child Mod\", \"Radley Bobbikins\", DateTime.Parse(\"4/3/2025\"), null, \"DOOM2\");\n                    case \"child2.txt\":\n                        return new IdGamesTextInfo(\"Wrong name\", null, null, \"A fine mod.\", null);\n                    default:\n                        throw new Exception($\"Unexpected entry {str}\");\n                }\n            });\n\n            syncAction.ApplyToGameFile(gameFile, new TreeReader(files), new string[0]);\n\n            // Child1's fields are preferred, because it is higher quality\n            Assert.AreEqual(\"Child Mod\", gameFile.Title);\n            Assert.AreEqual(\"Radley Bobbikins\", gameFile.Author);\n            Assert.AreEqual(DateTime.Parse(\"4/3/2025\"), gameFile.ReleaseDate);\n\n            // Falls through to Child2 where missing from Child1\n            Assert.AreEqual(\"A fine mod.\", gameFile.Description);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_IgnoresNonTextFiles()\n        {\n            IGameFile gameFile = new GameFile()\n            {\n                FileName = \"something.wad\"\n            };\n            Tree files = new Tree(\"root\", new Tree(\"lowqual.txt\"), new Tree(\"highqual1.bin\"));\n\n            var syncAction = new TextFileSyncAction(str =>\n            {\n                switch (str)\n                {\n                    case \"lowqual.txt\":\n                        return new IdGamesTextInfo(\"Low quality title\", null, null, null, null);\n                    case \"highqual1.bin\":\n                        return new IdGamesTextInfo(\"High Quality Mod\", \"Ernest Wallop\", null, \"Lots of description\", \"DOOM2\");\n                    default:\n                        throw new Exception($\"Unexpected entry {str}\");\n                }\n            });\n\n            syncAction.ApplyToGameFile(gameFile, new TreeReader(files), new string[0]);\n\n            // The high quality file got ignored because it isn't .txt\n            Assert.IsTrue(string.IsNullOrEmpty(gameFile.Author));\n            Assert.IsNull(gameFile.ReleaseDate);\n            Assert.IsTrue(string.IsNullOrEmpty(gameFile.Description));\n\n            // Low quality text file got used\n            Assert.AreEqual(\"Low quality title\", gameFile.Title);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_ChecksWADINFO()\n        {\n            IGameFile gameFile = new GameFile()\n            {\n                FileName = \"potato.wad\"\n            };\n            Tree files = new Tree(\"root\", new Tree(\"WADINFO\"), new Tree(\"wadinfo\"));\n\n            var syncAction = new TextFileSyncAction(str =>\n            {\n                switch (str)\n                {\n                    case \"WADINFO\":\n                        return new IdGamesTextInfo(\"Wadinfo title\", null, null, null, \"HERETIC\");\n                    case \"wadinfo\":\n                        return new IdGamesTextInfo(null, \"Wadinfo author\", null, \"WadInfo description\", null);\n                    default:\n                        throw new Exception($\"Unexpected entry {str}\");\n                }\n            });\n\n            syncAction.ApplyToGameFile(gameFile, new TreeReader(files), new string[0]);\n\n            Assert.AreEqual(\"Wadinfo title\", gameFile.Title);\n            Assert.AreEqual(\"Wadinfo author\", gameFile.Author);\n            Assert.AreEqual(\"WadInfo description\", gameFile.Description);\n        }\n\n        [TestMethod]\n        public void ApplyToGameFile_NullOrEmptyDataDoesntOverwriteGameFile()\n        {\n            IGameFile gameFile = new GameFile()\n            {\n                FileName = \"imps.wad\",\n                Author = \"Fredericus\",\n                Title = \"Too Many Imps\",\n                ReleaseDate = DateTime.Parse(\"1/7/2021\"),\n                Description = \"A wad with too many imps\",\n            };\n            Tree files = new Tree(\"root\", new Tree(\"empty.txt\"));\n\n            var syncAction = new TextFileSyncAction(str =>\n                new IdGamesTextInfo(null, null, null, null, null));\n\n            syncAction.ApplyToGameFile(gameFile, new TreeReader(files), new string[0]);\n\n            Assert.AreEqual(\"Too Many Imps\", gameFile.Title);\n            Assert.AreEqual(\"Fredericus\", gameFile.Author);\n            Assert.AreEqual(DateTime.Parse(\"1/7/2021\"), gameFile.ReleaseDate);\n            Assert.AreEqual(\"A wad with too many imps\", gameFile.Description);\n        }\n    }\n}"
  },
  {
    "path": "UnitTest/Tests/TestUpdateInfo.cs",
    "content": "﻿using DoomLauncher;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestUpdateInfo\n    {\n        [TestMethod]\n        public async Task TestGetVersion()\n        {\n            ApplicationUpdate applicationUpdate = new ApplicationUpdate(TimeSpan.FromSeconds(30));\n            Version version = new Version(\"1.0.0.0\");\n            ApplicationUpdateInfo info = await applicationUpdate.GetUpdateApplicationInfo(version);\n\n            if (info != null)\n            {\n                Assert.IsTrue(info.Version > version);\n                Assert.IsTrue(info.DownloadUrl.EndsWith(\".zip\"));\n\n                info = await applicationUpdate.GetUpdateApplicationInfo(info.Version);\n\n                Assert.IsNull(info);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestUtil.cs",
    "content": "﻿using System;\nusing DoomLauncher;\nusing DoomLauncher.Interfaces;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing Newtonsoft.Json;\n\nnamespace UnitTest.Tests\n{\n    static class TestUtil\n    {\n        public static IDataSourceAdapter CreateAdapter()\n        {\n            string dataSource = Path.Combine(Directory.GetCurrentDirectory(), \"DoomLauncher.sqlite\");\n            return new DbDataSourceAdapter(new SqliteDatabaseAdapter(), string.Format(@\"Data Source={0}\", dataSource));\n        }\n\n        public static void CleanDatabase(IDataSourceAdapter adapter)\n        {\n            var dataAccess = ((DbDataSourceAdapter)adapter).DataAccess;\n            dataAccess.ExecuteNonQuery(\"delete from GameProfiles\");\n            dataAccess.ExecuteNonQuery(\"delete from GameFiles\");\n        }\n\n        public static bool AllFieldsEqualIgnore<T>(T obj1, T obj2, params string[] ignore)\n        {\n            return AllFieldsEqual(obj1, obj2, ignore);\n        }\n\n        public static bool AllFieldsEqual<T>(T obj1, T obj2, string[] ignore = null)\n        {\n            var properties = typeof(T).GetProperties();\n            foreach (var prop in properties)\n            {\n                if (ignore != null && ignore.Contains(prop.Name))\n                    continue;\n\n                var value = prop.GetValue(obj1);\n\n                if (value == null)\n                {\n                    if (prop.GetValue(obj2) != null)\n                    {\n                        throw new Exception(\n                            $\"AllFieldsEqual failure: Expected {prop.Name} to be null but was {prop.GetValue(obj2)}\\n{GetObjectJson(obj1)}\\n{GetObjectJson(obj2)}\");\n                        return false;\n                    }\n                }\n                else\n                {\n                    if (!value.Equals(prop.GetValue(obj2)))\n                    {\n                        throw new Exception(\n                            $\"AllFieldsEqual failure: Expected {prop.Name} to be {value} but was {prop.GetValue(obj2)}\\n{GetObjectJson(obj1)}\\n{GetObjectJson(obj2)}\");\n                        return false;\n                    }\n                }\n            }\n\n            return true;\n        }\n\n        private static string GetObjectJson(object obj) =>\n            JsonConvert.SerializeObject(obj);\n\n        public static void CopyResourceFile(string filename)\n        {\n            DeleteResourceFile(filename);\n            File.Copy(Path.Combine(\"Resources\", filename), filename);\n        }\n\n        public static void DeleteResourceFile(string filename)\n        {\n            if (File.Exists(filename))\n                File.Delete(filename);\n        }\n\n        public static void ExtractResourceToDirectory(string filename, string directory)\n        {\n            if (Directory.Exists(directory))\n                Directory.Delete(directory, true);\n\n            string file = Path.Combine(\"Resources\", filename);\n            using (ZipArchive za = ZipFile.OpenRead(file))\n                za.ExtractToDirectory(directory);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestWadReader.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing WadReader;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestWadReader\n    {\n        [TestMethod]\n        public void ReadWadEntries()\n        {\n            string wadfile = \"uroburos.wad\";\n            var zip = ZipFile.OpenRead(Path.Combine(\"Resources\", \"uroburos.zip\"));\n            zip.Entries.First(x => x.FullName == wadfile).ExtractToFile(wadfile, true);\n\n            using (FileStream fs = File.OpenRead(wadfile))\n            {\n                WadFileReader reader = new WadFileReader(fs);\n                var lumps = reader.ReadLumps();\n\n                Assert.IsTrue(reader.IsValid);\n                Assert.AreEqual(WadType.PWAD, reader.WadType);\n                Assert.AreEqual(15, lumps.Count);\n                Assert.AreEqual(\"D_RUNNIN\", lumps[0].Name);\n                Assert.AreEqual(\"WOLF1\", lumps[1].Name);\n                Assert.AreEqual(\"RSKY1\", lumps[2].Name);\n                Assert.AreEqual(\"TITLEPIC\", lumps[3].Name);\n                Assert.AreEqual(\"MAP01\", lumps[4].Name);\n                Assert.AreEqual(\"THINGS\", lumps[5].Name);\n                Assert.AreEqual(\"LINEDEFS\", lumps[6].Name);\n                Assert.AreEqual(\"SIDEDEFS\", lumps[7].Name);\n                Assert.AreEqual(\"VERTEXES\", lumps[8].Name);\n                Assert.AreEqual(\"SEGS\", lumps[9].Name);\n                Assert.AreEqual(\"SSECTORS\", lumps[10].Name);\n                Assert.AreEqual(\"NODES\", lumps[11].Name);\n                Assert.AreEqual(\"SECTORS\", lumps[12].Name);\n                Assert.AreEqual(\"REJECT\", lumps[13].Name);\n                Assert.AreEqual(\"BLOCKMAP\", lumps[14].Name);\n\n                Assert.AreEqual(25257, lumps[0].ReadData(fs).Length); //D_RUNNIN\n                Assert.AreEqual(66888, lumps[3].ReadData(fs).Length); //TITLEPIC\n                Assert.AreEqual(0, lumps[4].ReadData(fs).Length); //MAP01\n                Assert.AreEqual(6082, lumps[14].ReadData(fs).Length); //BLOCKMAP\n            }\n        }\n\n        [TestMethod]\n        public void ReadInvalidWadHeaderType()\n        {\n            using (FileStream fs = File.OpenRead(Path.Combine(\"Resources\", \"invalid1.wad\")))\n            {\n                WadFileReader reader = new WadFileReader(fs);\n\n                Assert.IsFalse(reader.IsValid);\n                Assert.AreEqual(WadType.Unknown, reader.WadType);\n                Assert.AreEqual(0, reader.ReadLumps().Count);\n            }\n        }\n\n        [TestMethod]\n        public void ReadInvalidWadHeaderLumps()\n        {\n            using (FileStream fs = File.OpenRead(Path.Combine(\"Resources\", \"invalid2.wad\")))\n            {\n                WadFileReader reader = new WadFileReader(fs);\n\n                Assert.IsFalse(reader.IsValid);\n                Assert.AreEqual(WadType.PWAD, reader.WadType);\n                Assert.AreEqual(0, reader.ReadLumps().Count);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestZdlParser.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing DoomLauncher.Interfaces;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestZdlParser\n    {\n        [TestMethod]\n        public void TestZdlParserFile()\n        {\n            string file = @\"[zdl.save]\nport=gzdoom\niwad=C:/ZDL/DOOM2.WAD\nextra=extra\nfile0=C:/ZDL/pinnacle.zip\nfile1=C:/ZDL/bd21testApr25.zip\nskill=4\nwarp=MAP01\n[zdl.general]\nconflib=sunrise\n\";\n\n            ZdlParser parser = new ZdlParser(CreateSourcePorts(), CreateIWads());\n            IGameFile[] gameFiles = parser.Parse(file);\n\n            Assert.AreEqual(2, gameFiles.Length);\n\n            Assert.AreEqual(\"C:/ZDL/pinnacle.zip\", gameFiles[0].FileName);\n            Assert.AreEqual(\"MAP01\", gameFiles[0].SettingsMap);\n            Assert.AreEqual(\"4\", gameFiles[0].SettingsSkill);\n            Assert.AreEqual(\"extra\", gameFiles[0].SettingsExtraParams);\n\n            Assert.AreEqual(\"C:/ZDL/bd21testApr25.zip\", gameFiles[1].FileName);\n        }\n\n        private IEnumerable<IIWadData> CreateIWads()\n        {\n            return new IIWadData[]\n            {\n                new IWadData { FileName = \"DOOM2.WAD\" },\n                new IWadData { FileName = \"DOOM.WAD\" },\n                new IWadData { FileName = \"PLUTONIA.WAD\" }\n            };\n        }\n\n        private IEnumerable<ISourcePortData> CreateSourcePorts()\n        {\n            return new ISourcePortData[]\n            {\n                new SourcePortData { Name = \"GZDoom\" },\n                new SourcePortData { Name = \"PrBoom\" },\n                new SourcePortData { Name = \"Chocolate Doom\" }\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestZdoomSave.cs",
    "content": "﻿using DoomLauncher.SaveGame;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestZdoomSave\n    {\n        [TestMethod]\n        public void TestZdoomSaveBinary()\n        {\n            string save1 = \"zdoomsave_v1.zds\";\n            TestUtil.CopyResourceFile(save1);\n\n            ZDoomSaveGameReader reader = new ZDoomSaveGameReader(save1);\n\n            Assert.AreEqual(\"Autosave Aug 21 13:30\", reader.GetName());\n        }\n\n        [TestMethod]\n        public void TestZdoomSaveJson()\n        {\n            string save1 = \"zdoomsave_v2.zds\";\n            TestUtil.CopyResourceFile(save1);\n\n            ZDoomSaveGameReader reader = new ZDoomSaveGameReader(save1);\n\n            Assert.AreEqual(\"Autosave Aug 21 13:12\", reader.GetName());\n        }\n\n        [TestMethod]\n        public void TestZdoomSaveJson_3_5()\n        {\n            string save1 = \"zdoomsave_v3.zds\";\n            TestUtil.CopyResourceFile(save1);\n\n            ZDoomSaveGameReader reader = new ZDoomSaveGameReader(save1);\n\n            Assert.AreEqual(\"Autosave Aug 28 06:25\", reader.GetName());\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/Tests/TestZdoomStats.cs",
    "content": "﻿using DoomLauncher;\nusing DoomLauncher.DataSources;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace UnitTest.Tests\n{\n    [TestClass]\n    public class TestZdoomStats\n    {\n        private readonly List<NewStatisticsEventArgs> m_args = new List<NewStatisticsEventArgs>();\n\n        [TestMethod]\n        public void TestZdoomBinary()\n        {\n            string save1 = \"zdoomsave_v1.zds\";\n            TestUtil.DeleteResourceFile(save1);\n            ZDoomStatsReader statsReader = CreateStatsReader();\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.Start();\n\n            TestUtil.CopyResourceFile(save1);\n\n            statsReader.Stop();\n            statsReader.ReadNow();\n\n            Assert.AreEqual(2, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"e1m1\", m_args[0].Statistics.MapName.ToLower());\n            Assert.AreEqual(5, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(6, m_args[0].Statistics.TotalKills);\n\n            Assert.AreEqual(0, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(0, m_args[0].Statistics.TotalItems);\n\n            Assert.AreEqual(1, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[0].Statistics.TotalSecrets);\n\n            Assert.AreEqual(25.22857f, m_args[0].Statistics.LevelTime);\n\n            Assert.AreEqual(\"e1m2\", m_args[1].Statistics.MapName.ToLower());\n            Assert.AreEqual(22, m_args[1].Statistics.KillCount);\n            Assert.AreEqual(41, m_args[1].Statistics.TotalKills);\n\n            Assert.AreEqual(0, m_args[1].Statistics.ItemCount);\n            Assert.AreEqual(0, m_args[1].Statistics.TotalItems);\n\n            Assert.AreEqual(2, m_args[1].Statistics.SecretCount);\n            Assert.AreEqual(6, m_args[1].Statistics.TotalSecrets);\n\n            Assert.AreEqual(79.77143f, m_args[1].Statistics.LevelTime);\n        }\n\n        [TestMethod]\n        public void TestZdoomJson()\n        {\n            //this is the pre 3.5 json version that did not include items\n            string save1 = \"zdoomsave_v2.zds\";\n            TestUtil.DeleteResourceFile(save1);\n\n            ZDoomStatsReader statsReader = CreateStatsReader();\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.Start();\n\n            TestUtil.CopyResourceFile(save1);\n\n            statsReader.Stop();\n            statsReader.ReadNow();\n\n            Assert.AreEqual(2, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"e1m1\", m_args[0].Statistics.MapName.ToLower());\n            Assert.AreEqual(5, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(6, m_args[0].Statistics.TotalKills);\n\n            Assert.AreEqual(0, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(0, m_args[0].Statistics.TotalItems);\n\n            Assert.AreEqual(1, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[0].Statistics.TotalSecrets);\n\n            Assert.AreEqual(34.2857132f, m_args[0].Statistics.LevelTime);\n\n\n            Assert.AreEqual(3, m_args[0].Statistics.Skill);\n\n            Assert.AreEqual(\"e1m2\", m_args[1].Statistics.MapName.ToLower());\n            Assert.AreEqual(25, m_args[1].Statistics.KillCount);\n            Assert.AreEqual(41, m_args[1].Statistics.TotalKills);\n\n            Assert.AreEqual(0, m_args[1].Statistics.ItemCount);\n            Assert.AreEqual(0, m_args[1].Statistics.TotalItems);\n\n            Assert.AreEqual(2, m_args[1].Statistics.SecretCount);\n            Assert.AreEqual(6, m_args[1].Statistics.TotalSecrets);\n\n            Assert.AreEqual(132.65715f, m_args[1].Statistics.LevelTime);\n\n            Assert.AreEqual(3, m_args[0].Statistics.Skill);\n\n            //Give the reader the existing statistics, and let it re-read the save. It should not fire the events to prevent duplicates\n            TestUtil.DeleteResourceFile(save1);\n            statsReader = new ZDoomStatsReader(new GameFile() { GameFileID = 1 }, Directory.GetCurrentDirectory(), m_args.Select(x => x.Statistics).ToArray());\n            m_args.Clear();\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.Start();\n\n            statsReader.ReadNow();\n\n            File.Copy(Path.Combine(\"Resources\", save1), save1);\n            Assert.AreEqual(0, m_args.Count);\n        }\n\n        [TestMethod]\n        public void TestZdoomJson_3_5()\n        {\n            //This is to test the 3.5 save format that includes items\n            string save1 = \"zdoomsave_v3.zds\";\n            TestUtil.DeleteResourceFile(save1);\n\n            ZDoomStatsReader statsReader = CreateStatsReader();\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.Start();\n\n            TestUtil.CopyResourceFile(save1);\n\n            statsReader.Stop();\n            statsReader.ReadNow();\n\n            Assert.AreEqual(2, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"e1m1\", m_args[0].Statistics.MapName.ToLower());\n            Assert.AreEqual(5, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(6, m_args[0].Statistics.TotalKills);\n\n            Assert.AreEqual(15, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(37, m_args[0].Statistics.TotalItems);\n\n            Assert.AreEqual(1, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[0].Statistics.TotalSecrets);\n\n            Assert.AreEqual(40.2f, m_args[0].Statistics.LevelTime);\n\n            Assert.AreEqual(3, m_args[0].Statistics.Skill);\n\n            Assert.AreEqual(\"e1m2\", m_args[1].Statistics.MapName.ToLower());\n            Assert.AreEqual(21, m_args[1].Statistics.KillCount);\n            Assert.AreEqual(41, m_args[1].Statistics.TotalKills);\n\n            Assert.AreEqual(8, m_args[1].Statistics.ItemCount);\n            Assert.AreEqual(42, m_args[1].Statistics.TotalItems);\n\n            Assert.AreEqual(2, m_args[1].Statistics.SecretCount);\n            Assert.AreEqual(6, m_args[1].Statistics.TotalSecrets);\n\n            Assert.AreEqual(83.37143f, m_args[1].Statistics.LevelTime);\n\n            Assert.AreEqual(3, m_args[0].Statistics.Skill);\n\n            //Give the reader the existing statistics, and let it re-read the save. It should not fire the events to prevent duplicates\n            TestUtil.DeleteResourceFile(save1);\n            statsReader = new ZDoomStatsReader(new GameFile() { GameFileID = 1 }, Directory.GetCurrentDirectory(), m_args.Select(x => x.Statistics).ToArray());\n            m_args.Clear();\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.Start();\n\n            statsReader.ReadNow();\n\n            File.Copy(Path.Combine(\"Resources\", save1), save1);\n            Assert.AreEqual(0, m_args.Count);\n        }\n\n        [TestMethod]\n        public void TestZdoomJson_3_7()\n        {\n            // Test the 3.7 save format that changed cvars for pulling skill\n            string save1 = \"zdoomsave_v4.zds\";\n            TestUtil.DeleteResourceFile(save1);\n\n            ZDoomStatsReader statsReader = CreateStatsReader();\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.Start();\n\n            TestUtil.CopyResourceFile(save1);\n\n            statsReader.Stop();\n            statsReader.ReadNow();\n\n            Assert.AreEqual(1, m_args.Count);\n            Assert.AreEqual(0, statsReader.Errors.Length);\n\n            Assert.AreEqual(\"e1m1\", m_args[0].Statistics.MapName.ToLower());\n            Assert.AreEqual(21, m_args[0].Statistics.KillCount);\n            Assert.AreEqual(29, m_args[0].Statistics.TotalKills);\n\n            Assert.AreEqual(10, m_args[0].Statistics.ItemCount);\n            Assert.AreEqual(38, m_args[0].Statistics.TotalItems);\n\n            Assert.AreEqual(0, m_args[0].Statistics.SecretCount);\n            Assert.AreEqual(3, m_args[0].Statistics.TotalSecrets);\n\n            Assert.AreEqual(39.8857154846191f, m_args[0].Statistics.LevelTime);\n\n            Assert.AreEqual(4, m_args[0].Statistics.Skill);\n\n            //Give the reader the existing statistics, and let it re-read the save. It should not fire the events to prevent duplicates\n            TestUtil.DeleteResourceFile(save1);\n            statsReader = new ZDoomStatsReader(new GameFile() { GameFileID = 1 }, Directory.GetCurrentDirectory(), m_args.Select(x => x.Statistics).ToArray());\n            m_args.Clear();\n            statsReader.NewStastics += StatsReader_NewStastics;\n            statsReader.Start();\n\n            statsReader.ReadNow();\n\n            File.Copy(Path.Combine(\"Resources\", save1), save1);\n            Assert.AreEqual(0, m_args.Count);\n        }\n\n        private static ZDoomStatsReader CreateStatsReader()\n        {\n            return new ZDoomStatsReader(new GameFile() { GameFileID = 1 }, Directory.GetCurrentDirectory(), new IStatsData[] { });\n        }\n\n        private void StatsReader_NewStastics(object sender, NewStatisticsEventArgs e)\n        {\n            m_args.Add(e);\n        }\n    }\n}\n"
  },
  {
    "path": "UnitTest/UnitTest.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{2E593D49-B240-49BE-9E9D-5DD1250EEDF3}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>UnitTest</RootNamespace>\n    <AssemblyName>UnitTest</AssemblyName>\n    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <TargetFrameworkProfile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <RunSettingsFilePath>\n    </RunSettingsFilePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.13.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"SevenZipSharp, Version=0.64.3890.29348, Culture=neutral, PublicKeyToken=20de82c62b055c88, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SevenZipSharp.0.64\\lib\\SevenZipSharp.dll</HintPath>\n    </Reference>\n    <Reference Include=\"SharpCompress, Version=0.31.0.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SharpCompress.0.31.0\\lib\\net461\\SharpCompress.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Buffers.4.5.1\\lib\\net461\\System.Buffers.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.configuration\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Deployment\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.IO.Compression\" />\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\n    <Reference Include=\"System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Memory.4.5.4\\lib\\net461\\System.Memory.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Numerics\" />\n    <Reference Include=\"System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.5.0\\lib\\net46\\System.Numerics.Vectors.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Runtime.CompilerServices.Unsafe.6.0.0\\lib\\net461\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Text.Encoding.CodePages, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Text.Encoding.CodePages.5.0.0\\lib\\net461\\System.Text.Encoding.CodePages.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Windows.Forms\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"Tests\\Helpers\\DirectoriesConfiguration.cs\" />\n    <Compile Include=\"Tests\\TestDoom64SyncAction.cs\" />\n    <Compile Include=\"Tests\\TestDoom64TitlePicSyncAction.cs\" />\n    <Compile Include=\"Tests\\TestGameConfSyncAction.cs\" />\n    <Compile Include=\"Tests\\TestGameInfoSyncAction.cs\" />\n    <Compile Include=\"Tests\\TestIgnoreRarExploit.cs\" />\n    <Compile Include=\"Tests\\TestIWadTitlesSyncAction.cs\" />\n    <Compile Include=\"Tests\\TestKnownWadsSyncAction.cs\" />\n    <Compile Include=\"Tests\\TestMapStringSyncAction.cs\" />\n    <Compile Include=\"Tests\\TestRecursiveArchiveReader.cs\" />\n    <Compile Include=\"Tests\\TestGameStoreFiles.cs\" />\n    <Compile Include=\"TestInit.cs\" />\n    <Compile Include=\"Tests\\TestArchives.cs\" />\n    <Compile Include=\"Tests\\TestDirectoryArchive.cs\" />\n    <Compile Include=\"Tests\\TestFileDetector.cs\" />\n    <Compile Include=\"Tests\\TestGameFileTags.cs\" />\n    <Compile Include=\"Tests\\TestIdGamesTextInfo.cs\" />\n    <Compile Include=\"Tests\\TestIWad.cs\" />\n    <Compile Include=\"Tests\\TestGameFile.cs\" />\n    <Compile Include=\"Tests\\TestGameProfileUtil.cs\" />\n    <Compile Include=\"Tests\\TestIdGamesFileParser.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Tests\\TestLaunchParameters.cs\" />\n    <Compile Include=\"Tests\\TestGameLauncher.cs\" />\n    <Compile Include=\"Tests\\TestMapLumps.cs\" />\n    <Compile Include=\"Tests\\TestSourcePort.cs\" />\n    <Compile Include=\"Tests\\TestSpecificFiles.cs\" />\n    <Compile Include=\"Tests\\TestAutomaticSteamCheck.cs\" />\n    <Compile Include=\"Tests\\TestStartupImageSyncAction.cs\" />\n    <Compile Include=\"Tests\\TestSteamLoader.cs\" />\n    <Compile Include=\"Tests\\TestTextFileSyncAction.cs\" />\n    <Compile Include=\"Tests\\TestUtil.cs\" />\n    <Compile Include=\"Tests\\TestFile.cs\" />\n    <Compile Include=\"Tests\\TestLoadFiles.cs\" />\n    <Compile Include=\"Tests\\TestLevelstat.cs\" />\n    <Compile Include=\"Tests\\TestZdoomStats.cs\" />\n    <Compile Include=\"Tests\\TestZdlParser.cs\" />\n    <Compile Include=\"Tests\\TestCldDemoParser.cs\" />\n    <Compile Include=\"Tests\\TestLauncherPath.cs\" />\n    <Compile Include=\"Tests\\TestWadReader.cs\" />\n    <Compile Include=\"Tests\\TestDirectoryAdapter.cs\" />\n    <Compile Include=\"Tests\\TestSyncLibraryHandler.cs\" />\n    <Compile Include=\"Tests\\TestZdoomSave.cs\" />\n    <Compile Include=\"Tests\\TestDsgSave.cs\" />\n    <Compile Include=\"Tests\\TestStats.cs\" />\n    <Compile Include=\"Tests\\TestStatdump.cs\" />\n    <Compile Include=\"Tests\\TestUpdateInfo.cs\" />\n    <Compile Include=\"Tests\\TestGameProfile.cs\" />\n    <Compile Include=\"Tests\\Helpers\\Tree.cs\" />\n    <Compile Include=\"Tests\\Helpers\\TreeReader.cs\" />\n    <Compile Include=\"Tests\\Helpers\\TreeEntry.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\DoomLauncher\\DoomLauncher.csproj\">\n      <Project>{938b529a-9afd-4ae0-9f0f-5cb9527ad2f1}</Project>\n      <Name>DoomLauncher</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\WadReader\\WadReader.csproj\">\n      <Project>{15a9a8fc-096e-4458-ab7f-02386740cf4e}</Project>\n      <Name>WadReader</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n    <None Include=\"packages.config\" />\n    <None Include=\"Resources\\archive.7z\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\archive.rar\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\archive.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\chocosave1.dsg\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Directory.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\doom64_without_titlepic.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\doom64_with_titlepic.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\invalid1.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\invalid2.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\joymaps1.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\mapinfo.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\mapinfo_doom64.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\pathtest.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\planarimage.dat\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\poc.rar\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\prboomsave1.dsg\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\pyrrhic.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\pyrrhicmaps.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\simple.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\testpk3.pk3\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamInstall\\config\\libraryfolders.vdf\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\appmanifest_2280.acf\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\appmanifest_2390.acf\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\\base\\doom.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\\rerelease\\doom2.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\\rerelease\\id1.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\\rerelease\\masterlevels.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\\rerelease\\nerve.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\\rerelease\\plutonia.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\\rerelease\\sigil.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestDoom\\rerelease\\tnt.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary1\\steamapps\\common\\TestHeretic\\base\\heretic.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary2\\steamapps\\appmanifest_2360.acf\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary2\\steamapps\\appmanifest_2390.acf\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary2\\steamapps\\common\\TestHeretic\\base\\heretic.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\TestSteamLibrary2\\steamapps\\common\\TestHexen\\base\\hexen.wad\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\zdoomsave_v4.zds\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\zmapinfo.zip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\uroburos.zip\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\zandemo.cld\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\zdoomsave_v1.zds\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\zdoomsave_v2.zds\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"DoomLauncher.sqlite\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\zdoomsave_v3.zds\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Resources\\happy.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>if not exist $(TargetDir)x86 mkdir $(TargetDir)x86\nxcopy /y /d  \"$(SolutionDir)DoomLauncher\\bin\\$(Configuration)\\x86\\*.*\" \"$(TargetDir)x86\"\n\nif not exist $(TargetDir)x64 mkdir $(TargetDir)x64\nxcopy /y /d  \"$(SolutionDir)DoomLauncher\\bin\\$(Configuration)\\x64\\*.*\" \"$(TargetDir)x64\"</PostBuildEvent>\n  </PropertyGroup>\n  <Import Project=\"..\\packages\\SevenZipSharp.Interop.19.0.2\\build\\SevenZipSharp.Interop.targets\" Condition=\"Exists('..\\packages\\SevenZipSharp.Interop.19.0.2\\build\\SevenZipSharp.Interop.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\SevenZipSharp.Interop.19.0.2\\build\\SevenZipSharp.Interop.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\SevenZipSharp.Interop.19.0.2\\build\\SevenZipSharp.Interop.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "UnitTest/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "UnitTest/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Newtonsoft.Json\" version=\"13.0.1\" targetFramework=\"net48\" />\n  <package id=\"SevenZipSharp\" version=\"0.64\" targetFramework=\"net48\" />\n  <package id=\"SevenZipSharp.Interop\" version=\"19.0.2\" targetFramework=\"net48\" />\n  <package id=\"SharpCompress\" version=\"0.31.0\" targetFramework=\"net48\" />\n  <package id=\"Squid-Box.SevenZipSharp\" version=\"1.5.0.366\" targetFramework=\"net48\" />\n  <package id=\"System.Buffers\" version=\"4.5.1\" targetFramework=\"net48\" />\n  <package id=\"System.Memory\" version=\"4.5.4\" targetFramework=\"net48\" />\n  <package id=\"System.Numerics.Vectors\" version=\"4.5.0\" targetFramework=\"net48\" />\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"6.0.0\" targetFramework=\"net48\" />\n  <package id=\"System.Text.Encoding.CodePages\" version=\"5.0.0\" targetFramework=\"net48\" />\n</packages>"
  },
  {
    "path": "WadReader/DoomImage/DoomImage.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.Runtime.InteropServices;\n\nnamespace WadReader\n{\n    public enum ImageType\n    {\n        Palette,\n        Argb\n    }\n\n    public class DoomImage\n    {\n        public const ushort TransparentIndex = 0xFF00;\n\n        public readonly Bitmap Bitmap;\n        public readonly ImageType ImageType;\n        public readonly int OffsetX;\n        public readonly int OffsetY;\n\n        public int Width { get; private set; }\n        public int Height { get; private set; }\n\n        public DoomImage(Bitmap bitmap, ImageType imageType, int offsetX, int offsetY)\n        {\n            Bitmap = EnsureExpectedFormat(bitmap);\n            ImageType = imageType;\n            Width = Bitmap.Width;\n            Height = Bitmap.Height;\n            OffsetX = offsetX;\n            OffsetY = offsetY;\n        }\n\n        public DoomImage(int width, int height, ImageType imageType, int offsetX, int offsetY, Color? fillColor = null)\n        {\n            Width = Math.Max(width, 1);\n            Height = Math.Max(height, 1);\n            Bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);\n            ImageType = imageType;\n            OffsetX = offsetX;\n            OffsetY = offsetY;\n\n            Fill(fillColor ?? Color.Transparent);\n        }\n\n        private static Bitmap EnsureExpectedFormat(Bitmap bitmap)\n        {\n            if (bitmap.PixelFormat == PixelFormat.Format32bppArgb)\n                return bitmap;\n\n            Bitmap copy = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format32bppArgb);\n\n            using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(copy))\n                g.DrawImage(bitmap, new Rectangle(0, 0, copy.Width, copy.Height));\n\n            return copy;\n        }\n\n        public static DoomImage FromArgbBytes(int w, int h, byte[] argb, int offsetX = 0, int offsetY = 0)\n        {\n            int numBytes = w * h * 4;\n\n            if (argb.Length != numBytes || w <= 0 || h <= 0)\n                return null;\n\n            Bitmap bitmap = new Bitmap(w, h, PixelFormat.Format32bppArgb);\n\n            Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);\n            BitmapData metadata = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat);\n            Marshal.Copy(argb, 0, metadata.Scan0, numBytes);\n            bitmap.UnlockBits(metadata);\n\n            return new DoomImage(bitmap, ImageType.Argb, offsetX, offsetY);\n        }\n\n        public static DoomImage FromPaletteIndices(int width, int height, ushort[] indices, int offsetX, int offsetY)\n        {\n            if (width <= 0 || height <= 0 || indices.Length != width * height)\n                return null;\n\n            int numBytes = width * height * 4;\n            byte[] paletteData = new byte[numBytes];\n\n            int argbIndex = 0;\n            for (int i = 0; i < indices.Length; i++)\n            {\n                ushort index = indices[i];\n                paletteData[argbIndex] = (byte)~(index >> 8);\n                paletteData[argbIndex + 3] = (byte)index;\n\n                argbIndex += 4;\n            }\n\n            Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);\n            Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);\n            BitmapData metadata = bitmap.LockBits(rect, ImageLockMode.ReadOnly, bitmap.PixelFormat);\n            Marshal.Copy(paletteData, 0, metadata.Scan0, numBytes);\n            bitmap.UnlockBits(metadata);\n\n            return new DoomImage(bitmap, ImageType.Palette, offsetX, offsetY);\n        }\n\n        public void Fill(Color color)\n        {\n            using (SolidBrush b = new SolidBrush(color))\n                using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(Bitmap))\n                    g.FillRectangle(b, 0, 0, Bitmap.Width, Bitmap.Height);\n        }\n\n        public DoomImage PaletteToArgb(Palette palette)\n        {\n            if (ImageType == ImageType.Argb)\n                return this;\n\n            int numBytes = Width * Height * 4;\n            byte[] paletteBytes = new byte[numBytes];\n            byte[] argbBytes = new byte[numBytes];\n\n            Rectangle rect = new Rectangle(0, 0, Bitmap.Width, Bitmap.Height);\n            BitmapData metadata = Bitmap.LockBits(rect, ImageLockMode.ReadWrite, Bitmap.PixelFormat);\n            Marshal.Copy(metadata.Scan0, paletteBytes, 0, numBytes);\n            Bitmap.UnlockBits(metadata);\n\n            Color[] colors = palette.DefaultLayer;\n            int offset = 0;\n            for (int y = 0; y < Height; y++)\n            {\n                for (int x = 0; x < Width; x++)\n                {\n                    // The first of the four bytes is the alpha, and if we have\n                    // alpha, then we have to write the RGB. Otherwise, it is\n                    // already set to transparent so our job would be done.\n                    if (paletteBytes[offset] != 0)\n                    {\n                        int index = paletteBytes[offset + 3];\n                        Color color = colors[index];\n\n                        // Apparently since it reads it as a 32-bit word, then\n                        // we need to write it in BGRA format.\n                        argbBytes[offset] = color.B;\n                        argbBytes[offset + 1] = color.G;\n                        argbBytes[offset + 2] = color.R;\n                        argbBytes[offset + 3] = 255;\n                    }\n\n                    offset += 4;\n                }\n            }\n\n            DoomImage image = FromArgbBytes(Width, Height, argbBytes, OffsetX, OffsetY);\n            if (image != null)\n                return image;\n            \n            return new DoomImage(1, 1, ImageType.Argb, 0, 0);\n        }\n    }\n}\n"
  },
  {
    "path": "WadReader/DoomImage/Palette.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\n\nnamespace WadReader\n{\n    public class Palette\n    {\n        public static readonly int NumColors = 256;\n        public static readonly int ColorComponents = 3;\n        public static readonly int BytesPerLayer = NumColors * ColorComponents;\n        private static Palette DefaultPalette;\n\n        private readonly List<Color[]> layers;\n\n        public int Count => layers.Count;\n        public Color[] DefaultLayer => layers[0];\n\n        private Palette(List<Color[]> paletteLayers)\n        {\n            layers = paletteLayers;\n        }\n\n        public static Palette From(byte[] data)\n        {\n            if (data.Length == 0 || data.Length % BytesPerLayer != 0)\n                return null;\n\n            List<Color[]> paletteLayers = new List<Color[]>();\n            for (int layer = 0; layer < data.Length / BytesPerLayer; layer++)\n            {\n                int offset = layer * BytesPerLayer;\n                Span<byte> layerSpan = new Span<byte>(data, offset, BytesPerLayer);\n                paletteLayers.Add(PaletteLayerFrom(layerSpan));\n            }\n\n            return new Palette(paletteLayers);\n        }\n\n        private static Color[] PaletteLayerFrom(Span<byte> data)\n        {\n            Color[] paletteColors = new Color[NumColors];\n\n            int offset = 0;\n            for (int i = 0; i < BytesPerLayer; i += ColorComponents)\n                paletteColors[offset++] = Color.FromArgb(255, data[i], data[i + 1], data[i + 2]);\n\n            return paletteColors;\n        }\n\n        public Color[] Layer(int index) => layers[index];\n\n        public static Palette GetDefaultPalette()\n        {\n            if (DefaultPalette != null)\n                return DefaultPalette;\n\n            byte[] data = new byte[NumColors * ColorComponents];\n\n            for (int i = 0; i < NumColors; i++)\n            {\n                data[i] = (byte)i;\n                data[i + 1] = (byte)i;\n                data[i + 2] = (byte)i;\n            }\n\n            Palette palette = From(data);\n            if (palette == null)\n                throw new NullReferenceException(\"Failed to create the default palette, shouldn't be possible\");\n\n            DefaultPalette = palette;\n            return palette;\n        }\n    }\n}"
  },
  {
    "path": "WadReader/DoomImage/PaletteReaders.cs",
    "content": "﻿using System.IO;\nusing System.Linq;\n\nnamespace WadReader\n{\n    public static class PaletteReaders\n    {\n        public static bool LikelyFlat(byte[] data)\n        {\n            switch (data.Length)\n            {\n                case 64 * 64:\n                    return true;\n                case 128 * 128:\n                    return true;\n                case 256 * 256:\n                    return true;\n                case 320 * 200: // TITLE images use this size\n                    return true;\n                default:\n                    return false;\n            }\n        }\n\n        public static bool LikelyColumn(byte[] data)\n        {\n            if (data.Length < 16)\n                return false;\n\n            BinaryReader reader = new BinaryReader(new MemoryStream(data));\n\n            int width = reader.ReadInt16();\n            int height = reader.ReadInt16();\n            int offsetX = reader.ReadInt16();\n            int offsetY = reader.ReadInt16();\n\n            if (InvalidColumnImageDimensions(data, width, height, offsetX, offsetY))\n                return false;\n\n            return LastColumnValid(reader, width);\n        }\n\n        public static DoomImage ReadFlat(byte[] data)\n        {\n            if (!FlatDimension(data.Length, out int width, out int height))\n                return null;\n\n            ushort[] indices = data.Select(x => (ushort)x).ToArray();\n            return DoomImage.FromPaletteIndices(width, height, indices, 0, 0);\n        }\n\n        public static DoomImage ReadColumn(byte[] data)\n        {\n            try\n            {\n                BinaryReader reader = new BinaryReader(new MemoryStream(data));\n\n                int width = reader.ReadInt16();\n                int height = reader.ReadInt16();\n                int xOff = reader.ReadInt16();\n                int yOff = reader.ReadInt16();\n\n                int[] offsets = new int[width];\n                for (int i = 0; i < width; i++)\n                    offsets[i] = reader.ReadInt32();\n\n                ushort[] indices = new ushort[width * height];\n                for (int i = 0; i < indices.Length; i++)\n                    indices[i] = DoomImage.TransparentIndex;\n\n                for (int col = 0; col < width; col++)\n                {\n                    reader.BaseStream.Seek(offsets[col], SeekOrigin.Begin);\n                    int offset = 0;\n\n                    while (true)\n                    {\n                        int rowStart = reader.ReadByte();\n                        if (rowStart == 0xFF)\n                            break;\n\n                        int indicesCount = reader.ReadByte();\n                        reader.BaseStream.Seek(1, SeekOrigin.Current); // Skip dummy.\n                        byte[] paletteIndices = reader.ReadBytes(indicesCount);\n                        reader.BaseStream.Seek(1, SeekOrigin.Current); // Skip dummy.\n\n                        // Tall patch support, since we are writing up the column we expect rowStart to be greater than the last\n                        // If it's smaller or equal then add to the offset to support images greater than 254 in height\n                        if (rowStart <= offset)\n                            offset += rowStart;\n                        else\n                            offset = rowStart;\n\n                        int indicesOffset = (offset * width) + col;\n                        for (int i = 0; i < paletteIndices.Length; i++)\n                        {\n                            if (indicesOffset >= indices.Length)\n                                break;\n\n                            indices[indicesOffset] = paletteIndices[i];\n                            indicesOffset += width;\n                        }\n                    }\n                }\n\n                return DoomImage.FromPaletteIndices(width, height, indices, xOff, yOff);\n            }\n            catch\n            {\n                return null;\n            }\n        }\n\n        private static bool FlatDimension(int length, out int width, out int height)\n        {\n            if (length == 64 * 64)\n            {\n                width = height = 64;\n            }\n            else if (length == 128 * 128)\n            {\n                width = height = 128;\n            }\n            else if (length == 256 * 256)\n            {\n                width = height = 256;\n            }\n            else if (length == 320 * 200)\n            {\n                width = 320;\n                height = 200;\n            }\n            else\n            {\n                width = height = 0;\n                return false;\n            }\n\n            return true;\n        }\n\n        private static bool LargerThanMaxColumnDataSize(byte[] data, int width, int height)\n        {\n            // This is an upper bound on the worst case for a column. Suppose\n            // a column has a constant pixel/no-pixel alternating sequence.\n\n            // That means we will get h/2 'posts' (or h/2 + 1 if odd, so we'll\n            // go with that since it covers all cases).\n            int maxPosts = (height / 2) + 1;\n\n            // Each post is made up of a 'header' + 'length' + 2 dummy bytes +\n            // the length of bytes. Since each length would be 1 'index pixel',\n            // then the largest size it can be is 5 bytes. This means we have\n            // 5 * max posts. We add 1 to the end because the last byte has to\n            // be the 0xFF magic number to end the column.\n            int maxBytesPerColumn = (5 * maxPosts) + 1;\n\n            int headerSize = 8 - (width * 4);\n            return data.Length - headerSize > width * maxBytesPerColumn;\n        }\n\n        private static bool InvalidColumnImageDimensions(byte[] data, int width, int height, int offsetX, int offsetY)\n        {\n            return width <= 0 || width >= 4096 ||\n                   height <= 0 || height >= 4096 ||\n                   offsetX < -2048 || offsetX > 2048 ||\n                   offsetY < -2048 || offsetY > 2048 ||\n                   LargerThanMaxColumnDataSize(data, width, height);\n        }\n\n        private static bool LastColumnValid(BinaryReader reader, int width)\n        {\n            if (reader.BaseStream.Length > reader.BaseStream.Position + width * 4)\n                return false;\n\n            reader.BaseStream.Seek((width - 1) * 4, SeekOrigin.Current);\n\n            int offset = reader.ReadInt32();\n            if (offset < 0 || offset >= reader.BaseStream.Length)\n                return false;\n            reader.BaseStream.Seek(offset, SeekOrigin.Begin);\n            return reader.BaseStream.Length + 1 <= reader.BaseStream.Length;\n        }\n    }\n}"
  },
  {
    "path": "WadReader/FileLump.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Runtime.InteropServices;\n\nnamespace WadReader\n{\n    public class FileLump\n    {\n        private string m_name;\n\n        public int Length => m_filelump.size;\n\n        public FileLump(Stream stream)\n        {\n            m_filelump = Util.ReadStuctureFromStream<filelump_t>(stream);\n        }\n\n        public FileLump(string name)\n        {\n            m_name = name;\n        }\n\n        public string Name\n        {\n            get\n            {\n                if (m_name == null)\n                {\n                    int index = Array.IndexOf(m_filelump.name, (byte)0);\n                    if (index > 8 || index < 0)\n                        index = 8;\n                    m_name = System.Text.Encoding.UTF8.GetString(m_filelump.name, 0, index);\n                }\n\n                return m_name;\n            }\n        }\n\n        public byte[] ReadData(FileStream fs)\n        {\n            fs.Seek(m_filelump.filepos, SeekOrigin.Begin);\n\n            byte[] ret = new byte[m_filelump.size];\n            fs.Read(ret, 0, ret.Length);\n\n            return ret;\n        }\n\n        public void ReadData(FileStream fs, byte[] data, int offset, int length)\n        {\n            fs.Seek(m_filelump.filepos, SeekOrigin.Begin);\n            fs.Read(data, offset, length);\n        }\n\n        public static int FileLumpByteSize\n        {\n            get { return Marshal.SizeOf(typeof(filelump_t)); }\n        }\n\n        private readonly filelump_t m_filelump;\n\n        private struct filelump_t\n        {\n            public filelump_t(int i) //useless constructor, removes annoying unused variable warnings\n            {\n                filepos = size = i;\n                name = new byte[8];\n            }\n\n            public int filepos;\n            public int size;\n            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]\n            public byte[] name;\n        }\n    }\n}\n"
  },
  {
    "path": "WadReader/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"WadReader\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"WadReader\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"68aa5a5a-4e3a-483b-acc2-c3962c3b4590\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"3.8.1.0\")]\n[assembly: AssemblyFileVersion(\"3.8.1.0\")]\n"
  },
  {
    "path": "WadReader/Util.cs",
    "content": "﻿using System.IO;\nusing System.Runtime.InteropServices;\n\nnamespace WadReader\n{\n    static class Util\n    {\n        public static T ReadStuctureFromStream<T>(Stream stream)\n        {\n            byte[] bytes = new byte[Marshal.SizeOf(typeof(T))];\n            stream.Read(bytes, 0, bytes.Length);\n\n            GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);\n            T obj = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),typeof(T));\n            handle.Free();\n            return obj;\n        }\n    }\n}\n"
  },
  {
    "path": "WadReader/WadFileReader.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing System.Text.RegularExpressions;\n\nnamespace WadReader\n{\n    public class WadFileReader\n    {\n        public readonly bool IsValid;\n\n        private static readonly string[] s_mapData = new string[] { \"THINGS\", \"LINEDEFS\", \"SIDEDEFS\", \"VERTEXES\", \"SEGS\", \"SSECTORS\", \"NODES\", \"SECTORS\", \"REJECT\", \"BLOCKMAP\", \"BEHAVIOR\",\n            \"TEXTMAP\", \"ZNODES\", \"ENDMAP\", \"DIALOGUE\", \"SCRIPTS\", };\n        private static readonly string[] s_importantMapData = new string[] { \"BLOCKMAP\", \"VERTEXES\", \"SECTORS\", \"SIDEDEFS\", \"LINEDEFS\", \"SSECTORS\", \"NODES\", \"SEGS\" };\n\n        private static readonly string s_mapdataRegex = @\"^GL_\\S+\";\n\n        private readonly Stream m_stream;\n\n        public WadFileReader(Stream stream)\n        {\n            m_stream = stream;\n            WadHeader = new WadHeader(stream);\n            IsValid = CheckIsValid();\n        }\n\n        private bool CheckIsValid()\n        {\n            if (WadHeader.WadType == WadType.Unknown)\n                return false;\n\n            int lumpSize = WadHeader.LumpCount * FileLump.FileLumpByteSize;\n            if (lumpSize < 0 || lumpSize > m_stream.Length)\n                return false;\n\n            return true;\n        }\n\n        public WadType WadType\n        {\n            get { return WadHeader.WadType; }\n        }\n\n        public List<FileLump> ReadLumps()\n        {\n            if (!IsValid)\n                return new List<FileLump>();\n\n            return WadHeader.ReadLumps();\n        }\n\n        public static List<FileLump> GetMapMarkerLumps(List<FileLump> lumps)\n        {\n            List<FileLump> ret = new List<FileLump>();\n            HashSet<string> mapLumps = new HashSet<string>(s_mapData);\n            HashSet<string> important = new HashSet<string>(s_importantMapData);\n            int mapLumpCount = 0, mapMarkerIndex = 0;\n\n            for (int i = 0; i < lumps.Count; i++)\n            {\n                if (IsMapData(mapLumps, lumps[i]) && i > 0)\n                {\n                    bool isUdmf = false;\n                    mapMarkerIndex = i - 1;\n\n                    while (i < lumps.Count && IsMapData(mapLumps, lumps[i]))\n                    {\n                        if (lumps[i].Name == \"ENDMAP\")\n                            isUdmf = true;\n                        if (important.Contains(lumps[i].Name))\n                            mapLumpCount++;\n                        i++;\n                    }\n\n                    if (isUdmf || mapLumpCount > 4)\n                        ret.Add(lumps[mapMarkerIndex]);\n\n                    mapLumpCount = 0;\n                    i--;\n                }\n            }\n\n            return ret;\n        }\n\n        private static bool IsMapData(HashSet<string> mapLumps, FileLump lump)\n        {\n            return mapLumps.Contains(lump.Name) || Regex.IsMatch(lump.Name, s_mapdataRegex);\n        }\n\n        private WadHeader WadHeader { get; set; }\n    }\n}\n"
  },
  {
    "path": "WadReader/WadHeader.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing System.Runtime.InteropServices;\n\nnamespace WadReader\n{\n    public class WadHeader\n    {\n        private const int s_iwad = 1145132873;\n        private const int s_pwad = 1145132880;\n\n        public WadHeader(Stream stream)\n        {\n            if (stream.Length < Marshal.SizeOf(typeof(wadinfo_t)))\n            {\n                WadType = WadType.Unknown;\n            }\n            else\n            {\n                m_stream = stream;\n                m_wadinfo = Util.ReadStuctureFromStream<wadinfo_t>(m_stream);\n\n                switch (m_wadinfo.identification)\n                {\n                    case s_iwad:\n                        WadType = WadType.IWAD;\n                        break;\n                    case s_pwad:\n                        WadType = WadType.PWAD;\n                        break;\n                    default:\n                        WadType = WadType.Unknown;\n                        break;\n                }\n            }\n        }\n\n        public List<FileLump> ReadLumps()\n        {\n            List<FileLump> lumps = new List<FileLump>(m_wadinfo.numlumps);\n\n            try\n            {\n                m_stream.Seek(m_wadinfo.infotableofs, SeekOrigin.Begin);\n\n                for (int i = 0; i < m_wadinfo.numlumps; i++)\n                    lumps.Add(new FileLump(m_stream));\n            }\n            catch\n            {\n                //failed, nothing to do\n            }\n\n            return lumps;\n        }\n\n        public readonly WadType WadType;\n        public int LumpCount => m_wadinfo.numlumps;\n\n        private readonly wadinfo_t m_wadinfo;\n        private readonly Stream m_stream;\n\n        private struct wadinfo_t\n        {\n            public wadinfo_t(int i) //useless constructor, removes annoying unused variable warnings\n            {\n                identification = numlumps = infotableofs = i;\n            }\n\n            public int identification;\n            public int numlumps;\n            public int infotableofs;\n        };\n    }\n}\n"
  },
  {
    "path": "WadReader/WadReader.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{15A9A8FC-096E-4458-AB7F-02386740CF4E}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>WadReader</RootNamespace>\n    <AssemblyName>WadReader</AssemblyName>\n    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Buffers.4.5.1\\lib\\net461\\System.Buffers.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Memory.4.5.4\\lib\\net461\\System.Memory.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Numerics\" />\n    <Reference Include=\"System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.5.0\\lib\\net46\\System.Numerics.Vectors.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Runtime.CompilerServices.Unsafe.4.5.3\\lib\\net461\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"DoomImage\\DoomImage.cs\" />\n    <Compile Include=\"DoomImage\\Palette.cs\" />\n    <Compile Include=\"DoomImage\\PaletteReaders.cs\" />\n    <Compile Include=\"FileLump.cs\" />\n    <Compile Include=\"Util.cs\" />\n    <Compile Include=\"WadHeader.cs\" />\n    <Compile Include=\"WadFileReader.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"WadType.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "WadReader/WadType.cs",
    "content": "﻿namespace WadReader\n{\n    public enum WadType\n    {\n        PWAD,\n        IWAD,\n        Unknown\n    }\n}\n"
  },
  {
    "path": "WadReader/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"System.Buffers\" version=\"4.5.1\" targetFramework=\"net48\" />\n  <package id=\"System.Memory\" version=\"4.5.4\" targetFramework=\"net48\" />\n  <package id=\"System.Numerics.Vectors\" version=\"4.5.0\" targetFramework=\"net48\" />\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"4.5.3\" targetFramework=\"net48\" />\n</packages>"
  },
  {
    "path": "WpfControlLibrary/AssemblyInfo.cs",
    "content": "using System.Windows;\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n                                     //(used if a resource is not found in the page,\n                                     // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n                                              //(used if a resource is not found in the page,\n                                              // app, or any theme specific resource dictionaries)\n)]\n"
  },
  {
    "path": "WpfControlLibrary/WpfComboBox.xaml",
    "content": "<UserControl x:Class=\"WpfControlLibrary.UserControl1\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:WpfControlLibrary\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <Grid>\n            \n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "WpfControlLibrary/WpfComboBox.xaml.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace WpfControlLibrary\n{\n    /// <summary>\n    /// Interaction logic for UserControl1.xaml\n    /// </summary>\n    public partial class UserControl1 : UserControl\n    {\n        public UserControl1()\n        {\n            InitializeComponent();\n        }\n    }\n}"
  },
  {
    "path": "WpfControlLibrary/WpfControlLibrary.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0-windows</TargetFramework>\n    <Nullable>enable</Nullable>\n    <UseWPF>true</UseWPF>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "appveyor.yml",
    "content": "version: '{build}'\nconfiguration: Release\nplatform: Any CPU\nimage: Visual Studio 2022\nbefore_build:\n- cmd: nuget restore\n\nbuild_script:\n- ps: |\n    $env:DevenvPath = 'C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE'\n- '\"%DevenvPath%\\devenv.com\" DoomLauncher.sln /build Release /project Setup\\Setup.vdproj /projectconfig Release /Out errorFile.txt'\n- msbuild DoomLauncher.sln /target:UnitTest /logger:\"C:\\Program Files\\AppVeyor\\BuildAgent\\Appveyor.MSBuildLogger.dll\"\n\ntest:\n    on\n\nafter_build:\n- '%APPVEYOR_BUILD_FOLDER%\\DoomLauncherRelease\\bin\\Release\\DoomLauncherRelease.exe %APPVEYOR_BUILD_FOLDER%'\n\nartifacts:\n  path: ReleaseBuild/DoomLauncher*.zip\n  name: BuiltZip\n  "
  }
]