private static async Task ProcessAccount()
        {
            if (!await FutManager.IsFifaSupported(_logger))
            {
                throw new NotImplementedException("New Fifa Code");
            }

            IFutClient futClient    = FutManager.CreateNewInstance(_logger);
            int        errorTrigger = 0;

            while (true)
            {
                //Usually all main exception should be catch here ... specific exception like deny when bidding or stuck should be catch in specific method
                try
                {
                    await WorksProcess(futClient);

                    errorTrigger = 0;
                }
                catch (FifaConfigException ex)
                {
                    //All exceptions about wrong config like password ...
                    string message = "Config Exception: " + ex.Message;
                    _logger.LogError("Main", message);
                    break;
                }
                catch (FifaLogicException ex)
                {
                    _logger.LogWarning("Main", "Logic Exception: " + ex.Message);
                    errorTrigger++;

                    if (errorTrigger >= 3)
                    {
                        break;
                    }
                }
                catch (FifaInternalServerException e)
                {
                    _logger.LogWarning("Main", "Issue with server task sleep for 10 minutes");
                    await Task.Delay(10 * 60 * 1000);
                }
                catch (FifaSessionExceptionCaptcha e)
                {
                    _logger.Log("Main", "Session Captcha: " + e.Message);
                    //Must call it when trigger funcaptcha, then you need to login again and solve it, method setup IsLogged false to help you, at this point you can also force people to solve captcha by their self if dont wanna use solver after logout
                    //Remember must be solved only when trigger on GetUserInfo() not here
                    await futClient.LogOut();
                }
                catch (FifaSessionException e)
                {
                    _logger.LogWarning("Main", "Session: " + e.Message);

                    if (errorTrigger >= 3)
                    {
                        break;
                    }

                    //Usually happen when somebody is logged at same time
                    await futClient.ReSession();
                }
                catch (FifaException e)
                {
                    _logger.LogError("Main", "FifaException: " + e.Message);
                    errorTrigger++;

                    if (errorTrigger >= 3)
                    {
                        break;
                    }
                }
                catch (TaskCanceledException)
                {
                    //Network Issue? Perfomance Issue?
                    await Task.Delay(10 * 1000);
                }
                catch (Exception e)
                {
                    _logger.LogError("Main", "Exception: " + e.Message);
                    errorTrigger++;

                    if (errorTrigger >= 3)
                    {
                        break;
                    }
                }

                int secPause = FutManager.RandomNumber(2 * 10, 4 * 10);
                await Task.Delay(secPause * 100);
            }

            futClient.Dispose(); //Remember to Dispose when finish to use instance to release resources
        }
        private static async Task <bool> IsLogged(IFutClient futClient)
        {
            if (futClient.IsLogged)
            {
                return(true);
            }

            string fifaEmail         = "*****@*****.**";
            string fifaPass          = "******";
            string proxyAddress      = null; //"192.168.1.2:8888";
            string proxyUser         = null;
            string proxyPass         = null;
            Regex  rgx               = new Regex("[^a-zA-Z0-9]");
            string storageFile       = Path.Combine(AssemblyPath, rgx.Replace(fifaEmail, "") + ".storage.bin"); //must be unique for each account
            string solverApiKey      = "";                                                                      //Get key on http://api.de-ltd.co.uk/login
            bool   useFunSolverProxy = false;                                                                   //if true require proxy setup on loggin function
            ITwoFactorCodeProvider twoFactorCodeProvider = new AppAuthTwoFactorCodeProvider("xxxxxxxxxxxxx");   //You can also use ImapAuthTwoFactorCodeProvider, DisabledTwoFactorCodeProvider, AppAuthTwoFactorCodeProvider or implement a new by your self

            //Will throw Exception if detect new fifa code, then not need to use FutManager.IsFifaSupported before call it
            var accountType = await futClient.Loggin(fifaEmail, fifaPass, twoFactorCodeProvider, proxyAddress, proxyUser, proxyPass, storageFile);

            _logger.Log("IsLogged", "Logged on accountType " + accountType);

            FifaUserResponse accountInfo = null;

            try
            {
                accountInfo = await futClient.GetUserInfo();
            }
            catch (FifaSessionExceptionCaptcha)
            {
                //Need to solve captcha before we can continue

                //We use futmsolver solver but you can add a new one just implement here ... or you can also stop bot and ask to people to solve in standard app

                if (useFunSolverProxy)
                {
                    //Require proxy setup on Loggin function or will return error
                    if (!await futClient.FuncaptchaProxySolver(solverApiKey))
                    {
                        throw new Exception("too many tenatives");
                    }
                }
                else
                {
                    //We need to request captcha data before call funcaptcha
                    var captchaData = await futClient.GetCaptchaKey();

                    string callBack = null;

                    //It try to make max 3 tentatives
                    for (byte t = 0; t < 3; t++)
                    {
                        callBack = await futClient.FuncaptchaSolver(solverApiKey, captchaData.Pk, captchaData.Blob);

                        if (!string.IsNullOrEmpty(callBack))
                        {
                            break;
                        }
                    }

                    if (string.IsNullOrEmpty(callBack))
                    {
                        throw new Exception("too many tenatives");
                    }

                    //need to validate code on EA side
                    bool result = await futClient.ValidateCaptchaKey(callBack);

                    if (!result)
                    {
                        throw new Exception("usually never happen, session expired ?!?");
                    }
                }

                //Call again after captcha solved
                accountInfo = await futClient.GetUserInfo();
            }

            //0: "NONE" 1: "BLACKLIST" 2: "WHITELIST" 3: "GREYLIST" 100: "MAINTENANCE"
            if (accountInfo.UserInfo.Feature.Trade == 0)
            {
                throw new FifaConfigException("MarketNotUnlocked");
            }
            else if (accountInfo.UserInfo.Feature.Trade == 1)
            {
                throw new FifaConfigException("MarketLockedBlack");
            }
            else if (accountInfo.UserInfo.Feature.Trade == 3)
            {
                throw new FifaConfigException("MarketLockedGrey");
            }

            Coins = accountInfo.UserInfo.Credits; //Usually you will update credits when call GetTrade/GetWatch

            //Must Use it cause EA cache data for 5 minutes then you can't ask Each time this data
            NextTradePileCheck  = DateTime.UtcNow.AddMinutes(5);
            NextWatchListCheck  = DateTime.UtcNow.AddMinutes(5);
            NextUnassignedCheck = DateTime.UtcNow.AddMinutes(5);

            var liveMessages = await futClient.GetLiveMessage(); //Call only here no other part

            var unassignedData = await futClient.GetUnassignedItems();

            var tradeData = await futClient.GetTradePile();          //You can use Credits inside to update current credit when call it

            var watchlistData = await futClient.GetWatchList();      //You can use Credits inside to update current credit when call it

            var activeMessages = await futClient.GetActiveMessage(); //Call only here no other part

            Unassigned = unassignedData.ItemData;                    //DuplicateItemIdList should be use to know if you can send player to club
            TradePile  = tradeData.AuctionInfo;
            WatchList  = watchlistData.AuctionInfo;

            foreach (var message in liveMessages?.MessageList)
            {
                _logger.Log("IsLogged", "LiveMessage " + message.Renders.FirstOrDefault(i => i.Name == "bodyText").Value);
                await Task.Delay(FutManager.RandomNumber(30, 50) * 100);

                await futClient.CloseLiveMessage(message.MessageId);
            }

            foreach (var message in activeMessages?.ActiveMessage)
            {
                _logger.Log("IsLogged", "ActiveMessage You have Active Message message[" + message.Message + "] id[" + message.Id + "] rewardType[" + message.RewardType + "] rewardValue[" + message.RewardValue + "]");
                await Task.Delay(FutManager.RandomNumber(30, 50) * 100);

                await futClient.CloseActiveMessage(message.Id);
            }

            _logger.Log("IsLogged", "Logged");
            return(true);
        }