private async void btnSnipe_Click(object sender, EventArgs e)
        {
            try
            {
                // Clear Box
                textResults.Clear();

                // Disable Stuff
                boxCoordinates.Enabled = false;
                btnSnipe.Enabled = false;

                // Verify the Coordinates are valid
                string delim = Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator;
                string[] coordinates = boxCoordinates.Text.Trim().Replace(',', '/').Replace('.', char.Parse(delim)).Split('/');
                double lat = double.Parse(coordinates[0]);
                double lng = double.Parse(coordinates[1]);
                textResults.AppendText("Coordinates are valid." + Environment.NewLine);

                // Persist Coordinates
                _lat = lat;
                _lng = lng;

                // Being by moving to the location
                await _client.UpdatePlayerLocation(lat, lng, _client.Settings.DefaultAltitude);
                textResults.AppendText("Teleported to Snipe Location." + Environment.NewLine);

                // Remove the Ban
                textResults.AppendText("Will try to remove soft ban now, this will take less than 1 minute." + Environment.NewLine);
                if (!await ForceUnban())
                {
                    textResults.AppendText("Unable to remove soft ban, most likely the Pokemon(s) will run away." + Environment.NewLine);
                } else
                {
                    textResults.AppendText("Removed soft ban with success." + Environment.NewLine);
                }

                // Maybe walk to the location instead of teleporting...
                var distanceToPokemon = Helpers.LocationUtils.CalculateDistanceInMeters(new GeoCoordinate(_client.CurrentLat, _client.CurrentLng), new GeoCoordinate(lat, lng));
                textResults.AppendText($"Walking from Pokestop to the Pokemon, will take {distanceToPokemon / (60 / 3.6):0.0} seconds..." + Environment.NewLine);
                Navigation.HumanWalking walker = new Navigation.HumanWalking(_client);
                await walker.Walk(new GeoCoordinate(lat, lng), 60);
                textResults.AppendText("Arrived to Pokemon Location, will try to catch it now." + Environment.NewLine);

                // Catch Pokemons in the Area
                await ExecuteCatchAllNearbyPokemons();

                // Finish
                textResults.AppendText("Sniping Complete." + Environment.NewLine);

                // Enable Stuff
                boxCoordinates.Enabled = true;
                btnSnipe.Enabled = true;
            }
            catch(Exception ex)
            {
                textResults.Text = ex.ToString();
                MessageBox.Show("Error during Pokemon Snipe, see details in results box.");
            }
        }
        private async void btnSnipe_Click(object sender, EventArgs e)
        {
            try
            {
                // Clear Box
                textResults.Clear();

                // Disable Stuff
                boxCoordinates.Enabled = false;
                btnSnipe.Enabled       = false;

                // Verify the Coordinates are valid
                string[] coordinates = boxCoordinates.Text.Trim().Split(',');
                double   lat         = double.Parse(coordinates[0]);
                double   lng         = double.Parse(coordinates[1]);
                textResults.AppendText("Coordinates are valid." + Environment.NewLine);

                // Persist Coordinates
                _lat = lat;
                _lng = lng;

                // Being by moving to the location
                await _client.UpdatePlayerLocation(lat, lng, _client.Settings.DefaultAltitude);

                textResults.AppendText("Teleported to Snipe Location." + Environment.NewLine);

                // Remove the Ban
                textResults.AppendText("Will try to remove soft ban now, this will take less than 1 minute." + Environment.NewLine);
                if (!await ForceUnban())
                {
                    textResults.AppendText("Unable to remove soft ban, most likely the Pokemon(s) will run away." + Environment.NewLine);
                }
                else
                {
                    textResults.AppendText("Removed soft ban with success." + Environment.NewLine);
                }

                // Maybe walk to the location instead of teleporting...
                var distanceToPokemon = Helpers.LocationUtils.CalculateDistanceInMeters(new GeoCoordinate(_client.CurrentLat, _client.CurrentLng), new GeoCoordinate(lat, lng));
                textResults.AppendText($"Walking from Pokestop to the Pokemon, will take {distanceToPokemon / (60 / 3.6):0.0} seconds..." + Environment.NewLine);
                Navigation.HumanWalking walker = new Navigation.HumanWalking(_client);
                await walker.Walk(new GeoCoordinate(lat, lng), 60);

                textResults.AppendText("Arrived to Pokemon Location, will try to catch it now." + Environment.NewLine);

                // Catch Pokemons in the Area
                await ExecuteCatchAllNearbyPokemons();

                // Finish
                textResults.AppendText("Sniping Complete." + Environment.NewLine);

                // Enable Stuff
                boxCoordinates.Enabled = true;
                btnSnipe.Enabled       = true;
            }
            catch (Exception ex)
            {
                textResults.Text = ex.ToString();
                MessageBox.Show("Error during Pokemon Snipe, see details in results box.");
            }
        }
        private async Task ExecuteFarmingPokestopsAndPokemons()
        {
            var mapObjects = await _client.GetMapObjects();

            var pokeStops = mapObjects.MapCells.SelectMany(i => i.Forts).Where(i => i.Type == FortType.Checkpoint && i.CooldownCompleteTimestampMs < DateTime.UtcNow.ToUnixTime());

            var fortDatas = pokeStops as IList<FortData> ?? pokeStops.ToList();
            _pokestopsCount = fortDatas.Count<FortData>();
            int count = 1;

            foreach (var pokeStop in fortDatas)
            {
                // Use Teleporting if No Human Walking Enabled
                if (!GUISettings.Default.humanWalkingEnabled)
                {
                    var update = await _client.UpdatePlayerLocation(pokeStop.Latitude, pokeStop.Longitude, _settings.DefaultAltitude); // Redundant?
                    UpdateMap(pokeStop.Latitude, pokeStop.Longitude);
                } else
                {
                    HumanWalking human = new HumanWalking(_client);
                    GeoCoordinate targetLocation = new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude);
                    human.assignMapToUpdate(MainMap);
                    await human.Walk(targetLocation, GUISettings.Default.humanWalkingSpeed, ExecuteCatchAllNearbyPokemons);
                }               

                var fortInfo = await _client.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);

                boxPokestopName.Text = fortInfo.Name;
                boxPokestopInit.Text = count.ToString();
                boxPokestopCount.Text = _pokestopsCount.ToString();
                count++;                               

                var fortSearch = await _client.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
                Logger.Write($"Loot -> Gems: { fortSearch.GemsAwarded}, Eggs: {fortSearch.PokemonDataEgg} Items: {StringUtils.GetSummedFriendlyNameOfItemAwardList(fortSearch.ItemsAwarded)}");
                Logger.Write("Gained " + fortSearch.ExperienceAwarded + " XP.");

                // Experience Counter
                _totalExperience += fortSearch.ExperienceAwarded;

                await GetCurrentPlayerInformation();
                Logger.Write("Attempting to Capture Nearby Pokemons.");

                try
                {
                    await ExecuteCatchAllNearbyPokemons();
                }
                catch(Exception ex)
                {
                    Logger.Write("Error while trying to catch nearby Pokemon(s).");
                    ErrorReportCreator.Create("CatchingNearbyPokemonError", "Unable to Catch Nearby Pokemon(s).", ex);
                }

                if (!_isFarmingActive)
                {
                    Logger.Write("Stopping Farming Pokestops.");
                    return;
                }                    

                Logger.Write("Waiting before moving to the next Pokestop.");
                await Task.Delay(GUISettings.Default.pokestopDelay * 1000);
            }
        }