Exemple #1
0
        public static async Task <TransactionsResponse> GetAllTransactions(this ITransactionApi myPontoApi, Guid accountId)
        {
            var allTransactionsResponse = new TransactionsResponse();

            allTransactionsResponse.Data = new List <TransactionResource>();

            var transactionResponse = await myPontoApi.GetTransactions(accountId);

            allTransactionsResponse.Meta        = transactionResponse.Meta;
            allTransactionsResponse.Meta.Paging = null;
            TransactionsResponse nextPage = await transactionResponse.Links.GetFirstPage();

            allTransactionsResponse.Data.AddRange(nextPage.Data);
            if (nextPage.Links.Next != null)
            {
                do
                {
                    nextPage = await nextPage.Links.GetNextPage();

                    allTransactionsResponse.Data.AddRange(nextPage.Data);
                    allTransactionsResponse.Links = nextPage.Links;
                } while (nextPage.Links.Next != null);
            }

            return(allTransactionsResponse);
        }
Exemple #2
0
        public async Task GetTransactionsAnd200()
        {
            var accountNumber        = "12345";
            var postCode             = "E8 1DY";
            var transactionsResponse = new TransactionsResponse
            {
                TransactionRequest = new TransactionRequest
                {
                    PaymentRef = accountNumber,
                    PostCode   = postCode
                },
                Transactions = new List <LBHTransactions>
                {
                    new LBHTransactions
                    {
                        Balance     = "123.00",
                        Date        = DateTime.Now.ToString(),
                        Description = "Some description",
                        valueIn     = "123.00"
                    }
                }
            };

            _getTransactionsUseCase.Setup(x => x.Execute(accountNumber, postCode)).ReturnsAsync(transactionsResponse);
            var response = await _classUnderTest.GetTransactions(accountNumber, postCode).ConfigureAwait(true) as IActionResult as OkObjectResult;

            response.Should().NotBeNull();
            response.StatusCode.Should().Be(200);
            response.Value.Should().BeOfType <TransactionsResponse>();
            response.Value.Should().BeEquivalentTo(transactionsResponse);
        }
Exemple #3
0
        public IResponse createHistoryResultsResponse(List <SaleEN> pSalesList, string pToken)
        {
            TransactionsResponse response = new TransactionsResponse();
            HistoryResponse      history  = new HistoryResponse();

            history.transactions = new List <Sale>();

            foreach (var item in pSalesList)
            {
                Sale sale = new Sale();
                sale.Amount          = item.Amount;
                sale.currency        = item.Currency;
                sale.date            = item.Date; //Date is actually server's date. Used by Android clients, as android sets displayed dates based on TimeZone set on device
                sale.FormattedAmount = item.FormattedAmount;
                sale.id             = item.ID.ToString();
                sale.msisdn         = item.Msisdn;
                sale.Operator       = item.OperatorName;
                sale.paid           = item.Paid;
                sale.Pais           = item.CountryName;
                sale.salesman       = item.PersonName;
                sale.serverDateGMT  = item.ISOServerDate;
                sale.status         = (item.Success) ? "Exitosa" : "Fallida";
                sale.transaction_id = item.TransactionID;
                history.transactions.Add(sale);
            }

            response.History = history;
            response.count   = history.transactions.Count;
            response.token   = pToken;

            return(response);
        }
        public async Task ReturnsCorrectResponseWhenTransactionExists()
        {
            var accountNumber        = "12345";
            var postCode             = "E8 1DY";
            var transactionsResponse = new TransactionsResponse
            {
                TransactionRequest = new TransactionRequest
                {
                    PaymentRef = accountNumber,
                    PostCode   = postCode
                },
                Transactions = new List <LBHTransactions>
                {
                    new LBHTransactions
                    {
                        Balance     = "123.00",
                        Date        = DateTime.Now.ToString(),
                        Description = "Some description",
                        valueIn     = "123.00"
                    }
                }
            };

            _mockTransactionsGateway.Setup(x => x.GetTransactions(accountNumber, postCode)).ReturnsAsync(transactionsResponse);

            var response = await _classUnderTest.Execute(accountNumber, postCode).ConfigureAwait(true);

            response.Should().NotBeNull();
            response.Should().BeOfType <TransactionsResponse>();
            response.Should().Equals(transactionsResponse);
        }
Exemple #5
0
        public IResponse createHistoryResultsResponseGMT(List <SaleEN> pSalesList, string pToken)
        {
            TransactionsResponse response = new TransactionsResponse();
            HistoryResponse      history  = new HistoryResponse();

            history.transactions = new List <Sale>();

            foreach (var item in pSalesList)
            {
                Sale sale = new Sale();
                sale.Amount          = item.Amount;
                sale.currency        = item.Currency;
                sale.date            = item.Date; //Server date on 'date' property in response for iOS clients
                sale.FormattedAmount = item.FormattedAmount;
                sale.id             = item.ID.ToString();
                sale.msisdn         = item.Msisdn;
                sale.Operator       = item.OperatorName;
                sale.paid           = item.Paid;
                sale.Pais           = item.CountryName;
                sale.salesman       = item.PersonName;
                sale.serverDateGMT  = item.ISOServerDate;
                sale.status         = (item.Success) ? "Exitosa" : "Fallida";
                sale.transaction_id = item.TransactionID;
                history.transactions.Add(sale);
            }

            response.History = history;
            response.count   = history.transactions.Count;
            response.token   = pToken;

            return(response);
        }
Exemple #6
0
        public void AddTransactions(IReadOnlyCollection <Transaction> transactions)
        {
            progress.AppendLine($"Added {transactions.Count} transactions for {budget.Name}/{account.Name}");
            transactionSinceOldest = GetTransactionSinceDate(transactions.Min(item => item.Date));

            foreach (var transaction in transactions)
            {
                AddTransaction(transaction);
            }

            if (updateTransactions.Any())
            {
                logger.Trace("Updated: " + JsonConvert.SerializeObject(updateTransactions, Formatting.Indented));
                ynabApi.Transactions.UpdateTransactions(budget.Id.ToString(), new UpdateTransactionsWrapper(updateTransactions));
                progress.AppendLine($"Updated: {updateTransactions.Count}");
            }

            if (!saveTransactions.Any())
            {
                return;
            }

            logger.Trace("New: " + JsonConvert.SerializeObject(saveTransactions, Formatting.Indented));
            ynabApi.Transactions.CreateTransaction(budget.Id.ToString(), new SaveTransactionsWrapper(null, saveTransactions));
            progress.AppendLine($"New: {saveTransactions.Count}");
        }
Exemple #7
0
        /// <summary>
        /// Retrieves all transactions since the given transactionId (inclusive)
        /// </summary>
        /// <param name="accountId">the id of the account to which the transaction belongs</param>
        /// <param name="transactionId">the id of the first transaction to retrieve</param>
        /// <returns>List of transaction objects</returns>
        public static async Task <List <ITransaction> > GetTransactionsSinceIdAsync(string accountId, long transactionId)
        {
            string requestString = Server(EServer.Account) + "accounts/" + accountId + "/transactions/sinceid";

            requestString += "?id=" + transactionId;

            TransactionsResponse response = await MakeRequestAsync <TransactionsResponse>(requestString);

            return(response.transactions);
        }
Exemple #8
0
        public async Task <IActionResult> Get([FromQuery] PagedTransactionRequest request)
        {
            var response = _dataService.GetTransactionsAsync(request);
            var count    = _dataService.GetTotalTransactionCountAsync(request.IgnorePayments);
            var trxResp  = new TransactionsResponse()
            {
                Data = await response, Total = await count, Skip = request.Skip, Take = request.Take
            };

            return(Ok(trxResp));
        }
Exemple #9
0
        public override Task <TransactionsResponse> GetTransactions(AccountRequest request, ServerCallContext context)
        {
            TransactionsResponse response = new TransactionsResponse();
            var transactions = Transaction.GetTransactions(request.Address);

            foreach (Transaction trx in transactions)
            {
                TrxModel mdl = ConvertTrxModel(trx);
                response.Transactions.Add(mdl);
            }
            return(Task.FromResult(response));
        }
Exemple #10
0
        private async Task <List <TransactionDetail> > GetVenmoDeposits(Database.Models.VenmoUser venmoUser, Configuration configuration)
        {
            TransactionsApi      transactionsApi = new TransactionsApi(configuration);
            TransactionsResponse transactions    = await transactionsApi.GetTransactionsByAccountAsync(Default, venmoUser.YNAB !.DefaultAccount);

            var venmoDeposits = transactions.Transactions
                                .Where(t => t.PayeeName != null && t.PayeeName.ToLower().Contains("from venmo"))
                                .OrderByDescending(t => t.Date)
                                .ToList();

            return(venmoDeposits);
        }
Exemple #11
0
        public TransactionAdder(TransactionsResponse transactionSinceOldest, Transaction transaction)
        {
            id = transaction.Id;
            hasTransactionId = !string.IsNullOrEmpty(id);
            date             = transaction.Date.Date;
            mcc    = transaction.Mcc;
            memo   = GetMemo(transaction.Memo);
            payee  = GetPayee(transaction.Payee);
            amount = GetAmount(transaction.Amount);

            transactionsWithSameAmountAndDate = transactionSinceOldest.Data.Transactions.Where(item => item.Amount == amount && item.Date.Date == transaction.Date.Date).ToList();
            logger.Trace("Old transaction with same amount and same date: " + JsonConvert.SerializeObject(transactionsWithSameAmountAndDate, Formatting.Indented));
        }
Exemple #12
0
        public ServiceResult <TransactionsResponse> GetTransactions(Guid stockId, DateRange dateRange)
        {
            if (_Portfolio == null)
            {
                return(ServiceResult <TransactionsResponse> .NotFound());
            }

            var transactions = _Portfolio.Transactions.ForHolding(stockId, dateRange);

            var response = new TransactionsResponse();

            response.Transactions.AddRange(transactions.Select(x => x.ToTransactionItem(dateRange.ToDate)));

            return(ServiceResult <TransactionsResponse> .Ok(response));
        }
        public async Task <TransactionsResponse> GetTransactions(GetTransactionsRequest request)
        {
            var message = CreateHttpRequest(HttpMethod.Post, $"{HOST}/api/transaction/get");

            string postContent = JsonConvert.SerializeObject(request);

            message.Content = new StringContent(postContent, Encoding.UTF8, "application/json");
            HttpResponseMessage response = await _httpClient.SendAsync(message);

            response.EnsureSuccessStatusCode();
            string responseContent = await response.Content.ReadAsStringAsync();

            TransactionsResponse result = JsonConvert.DeserializeObject <TransactionsResponse>(responseContent);

            return(result);
        }
Exemple #14
0
        public void GetTransactionsBothDates()
        {
            var mockRepository = new MockRepository(MockBehavior.Strict);

            var response = new TransactionsResponse();

            var service = mockRepository.Create <IPortfolioTransactionService>();

            service.Setup(x => x.GetTransactions(new DateRange(new Date(2000, 01, 01), new Date(2000, 12, 31)))).Returns(ServiceResult <TransactionsResponse> .Ok(response)).Verifiable();

            var controller = new PortfolioController();
            var result     = controller.GetTransactions(service.Object, new DateTime(2000, 01, 01), new DateTime(2000, 12, 31));

            result.Result.Should().BeOkObjectResult().Value.Should().Be(response);

            mockRepository.VerifyAll();
        }
Exemple #15
0
        public void GetTransactionsNoDates()
        {
            var mockRepository = new MockRepository(MockBehavior.Strict);

            var response = new TransactionsResponse();

            var service = mockRepository.Create <IPortfolioTransactionService>();

            service.Setup(x => x.GetTransactions(new DateRange(Date.Today.AddYears(-1).AddDays(1), Date.Today))).Returns(ServiceResult <TransactionsResponse> .Ok(response)).Verifiable();

            var controller = new PortfolioController();
            var result     = controller.GetTransactions(service.Object, null, null);

            result.Result.Should().BeOkObjectResult().Value.Should().Be(response);

            mockRepository.VerifyAll();
        }
Exemple #16
0
        //Version 1.0.4
        static void Main(string[] args)
        {
            //Create class with the API Key
            WhaleAlert whaleAlert = new WhaleAlert("API Key here");
            //Get request --> Reponse Status Object
            StatusResponse Status = whaleAlert.GetStatus();

            //Error Handling
            if (Status.Success == false)
            {
                Console.WriteLine(Status.Error.Message);
                return;
            }
            //Success
            Console.WriteLine(Status.Status.Result);

            //Blockchain Count
            Console.WriteLine(Status.Status.BlockchainCount);

            //List of all Blockchains
            foreach (Blockchain entry in Status.Status.Blockchains)
            {
                string symbols = "";
                foreach (string s in entry.Symbols)
                {
                    symbols += s + ",";
                }

                Console.WriteLine($"{entry.Name} [{symbols}]: {entry.Status}");
            }

            Console.WriteLine("\n");
            //Get request --> Reponse Transactions Object
            TransactionsResponse transactionsResponse = whaleAlert.GetTransactions(1550237797);

            //List of Transcations
            int counter = 0;

            foreach (Transactions entry in transactionsResponse.Transactions.Transactions)
            {
                counter++;
                Console.WriteLine($"{counter}. {entry.Symbol}: {entry.Amount}; USD: {entry.AmountUsd}");
            }
        }
        public static void SearchTransResponse(Form1 form, String JSONString)
        {
            DataContractJsonSerializer serializer1 = new DataContractJsonSerializer(typeof(TransactionsResponse));

            TransactionsResponse response = null;

            Console.WriteLine(JSONString);
            try
            {
                response = Deserialize <TransactionsResponse>(JSONString);
            }
            catch (Exception e)
            {
                Console.WriteLine("Parsing response get Exception: " + e.Message);
                throw e;
            }

            Console.WriteLine("rows count: " + response.rows.Length);
            for (int i = 0; i < response.rows.Length; i++)
            {
                form.TransFromNexioList.Rows.Add(false, response.rows[i].id, response.rows[i].amount);
            }
        }
        public async Task ReturnsCorrectResponseWhenTransactionDoesNotExist()
        {
            var accountNumber        = "12345";
            var postCode             = "E8 1DY";
            var transactionsResponse = new TransactionsResponse
            {
                TransactionRequest = new TransactionRequest
                {
                    PaymentRef = accountNumber,
                    PostCode   = postCode
                },
                Transactions = new List <LBHTransactions>()
            };

            _mockTransactionsGateway.Setup(x => x.GetTransactions(accountNumber, postCode)).ReturnsAsync(transactionsResponse);

            var response = await _classUnderTest.Execute(accountNumber, postCode).ConfigureAwait(true);

            response.Should().NotBeNull();
            response.Should().BeOfType <TransactionsResponse>();
            response.Should().Equals(transactionsResponse);
            response.Transactions.Count.Should().Equals(0);
        }
Exemple #19
0
        public async Task GetEmptyTransactions()
        {
            var accountNumber        = "12345";
            var postCode             = "E8 1DY";
            var transactionsResponse = new TransactionsResponse
            {
                TransactionRequest = new TransactionRequest
                {
                    PaymentRef = accountNumber,
                    PostCode   = postCode
                },
                Transactions = new List <LBHTransactions>()
            };

            _getTransactionsUseCase.Setup(x => x.Execute(accountNumber, postCode)).ReturnsAsync(transactionsResponse);
            var response = await _classUnderTest.GetTransactions(accountNumber, postCode).ConfigureAwait(true) as IActionResult as OkObjectResult;

            response.Should().NotBeNull();
            response.StatusCode.Should().Be(200);
            var transactionResponse = (TransactionsResponse)response.Value;

            transactionResponse.Transactions.Count.Should().Equals(0);
        }
Exemple #20
0
        public async Task GetTransactions()
        {
            var mockRepository = new MockRepository(MockBehavior.Strict);

            var portfolioId = Guid.NewGuid();
            var dateRange   = new DateRange(new Date(2001, 02, 03), new Date(2008, 06, 30));
            var response    = new TransactionsResponse();

            var messageHandler = mockRepository.Create <IRestClientMessageHandler>();

            messageHandler.SetupProperty(x => x.Portfolio, portfolioId);
            messageHandler.Setup(x => x.GetAsync <TransactionsResponse>(It.Is <string>(x => x == "portfolio/" + portfolioId + "/transactions?fromdate=2001-02-03&todate=2008-06-30")))
            .Returns(Task <TransactionsResponse> .FromResult(response))
            .Verifiable();

            var resource = new PortfolioResource(messageHandler.Object);

            var result = await resource.GetTransactions(dateRange);

            result.Should().Be(response);

            mockRepository.Verify();
        }
        public override Task <TransactionsResponse> GetTransactions(AccountRequest request, ServerCallContext context)
        {
            var response = new TransactionsResponse();

            var transactions = this.blockChain
                               .GetTransactions(request.Address)
                               .Select(t => new TransactionModel()
            {
                TransactionID = t.Hash,
                TimeStamp     = t.TimeStamp,
                Sender        = t.Sender,
                Recipient     = t.Recipient,
                Amount        = t.Amount,
                Fee           = t.Fee,
            });

            foreach (var trx in transactions)
            {
                response.Transactions.Add(trx);
            }

            return(Task.FromResult(response));
        }
Exemple #22
0
        public static async Task <TransactionsResponse> GetNewTransactions(this ITransactionApi myPontoApi, Guid accountId, Guid lastKnownTransactionId)
        {
            var allTransactionsResponse = new TransactionsResponse();

            allTransactionsResponse.Data = new List <TransactionResource>();
            var transactionResponse = await myPontoApi.GetTransactionsBefore(accountId, lastKnownTransactionId);

            allTransactionsResponse.Meta        = transactionResponse.Meta;
            allTransactionsResponse.Meta.Paging = null;
            allTransactionsResponse.Data.AddRange(transactionResponse.Data);
            if (transactionResponse.Links.Prev != null)
            {
                do
                {
                    transactionResponse = await transactionResponse.Links.GetPreviousPage();

                    allTransactionsResponse.Data.AddRange(transactionResponse.Data);
                    allTransactionsResponse.Links = transactionResponse.Links;
                } while (transactionResponse.Links.Prev != null);
            }

            return(allTransactionsResponse);
        }
Exemple #23
0
        public ActionResult <TransactionsResponse> GetTransactions(Guid userId)
        {
            TransactionsResponse transactionsResponse = new TransactionsResponse
            {
                Purchases = new List <PurchaseBE>(),
                Tickets   = new List <TicketBE>(),
                Vouchers  = new List <VoucherBE>(),
                Orders    = new List <OrderBE>()
            };

            using (UnitOfWork unitOfWork = new UnitOfWork(_context))
            {
                User user = unitOfWork.Users.GetWithRelated(userId);
                if (user == null)
                {
                    return(NotFound("User"));
                }

                user.Purchases.ForEach(p =>
                {
                    Purchase purchase = unitOfWork.Purchases.GetWithRelated(p.Id);

                    transactionsResponse.Purchases.Add(new PurchaseBE
                    {
                        Id              = purchase.Id,
                        PerformanceId   = purchase.PerformanceId,
                        PerformanceName = purchase.Performance.Name,
                        PerformanceDate = purchase.Performance.Date,
                        PaidValue       = purchase.PaidValue,
                        TicketAmount    = unitOfWork.Purchases.GetPurchaseTicketAmount(p.Id)
                    });

                    purchase.Tickets.ForEach(t =>
                    {
                        if (!t.Used)
                        {
                            transactionsResponse.Tickets.Add(new TicketBE
                            {
                                Id              = t.Id,
                                PerformanceId   = purchase.Performance.Id,
                                PerformanceName = purchase.Performance.Name,
                                PerformanceDate = purchase.Performance.Date,
                                PlaceInRoom     = t.PlaceInRoom
                            });
                        }
                    });
                });

                user.Vouchers.ForEach(v =>
                {
                    if (v.OrderId == null)
                    {
                        transactionsResponse.Vouchers.Add(new VoucherBE
                        {
                            Id   = v.Id,
                            Type = v.Type
                        });
                    }
                });

                user.Orders.ForEach(o =>
                {
                    Order order = unitOfWork.Orders.GetWithRelated(o.Id);

                    List <string> acceptedVoucherTypes = new List <string>();
                    order.Vouchers.ForEach(v =>
                    {
                        acceptedVoucherTypes.Add(v.Type);
                    });

                    List <OrderProductBE> orderProducts = new List <OrderProductBE>();
                    order.OrdersProducts.ForEach(op =>
                    {
                        Product product = unitOfWork.Products.Get(op.ProductId);

                        orderProducts.Add(new OrderProductBE
                        {
                            Id       = product.Id,
                            Name     = product.Name,
                            Price    = product.Price,
                            Quantity = op.Quantity
                        });
                    });

                    transactionsResponse.Orders.Add(new OrderBE
                    {
                        Id                   = o.Id,
                        PaidValue            = o.PaidValue,
                        AcceptedVoucherTypes = acceptedVoucherTypes,
                        OrdersProducts       = orderProducts
                    });
                });
            }

            return(Ok(transactionsResponse));
        }
Exemple #24
0
        public async Task Run(
            [TimerTrigger("0 */5 * * * *")] TimerInfo timerInfo,
            [DurableClient] IDurableOrchestrationClient starter)
        {
            if (starter is null)
            {
                throw new ArgumentNullException(nameof(starter));
            }

            var allGlobalXSettings = await _mediator.Send(new GlobalXOrgSettingsQuery()
            {
                TransactionSyncEnabled = true
            });

            var allExceptions = new List <Exception>();

            foreach (var globalXSettings in allGlobalXSettings)
            {
                var latestTransactionId = globalXSettings.LatestTransactionId;

                try
                {
                    var validator = new GlobalXOrgSettings.Validator();
                    validator.ValidateAndThrow(globalXSettings);
                }
                catch (ValidationException vex)
                {
                    allExceptions.Add(vex);
                    _logger.LogError(vex, $"Error encountered processing transactions for org key'{globalXSettings?.ActionstepOrgKey}'. Settings are invalid.");
                }

                TransactionsResponse transactionsResponse = null;

                try
                {
                    transactionsResponse = await _globalXService.GetTransactions(new TransactionsQuery()
                    {
                        UserId   = globalXSettings.GlobalXAdminId,
                        TransId  = globalXSettings.LatestTransactionId + 1,
                        UserType = UserType.AllChildren
                    });
                }
                catch (Exception ex)
                {
                    allExceptions.Add(ex);
                    _logger.LogError(ex, $"Error encountered while retrieving transactions for" +
                                     $" org '{globalXSettings?.ActionstepOrgKey}', GlobalX Admin ID: '{globalXSettings?.GlobalXAdminId}'");
                }

                if (!(transactionsResponse is null))
                {
                    foreach (var transaction in transactionsResponse.Transactions)
                    {
                        try
                        {
                            var transactionSyncInstanceId = GlobalXTransactionSyncOrchestrator.InstancePrefix + transaction.TransactionId.ToString(CultureInfo.InvariantCulture);
                            var existingInstance          = await starter.GetStatusAsync(transactionSyncInstanceId);

                            if (existingInstance is null)
                            {
                                await starter.StartNewAsync(
                                    orchestratorFunctionName : nameof(GlobalXTransactionSyncOrchestrator),
                                    instanceId : transactionSyncInstanceId,
                                    input : new CreateDisbursementsCommand()
                                {
                                    ActionstepUserId      = globalXSettings.ActionstepSyncUserId,
                                    Transaction           = transaction,
                                    ActionstepOrgKey      = globalXSettings.ActionstepOrgKey,
                                    MinimumMatterIdToSync = globalXSettings.MinimumMatterIdToSync,
                                    TaxCodeIdWithGST      = globalXSettings.TaxCodeIdWithGST.Value,
                                    TaxCodeIdNoGST        = globalXSettings.TaxCodeIdNoGST.Value
                                });
                            }
                            else
                            {
                                _logger.LogWarning($"Orchestration '{nameof(GlobalXTransactionSyncOrchestrator)}' with id '{transactionSyncInstanceId}' is already running, so does not need to be started");
                            }

                            if (transaction.TransactionId > latestTransactionId)
                            {
                                latestTransactionId = transaction.TransactionId;
                            }
                        }
                        catch (Exception ex)
                        {
                            allExceptions.Add(ex);
                            _logger.LogError(ex, $"Error encountered processing transaction '{transaction?.TransactionId}' for" +
                                             $" org '{globalXSettings?.ActionstepOrgKey}', GlobalX Admin ID: '{globalXSettings?.GlobalXAdminId}'");
                        }
                    }
                }

                if (latestTransactionId > globalXSettings.LatestTransactionId)
                {
                    await _mediator.Send(new SetLatestGlobalXTransactionIdCommand(globalXSettings.ActionstepOrgKey, latestTransactionId));
                }
            }

            if (allExceptions.Count > 0)
            {
                // If there were any failures, throwing ensures that the TimerJob shows up as failed.
                throw new AggregateException("One or more failures encountered while processing GlobalX transactions.", allExceptions);
            }
        }