private async void UnlockAccountMessageReceived(UnlockAccountMessage message)
        {
            if (this.m_connection.State == ClientConnectionState.LOGIN_FAILED)
            {
                if (ServerStatus.Status == ServerStatusType.SHUTDOWN_STARTED || ServerStatus.Status == ServerStatusType.MAINTENANCE)
                {
                    UnlockAccountFailedMessage unlockAccountFailedMessage = new UnlockAccountFailedMessage();
                    unlockAccountFailedMessage.SetErrorCode(UnlockAccountFailedMessage.ErrorCode.SERVER_MAINTENANCE);
                    this.SendMessage(unlockAccountFailedMessage);
                    return;
                }

                IOperationResult <string> getResult = await ServerProxy.AccountDatabase.Get(message.GetAccountId());

                if (!getResult.Success)
                {
                    UnlockAccountFailedMessage unlockAccountFailedMessage = new UnlockAccountFailedMessage();
                    unlockAccountFailedMessage.SetErrorCode(UnlockAccountFailedMessage.ErrorCode.UNLOCK_UNAVAILABLE);
                    this.SendMessage(unlockAccountFailedMessage);
                    return;
                }

                AccountDocument accountDocument = CouchbaseDocument.Load <AccountDocument>(getResult.Value);

                if (accountDocument.PassToken != message.GetPassToken() || accountDocument.State != AccountState.LOCKED)
                {
                    UnlockAccountFailedMessage unlockAccountFailedMessage = new UnlockAccountFailedMessage();
                    unlockAccountFailedMessage.SetErrorCode(UnlockAccountFailedMessage.ErrorCode.UNLOCK_UNAVAILABLE);
                    this.SendMessage(unlockAccountFailedMessage);
                    return;
                }

                if (accountDocument.StateArg != null && !accountDocument.StateArg.Equals(message.GetUnlockCode(), StringComparison.InvariantCultureIgnoreCase))
                {
                    UnlockAccountFailedMessage unlockAccountFailedMessage = new UnlockAccountFailedMessage();
                    unlockAccountFailedMessage.SetErrorCode(UnlockAccountFailedMessage.ErrorCode.UNLOCK_FAILED);
                    this.SendMessage(unlockAccountFailedMessage);
                    return;
                }

                accountDocument.State    = AccountState.NORMAL;
                accountDocument.StateArg = null;

                IOperationResult <string> updateResult = await ServerProxy.AccountDatabase.Update(accountDocument.Id, CouchbaseDocument.Save(accountDocument));

                if (!updateResult.Success)
                {
                    UnlockAccountFailedMessage unlockAccountFailedMessage = new UnlockAccountFailedMessage();
                    unlockAccountFailedMessage.SetErrorCode(UnlockAccountFailedMessage.ErrorCode.UNLOCK_UNAVAILABLE);
                    this.SendMessage(unlockAccountFailedMessage);
                    return;
                }

                UnlockAccountOkMessage unlockAccountOkMessage = new UnlockAccountOkMessage();
                unlockAccountOkMessage.SetAccountId(message.GetAccountId());
                unlockAccountOkMessage.SetPassToken(message.GetPassToken());
                this.SendMessage(unlockAccountOkMessage);
            }
        }