public Task UpdateMappingDataTask()
        {
            return(new Task(() => {
                RefreshTimer.Stop();
                OnUpdate?.Invoke();
                JsonTextReader jReader;
                using (var client = new WebClient()) {
                    var data = Encoding.UTF8.GetString(client.DownloadData(Properties.Settings.Default.VersionJsonUrl));
                    jReader = new JsonTextReader(new StringReader(data));
                }

                MappingData.Clear();
                VersionJson jsonInput = VersionJson.Init;
                string keyVersion = null;
                MappingType keyMapType = MappingType.Snapshot;

                while (jReader.Read())
                {
                    var value = jReader.Value;
                    if (jReader.Value != null)
                    {
                        switch (jsonInput)
                        {
                        case VersionJson.MCVersion:
                            MappingData[keyVersion = (string)value] = new Dictionary <MappingType, SortedSet <int> >();
                            break;

                        case VersionJson.MapType:
                            if (!Enum.TryParse((string)value, true, out keyMapType))
                            {
                                throw new InvalidDataException("Expected Mapping type.");
                            }
                            break;

                        case VersionJson.Version:
                            if (!MappingData[keyVersion].ContainsKey(keyMapType))
                            {
                                MappingData[keyVersion][keyMapType] = new SortedSet <int>();
                            }
                            MappingData[keyVersion][keyMapType].Add((int)(long)value);
                            break;

                        default:
                            break;
                        }
                    }
                    else
                    {
                        if (jReader.TokenType == JsonToken.StartObject)
                        {
                            jsonInput += 1;
                        }
                        else if (jReader.TokenType == JsonToken.StartArray)
                        {
                            jsonInput += 1;
                        }
                        else if (jReader.TokenType == JsonToken.EndObject)
                        {
                            jsonInput -= 1;
                        }
                        else if (jReader.TokenType == JsonToken.EndArray)
                        {
                            jsonInput -= 1;
                        }
                    }
                }

                Dispatcher.Invoke(() => {
                    var versions = new List <string>(MappingData.Keys);
                    versions.Sort(MCVersionComparer.Comparer);
                    versions.Reverse();
                    versions.Insert(0, "Semi-Live");
                    versions.Add("Custom");
                    MCVersionDropDown.ItemsSource = versions;
                });

                RefreshTimer.Start();
                OnUpdateFinished?.Invoke();
                IsUpdating = false;
            }));
        }