From 64fa71dbf0cc8edde67e1fa2cb846d3c3124b408 Mon Sep 17 00:00:00 2001 From: Adasat Torres de Leon Date: Tue, 28 May 2024 12:25:17 +0100 Subject: [PATCH 1/9] [ADD]account_statement_import_online_plaid [FIX]account_statement_import_provider_plaid: Changes in the amount signs [FIX]account_statement_import_online_plaid: A verification has been added for the language to be used. [IMP]account_statement_import_online_plaid: The maximum number of records per request has been increased. [FIX] account_statement_import_online_plaid: Documentation --- .../README.rst | 156 + .../__init__.py | 3 + .../__manifest__.py | 23 + .../i18n/es.po | 102 + .../models/__init__.py | 3 + .../online_bank_statement_provider_plaid.py | 130 + .../models/plaid_interface.py | 96 + .../readme/CONFIGURE.rst | 57 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 1 + .../readme/USAGE.rst | 13 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 509 + .../static/description/plaid_keys.png | Bin 0 -> 49781 bytes .../static/src/js/plaid_integration.esm.js | 19 + .../src/lib/link/v2/stable/link-initialize.js | 10999 ++++++++++++++++ .../tests/__init__.py | 4 + ...t_account_statement_import_online_plaid.py | 206 + .../tests/test_plaid_interface.py | 140 + .../views/online_bank_statement_provider.xml | 48 + 20 files changed, 12512 insertions(+) create mode 100644 account_statement_import_online_plaid/README.rst create mode 100644 account_statement_import_online_plaid/__init__.py create mode 100644 account_statement_import_online_plaid/__manifest__.py create mode 100644 account_statement_import_online_plaid/i18n/es.po create mode 100644 account_statement_import_online_plaid/models/__init__.py create mode 100644 account_statement_import_online_plaid/models/online_bank_statement_provider_plaid.py create mode 100644 account_statement_import_online_plaid/models/plaid_interface.py create mode 100644 account_statement_import_online_plaid/readme/CONFIGURE.rst create mode 100644 account_statement_import_online_plaid/readme/CONTRIBUTORS.rst create mode 100644 account_statement_import_online_plaid/readme/DESCRIPTION.rst create mode 100644 account_statement_import_online_plaid/readme/USAGE.rst create mode 100644 account_statement_import_online_plaid/static/description/icon.png create mode 100644 account_statement_import_online_plaid/static/description/index.html create mode 100644 account_statement_import_online_plaid/static/description/plaid_keys.png create mode 100644 account_statement_import_online_plaid/static/src/js/plaid_integration.esm.js create mode 100644 account_statement_import_online_plaid/static/src/lib/link/v2/stable/link-initialize.js create mode 100644 account_statement_import_online_plaid/tests/__init__.py create mode 100644 account_statement_import_online_plaid/tests/test_account_statement_import_online_plaid.py create mode 100644 account_statement_import_online_plaid/tests/test_plaid_interface.py create mode 100644 account_statement_import_online_plaid/views/online_bank_statement_provider.xml diff --git a/account_statement_import_online_plaid/README.rst b/account_statement_import_online_plaid/README.rst new file mode 100644 index 0000000000..6f9c5f39d8 --- /dev/null +++ b/account_statement_import_online_plaid/README.rst @@ -0,0 +1,156 @@ +================================= +Online Bank Statements: plaid.com +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:dc332be9d48ea443058426422cd1475b9c52c99c78d35fdb95d5332f35b378ff + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fbank--statement--import-lightgray.png?logo=github + :target: https://github.com/OCA/bank-statement-import/tree/16.0/account_statement_import_online_plaid + :alt: OCA/bank-statement-import +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/bank-statement-import-16-0/bank-statement-import-16-0-account_statement_import_online_plaid + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/bank-statement-import&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module provides online bank statements from Plaid.com, supporting both Sandbox and Production environments. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure online bank statements provider: + +#. Go to *Invoicing > Configuration > Bank Accounts* +#. Open bank account to configure and edit it +#. Set *Bank Feeds* to *Online* +#. Select *Plaid.com* as online bank statements provider in + *Online Bank Statements (OCA)* section +#. Save the bank account +#. Click on provider and configure provider-specific settings. + +or, alternatively: + +#. Go to *Invoicing > Overview* +#. Open settings of the corresponding journal account +#. Switch to *Bank Account* tab +#. Set *Bank Feeds* to *Online* +#. Select *Plaid.com* as online bank statements provider in + *Online Bank Statements (OCA)* section +#. Save the bank account +#. Click on provider and configure provider-specific settings. + +Plaid Account & Credentials +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To obtain the necessary credentials (*Client ID* and *Secret*), follow these steps: + +#. **Create a Plaid Account**: + Go to `dashboard.plaid.com/signup `_ and sign up for a developer account. + +#. **Get Credentials**: + Once logged in, navigate to **Platform > Developers > Keys** in the Plaid Dashboard. + Here you will find your **Client ID** and **Secret**. + + .. image:: https://raw.githubusercontent.com/OCA/bank-statement-import/16.0/account_statement_import_online_plaid/static/description/plaid_keys.png + :alt: Plaid Keys Dashboard + + .. note:: + There are different secrets for **Sandbox** (testing) and **Production** (live) environments. + Make sure to copy the secret corresponding to the environment you intend to use. + + .. important:: + **Account Approval Times:** + + * For **US-based companies**, approval typically takes **1-2 business days**. + * For **companies outside the United States**, the approval process may take longer. + +Configuration in Odoo +~~~~~~~~~~~~~~~~~~~~~ + +When configuring the provider in Odoo, map the Plaid credentials as follows: + +* **Username**: Enter your Plaid **Client ID**. +* **Password**: Enter your Plaid **Secret** (Sandbox or Production). +* **Plaid Environment**: Select **Sandbox** for testing or **Production** for live data. + +Check also ``account_bank_statement_import_online`` configuration instructions +for more information. + +Usage +===== + +To pull historical bank statements: + +#. Go to *Invoicing > Configuration > Bank Accounts* +#. Select specific bank accounts +#. Configure username, password and host for plaid +#. Launch *Actions > Sync with plaid.com* + +#. After launch *Actions > Online Bank Statements Pull Wizard* +#. Configure date interval and click *Pull* + +If historical data is not needed, then just simply wait for the scheduled +activity "Pull Online Bank Statements" to be executed for getting new +transactions. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Binhex + +Contributors +~~~~~~~~~~~~ + +* `Binhex `_: + + * Adasat Torres de León + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/bank-statement-import `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_statement_import_online_plaid/__init__.py b/account_statement_import_online_plaid/__init__.py new file mode 100644 index 0000000000..31660d6a96 --- /dev/null +++ b/account_statement_import_online_plaid/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/account_statement_import_online_plaid/__manifest__.py b/account_statement_import_online_plaid/__manifest__.py new file mode 100644 index 0000000000..9b782525e8 --- /dev/null +++ b/account_statement_import_online_plaid/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2024 Binhex - Adasat Torres de León. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Online Bank Statements: plaid.com", + "version": "16.0.1.0.0", + "category": "Account", + "website": "https://github.com/OCA/bank-statement-import", + "author": "Binhex, Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "depends": ["account_statement_import_online"], + "data": [ + "views/online_bank_statement_provider.xml", + ], + "assets": { + "web.assets_backend": [ + "/account_statement_import_online_plaid/static/src/**/*.js", + ], + }, + "external_dependencies": { + "python": ["plaid-python"], + }, +} diff --git a/account_statement_import_online_plaid/i18n/es.po b/account_statement_import_online_plaid/i18n/es.po new file mode 100644 index 0000000000..478305b1a2 --- /dev/null +++ b/account_statement_import_online_plaid/i18n/es.po @@ -0,0 +1,102 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_statement_import_online_plaid +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0-20240104\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-22 12:02+0000\n" +"PO-Revision-Date: 2024-05-22 13:04+0100\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.4.3\n" + +#. module: account_statement_import_online_plaid +#: model:ir.model.fields.selection,name:account_statement_import_online_plaid.selection__online_bank_statement_provider__plaid_host__development +msgid "Development" +msgstr "Desarrollo" + +#. module: account_statement_import_online_plaid +#. odoo-python +#: code:addons/account_statement_import_online_plaid/models/plaid_interface.py:0 +#, python-format +msgid "Error getting access token: %s" +msgstr "Error al obtener el token de acceso: %s" + +#. module: account_statement_import_online_plaid +#. odoo-python +#: code:addons/account_statement_import_online_plaid/models/plaid_interface.py:0 +#, python-format +msgid "Error getting client api: %s" +msgstr "Error obteniendo api de cliente: %s" + +#. module: account_statement_import_online_plaid +#. odoo-python +#: code:addons/account_statement_import_online_plaid/models/plaid_interface.py:0 +#, python-format +msgid "Error getting link token: %s" +msgstr "Error al obtener el token de enlace: %s" + +#. module: account_statement_import_online_plaid +#. odoo-python +#: code:addons/account_statement_import_online_plaid/models/plaid_interface.py:0 +#, python-format +msgid "Error getting transactions: %s" +msgstr "Error al obtener transacciones: %s" + +#. module: account_statement_import_online_plaid +#: model_terms:ir.ui.view,arch_db:account_statement_import_online_plaid.online_bank_statement_provider_form +msgid "Login" +msgstr "Iniciar sesión" + +#. module: account_statement_import_online_plaid +#: model:ir.model,name:account_statement_import_online_plaid.model_online_bank_statement_provider +msgid "Online Bank Statement Provider" +msgstr "Proveedor de extractos bancarios en línea" + +#. module: account_statement_import_online_plaid +#: model:ir.model.fields,field_description:account_statement_import_online_plaid.field_online_bank_statement_provider__plaid_access_token +msgid "Plaid Access Token" +msgstr "Ficha de acceso Plaid" + +#. module: account_statement_import_online_plaid +#: model:ir.model.fields,field_description:account_statement_import_online_plaid.field_online_bank_statement_provider__plaid_host +#: model_terms:ir.ui.view,arch_db:account_statement_import_online_plaid.online_bank_statement_provider_form +msgid "Plaid Host" +msgstr "Anfitrión" + +#. module: account_statement_import_online_plaid +#: model:ir.model,name:account_statement_import_online_plaid.model_plaid_interface +msgid "Plaid Interface" +msgstr "Interfaz plaid" + +#. module: account_statement_import_online_plaid +#: model_terms:ir.ui.view,arch_db:account_statement_import_online_plaid.online_bank_statement_provider_form +msgid "Plaid config" +msgstr "Configuración plaid" + +#. module: account_statement_import_online_plaid +#: model:ir.model.fields.selection,name:account_statement_import_online_plaid.selection__online_bank_statement_provider__plaid_host__production +msgid "Production" +msgstr "Producción" + +#. module: account_statement_import_online_plaid +#: model:ir.model.fields.selection,name:account_statement_import_online_plaid.selection__online_bank_statement_provider__plaid_host__sandbox +msgid "Sandbox" +msgstr "Salvadera" + +#. module: account_statement_import_online_plaid +#: model_terms:ir.ui.view,arch_db:account_statement_import_online_plaid.online_bank_statement_provider_form +msgid "Secret Key" +msgstr "LLave secreta" + +#. module: account_statement_import_online_plaid +#: model_terms:ir.ui.view,arch_db:account_statement_import_online_plaid.online_bank_statement_provider_form +msgid "Sync with Plaid.com" +msgstr "Sincronizar con plaid.com" diff --git a/account_statement_import_online_plaid/models/__init__.py b/account_statement_import_online_plaid/models/__init__.py new file mode 100644 index 0000000000..7e0411756c --- /dev/null +++ b/account_statement_import_online_plaid/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import online_bank_statement_provider_plaid +from . import plaid_interface diff --git a/account_statement_import_online_plaid/models/online_bank_statement_provider_plaid.py b/account_statement_import_online_plaid/models/online_bank_statement_provider_plaid.py new file mode 100644 index 0000000000..57ea5108b8 --- /dev/null +++ b/account_statement_import_online_plaid/models/online_bank_statement_provider_plaid.py @@ -0,0 +1,130 @@ +# Copyright 2024 Binhex - Adasat Torres de León. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import _, api, fields, models +from odoo.exceptions import UserError + +AVAILABLE_LANGS = [ + "da", + "nl", + "en", + "et", + "fr", + "de", + "hi", + "it", + "lv", + "lt", + "no", + "pl", + "pt", + "ro", + "es", + "sv", + "vi", +] + + +class OnlineBankStatementProvider(models.Model): + _inherit = "online.bank.statement.provider" + plaid_access_token = fields.Char() + plaid_host = fields.Selection( + [ + ("sandbox", "Sandbox"), + ("production", "Production"), + ], + default="sandbox", + ) + + def _obtain_statement_data(self, date_since, date_until): + self.ensure_one() + if self.service != "plaid": + return super()._obtain_statement_data(date_since, date_until) + return self._plaid_retrieve_data(date_since, date_until), {} + + @api.model + def _get_available_services(self): + return super()._get_available_services() + [ + ("plaid", "Plaid.com"), + ] + + def _country_code(self): + if self.journal_id.bank_id and self.journal_id.bank_id.country: + return self.journal_id.bank_id.country.code + if self.journal_id.company_id.country_id: + return self.journal_id.company_id.country_id.code + raise UserError(_("Country code not found for the bank or the company...")) + + def _verify_lang(self, lang): + if lang not in AVAILABLE_LANGS: + return "en" + return lang + + def action_sync_with_plaid(self): + self.ensure_one() + plaid_interface = self.env["plaid.interface"] + args = [self.username, self.password, self.plaid_host] + client = plaid_interface._client(*args) + lang = ( + self.env["res.lang"]._lang_get(self.env.lang or self.env.user.lang).iso_code + ) + company_name = self.env.company.name + + link_token = plaid_interface._link( + client=client, + language=self._verify_lang(lang), + country_code=self._country_code(), + company_name=company_name, + products=["transactions"], + ) + return { + "type": "ir.actions.client", + "tag": "plaid_login", + "params": { + "call_model": "online.bank.statement.provider", + "call_method": "plaid_create_access_token", + "token": link_token, + "object_id": self.id, + }, + "target": "new", + } + + def _plaid_retrieve_data(self, date_since, date_until): + if not self.plaid_access_token: + raise UserError( + _( + "Please link your Plaid account first by clicking on 'Sync with Plaid'." + ) + ) + plaid_interface = self.env["plaid.interface"] + args = [self.username, self.password, self.plaid_host] + client = plaid_interface._client(*args) + transactions = plaid_interface._get_transactions( + client, self.plaid_access_token, date_since, date_until + ) + return self._prepare_vals_for_statement(transactions) + + @api.model + def plaid_create_access_token(self, public_token, active_id): + provider = self.browse(active_id) + plaid_interface = self.env["plaid.interface"] + client = plaid_interface._client( + provider.username, provider.password, provider.plaid_host + ) + args = [client, public_token] + provider.plaid_access_token = plaid_interface._login(*args) + if provider.plaid_access_token: + return True + return False + + def _prepare_vals_for_statement(self, transactions): + return [ + { + "date": transaction["date"], + "ref": transaction["name"], + "payment_ref": transaction["name"], + "unique_import_id": transaction["transaction_id"], + "amount": float(transaction["amount"]) * -1.00, + "raw_data": transaction, + } + for transaction in transactions + ] diff --git a/account_statement_import_online_plaid/models/plaid_interface.py b/account_statement_import_online_plaid/models/plaid_interface.py new file mode 100644 index 0000000000..cc9d94368f --- /dev/null +++ b/account_statement_import_online_plaid/models/plaid_interface.py @@ -0,0 +1,96 @@ +# Copyright 2024 Binhex - Adasat Torres de León. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import plaid +from plaid.api import plaid_api +from plaid.model.country_code import CountryCode +from plaid.model.item_public_token_exchange_request import ( + ItemPublicTokenExchangeRequest, +) +from plaid.model.link_token_create_request import LinkTokenCreateRequest +from plaid.model.link_token_create_request_user import LinkTokenCreateRequestUser +from plaid.model.products import Products +from plaid.model.transactions_get_request import TransactionsGetRequest +from plaid.model.transactions_get_request_options import TransactionsGetRequestOptions + +from odoo import _, models +from odoo.exceptions import ValidationError + + +class PlaidInterface(models.AbstractModel): + _name = "plaid.interface" + _description = "Plaid Interface" + + def _get_host(self, host): + if host == "sandbox": + return plaid.Environment.Sandbox + if host == "production": + return plaid.Environment.Production + return False + + def _client(self, client_id, secret, host): + configuration = plaid.Configuration( + host=self._get_host(host), + api_key={ + "clientId": client_id or "", + "secret": secret or "", + }, + ) + try: + return plaid_api.PlaidApi(plaid.ApiClient(configuration)) + except plaid.ApiException as e: + raise ValidationError(_("Error getting client api: %s") % e.body) from e + + def _link(self, client, language, country_code, company_name, products): + request = LinkTokenCreateRequest( + products=[Products(product) for product in products], + client_name=company_name, + country_codes=[CountryCode(country_code)], + language=language, + user=LinkTokenCreateRequestUser(client_user_id="client"), + ) + try: + response = client.link_token_create(request) + except plaid.ApiException as e: + raise ValidationError(_("Error getting link token: %s") % e.body) from e + return response.to_dict()["link_token"] + + def _login(self, client, public_token): + request = ItemPublicTokenExchangeRequest(public_token=public_token) + try: + response = client.item_public_token_exchange(request) + except plaid.ApiException as e: + raise ValidationError(_("Error getting access token: %s") % e.body) from e + return response["access_token"] + + def _get_transactions(self, client, access_token, start_date, end_date): + options = TransactionsGetRequestOptions( + count=500, + ) + request = TransactionsGetRequest( + access_token=access_token, + start_date=start_date.date(), + end_date=end_date.date(), + options=options, + ) + try: + response = client.transactions_get(request) + except plaid.ApiException as e: + raise ValidationError(_("Error getting transactions: %s") % e.body) from e + transactions = response["transactions"] + while len(transactions) < response["total_transactions"]: + options.offset = len(transactions) + request = TransactionsGetRequest( + access_token=access_token, + start_date=start_date.date(), + end_date=end_date.date(), + options=options, + ) + try: + response = client.transactions_get(request) + except plaid.ApiException as e: + raise ValidationError( + _("Error getting transactions: %s") % e.body + ) from e + transactions.extend(response["transactions"]) + return transactions diff --git a/account_statement_import_online_plaid/readme/CONFIGURE.rst b/account_statement_import_online_plaid/readme/CONFIGURE.rst new file mode 100644 index 0000000000..f427cf1efb --- /dev/null +++ b/account_statement_import_online_plaid/readme/CONFIGURE.rst @@ -0,0 +1,57 @@ +To configure online bank statements provider: + +#. Go to *Invoicing > Configuration > Bank Accounts* +#. Open bank account to configure and edit it +#. Set *Bank Feeds* to *Online* +#. Select *Plaid.com* as online bank statements provider in + *Online Bank Statements (OCA)* section +#. Save the bank account +#. Click on provider and configure provider-specific settings. + +or, alternatively: + +#. Go to *Invoicing > Overview* +#. Open settings of the corresponding journal account +#. Switch to *Bank Account* tab +#. Set *Bank Feeds* to *Online* +#. Select *Plaid.com* as online bank statements provider in + *Online Bank Statements (OCA)* section +#. Save the bank account +#. Click on provider and configure provider-specific settings. + +Plaid Account & Credentials +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To obtain the necessary credentials (*Client ID* and *Secret*), follow these steps: + +#. **Create a Plaid Account**: + Go to `dashboard.plaid.com/signup `_ and sign up for a developer account. + +#. **Get Credentials**: + Once logged in, navigate to **Platform > Developers > Keys** in the Plaid Dashboard. + Here you will find your **Client ID** and **Secret**. + + .. image:: ../static/description/plaid_keys.png + :alt: Plaid Keys Dashboard + + .. note:: + There are different secrets for **Sandbox** (testing) and **Production** (live) environments. + Make sure to copy the secret corresponding to the environment you intend to use. + + .. important:: + **Account Approval Times:** + + * For **US-based companies**, approval typically takes **1-2 business days**. + * For **companies outside the United States**, the approval process may take longer. + +Configuration in Odoo +~~~~~~~~~~~~~~~~~~~~~ + +When configuring the provider in Odoo, map the Plaid credentials as follows: + +* **Username**: Enter your Plaid **Client ID**. +* **Password**: Enter your Plaid **Secret** (Sandbox or Production). +* **Plaid Environment**: Select **Sandbox** for testing or **Production** for live data. + +Check also ``account_bank_statement_import_online`` configuration instructions +for more information. diff --git a/account_statement_import_online_plaid/readme/CONTRIBUTORS.rst b/account_statement_import_online_plaid/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..a2a3a6b642 --- /dev/null +++ b/account_statement_import_online_plaid/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Binhex `_: + + * Adasat Torres de León diff --git a/account_statement_import_online_plaid/readme/DESCRIPTION.rst b/account_statement_import_online_plaid/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..14fc838ce2 --- /dev/null +++ b/account_statement_import_online_plaid/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module provides online bank statements from Plaid.com, supporting both Sandbox and Production environments. diff --git a/account_statement_import_online_plaid/readme/USAGE.rst b/account_statement_import_online_plaid/readme/USAGE.rst new file mode 100644 index 0000000000..29a24817fe --- /dev/null +++ b/account_statement_import_online_plaid/readme/USAGE.rst @@ -0,0 +1,13 @@ +To pull historical bank statements: + +#. Go to *Invoicing > Configuration > Bank Accounts* +#. Select specific bank accounts +#. Configure username, password and host for plaid +#. Launch *Actions > Sync with plaid.com* + +#. After launch *Actions > Online Bank Statements Pull Wizard* +#. Configure date interval and click *Pull* + +If historical data is not needed, then just simply wait for the scheduled +activity "Pull Online Bank Statements" to be executed for getting new +transactions. diff --git a/account_statement_import_online_plaid/static/description/icon.png b/account_statement_import_online_plaid/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/account_statement_import_online_plaid/static/description/index.html b/account_statement_import_online_plaid/static/description/index.html new file mode 100644 index 0000000000..d0b606c73e --- /dev/null +++ b/account_statement_import_online_plaid/static/description/index.html @@ -0,0 +1,509 @@ + + + + + +Online Bank Statements: plaid.com + + + +
+

Online Bank Statements: plaid.com

+ + +

Beta License: AGPL-3 OCA/bank-statement-import Translate me on Weblate Try me on Runboat

+

This module provides online bank statements from Plaid.com, supporting both Sandbox and Production environments.

+

Table of contents

+ +
+

Configuration

+

To configure online bank statements provider:

+
    +
  1. Go to Invoicing > Configuration > Bank Accounts
  2. +
  3. Open bank account to configure and edit it
  4. +
  5. Set Bank Feeds to Online
  6. +
  7. Select Plaid.com as online bank statements provider in +Online Bank Statements (OCA) section
  8. +
  9. Save the bank account
  10. +
  11. Click on provider and configure provider-specific settings.
  12. +
+

or, alternatively:

+
    +
  1. Go to Invoicing > Overview
  2. +
  3. Open settings of the corresponding journal account
  4. +
  5. Switch to Bank Account tab
  6. +
  7. Set Bank Feeds to Online
  8. +
  9. Select Plaid.com as online bank statements provider in +Online Bank Statements (OCA) section
  10. +
  11. Save the bank account
  12. +
  13. Click on provider and configure provider-specific settings.
  14. +
+
+

Plaid Account & Credentials

+

To obtain the necessary credentials (Client ID and Secret), follow these steps:

+
    +
  1. Create a Plaid Account: +Go to dashboard.plaid.com/signup and sign up for a developer account.

    +
  2. +
  3. Get Credentials: +Once logged in, navigate to Platform > Developers > Keys in the Plaid Dashboard. +Here you will find your Client ID and Secret.

    +Plaid Keys Dashboard +
    +

    Note

    +

    There are different secrets for Sandbox (testing) and Production (live) environments. +Make sure to copy the secret corresponding to the environment you intend to use.

    +
    +
    +

    Important

    +

    Account Approval Times:

    +
      +
    • For US-based companies, approval typically takes 1-2 business days.
    • +
    • For companies outside the United States, the approval process may take longer.
    • +
    +
    +
  4. +
+
+
+

Configuration in Odoo

+

When configuring the provider in Odoo, map the Plaid credentials as follows:

+
    +
  • Username: Enter your Plaid Client ID.
  • +
  • Password: Enter your Plaid Secret (Sandbox or Production).
  • +
  • Plaid Environment: Select Sandbox for testing or Production for live data.
  • +
+

Check also account_bank_statement_import_online configuration instructions +for more information.

+
+
+
+

Usage

+

To pull historical bank statements:

+
    +
  1. Go to Invoicing > Configuration > Bank Accounts
  2. +
  3. Select specific bank accounts
  4. +
  5. Configure username, password and host for plaid
  6. +
  7. Launch Actions > Sync with plaid.com
  8. +
  9. After launch Actions > Online Bank Statements Pull Wizard
  10. +
  11. Configure date interval and click Pull
  12. +
+

If historical data is not needed, then just simply wait for the scheduled +activity “Pull Online Bank Statements” to be executed for getting new +transactions.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Binhex
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/bank-statement-import project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/account_statement_import_online_plaid/static/description/plaid_keys.png b/account_statement_import_online_plaid/static/description/plaid_keys.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd81b3147ea5feb5846cfcac46df25fbc009d37 GIT binary patch literal 49781 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%0DppSVW; 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 literal 0 HcmV?d00001 diff --git a/account_statement_import_online_plaid/static/src/js/plaid_integration.esm.js b/account_statement_import_online_plaid/static/src/js/plaid_integration.esm.js new file mode 100644 index 0000000000..29d818c082 --- /dev/null +++ b/account_statement_import_online_plaid/static/src/js/plaid_integration.esm.js @@ -0,0 +1,19 @@ +/** @odoo-module **/ +/* global Plaid */ +import {registry} from "@web/core/registry"; + +export async function plaid_login(env, action) { + const handler = Plaid.create({ + onSuccess: (public_token) => { + env.services.orm.call(action.params.call_model, action.params.call_method, [ + public_token, + action.params.object_id, + ]); + }, + + token: action.params.token, + }); + handler.open(); +} + +registry.category("actions").add("plaid_login", plaid_login); diff --git a/account_statement_import_online_plaid/static/src/lib/link/v2/stable/link-initialize.js b/account_statement_import_online_plaid/static/src/lib/link/v2/stable/link-initialize.js new file mode 100644 index 0000000000..11eb5cfdc8 --- /dev/null +++ b/account_statement_import_online_plaid/static/src/lib/link/v2/stable/link-initialize.js @@ -0,0 +1,10999 @@ +var Plaid = (function (t) { + function webpackJsonpCallback(r) { + for (var i, a, u = r[0], l = r[1], d = 0, p = []; d < u.length; d++) + (a = u[d]), + Object.prototype.hasOwnProperty.call(o, a) && o[a] && p.push(o[a][0]), + (o[a] = 0); + for (i in l) Object.prototype.hasOwnProperty.call(l, i) && (t[i] = l[i]); + for (c && c(r); p.length; ) p.shift()(); + } + var r = {}, + o = {32: 0, 7: 0}; + function __webpack_require__(o) { + if (r[o]) return r[o].exports; + var i = (r[o] = {i: o, l: !1, exports: {}}); + + return ( + t[o].call(i.exports, i, i.exports, __webpack_require__), (i.l = !0), i.exports + ); + } + (__webpack_require__.e = function requireEnsure(t) { + var r = [], + i = o[t]; + if (0 !== i) + if (i) r.push(i[2]); + else { + var a = new Promise(function (r, a) { + i = o[t] = [r, a]; + }); + r.push((i[2] = a)); + var u, + c = document.createElement("script"); + (c.charset = "utf-8"), + (c.timeout = 120), + __webpack_require__.nc && c.setAttribute("nonce", __webpack_require__.nc), + (c.src = (function jsonpScriptSrc(t) { + return ( + __webpack_require__.p + + "" + + ({ + 11: "vendors~LazyLink~web3Bridge", + 17: "CBWalletWeb3", + 18: "CBWalletWeb3Storage", + 21: "MEWConnectClient", + 23: "WCV2Web3", + 24: "WCWeb3", + 26: "chainUtilities", + 28: "ethers", + 39: "vendors~CBWalletWeb3", + 42: "vendors~TrezorProvider", + 43: "vendors~WCV2Web3", + 44: "vendors~WCWeb3", + 45: "vendors~ethers", + 48: "web3Bridge", + }[t] || t) + + ".js" + ); + })(t)); + var l = new Error(); + u = function (r) { + (c.onerror = c.onload = null), clearTimeout(d); + var i = o[t]; + if (0 !== i) { + if (i) { + var a = r && ("load" === r.type ? "missing" : r.type), + u = r && r.target && r.target.src; + (l.message = "Loading chunk " + t + " failed.\n(" + a + ": " + u + ")"), + (l.name = "ChunkLoadError"), + (l.type = a), + (l.request = u), + i[1](l); + } + o[t] = void 0; + } + }; + var d = setTimeout(function () { + u({type: "timeout", target: c}); + }, 12e4); + (c.onerror = c.onload = u), document.head.appendChild(c); + } + return Promise.all(r); + }), + (__webpack_require__.m = t), + (__webpack_require__.c = r), + (__webpack_require__.d = function (t, r, o) { + __webpack_require__.o(t, r) || + Object.defineProperty(t, r, {enumerable: !0, get: o}); + }), + (__webpack_require__.r = function (t) { + "undefined" != typeof Symbol && + Symbol.toStringTag && + Object.defineProperty(t, Symbol.toStringTag, {value: "Module"}), + Object.defineProperty(t, "__esModule", {value: !0}); + }), + (__webpack_require__.t = function (t, r) { + if ((1 & r && (t = __webpack_require__(t)), 8 & r)) return t; + if (4 & r && "object" == typeof t && t && t.__esModule) return t; + var o = Object.create(null); + if ( + (__webpack_require__.r(o), + Object.defineProperty(o, "default", {enumerable: !0, value: t}), + 2 & r && "string" != typeof t) + ) + for (var i in t) + __webpack_require__.d( + o, + i, + function (r) { + return t[r]; + }.bind(null, i) + ); + return o; + }), + (__webpack_require__.n = function (t) { + var r = + t && t.__esModule + ? function getDefault() { + return t.default; + } + : function getModuleExports() { + return t; + }; + return __webpack_require__.d(r, "a", r), r; + }), + (__webpack_require__.o = function (t, r) { + return Object.prototype.hasOwnProperty.call(t, r); + }), + (__webpack_require__.p = "/link/2.0.1951/"), + (__webpack_require__.oe = function (t) { + throw (console.error(t), t); + }); + var i = (window.webpackJsonpPlaid = window.webpackJsonpPlaid || []), + a = i.push.bind(i); + (i.push = webpackJsonpCallback), (i = i.slice()); + for (var u = 0; u < i.length; u++) webpackJsonpCallback(i[u]); + var c = a; + return __webpack_require__((__webpack_require__.s = 1489)); +})([ + , + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(15), + u = o(43).f; + i( + {target: "Object", stat: !0, forced: Object.defineProperty !== u, sham: !a}, + {defineProperty: u} + ); + }, + function (t, r) { + (t.exports = function _interopRequireDefault(t) { + return t && t.__esModule ? t : {default: t}; + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + "use strict"; + var i = o(199), + a = o(40), + u = o(349); + i || a(Object.prototype, "toString", u, {unsafe: !0}); + }, + , + function (t, r, o) { + "use strict"; + var i = o(13), + a = o(94).f, + u = o(81), + c = o(40), + l = o(196), + d = o(222), + p = o(144); + t.exports = function (t, r) { + var o, + v, + h, + y, + _, + g = t.target, + b = t.global, + E = t.stat; + if ((o = b ? i : E ? i[g] || l(g, {}) : i[g] && i[g].prototype)) + for (v in r) { + if ( + ((y = r[v]), + (h = t.dontCallGetSet ? (_ = a(o, v)) && _.value : o[v]), + !p(b ? v : g + (E ? "." : "#") + v, t.forced) && void 0 !== h) + ) { + if (typeof y == typeof h) continue; + d(y, h); + } + (t.sham || (h && h.sham)) && u(y, "sham", !0), c(o, v, y, t); + } + }; + }, + function (t, r, o) { + "use strict"; + t.exports = function (t) { + try { + return !!t(); + } catch (t) { + return !0; + } + }; + }, + function (t, r, o) { + "use strict"; + var i = o(147), + a = Function.prototype, + u = a.call, + c = i && a.bind.bind(u, u); + t.exports = i + ? c + : function (t) { + return function () { + return u.apply(t, arguments); + }; + }; + }, + function (t, r, o) { + var i = o(275); + (t.exports = function _defineProperty(t, r, o) { + return ( + (r = i(r)) in t + ? Object.defineProperty(t, r, { + value: o, + enumerable: !0, + configurable: !0, + writable: !0, + }) + : (t[r] = o), + t + ); + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + "use strict"; + var i = o(50), + a = o(179), + u = o(125), + c = o(46), + l = o(43).f, + d = o(226), + p = o(178), + v = o(60), + h = o(15), + y = "Array Iterator", + _ = c.set, + g = c.getterFor(y); + t.exports = d( + Array, + "Array", + function (t, r) { + _(this, {type: y, target: i(t), index: 0, kind: r}); + }, + function () { + var t = g(this), + r = t.target, + o = t.index++; + if (!r || o >= r.length) return (t.target = void 0), p(void 0, !0); + switch (t.kind) { + case "keys": + return p(o, !1); + case "values": + return p(r[o], !1); + } + return p([o, r[o]], !1); + }, + "values" + ); + var b = (u.Arguments = u.Array); + if ((a("keys"), a("values"), a("entries"), !v && h && "values" !== b.name)) + try { + l(b, "name", {value: "values"}); + } catch (t) {} + }, + function (t, r, o) { + "use strict"; + var i = o(204).charAt, + a = o(32), + u = o(46), + c = o(226), + l = o(178), + d = "String Iterator", + p = u.set, + v = u.getterFor(d); + c( + String, + "String", + function (t) { + p(this, {type: d, string: a(t), index: 0}); + }, + function next() { + var t, + r = v(this), + o = r.string, + a = r.index; + return a >= o.length + ? l(void 0, !0) + : ((t = i(o, a)), (r.index += t.length), l(t, !1)); + } + ); + }, + function (t, r) { + function _typeof(r) { + return ( + (t.exports = _typeof = + "function" == typeof Symbol && "symbol" == typeof Symbol.iterator + ? function (t) { + return typeof t; + } + : function (t) { + return t && + "function" == typeof Symbol && + t.constructor === Symbol && + t !== Symbol.prototype + ? "symbol" + : typeof t; + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports), + _typeof(r) + ); + } + (t.exports = _typeof), (t.exports.__esModule = !0), (t.exports.default = t.exports); + }, + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(6), + u = o(50), + c = o(94).f, + l = o(15); + i( + { + target: "Object", + stat: !0, + forced: + !l || + a(function () { + c(1); + }), + sham: !l, + }, + { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(t, r) { + return c(u(t), r); + }, + } + ); + }, + function (t, r, o) { + "use strict"; + (function (r) { + var check = function (t) { + return t && t.Math === Math && t; + }; + t.exports = + check("object" == typeof globalThis && globalThis) || + check("object" == typeof window && window) || + check("object" == typeof self && self) || + check("object" == typeof r && r) || + check("object" == typeof this && this) || + (function () { + return this; + })() || + Function("return this")(); + }).call(this, o(114)); + }, + function (t, r, o) { + "use strict"; + var i = o(13), + a = o(254), + u = o(255), + c = o(9), + l = o(81), + d = o(70), + p = o(17)("iterator"), + v = c.values, + handlePrototype = function (t, r) { + if (t) { + if (t[p] !== v) + try { + l(t, p, v); + } catch (r) { + t[p] = v; + } + if ((d(t, r, !0), a[r])) + for (var o in c) + if (t[o] !== c[o]) + try { + l(t, o, c[o]); + } catch (r) { + t[o] = c[o]; + } + } + }; + for (var h in a) handlePrototype(i[h] && i[h].prototype, h); + handlePrototype(u, "DOMTokenList"); + }, + function (t, r, o) { + "use strict"; + var i = o(6); + t.exports = !i(function () { + return ( + 7 !== + Object.defineProperty({}, 1, { + get: function () { + return 7; + }, + })[1] + ); + }); + }, + , + function (t, r, o) { + "use strict"; + var i = o(13), + a = o(105), + u = o(31), + c = o(149), + l = o(104), + d = o(246), + p = i.Symbol, + v = a("wks"), + h = d ? p.for || p : (p && p.withoutSetter) || c; + t.exports = function (t) { + return u(v, t) || (v[t] = l && u(p, t) ? p[t] : h("Symbol." + t)), v[t]; + }; + }, + function (t, r, o) { + "use strict"; + var i = o(13), + a = o(254), + u = o(255), + c = o(334), + l = o(81), + handlePrototype = function (t) { + if (t && t.forEach !== c) + try { + l(t, "forEach", c); + } catch (r) { + t.forEach = c; + } + }; + for (var d in a) a[d] && handlePrototype(i[d] && i[d].prototype); + handlePrototype(u); + }, + function (t, r, o) { + "use strict"; + var i = "object" == typeof document && document.all; + t.exports = + void 0 === i && void 0 !== i + ? function (t) { + return "function" == typeof t || t === i; + } + : function (t) { + return "function" == typeof t; + }; + }, + , + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(49), + u = o(138); + i( + { + target: "Object", + stat: !0, + forced: o(6)(function () { + u(1); + }), + }, + { + keys: function keys(t) { + return u(a(t)); + }, + } + ); + }, + function (t, r, o) { + "use strict"; + o(342), o(344), o(345), o(86), o(347); + }, + function (t, r, o) { + "use strict"; + var i = o(147), + a = Function.prototype.call; + t.exports = i + ? a.bind(a) + : function () { + return a.apply(a, arguments); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(88).filter; + i( + {target: "Array", proto: !0, forced: !o(159)("filter")}, + { + filter: function filter(t) { + return a(this, t, arguments.length > 1 ? arguments[1] : void 0); + }, + } + ); + }, + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(198); + i({target: "RegExp", proto: !0, forced: /./.exec !== a}, {exec: a}); + }, + function (t, r, o) { + var i = o(338), + a = o(350), + u = o(283), + c = o(339); + (t.exports = function _slicedToArray(t, r) { + return i(t) || a(t, r) || u(t, r) || c(); + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(88).map; + i( + {target: "Array", proto: !0, forced: !o(159)("map")}, + { + map: function map(t) { + return a(this, t, arguments.length > 1 ? arguments[1] : void 0); + }, + } + ); + }, + , + function (t, r, o) { + "use strict"; + o(352); + }, + function (t, r, o) { + "use strict"; + var i = o(19); + t.exports = function (t) { + return "object" == typeof t ? null !== t : i(t); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(7), + a = o(49), + u = i({}.hasOwnProperty); + t.exports = + Object.hasOwn || + function hasOwn(t, r) { + return u(a(t), r); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(109), + a = String; + t.exports = function (t) { + if ("Symbol" === i(t)) + throw new TypeError("Cannot convert a Symbol value to a string"); + return a(t); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(15), + u = o(200).f; + i( + {target: "Object", stat: !0, forced: Object.defineProperties !== u, sham: !a}, + {defineProperties: u} + ); + }, + function (t, r, o) { + "use strict"; + var i = o(30), + a = String, + u = TypeError; + t.exports = function (t) { + if (i(t)) return t; + throw new u(a(t) + " is not an object"); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(15), + u = o(244), + c = o(50), + l = o(94), + d = o(146); + i( + {target: "Object", stat: !0, sham: !a}, + { + getOwnPropertyDescriptors: function getOwnPropertyDescriptors(t) { + for (var r, o, i = c(t), a = l.f, p = u(i), v = {}, h = 0; p.length > h; ) + void 0 !== (o = a(i, (r = p[h++]))) && d(v, r, o); + return v; + }, + } + ); + }, + , + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(6), + u = o(143), + c = o(30), + l = o(49), + d = o(63), + p = o(305), + v = o(146), + h = o(220), + y = o(159), + _ = o(17), + g = o(113), + b = _("isConcatSpreadable"), + E = + g >= 51 || + !a(function () { + var t = []; + return (t[b] = !1), t.concat()[0] !== t; + }), + isConcatSpreadable = function (t) { + if (!c(t)) return !1; + var r = t[b]; + return void 0 !== r ? !!r : u(t); + }; + i( + {target: "Array", proto: !0, arity: 1, forced: !E || !y("concat")}, + { + concat: function concat(t) { + var r, + o, + i, + a, + u, + c = l(this), + y = h(c, 0), + _ = 0; + for (r = -1, i = arguments.length; r < i; r++) + if (isConcatSpreadable((u = -1 === r ? c : arguments[r]))) + for (a = d(u), p(_ + a), o = 0; o < a; o++, _++) o in u && v(y, _, u[o]); + else p(_ + 1), v(y, _++, u); + return (y.length = _), y; + }, + } + ); + }, + , + , + function (t, r, o) { + "use strict"; + var i = o(19), + a = o(43), + u = o(240), + c = o(196); + t.exports = function (t, r, o, l) { + l || (l = {}); + var d = l.enumerable, + p = void 0 !== l.name ? l.name : r; + if ((i(o) && u(o, p, l), l.global)) d ? (t[r] = o) : c(r, o); + else { + try { + l.unsafe ? t[r] && (d = !0) : delete t[r]; + } catch (t) {} + d + ? (t[r] = o) + : a.f(t, r, { + value: o, + enumerable: !1, + configurable: !l.nonConfigurable, + writable: !l.nonWritable, + }); + } + return t; + }; + }, + , + , + function (t, r, o) { + "use strict"; + var i = o(15), + a = o(247), + u = o(248), + c = o(34), + l = o(182), + d = TypeError, + p = Object.defineProperty, + v = Object.getOwnPropertyDescriptor, + h = "enumerable", + y = "configurable", + _ = "writable"; + r.f = i + ? u + ? function defineProperty(t, r, o) { + if ( + (c(t), + (r = l(r)), + c(o), + "function" == typeof t && + "prototype" === r && + "value" in o && + _ in o && + !o.writable) + ) { + var i = v(t, r); + i && + i.writable && + ((t[r] = o.value), + (o = { + configurable: y in o ? o.configurable : i.configurable, + enumerable: h in o ? o.enumerable : i.enumerable, + writable: !1, + })); + } + return p(t, r, o); + } + : p + : function defineProperty(t, r, o) { + if ((c(t), (r = l(r)), c(o), a)) + try { + return p(t, r, o); + } catch (t) {} + if ("get" in o || "set" in o) throw new d("Accessors not supported"); + return "value" in o && (t[r] = o.value), t; + }; + }, + function (t, r, o) { + "use strict"; + var i = o(15), + a = o(136).EXISTS, + u = o(7), + c = o(73), + l = Function.prototype, + d = u(l.toString), + p = /function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/, + v = u(p.exec); + i && + !a && + c(l, "name", { + configurable: !0, + get: function () { + try { + return v(p, d(this))[1]; + } catch (t) { + return ""; + } + }, + }); + }, + , + function (t, r, o) { + "use strict"; + var i, + a, + u, + c = o(249), + l = o(13), + d = o(30), + p = o(81), + v = o(31), + h = o(195), + y = o(160), + _ = o(124), + g = "Object already initialized", + b = l.TypeError, + E = l.WeakMap; + if (c || h.state) { + var m = h.state || (h.state = new E()); + (m.get = m.get), + (m.has = m.has), + (m.set = m.set), + (i = function (t, r) { + if (m.has(t)) throw new b(g); + return (r.facade = t), m.set(t, r), r; + }), + (a = function (t) { + return m.get(t) || {}; + }), + (u = function (t) { + return m.has(t); + }); + } else { + var w = y("state"); + (_[w] = !0), + (i = function (t, r) { + if (v(t, w)) throw new b(g); + return (r.facade = t), p(t, w, r), r; + }), + (a = function (t) { + return v(t, w) ? t[w] : {}; + }), + (u = function (t) { + return v(t, w); + }); + } + t.exports = { + set: i, + get: a, + has: u, + enforce: function (t) { + return u(t) ? a(t) : i(t, {}); + }, + getterFor: function (t) { + return function (r) { + var o; + if (!d(r) || (o = a(r)).type !== t) + throw new b("Incompatible receiver, " + t + " required"); + return o; + }; + }, + }; + }, + , + , + function (t, r, o) { + "use strict"; + var i = o(56), + a = Object; + t.exports = function (t) { + return a(i(t)); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(123), + a = o(56); + t.exports = function (t) { + return i(a(t)); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(7), + a = i({}.toString), + u = i("".slice); + t.exports = function (t) { + return u(a(t), 8, -1); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(143), + u = o(166), + c = o(30), + l = o(203), + d = o(63), + p = o(50), + v = o(146), + h = o(17), + y = o(159), + _ = o(89), + g = y("slice"), + b = h("species"), + E = Array, + m = Math.max; + i( + {target: "Array", proto: !0, forced: !g}, + { + slice: function slice(t, r) { + var o, + i, + h, + y = p(this), + g = d(y), + w = l(t, g), + S = l(void 0 === r ? g : r, g); + if ( + a(y) && + ((o = y.constructor), + ((u(o) && (o === E || a(o.prototype))) || (c(o) && null === (o = o[b]))) && + (o = void 0), + o === E || void 0 === o) + ) + return _(y, w, S); + for (i = new (void 0 === o ? E : o)(m(S - w, 0)), h = 0; w < S; w++, h++) + w in y && v(i, h, y[w]); + return (i.length = h), i; + }, + } + ); + }, + , + , + function (t, r, o) { + "use strict"; + var i = o(136).PROPER, + a = o(40), + u = o(34), + c = o(32), + l = o(6), + d = o(241), + p = "toString", + v = RegExp.prototype, + h = v.toString, + y = l(function () { + return "/a/b" !== h.call({source: "a", flags: "b"}); + }), + _ = i && h.name !== p; + (y || _) && + a( + v, + p, + function toString() { + var t = u(this); + return "/" + c(t.source) + "/" + c(d(t)); + }, + {unsafe: !0} + ); + }, + function (t, r, o) { + "use strict"; + var i = o(67), + a = TypeError; + t.exports = function (t) { + if (i(t)) throw new a("Can't call method on " + t); + return t; + }; + }, + , + function (t, r, o) { + "use strict"; + o(25); + var i, + a, + u = o(5), + c = o(23), + l = o(19), + d = o(34), + p = o(32), + v = + ((i = !1), + ((a = /[ac]/).exec = function () { + return (i = !0), /./.exec.apply(this, arguments); + }), + !0 === a.test("abc") && i), + h = /./.test; + u( + {target: "RegExp", proto: !0, forced: !v}, + { + test: function (t) { + var r = d(this), + o = p(t), + i = r.exec; + if (!l(i)) return c(h, r, o); + var a = c(i, r, o); + return null !== a && (d(a), !0); + }, + } + ); + }, + , + function (t, r, o) { + "use strict"; + t.exports = !1; + }, + function (t, r, o) { + "use strict"; + var i = o(13), + a = o(19), + aFunction = function (t) { + return a(t) ? t : void 0; + }; + t.exports = function (t, r) { + return arguments.length < 2 ? aFunction(i[t]) : i[t] && i[t][r]; + }; + }, + , + function (t, r, o) { + "use strict"; + var i = o(112); + t.exports = function (t) { + return i(t.length); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(19), + a = o(110), + u = TypeError; + t.exports = function (t) { + if (i(t)) return t; + throw new u(a(t) + " is not a function"); + }; + }, + , + function (t, r, o) { + "use strict"; + var i = o(156), + a = o(23), + u = o(7), + c = o(175), + l = o(6), + d = o(34), + p = o(19), + v = o(67), + h = o(99), + y = o(112), + _ = o(32), + g = o(56), + b = o(212), + E = o(98), + m = o(337), + w = o(174), + S = o(17)("replace"), + O = Math.max, + x = Math.min, + I = u([].concat), + P = u([].push), + T = u("".indexOf), + A = u("".slice), + R = "$0" === "a".replace(/./, "$0"), + N = !!/./[S] && "" === /./[S]("a", "$0"); + c( + "replace", + function (t, r, o) { + var u = N ? "$" : "$0"; + return [ + function replace(t, o) { + var i = g(this), + u = v(t) ? void 0 : E(t, S); + return u ? a(u, t, i, o) : a(r, _(i), t, o); + }, + function (t, a) { + var c = d(this), + l = _(t); + if ("string" == typeof a && -1 === T(a, u) && -1 === T(a, "$<")) { + var v = o(r, c, l, a); + if (v.done) return v.value; + } + var g = p(a); + g || (a = _(a)); + var E, + S = c.global; + S && ((E = c.unicode), (c.lastIndex = 0)); + for (var R, N = []; null !== (R = w(c, l)) && (P(N, R), S); ) { + "" === _(R[0]) && (c.lastIndex = b(l, y(c.lastIndex), E)); + } + for (var L, C = "", k = 0, M = 0; M < N.length; M++) { + for ( + var j, + U = _((R = N[M])[0]), + W = O(x(h(R.index), l.length), 0), + D = [], + V = 1; + V < R.length; + V++ + ) + P(D, void 0 === (L = R[V]) ? L : String(L)); + var K = R.groups; + if (g) { + var B = I([U], D, W, l); + void 0 !== K && P(B, K), (j = _(i(a, void 0, B))); + } else j = m(U, l, W, D, K, a); + W >= k && ((C += A(l, k, W) + j), (k = W + U.length)); + } + return C + A(l, k); + }, + ]; + }, + !!l(function () { + var t = /./; + return ( + (t.exec = function () { + var t = []; + return (t.groups = {a: "7"}), t; + }), + "7" !== "".replace(t, "$") + ); + }) || + !R || + N + ); + }, + function (t, r, o) { + "use strict"; + t.exports = function (t) { + return null == t; + }; + }, + , + , + function (t, r, o) { + "use strict"; + var i = o(43).f, + a = o(31), + u = o(17)("toStringTag"); + t.exports = function (t, r, o) { + t && !o && (t = t.prototype), + t && !a(t, u) && i(t, u, {configurable: !0, value: r}); + }; + }, + , + , + function (t, r, o) { + "use strict"; + var i = o(240), + a = o(43); + t.exports = function (t, r, o) { + return ( + o.get && i(o.get, r, {getter: !0}), + o.set && i(o.set, r, {setter: !0}), + a.f(t, r, o) + ); + }; + }, + , + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(7), + u = o(123), + c = o(50), + l = o(134), + d = a([].join); + i( + {target: "Array", proto: !0, forced: u !== Object || !l("join", ",")}, + { + join: function join(t) { + return d(c(this), void 0 === t ? "," : t); + }, + } + ); + }, + , + , + function (t, r, o) { + "use strict"; + var i = o(7); + t.exports = i({}.isPrototypeOf); + }, + function (t, r, o) { + "use strict"; + var i = o(5), + a = o(15), + u = o(13), + c = o(7), + l = o(31), + d = o(19), + p = o(78), + v = o(32), + h = o(73), + y = o(222), + _ = u.Symbol, + g = _ && _.prototype; + if (a && d(_) && (!("description" in g) || void 0 !== _().description)) { + var b = {}, + E = function Symbol() { + var t = + arguments.length < 1 || void 0 === arguments[0] + ? void 0 + : v(arguments[0]), + r = p(g, this) ? new _(t) : void 0 === t ? _() : _(t); + return "" === t && (b[r] = !0), r; + }; + y(E, _), (E.prototype = g), (g.constructor = E); + var m = "Symbol(description detection)" === String(_("description detection")), + w = c(g.valueOf), + S = c(g.toString), + O = /^Symbol\((.*)\)[^)]+$/, + x = c("".replace), + I = c("".slice); + h(g, "description", { + configurable: !0, + get: function description() { + var t = w(this); + if (l(b, t)) return ""; + var r = S(t), + o = m ? I(r, 7, -1) : x(r, O, "$1"); + return "" === o ? void 0 : o; + }, + }), + i({global: !0, constructor: !0, forced: !0}, {Symbol: E}); + } + }, + , + function (t, r, o) { + "use strict"; + var i = o(15), + a = o(43), + u = o(97); + t.exports = i + ? function (t, r, o) { + return a.f(t, r, u(1, o)); + } + : function (t, r, o) { + return (t[r] = o), t; + }; + }, + function (t, r, o) { + "use strict"; + var i, + a = o(34), + u = o(200), + c = o(197), + l = o(124), + d = o(269), + p = o(167), + v = o(160), + h = v("IE_PROTO"), + EmptyConstructor = function () {}, + scriptTag = function (t) { + return ""), + t.close(), + createDict = t.F; + i--; + + ) + delete createDict.prototype[u[i]]; + return createDict(); + }; + t.exports = + Object.create || + function create(t, r) { + var o; + return ( + null !== t + ? ((Empty.prototype = i(t)), + (o = new Empty()), + (Empty.prototype = null), + (o[c] = t)) + : (o = createDict()), + void 0 === r ? o : a(o, r) + ); + }; + }, + function (t, r, o) { + var i = o(728), + a = o(721), + u = o(497), + c = o(1131), + l = o(524), + d = o(1385), + p = Object.getOwnPropertyDescriptor; + r.f = o(427) + ? p + : function getOwnPropertyDescriptor(t, r) { + if (((t = u(t)), (r = c(r, !0)), d)) + try { + return p(t, r); + } catch (t) {} + if (l(t, r)) return a(!i.f.call(t, r), t[r]); + }; + }, + function (t, r) { + t.exports = function (t) { + if (null == t) throw TypeError("Can't call method on " + t); + return t; + }; + }, + function (t, r, o) { + t.exports = o(1430); + }, + function (t, r, o) { + var i = o(483); + t.exports = function (t, r) { + if (!i(t)) return t; + var o, a; + if (r && "function" == typeof (o = t.toString) && !i((a = o.call(t)))) return a; + if ("function" == typeof (o = t.valueOf) && !i((a = o.call(t)))) return a; + if (!r && "function" == typeof (o = t.toString) && !i((a = o.call(t)))) return a; + throw TypeError("Can't convert object to primitive value"); + }; + }, + function (t, r, o) { + var i = o(323), + a = o(425), + u = "__core-js_shared__", + c = a[u] || (a[u] = {}); + (t.exports = function (t, r) { + return c[t] || (c[t] = void 0 !== r ? r : {}); + })("versions", []).push({ + version: i.version, + mode: o(1107) ? "pure" : "global", + copyright: "© 2020 Denis Pushkarev (zloirock.ru)", + }); + }, + function (t, r, o) { + var i = o(425), + a = o(323), + u = o(1107), + c = o(1112), + l = o(434).f; + t.exports = function (t) { + var r = a.Symbol || (a.Symbol = u ? {} : i.Symbol || {}); + "_" == t.charAt(0) || t in r || l(r, t, {value: c.f(t)}); + }; + }, + function (t, r) { + var o = Math.ceil, + i = Math.floor; + t.exports = function (t) { + return isNaN((t = +t)) ? 0 : (t > 0 ? i : o)(t); + }; + }, + function (t, r, o) { + var i = o(1132)("keys"), + a = o(1111); + t.exports = function (t) { + return i[t] || (i[t] = a(t)); + }; + }, + function (t, r) { + t.exports = + "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split( + "," + ); + }, + function (t, r, o) { + var i = o(1386), + a = o(1136).concat("length", "prototype"); + r.f = + Object.getOwnPropertyNames || + function getOwnPropertyNames(t) { + return i(t, a); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(1107), + a = o(405), + u = o(1143), + c = o(525), + l = o(722), + d = o(1440), + p = o(1108), + v = o(1420), + h = o(426)("iterator"), + y = !([].keys && "next" in [].keys()), + _ = "keys", + g = "values", + returnThis = function () { + return this; + }; + t.exports = function (t, r, o, b, E, m, w) { + d(o, r, b); + var S, + O, + x, + getMethod = function (t) { + if (!y && t in A) return A[t]; + switch (t) { + case _: + return function keys() { + return new o(this, t); + }; + case g: + return function values() { + return new o(this, t); + }; + } + return function entries() { + return new o(this, t); + }; + }, + I = r + " Iterator", + P = E == g, + T = !1, + A = t.prototype, + R = A[h] || A["@@iterator"] || (E && A[E]), + N = R || getMethod(E), + L = E ? (P ? getMethod("entries") : N) : void 0, + C = ("Array" == r && A.entries) || R; + if ( + (C && + (x = v(C.call(new t()))) !== Object.prototype && + x.next && + (p(x, I, !0), i || "function" == typeof x[h] || c(x, h, returnThis)), + P && + R && + R.name !== g && + ((T = !0), + (N = function values() { + return R.call(this); + })), + (i && !w) || (!y && !T && A[h]) || c(A, h, N), + (l[r] = N), + (l[I] = returnThis), + E) + ) + if ( + ((S = {values: P ? N : getMethod(g), keys: m ? N : getMethod(_), entries: L}), + w) + ) + for (O in S) O in A || u(A, O, S[O]); + else a(a.P + a.F * (y || T), r, S); + return S; + }; + }, + function (t, r, o) { + var i = o(525); + t.exports = function (t, r, o) { + for (var a in r) o && t[a] ? (t[a] = r[a]) : i(t, a, r[a]); + return t; + }; + }, + function (t, r) { + t.exports = function (t, r, o, i) { + if (!(t instanceof r) || (void 0 !== i && i in t)) + throw TypeError(o + ": incorrect invocation!"); + return t; + }; + }, + , + , + function (t, r, o) { + t.exports = o(525); + }, + function (t, r, o) { + var i = o(1126); + t.exports = Object("z").propertyIsEnumerable(0) + ? Object + : function (t) { + return "String" == i(t) ? t.split("") : Object(t); + }; + }, + function (t, r, o) { + var i = o(1126); + t.exports = + Array.isArray || + function isArray(t) { + return "Array" == i(t); + }; + }, + function (t, r, o) { + t.exports = o(1438); + }, + function (t, r, o) { + "use strict"; + var i = o(425), + a = o(405), + u = o(734), + c = o(595), + l = o(525), + d = o(1139), + p = o(723), + v = o(1140), + h = o(483), + y = o(1108), + _ = o(434).f, + g = o(1158)(0), + b = o(427); + t.exports = function (t, r, o, E, m, w) { + var S = i[t], + O = S, + x = m ? "set" : "add", + I = O && O.prototype, + P = {}; + return ( + b && + "function" == typeof O && + (w || + (I.forEach && + !c(function () { + new O().entries().next(); + }))) + ? ((O = r(function (r, o) { + v(r, O, t, "_c"), (r._c = new S()), null != o && p(o, m, r[x], r); + })), + g( + "add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON".split( + "," + ), + function (t) { + var r = "add" == t || "set" == t; + !(t in I) || + (w && "clear" == t) || + l(O.prototype, t, function (o, i) { + if ((v(this, O, t), !r && w && !h(o))) return "get" == t && void 0; + var a = this._c[t](0 === o ? 0 : o, i); + return r ? this : a; + }); + } + ), + w || + _(O.prototype, "size", { + get: function () { + return this._c.size; + }, + })) + : ((O = E.getConstructor(r, t, m, x)), d(O.prototype, o), (u.NEED = !0)), + y(O, t), + (P[t] = O), + a(a.G + a.W + a.F, P), + w || E.setStrong(O, t, m), + O + ); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(405); + t.exports = function (t) { + i(i.S, t, { + of: function of() { + for (var t = arguments.length, r = new Array(t); t--; ) r[t] = arguments[t]; + return new this(r); + }, + }); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(405), + a = o(1379), + u = o(665), + c = o(723); + t.exports = function (t) { + i(i.S, t, { + from: function from(t) { + var r, + o, + i, + l, + d = arguments[1]; + return ( + a(this), + (r = void 0 !== d) && a(d), + null == t + ? new this() + : ((o = []), + r + ? ((i = 0), + (l = u(d, arguments[2], 2)), + c(t, !1, function (t) { + o.push(l(t, i++)); + })) + : c(t, !1, o.push, o), + new this(o)) + ); + }, + }); + }; + }, + , + , + , + , + , + , + , + , + function (t, r, o) { + var i = o(665), + a = o(1144), + u = o(666), + c = o(1113), + l = o(1443); + t.exports = function (t, r) { + var o = 1 == t, + d = 2 == t, + p = 3 == t, + v = 4 == t, + h = 6 == t, + y = 5 == t || h, + _ = r || l; + return function (r, l, g) { + for ( + var b, + E, + m = u(r), + w = a(m), + S = i(l, g, 3), + O = c(w.length), + x = 0, + I = o ? _(r, O) : d ? _(r, 0) : void 0; + O > x; + x++ + ) + if ((y || x in w) && ((E = S((b = w[x]), x, m)), t)) + if (o) I[x] = E; + else if (E) + switch (t) { + case 3: + return !0; + case 5: + return b; + case 6: + return x; + case 2: + I.push(b); + } + else if (v) return !1; + return h ? -1 : p || v ? v : I; + }; + }; + }, + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + function (t, r, o) { + "use strict"; + var i = o(495); + o(1), o(3), o(18), Object.defineProperty(r, "__esModule", {value: !0}); + var a = { + getMetaViewport: !0, + isInlineStylesheetSupported: !0, + isMetaViewportSet: !0, + }; + (r.isMetaViewportSet = r.isInlineStylesheetSupported = r.getMetaViewport = void 0), + o(25), + o(58); + var u = o(1397); + i(u).forEach(function (t) { + "default" !== t && + "__esModule" !== t && + (Object.prototype.hasOwnProperty.call(a, t) || + (t in r && r[t] === u[t]) || + Object.defineProperty(r, t, { + enumerable: !0, + get: function get() { + return u[t]; + }, + })); + }); + var c = function getMetaViewport() { + var t = document.querySelectorAll('meta[name="viewport"]'); + if (0 === t.length) return ""; + var r = t[t.length - 1].getAttribute("content"); + return String(r); + }; + r.getMetaViewport = c; + r.isInlineStylesheetSupported = function isInlineStylesheetSupported() { + try { + var t = "link-stylesheet-test-".concat(Math.floor(100 * Math.random())), + r = document.createElement("div"); + r.id = t; + var o = document.createElement("style"); + o.textContent = "#".concat(t, " { width: 100px; height: 100px; }"); + var i = document.body; + i.appendChild(r), i.appendChild(o); + var a = 100 === r.offsetWidth; + return i.removeChild(r), i.removeChild(o), a; + } catch (t) { + return !1; + } + }; + r.isMetaViewportSet = function isMetaViewportSet() { + return /device-width/.test(c()); + }; + }, + function (t, r, o) { + "use strict"; + o(1); + var i = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.FLEX_LINK_HTML_PATH = r.CREATE_PARAMETERS = void 0), + Object.defineProperty(r, "LINK_CLIENT_CORS_ORIGIN", { + enumerable: !0, + get: function get() { + return u.LINK_CLIENT_CORS_ORIGIN; + }, + }), + Object.defineProperty(r, "LINK_CLIENT_STABLE_URL", { + enumerable: !0, + get: function get() { + return u.LINK_CLIENT_STABLE_URL; + }, + }), + Object.defineProperty(r, "LINK_CLIENT_URL", { + enumerable: !0, + get: function get() { + return u.LINK_CLIENT_URL; + }, + }), + Object.defineProperty(r, "LINK_HTML_PATH", { + enumerable: !0, + get: function get() { + return u.LINK_HTML_PATH; + }, + }), + Object.defineProperty(r, "PLAID_INTERNAL_NAMESPACE", { + enumerable: !0, + get: function get() { + return u.PLAID_INTERNAL_NAMESPACE; + }, + }), + o(37); + var a = i(o(1501)), + u = o(231); + r.FLEX_LINK_HTML_PATH = "/flink.html"; + var c = [].concat((0, a.default)(u.CREATE_PARAMETERS), [ + "apiVersion", + "clientName", + "configUserId", + "configUserTags", + "countryCodes", + "customizations", + "depositSwitchToken", + "experimentVariants", + "forceIframe", + "hostedLinkVersion", + "isEmbedded", + "isSimpleIntegration", + "key", + "language", + "linkCustomizationName", + "longtail", + "longTail", + "oauthNonce", + "oauthStateId", + "oauthRedirectUri", + "onResult", + "paymentToken", + "product", + "accountSubtypes", + "selectAccount", + "noLoadingState", + "useMobileWindow", + "user", + "userLegalName", + "userEmailAddress", + "userPhoneNumber", + "webhook", + "workflowVersionOverride", + ]); + r.CREATE_PARAMETERS = c; + }, + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + function (t, r, o) { + "use strict"; + o(1), + Object.defineProperty(r, "__esModule", {value: !0}), + (r.ProviderRpcErrorCode = r.ChainTypes = void 0); + var i = (function (t) { + return ( + (t[(t.ACCOUNT_ACCESS_REJECTED = 4001)] = "ACCOUNT_ACCESS_REJECTED"), + (t[(t.ACCOUNT_ACCESS_ALREADY_REQUESTED = -32002)] = + "ACCOUNT_ACCESS_ALREADY_REQUESTED"), + (t[(t.UNAUTHORIZED = 4100)] = "UNAUTHORIZED"), + (t[(t.INVALID_PARAMS = -32602)] = "INVALID_PARAMS"), + (t[(t.UNSUPPORTED_METHOD = 4200)] = "UNSUPPORTED_METHOD"), + (t[(t.DISCONNECTED = 4900)] = "DISCONNECTED"), + (t[(t.CHAIN_DISCONNECTED = 4901)] = "CHAIN_DISCONNECTED"), + (t[(t.CHAIN_NOT_ADDED = 4902)] = "CHAIN_NOT_ADDED"), + (t[(t.DOES_NOT_EXIST = -32601)] = "DOES_NOT_EXIST"), + (t[(t.METAMASK_NETWORK_SWITCH_DISCONNECT = 1013)] = + "METAMASK_NETWORK_SWITCH_DISCONNECT"), + t + ); + })({}); + r.ProviderRpcErrorCode = i; + var a = (function (t) { + return ( + (t[(t.Unknown = 0)] = "Unknown"), + (t[(t.EVM = 1)] = "EVM"), + (t[(t.Solana = 2)] = "Solana"), + t + ); + })({}); + r.ChainTypes = a; + }, + function (t, r) { + t.exports = function (t) { + if ("function" != typeof t) throw TypeError(t + " is not a function!"); + return t; + }; + }, + function (t, r, o) { + t.exports = o(1458); + }, + function (t, r, o) { + var i = o(483), + a = o(425).document, + u = i(a) && i(a.createElement); + t.exports = function (t) { + return u ? a.createElement(t) : {}; + }; + }, + function (t, r, o) { + var i = o(1126), + a = o(426)("toStringTag"), + u = + "Arguments" == + i( + (function () { + return arguments; + })() + ); + t.exports = function (t) { + var r, o, c; + return void 0 === t + ? "Undefined" + : null === t + ? "Null" + : "string" == + typeof (o = (function (t, r) { + try { + return t[r]; + } catch (t) {} + })((r = Object(t)), a)) + ? o + : u + ? i(r) + : "Object" == (c = i(r)) && "function" == typeof r.callee + ? "Arguments" + : c; + }; + }, + function (t, r, o) { + var i = o(405), + a = o(323), + u = o(595); + t.exports = function (t, r) { + var o = (a.Object || {})[t] || Object[t], + c = {}; + (c[t] = r(o)), + i( + i.S + + i.F * + u(function () { + o(1); + }), + "Object", + c + ); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(425), + a = o(524), + u = o(427), + c = o(405), + l = o(1143), + d = o(734).KEY, + p = o(595), + v = o(1132), + h = o(1108), + y = o(1111), + _ = o(426), + g = o(1112), + b = o(1133), + E = o(1431), + m = o(1145), + w = o(523), + S = o(483), + O = o(666), + x = o(497), + I = o(1131), + P = o(721), + T = o(1127), + A = o(1435), + R = o(1128), + N = o(1116), + L = o(434), + C = o(667), + k = R.f, + M = L.f, + j = A.f, + U = i.Symbol, + W = i.JSON, + D = W && W.stringify, + V = _("_hidden"), + K = _("toPrimitive"), + B = {}.propertyIsEnumerable, + H = v("symbol-registry"), + q = v("symbols"), + z = v("op-symbols"), + G = Object.prototype, + Q = "function" == typeof U && !!N.f, + X = i.QObject, + Y = !X || !X.prototype || !X.prototype.findChild, + J = + u && + p(function () { + return ( + 7 != + T( + M({}, "a", { + get: function () { + return M(this, "a", {value: 7}).a; + }, + }) + ).a + ); + }) + ? function (t, r, o) { + var i = k(G, r); + i && delete G[r], M(t, r, o), i && t !== G && M(G, r, i); + } + : M, + wrap = function (t) { + var r = (q[t] = T(U.prototype)); + return (r._k = t), r; + }, + $ = + Q && "symbol" == typeof U.iterator + ? function (t) { + return "symbol" == typeof t; + } + : function (t) { + return t instanceof U; + }, + Z = function defineProperty(t, r, o) { + return ( + t === G && Z(z, r, o), + w(t), + (r = I(r, !0)), + w(o), + a(q, r) + ? (o.enumerable + ? (a(t, V) && t[V][r] && (t[V][r] = !1), + (o = T(o, {enumerable: P(0, !1)}))) + : (a(t, V) || M(t, V, P(1, {})), (t[V][r] = !0)), + J(t, r, o)) + : M(t, r, o) + ); + }, + ee = function defineProperties(t, r) { + w(t); + for (var o, i = E((r = x(r))), a = 0, u = i.length; u > a; ) + Z(t, (o = i[a++]), r[o]); + return t; + }, + te = function propertyIsEnumerable(t) { + var r = B.call(this, (t = I(t, !0))); + return ( + !(this === G && a(q, t) && !a(z, t)) && + (!(r || !a(this, t) || !a(q, t) || (a(this, V) && this[V][t])) || r) + ); + }, + ne = function getOwnPropertyDescriptor(t, r) { + if (((t = x(t)), (r = I(r, !0)), t !== G || !a(q, r) || a(z, r))) { + var o = k(t, r); + return !o || !a(q, r) || (a(t, V) && t[V][r]) || (o.enumerable = !0), o; + } + }, + re = function getOwnPropertyNames(t) { + for (var r, o = j(x(t)), i = [], u = 0; o.length > u; ) + a(q, (r = o[u++])) || r == V || r == d || i.push(r); + return i; + }, + oe = function getOwnPropertySymbols(t) { + for (var r, o = t === G, i = j(o ? z : x(t)), u = [], c = 0; i.length > c; ) + !a(q, (r = i[c++])) || (o && !a(G, r)) || u.push(q[r]); + return u; + }; + Q || + ((U = function Symbol() { + if (this instanceof U) throw TypeError("Symbol is not a constructor!"); + var t = y(arguments.length > 0 ? arguments[0] : void 0), + $set = function (r) { + this === G && $set.call(z, r), + a(this, V) && a(this[V], t) && (this[V][t] = !1), + J(this, t, P(1, r)); + }; + return u && Y && J(G, t, {configurable: !0, set: $set}), wrap(t); + }), + l(U.prototype, "toString", function toString() { + return this._k; + }), + (R.f = ne), + (L.f = Z), + (o(1137).f = A.f = re), + (o(728).f = te), + (N.f = oe), + u && !o(1107) && l(G, "propertyIsEnumerable", te, !0), + (g.f = function (t) { + return wrap(_(t)); + })), + c(c.G + c.W + c.F * !Q, {Symbol: U}); + for ( + var ie = + "hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split( + "," + ), + ae = 0; + ie.length > ae; + + ) + _(ie[ae++]); + for (var ue = C(_.store), ce = 0; ue.length > ce; ) b(ue[ce++]); + c(c.S + c.F * !Q, "Symbol", { + for: function (t) { + return a(H, (t += "")) ? H[t] : (H[t] = U(t)); + }, + keyFor: function keyFor(t) { + if (!$(t)) throw TypeError(t + " is not a symbol!"); + for (var r in H) if (H[r] === t) return r; + }, + useSetter: function () { + Y = !0; + }, + useSimple: function () { + Y = !1; + }, + }), + c(c.S + c.F * !Q, "Object", { + create: function create(t, r) { + return void 0 === r ? T(t) : ee(T(t), r); + }, + defineProperty: Z, + defineProperties: ee, + getOwnPropertyDescriptor: ne, + getOwnPropertyNames: re, + getOwnPropertySymbols: oe, + }); + var se = p(function () { + N.f(1); + }); + c(c.S + c.F * se, "Object", { + getOwnPropertySymbols: function getOwnPropertySymbols(t) { + return N.f(O(t)); + }, + }), + W && + c( + c.S + + c.F * + (!Q || + p(function () { + var t = U(); + return ( + "[null]" != D([t]) || "{}" != D({a: t}) || "{}" != D(Object(t)) + ); + })), + "JSON", + { + stringify: function stringify(t) { + for (var r, o, i = [t], a = 1; arguments.length > a; ) + i.push(arguments[a++]); + if (((o = r = i[1]), (S(r) || void 0 !== t) && !$(t))) + return ( + m(r) || + (r = function (t, r) { + if (("function" == typeof o && (r = o.call(this, t, r)), !$(r))) + return r; + }), + (i[1] = r), + D.apply(W, i) + ); + }, + } + ), + U.prototype[K] || o(525)(U.prototype, K, U.prototype.valueOf), + h(U, "Symbol"), + h(Math, "Math", !0), + h(i.JSON, "JSON", !0); + }, + function (t, r, o) { + t.exports = + !o(427) && + !o(595)(function () { + return ( + 7 != + Object.defineProperty(o(1381)("div"), "a", { + get: function () { + return 7; + }, + }).a + ); + }); + }, + function (t, r, o) { + var i = o(524), + a = o(497), + u = o(1432)(!1), + c = o(1135)("IE_PROTO"); + t.exports = function (t, r) { + var o, + l = a(t), + d = 0, + p = []; + for (o in l) o != c && i(l, o) && p.push(o); + for (; r.length > d; ) i(l, (o = r[d++])) && (~u(p, o) || p.push(o)); + return p; + }; + }, + function (t, r) { + t.exports = function (t, r) { + return {value: r, done: !!t}; + }; + }, + function (t, r, o) { + var i = o(523); + t.exports = function (t, r, o, a) { + try { + return a ? r(i(o)[0], o[1]) : r(o); + } catch (r) { + var u = t.return; + throw (void 0 !== u && i(u.call(t)), r); + } + }; + }, + function (t, r, o) { + var i = o(722), + a = o(426)("iterator"), + u = Array.prototype; + t.exports = function (t) { + return void 0 !== t && (i.Array === t || u[a] === t); + }; + }, + function (t, r, o) { + var i = o(1382), + a = o(426)("iterator"), + u = o(722); + t.exports = o(323).getIteratorMethod = function (t) { + if (null != t) return t[a] || t["@@iterator"] || u[i(t)]; + }; + }, + function (t, r, o) { + "use strict"; + var i = o(434), + a = o(721); + t.exports = function (t, r, o) { + r in t ? i.f(t, r, a(0, o)) : (t[r] = o); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(434).f, + a = o(1127), + u = o(1139), + c = o(665), + l = o(1140), + d = o(723), + p = o(1138), + v = o(1387), + h = o(1426), + y = o(427), + _ = o(734).fastKey, + g = o(668), + b = y ? "_s" : "size", + getEntry = function (t, r) { + var o, + i = _(r); + if ("F" !== i) return t._i[i]; + for (o = t._f; o; o = o.n) if (o.k == r) return o; + }; + t.exports = { + getConstructor: function (t, r, o, p) { + var v = t(function (t, i) { + l(t, v, r, "_i"), + (t._t = r), + (t._i = a(null)), + (t._f = void 0), + (t._l = void 0), + (t[b] = 0), + null != i && d(i, o, t[p], t); + }); + return ( + u(v.prototype, { + clear: function clear() { + for (var t = g(this, r), o = t._i, i = t._f; i; i = i.n) + (i.r = !0), i.p && (i.p = i.p.n = void 0), delete o[i.i]; + (t._f = t._l = void 0), (t[b] = 0); + }, + delete: function (t) { + var o = g(this, r), + i = getEntry(o, t); + if (i) { + var a = i.n, + u = i.p; + delete o._i[i.i], + (i.r = !0), + u && (u.n = a), + a && (a.p = u), + o._f == i && (o._f = a), + o._l == i && (o._l = u), + o[b]--; + } + return !!i; + }, + forEach: function forEach(t) { + g(this, r); + for ( + var o, i = c(t, arguments.length > 1 ? arguments[1] : void 0, 3); + (o = o ? o.n : this._f); + + ) + for (i(o.v, o.k, this); o && o.r; ) o = o.p; + }, + has: function has(t) { + return !!getEntry(g(this, r), t); + }, + }), + y && + i(v.prototype, "size", { + get: function () { + return g(this, r)[b]; + }, + }), + v + ); + }, + def: function (t, r, o) { + var i, + a, + u = getEntry(t, r); + return ( + u + ? (u.v = o) + : ((t._l = u = + {i: (a = _(r, !0)), k: r, v: o, p: (i = t._l), n: void 0, r: !1}), + t._f || (t._f = u), + i && (i.n = u), + t[b]++, + "F" !== a && (t._i[a] = u)), + t + ); + }, + getEntry: getEntry, + setStrong: function (t, r, o) { + p( + t, + r, + function (t, o) { + (this._t = g(t, r)), (this._k = o), (this._l = void 0); + }, + function () { + for (var t = this, r = t._k, o = t._l; o && o.r; ) o = o.p; + return t._t && (t._l = o = o ? o.n : t._t._f) + ? v(0, "keys" == r ? o.k : "values" == r ? o.v : [o.k, o.v]) + : ((t._t = void 0), v(1)); + }, + o ? "entries" : "values", + !o, + !0 + ), + h(r); + }, + }; + }, + function (t, r, o) { + var i = o(1382), + a = o(1464); + t.exports = function (t) { + return function toJSON() { + if (i(this) != t) throw TypeError(t + "#toJSON isn't generic"); + return a(this); + }; + }; + }, + , + , + function (t, r, o) { + "use strict"; + o(24), o(3), o(18), o(33), o(1); + var i = o(527), + a = o(495), + u = o(591), + c = o(590), + l = o(664), + d = o(1118), + p = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.create = void 0), + o(118), + o(25), + o(66); + var v = p(o(588)), + h = p(o(1380)), + y = o(1498), + _ = o(1399), + g = _interopRequireWildcard(o(1179)), + b = _interopRequireWildcard(o(1401)), + E = o(100), + m = o(1418), + w = o(1402), + S = p(o(223)); + function _getRequireWildcardCache(t) { + if ("function" != typeof d) return null; + var r = new d(), + o = new d(); + return (_getRequireWildcardCache = function _getRequireWildcardCache(t) { + return t ? o : r; + })(t); + } + function _interopRequireWildcard(t, r) { + if (!r && t && t.__esModule) return t; + if (null === t || ("object" !== i(t) && "function" != typeof t)) + return {default: t}; + var o = _getRequireWildcardCache(r); + if (o && o.has(t)) return o.get(t); + var a = {}, + u = Object.defineProperty && c; + for (var l in t) + if ("default" !== l && Object.prototype.hasOwnProperty.call(t, l)) { + var d = u ? c(t, l) : null; + d && (d.get || d.set) ? Object.defineProperty(a, l, d) : (a[l] = t[l]); + } + return (a.default = t), o && o.set(t, a), a; + } + function ownKeys(t, r) { + var o = a(t); + if (u) { + var i = u(t); + r && + (i = i.filter(function (r) { + return c(t, r).enumerable; + })), + o.push.apply(o, i); + } + return o; + } + function _objectSpread(t) { + for (var r = 1; r < arguments.length; r++) { + var o = null != arguments[r] ? arguments[r] : {}; + r % 2 + ? ownKeys(Object(o), !0).forEach(function (r) { + (0, v.default)(t, r, o[r]); + }) + : l + ? Object.defineProperties(t, l(o)) + : ownKeys(Object(o)).forEach(function (r) { + Object.defineProperty(t, r, c(o, r)); + }); + } + return t; + } + r.create = function create(t) { + var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; + return ( + (r.detectedWeb3WalletIds = (0, m.getInstalledWalletPlugins)( + r.web3ValidChains && r.web3ValidChains[0] + )), + (r.version = E.VERSION), + (0, y.create)(t, r) + ); + }; + (b.hooks.getConfig = function (t, r) { + return (function getConfig(t) { + var r = t.apiVersion, + o = t.clientName, + i = t.configUserId, + a = t.configUserTags, + u = t.countryCodes, + c = t.customizations, + l = t.depositSwitchToken, + d = t.embeddedOpenLinkConfiguration, + p = t.embeddedWorkflowSessionId, + v = t.embeddedComponentConfiguration, + h = t.env, + y = t.experimentVariants, + _ = t.forceDarkMode, + b = t.hostedLinkVersion, + E = t.institutionContactMessagingInstitutions, + m = t.isEagerStart, + w = t.isEmbedded, + O = t.isPrivacyPortalItemAdd, + x = t.isSimpleIntegration, + I = t.isUsingWalletOnboardCallback, + P = t.key, + T = t.language, + A = t.linkOpenId, + R = t.linkCustomizationName, + N = t.logInternalAnalytics, + L = t.oauthNonce, + C = t.oauthRedirectUri, + k = t.oauthStateId, + M = t.onEvent, + j = t.onResult, + U = t.onExit, + W = t.onLoad, + D = t.paymentToken, + V = t.product, + K = t.receivedRedirectUri, + B = t.accountSubtypes, + H = t.selectAccount, + q = t.noLoadingState, + z = t.token, + G = t.useMockFingerprint, + Q = t.user, + X = t.userLegalName, + Y = t.userEmailAddress, + J = t.userPhoneNumber, + $ = t.webhook, + Z = t.workflowVersionOverride, + ee = t.detectedWeb3WalletIds, + te = t.web3ValidChains, + ne = t.version; + return { + apiVersion: r, + clientName: o, + configUserId: i, + configUserTags: a, + countryCodes: u, + customizations: c, + depositSwitchToken: l, + embeddedOpenLinkConfiguration: d, + embeddedComponentConfiguration: v, + embeddedWorkflowSessionId: p, + env: h, + experimentVariants: y, + forceIframe: !0, + forceDarkMode: _, + hostedLinkVersion: b, + institutionContactMessagingInstitutions: E, + isPrivacyPortalItemAdd: O, + isEagerStart: null != m && m, + isEmbedded: w, + isParentInlineStylesheetSupported: g.isInlineStylesheetSupported(), + isParentMetaViewportSet: g.isMetaViewportSet(), + isSimpleIntegration: !0 === x, + isUsingOnEventCallback: "function" == typeof M, + isUsingOnResultCallback: "function" == typeof j, + isUsingOnExitCallback: "function" == typeof U, + isUsingOnLoadCallback: "function" == typeof W, + isUsingWalletOnboardCallback: I, + key: P, + language: T, + linkCustomizationName: R, + linkOpenId: null != A ? A : (0, S.default)(), + logInternalAnalytics: !0 === N, + oauthNonce: L, + oauthRedirectUri: C, + oauthStateId: k, + parentMetaViewport: g.getMetaViewport(), + paymentToken: D, + product: V, + receivedRedirectUri: K, + accountSubtypes: B, + selectAccount: !0 === H, + noLoadingState: q, + token: z, + useMockFingerprint: G, + user: Q, + userLegalName: X, + userEmailAddress: Y, + userPhoneNumber: J, + version: ne, + webhook: $, + workflowVersionOverride: Z, + detectedWeb3WalletIds: ee, + web3ValidChains: te, + isLinkWebSdk: void 0, + linkSdkVersion: void 0, + }; + })( + _objectSpread( + _objectSpread({}, t), + {}, + { + isUsingWalletOnboardCallback: !!r.onProviderSuccess, + workflowVersionOverride: r.workflowVersionOverride, + detectedWeb3WalletIds: r.detectedWeb3WalletIds, + isEagerStart: r.isEagerStart, + version: r.version, + web3ValidChains: r.web3ValidChains, + forceDarkMode: r.forceDarkMode, + embeddedWorkflowSessionId: r.embeddedWorkflowSessionId, + embeddedOpenLinkConfiguration: r.embeddedOpenLinkConfiguration, + useMockFingerprint: r.useMockFingerprint, + } + ) + ); + }), + (b.hooks.getQueryParameters = function getQueryParameters(t) { + var r = t.countryCodes, + o = t.embeddedComponentConfiguration, + i = t.env, + a = t.experimentVariants, + u = t.key, + c = t.token, + l = t.language, + d = t.linkCustomizationName, + p = t.origin, + v = t.product, + y = t.accountSubtypes, + _ = t.uniqueId, + g = t.oauthStateId, + b = t.noLoadingState, + E = t.version, + m = t.hostedLinkVersion, + w = t.linkOpenId; + return { + countryCodes: r, + embeddedComponentConfiguration: null == o ? void 0 : (0, h.default)(o), + env: i, + experimentVariants: null == a ? void 0 : (0, h.default)(a), + isLinkInitialize: !0, + key: u, + token: c, + language: l, + linkCustomizationName: d, + origin: p, + product: v, + accountSubtypes: (0, h.default)(y), + uniqueId: _, + version: E, + oauthStateId: g, + noLoadingState: b, + hostedLinkVersion: m, + linkOpenId: w, + isLinkWebSdk: void 0, + linkSdkVersion: void 0, + }; + }), + (b.hooks.validateCreateOptions = w.validateCreateOptions), + (b.hooks.updateLinkURL = function (t, r) { + if ("1.1.0" === r.hostedLinkVersion) { + if (-1 !== t.indexOf("cdn.plaid.com")) + return t.replace("cdn.plaid.com", "secure.plaid.com"); + if (-1 !== t.indexOf("cdn-testing.plaid.com")) + return t.replace("cdn-testing.plaid.com", "secure-testing.plaid.com"); + } + return t; + }), + (b.hooks.emitLinkOpen = _.emitLinkOpen); + }, + function (t, r, o) { + "use strict"; + o(52), o(44), o(95), o(58), o(22), o(79), o(93), o(29), o(1), o(12); + var i = o(2), + a = o(11); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.uuid = + r.sendMessage = + r.queryStringFromQueryParameters = + r.getWindowOrigin = + r.getUniqueId = + r.default = + r.createMessageEventListener = + r.buildLinkUrl = + void 0); + var u = i(o(26)); + o(37), o(235), o(86), o(9), o(3), o(10), o(14), o(108), o(121), o(55), o(25), o(66); + var c = (function _interopRequireWildcard(t, r) { + if (!r && t && t.__esModule) return t; + if (null === t || ("object" !== a(t) && "function" != typeof t)) + return {default: t}; + var o = _getRequireWildcardCache(r); + if (o && o.has(t)) return o.get(t); + var i = {}, + u = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var c in t) + if ("default" !== c && Object.prototype.hasOwnProperty.call(t, c)) { + var l = u ? Object.getOwnPropertyDescriptor(t, c) : null; + l && (l.get || l.set) ? Object.defineProperty(i, c, l) : (i[c] = t[c]); + } + (i.default = t), o && o.set(t, i); + return i; + })(o(231)); + function _getRequireWildcardCache(t) { + if ("function" != typeof WeakMap) return null; + var r = new WeakMap(), + o = new WeakMap(); + return (_getRequireWildcardCache = function _getRequireWildcardCache(t) { + return t ? o : r; + })(t); + } + function _createForOfIteratorHelper(t, r) { + var o = ("undefined" != typeof Symbol && t[Symbol.iterator]) || t["@@iterator"]; + if (!o) { + if ( + Array.isArray(t) || + (o = (function _unsupportedIterableToArray(t, r) { + if (!t) return; + if ("string" == typeof t) return _arrayLikeToArray(t, r); + var o = Object.prototype.toString.call(t).slice(8, -1); + "Object" === o && t.constructor && (o = t.constructor.name); + if ("Map" === o || "Set" === o) return Array.from(t); + if ("Arguments" === o || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)) + return _arrayLikeToArray(t, r); + })(t)) || + (r && t && "number" == typeof t.length) + ) { + o && (t = o); + var i = 0, + a = function F() {}; + return { + s: a, + n: function n() { + return i >= t.length ? {done: !0} : {done: !1, value: t[i++]}; + }, + e: function e(t) { + throw t; + }, + f: a, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." + ); + } + var u, + c = !0, + l = !1; + return { + s: function s() { + o = o.call(t); + }, + n: function n() { + var t = o.next(); + return (c = t.done), t; + }, + e: function e(t) { + (l = !0), (u = t); + }, + f: function f() { + try { + c || null == o.return || o.return(); + } finally { + if (l) throw u; + } + }, + }; + } + function _arrayLikeToArray(t, r) { + (null == r || r > t.length) && (r = t.length); + for (var o = 0, i = new Array(r); o < r; o++) i[o] = t[o]; + return i; + } + r.buildLinkUrl = function buildLinkUrl(t) { + var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : c, + o = p(t), + i = + r.LINK_CLIENT_STABLE_URL.length > 0 + ? r.LINK_CLIENT_STABLE_URL + : r.LINK_CLIENT_URL, + a = r.LINK_HTML_PATH; + return "".concat(i).concat(a, "?").concat(o); + }; + var l, + d = + ((l = 0), + function () { + return (l += 1), String(l); + }); + r.getUniqueId = d; + r.getWindowOrigin = function getWindowOrigin() { + return null != window.location.origin + ? window.location.origin + : window.location.protocol + + "//" + + window.location.hostname + + (window.location.port ? ":" + window.location.port : ""); + }; + r.sendMessage = function sendMessage(t) { + var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : void 0; + return function (o) { + var i = Object.assign({}, o, { + action: "".concat(c.PLAID_INTERNAL_NAMESPACE, "::").concat(o.action), + }); + t.postMessage(JSON.stringify(i), r || c.LINK_CLIENT_CORS_ORIGIN); + }; + }; + r.createMessageEventListener = function createMessageEventListener(t, r, o) { + return function (i) { + var a = (function parseJSON(t) { + try { + return JSON.parse(t); + } catch (t) { + return {}; + } + })(i.data); + for (var u in o) + if (a.action === "".concat(t, "-").concat(r, "::").concat(u)) return o[u](a); + }; + }; + var p = function queryStringFromQueryParameters(t) { + for ( + var r = new URLSearchParams(), o = 0, i = Object.entries(t); + o < i.length; + o++ + ) { + var a = (0, u.default)(i[o], 2), + c = a[0], + l = a[1]; + if (null != l) + if (Array.isArray(l)) { + if (l.length > 0) { + var d, + p = _createForOfIteratorHelper(l); + try { + for (p.s(); !(d = p.n()).done; ) { + var v = d.value; + null != v && r.append(c, v); + } + } catch (t) { + p.e(t); + } finally { + p.f(); + } + } + } else "boolean" == typeof l ? r.append(c, String(l)) : r.append(c, l); + } + return r.toString(); + }; + r.queryStringFromQueryParameters = p; + var v = function uuid() { + var t = window.crypto || window.msCrypto; + return null != t && "randomUUID" in t + ? t.randomUUID() + : "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (t) { + var r = (16 * Math.random()) | 0; + return ("x" === t ? r : (3 & r) | 8).toString(16); + }); + }; + r.uuid = v; + var h = v; + r.default = h; + }, + function (t, r, o) { + "use strict"; + o(1), + Object.defineProperty(r, "__esModule", {value: !0}), + (r.messageHandlerExtensions = r.hooks = void 0); + r.messageHandlerExtensions = {}; + r.hooks = { + getConfig: null, + getQueryParameters: null, + validateCreateOptions: null, + updateLinkURL: null, + emitLinkOpen: null, + }; + }, + function (t, r, o) { + "use strict"; + o(1), + Object.defineProperty(r, "__esModule", {value: !0}), + (r.emitLinkOpen = void 0); + var i = o(231); + r.emitLinkOpen = function emitLinkOpen(t) { + var r = document.createElement("iframe"); + (r.id = "plaid-link-open-iframe"), + (r.title = "Plaid Link Open"), + (r.src = t), + (r.allow = "camera ".concat(i.LINK_IFRAME_FEATURE_POLICY_URLS, ";")), + r.setAttribute("sandbox", i.LINK_IFRAME_SANDBOX_PERMISSIONS), + (r.width = "100%"), + (r.height = "100%"), + (r.style.position = "fixed"), + (r.style.top = "0"), + (r.style.left = "0"), + (r.style.right = "0"), + (r.style.bottom = "0"), + (r.style.zIndex = "9999999999"), + (r.style.borderWidth = "0"), + (r.style.display = "none"), + (r.style.overflowX = "hidden"), + (r.style.overflowY = "auto"), + (r.onload = function () { + r.parentNode && r.parentNode.removeChild(r); + }), + document.body.appendChild(r); + }; + }, + function (t, r, o) { + "use strict"; + o(1); + var i = o(2); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.validateExitOptions = r.validateCreateOptions = void 0); + var a = i(o(11)); + o(118); + var u = o(231), + c = function getValidationHandlers(t) { + var r = t.env; + return { + error: function error(t) { + if ("production" !== r) throw new Error(t); + }, + warn: function warn(t) { + "production" !== r && console.warn(t); + }, + }; + }; + r.validateCreateOptions = function validateCreateOptions(t) { + var r = c(t).error; + !(function validateCreateKeys(t) { + var r = c(t).warn; + for (var o in t) + u.CREATE_PARAMETERS.indexOf(o) < 0 && + r( + "Invalid Link parameter: ".concat( + o, + " is not a valid Plaid.create() parameter" + ) + ); + })(t), + "function" != typeof t.onSuccess && r("Invalid onSuccess function"), + null == t.receivedRedirectUri && + null == t.token && + r("Missing Link parameter. Link requires a token to be provided."); + }; + r.validateExitOptions = function validateExitOptions(t, r) { + var o = c(t).error; + return ( + null == r || + ("object" !== (0, a.default)(r) && + o("Invalid exit parameter, must be an Object")), + null + ); + }; + }, + function (t, r, o) { + "use strict"; + var i = o(495); + o(1), o(3), o(18), Object.defineProperty(r, "__esModule", {value: !0}); + var a = o(1398); + i(a).forEach(function (t) { + "default" !== t && + "__esModule" !== t && + ((t in r && r[t] === a[t]) || + Object.defineProperty(r, t, { + enumerable: !0, + get: function get() { + return a[t]; + }, + })); + }); + }, + function (t, r, o) { + "use strict"; + o(1), + Object.defineProperty(r, "__esModule", {value: !0}), + (r.validateEmbeddedComponentConfiguration = r.validateCreateOptions = void 0), + o(118); + var i = o(1180), + a = function getValidationHandlers(t) { + var r = t.env; + return { + error: function error(t) { + if ("production" !== r) throw new Error(t); + }, + warn: function warn(t) { + "production" !== r && console.warn(t); + }, + }; + }; + r.validateCreateOptions = function validateCreateOptions(t) { + var r = a(t), + o = r.error, + u = r.warn; + !(function validateCreateKeys(t) { + var r = a(t).warn; + for (var o in t) + i.CREATE_PARAMETERS.indexOf(o) < 0 && + r( + "Invalid Link parameter: ".concat( + o, + " is not a valid Plaid.create() parameter" + ) + ); + })(t), + "function" != typeof t.onSuccess && o("Invalid onSuccess function"), + void 0 !== t.forceIframe && + u( + "The forceIframe option has been deprecated. Link will use an iframe by default when possible." + ), + null == t.key && + null == t.token && + null == t.receivedRedirectUri && + o( + "Missing Link parameter. Link requires a key, token, or received redirect URI to be provided." + ); + }; + r.validateEmbeddedComponentConfiguration = + function validateEmbeddedComponentConfiguration(t) { + switch (null == t ? void 0 : t.type) { + case "button": + return {button_component_configuration: {}}; + case "mini_card": + return {mini_card_component_configuration: {}}; + case "institution_select": + return {institution_select_component_configuration: {}}; + case "chip": + return {chip_component_configuration: {}}; + } + return null; + }; + }, + function (t, r) { + (t.exports = function _arrayLikeToArray(t, r) { + (null == r || r > t.length) && (r = t.length); + for (var o = 0, i = new Array(r); o < r; o++) i[o] = t[o]; + return i; + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + , + , + , + , + , + , + , + , + , + , + , + function (t, r, o) { + "use strict"; + o(1), + Object.defineProperty(r, "__esModule", {value: !0}), + (r.default = function determineChainTypeFromChainId(t) { + var r = t.split(":"); + if (r.length < 2) + return "0x" === t.substring(0, 2) ? i.ChainTypes.EVM : i.ChainTypes.Unknown; + switch (r[0]) { + case "solana": + return i.ChainTypes.Solana; + case "eip155": + case "EIP155": + return i.ChainTypes.EVM; + default: + return i.ChainTypes.Unknown; + } + }); + var i = o(1378); + }, + , + function (t, r, o) { + t.exports = o(1453); + }, + function (t, r, o) { + "use strict"; + var i = o(1117), + a = o(1130), + u = o(1146); + o(52), o(44), o(25), o(58), o(1); + var c = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.getProviderByChainType = + r.getInstalledWalletPlugins = + r.getEIP1193ProviderByWalletBrandId = + void 0); + var l = c(o(527)), + d = c(o(588)), + p = c(o(1419)), + v = c(o(1467)), + h = c(o(1471)), + y = c(o(1117)); + o(210), o(3), o(55), o(18), o(24), o(120); + var _, + g, + b, + E = o(1421), + m = c(o(395)), + w = o(1378), + S = c(o(1415)); + function _createForOfIteratorHelper(t, r) { + var o = (void 0 !== a && t[u]) || t["@@iterator"]; + if (!o) { + if ( + Array.isArray(t) || + (o = (function _unsupportedIterableToArray(t, r) { + if (!t) return; + if ("string" == typeof t) return _arrayLikeToArray(t, r); + var o = Object.prototype.toString.call(t).slice(8, -1); + "Object" === o && t.constructor && (o = t.constructor.name); + if ("Map" === o || "Set" === o) return i(t); + if ("Arguments" === o || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)) + return _arrayLikeToArray(t, r); + })(t)) || + (r && t && "number" == typeof t.length) + ) { + o && (t = o); + var c = 0, + l = function F() {}; + return { + s: l, + n: function n() { + return c >= t.length ? {done: !0} : {done: !1, value: t[c++]}; + }, + e: function e(t) { + throw t; + }, + f: l, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." + ); + } + var d, + p = !0, + v = !1; + return { + s: function s() { + o = o.call(t); + }, + n: function n() { + var t = o.next(); + return (p = t.done), t; + }, + e: function e(t) { + (v = !0), (d = t); + }, + f: function f() { + try { + p || null == o.return || o.return(); + } finally { + if (v) throw d; + } + }, + }; + } + function _arrayLikeToArray(t, r) { + (null == r || r > t.length) && (r = t.length); + for (var o = 0, i = new Array(r); o < r; o++) i[o] = t[o]; + return i; + } + var O = [ + "isMetaMask", + "isBraveWallet", + "isCoinbaseWallet", + "isCoinbaseBrowser", + "isRabby", + "__XDEFI", + "isXDEFI", + "isGamestop", + "isBitKeep", + "isBitKeepChrome", + "isMathWallet", + "isTokenary", + "isTally", + "isAlphaWallet", + "isBitpie", + "isBlockWallet", + "isExodus", + "isHbWallet", + "isImToken", + "isLiquality", + "isTrust", + "isTrustWallet", + "isOneInchIOSWallet", + "isOneInchAndroidWallet", + "isTokenPocket", + "isMEWwallet", + "isSequence", + "isDfox", + "isDeficonnectProvider", + "isPhantom", + "isSolflare", + "isGlow", + ].sort(), + x = new p.default( + (0, v.default)( + ((_ = {isMetaMask: "wallet_347"}), + (0, d.default)(_, ["isBraveWallet", "isMetaMask"].toString(), "wallet_375"), + (0, d.default)(_, ["isBraveWallet", "isPhantom"].toString(), "wallet_375"), + (0, d.default)(_, ["__XDEFI", "isXDEFI"].toString(), "wallet_343"), + (0, d.default)(_, ["__XDEFI", "isMetaMask"].toString(), "wallet_343"), + (0, d.default)(_, ["isMetaMask", "isRabby"].toString(), "wallet_353"), + (0, d.default)( + _, + ["isBitKeep", "isBitKeepChrome", "isMetaMask"].toString(), + "wallet_354" + ), + (0, d.default)(_, ["isMathWallet", "isMetaMask"].toString(), "wallet_349"), + (0, d.default)(_, ["isMetaMask", "isTokenary"].toString(), "wallet_351"), + (0, d.default)( + _, + ["isDeficonnectProvider", "isMetaMask"].toString(), + "wallet_356" + ), + (0, d.default)(_, "isCoinbaseWallet", "wallet_374"), + (0, d.default)(_, "isGamestop", "wallet_344"), + (0, d.default)(_, "isTally", "wallet_345"), + (0, d.default)(_, "isBlockWallet", "wallet_340"), + (0, d.default)(_, "isLiquality", "wallet_342"), + (0, d.default)( + _, + ["isDfox", "isMetaMask", "isTokenPocket"].toString(), + "wallet_348" + ), + (0, d.default)(_, ["isTrust", "isTrustWallet"].toString(), "wallet_355"), + (0, d.default)(_, "isPhantom", "wallet_420"), + (0, d.default)(_, ["isPhantom", "isGlow"].toString(), "wallet_411"), + _) + ) + ), + I = [ + { + walletId: "wallet_374", + brandId: "wallet_236", + providerPath: ["coinbaseWalletExtension"], + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_432", + brandId: "wallet_236", + providerPath: ["coinbaseSolana"], + injectedProviderChainType: w.ChainTypes.Solana, + }, + { + walletId: "wallet_345", + brandId: "wallet_233", + providerPath: ["tally"], + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_347", + brandId: "wallet_4", + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_354", + brandId: "wallet_126", + providerPath: ["bitkeep", "ethereum"], + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_344", + brandId: "wallet_232", + providerPath: ["gamestop"], + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_343", + brandId: "wallet_231", + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_349", + brandId: "wallet_13", + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_348", + brandId: "wallet_11", + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_353", + brandId: "wallet_70", + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_340", + brandId: "wallet_229", + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_341", + brandId: "wallet_129", + providerPath: ["exodus", "ethereum"], + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_342", + brandId: "wallet_230", + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_375", + brandId: "wallet_237", + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_375", + brandId: "wallet_237", + providerPath: ["braveSolana"], + injectedProviderChainType: w.ChainTypes.Solana, + }, + { + walletId: "wallet_355", + brandId: "wallet_2", + providerPath: ["trustwallet"], + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_355", + brandId: "wallet_2", + providerPath: ["trustwallet", "solana"], + injectedProviderChainType: w.ChainTypes.Solana, + }, + { + walletId: "wallet_356", + brandId: "wallet_6", + providerPath: ["deficonnectProvider"], + injectedProviderChainType: w.ChainTypes.EVM, + }, + { + walletId: "wallet_426", + brandId: "wallet_273", + providerPath: ["solflare"], + injectedProviderChainType: w.ChainTypes.Solana, + }, + { + walletId: "wallet_411", + brandId: "wallet_264", + providerPath: ["glowSolana"], + injectedProviderChainType: w.ChainTypes.Solana, + }, + ], + P = new p.default( + (0, v.default)( + ((g = {isMetaMask: "wallet_358", isCoinbaseWallet: "wallet_374"}), + (0, d.default)( + g, + ["isCoinbaseBrowser", "isCoinbaseWallet"].toString(), + "wallet_372" + ), + (0, d.default)(g, "isAlphaWallet", "wallet_364"), + (0, d.default)(g, "isBitpie", "wallet_368"), + (0, d.default)(g, "isHbWallet", "wallet_362"), + (0, d.default)(g, "isImToken", "wallet_359"), + (0, d.default)(g, "isTrust", "wallet_365"), + (0, d.default)( + g, + ["isMetaMask", "isOneInchAndroidWallet", "isOneInchIOSWallet"].toString(), + "wallet_361" + ), + (0, d.default)(g, ["isMathWallet", "isMetaMask"].toString(), "wallet_370"), + (0, d.default)(g, ["isBitKeep", "isMetaMask"].toString(), "wallet_371"), + (0, d.default)( + g, + ["isMetaMask", "isTokenPocket", "isTrust"].toString(), + "wallet_360" + ), + (0, d.default)( + g, + ["isMEWwallet", "isMetaMask", "isTrust"].toString(), + "wallet_376" + ), + (0, d.default)(g, "isPhantom", "wallet_433"), + g) + ) + ), + T = new p.default( + (0, v.default)( + ((b = {}), + (0, d.default)(b, w.ChainTypes.EVM, function () { + return window.ethereum; + }), + (0, d.default)(b, w.ChainTypes.Solana, function () { + return window.solana; + }), + b) + ) + ), + A = function getProviderByChainType(t) { + var r = T.get(t.toString()); + if (void 0 !== r) return r(); + }; + r.getProviderByChainType = A; + r.getInstalledWalletPlugins = function getInstalledWalletPlugins(t) { + var r = new h.default(), + o = t ? (0, S.default)(t) : w.ChainTypes.EVM, + i = (0, m.default)().isMobile; + i || + I.forEach(function (t) { + N(t) && t.injectedProviderChainType === o && r.add(t.walletId); + }); + var a = A(o); + if (a) { + var u, + c = _createForOfIteratorHelper(null != a && a.providers ? a.providers : [a]); + try { + var l = function _loop() { + var t = u.value, + o = []; + O.forEach(function (r) { + !0 === t[r] && o.push(r); + }); + var a = i ? P.get(o.toString()) : x.get(o.toString()); + (a && r.has(a)) || + r.add( + a || + (i ? E.UnidentifiedMobileBrowserWallet : E.UnidentifiedPluginWallet) + ); + }; + for (c.s(); !(u = c.n()).done; ) l(); + } catch (t) { + c.e(t); + } finally { + c.f(); + } + } + return ( + r.size > 1 && r.delete("wallet_353"), + r.size > 1 && + (r.delete(E.UnidentifiedMobileBrowserWallet), + r.delete(E.UnidentifiedPluginWallet)), + (0, y.default)(r) + ); + }; + r.getEIP1193ProviderByWalletBrandId = function getEIP1193ProviderByWalletBrandId( + t + ) { + var r = I.filter(function (r) { + return r.brandId === t; + }), + o = (0, m.default)().isMobile; + return 1 !== r.length || o ? window.ethereum : R(r[0]); + }; + var R = function getEIP1193ProviderFromProviderPath(t) { + var r = window.ethereum; + if (t.providerPath || r) { + if (t.providerPath) { + var o = N(t); + return o || void 0; + } + if (r) { + var i, + a = _createForOfIteratorHelper(r.providers ? r.providers : [r]); + try { + var u = function _loop2() { + var r = i.value, + o = []; + if ( + (O.forEach(function (t) { + !0 === r[t] && o.push(t); + }), + x.get(o.toString()) === t.walletId) + ) + return {v: r}; + }; + for (a.s(); !(i = a.n()).done; ) { + var c = u(); + if ("object" === (0, l.default)(c)) return c.v; + } + } catch (t) { + a.e(t); + } finally { + a.f(); + } + } + } + }, + N = function findProvider(t) { + var r; + return null == t || null === (r = t.providerPath) || void 0 === r + ? void 0 + : r.reduce(function (t, r) { + if (t) return t[r]; + }, window); + }; + }, + function (t, r, o) { + t.exports = o(1461); + }, + function (t, r, o) { + var i = o(524), + a = o(666), + u = o(1135)("IE_PROTO"), + c = Object.prototype; + t.exports = + Object.getPrototypeOf || + function (t) { + return ( + (t = a(t)), + i(t, u) + ? t[u] + : "function" == typeof t.constructor && t instanceof t.constructor + ? t.constructor.prototype + : t instanceof Object + ? c + : null + ); + }; + }, + function (t, r, o) { + "use strict"; + o(1), + Object.defineProperty(r, "__esModule", {value: !0}), + (r.WalletConnectBrand = + r.UnidentifiedWalletBrand = + r.UnidentifiedPluginWallet = + r.UnidentifiedMobileBrowserWallet = + r.TrustWalletBrandId = + void 0); + r.UnidentifiedWalletBrand = "wallet_240"; + r.UnidentifiedMobileBrowserWallet = "wallet_380"; + r.UnidentifiedPluginWallet = "wallet_381"; + r.WalletConnectBrand = "wallet_235"; + r.TrustWalletBrandId = "wallet_2"; + }, + , + function (t, r, o) { + var i = o(425).document; + t.exports = i && i.documentElement; + }, + function (t, r, o) { + var i = o(527).default, + a = o(1455); + (t.exports = function _toPropertyKey(t) { + var r = a(t, "string"); + return "symbol" === i(r) ? r : String(r); + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + var i = o(426)("iterator"), + a = !1; + try { + var u = [7][i](); + (u.return = function () { + a = !0; + }), + Array.from(u, function () { + throw 2; + }); + } catch (t) {} + t.exports = function (t, r) { + if (!r && !a) return !1; + var o = !1; + try { + var u = [7], + c = u[i](); + (c.next = function () { + return {done: (o = !0)}; + }), + (u[i] = function () { + return c; + }), + t(u); + } catch (t) {} + return o; + }; + }, + function (t, r, o) { + "use strict"; + var i = o(425), + a = o(323), + u = o(434), + c = o(427), + l = o(426)("species"); + t.exports = function (t) { + var r = "function" == typeof a[t] ? a[t] : i[t]; + c && + r && + !r[l] && + u.f(r, l, { + configurable: !0, + get: function () { + return this; + }, + }); + }; + }, + , + , + , + function (t, r, o) { + o(1384), o(1114), o(1436), o(1437), (t.exports = o(323).Symbol); + }, + function (t, r, o) { + var i = o(667), + a = o(1116), + u = o(728); + t.exports = function (t) { + var r = i(t), + o = a.f; + if (o) + for (var c, l = o(t), d = u.f, p = 0; l.length > p; ) + d.call(t, (c = l[p++])) && r.push(c); + return r; + }; + }, + function (t, r, o) { + var i = o(497), + a = o(1113), + u = o(1433); + t.exports = function (t) { + return function (r, o, c) { + var l, + d = i(r), + p = a(d.length), + v = u(c, p); + if (t && o != o) { + for (; p > v; ) if ((l = d[v++]) != l) return !0; + } else for (; p > v; v++) if ((t || v in d) && d[v] === o) return t || v || 0; + return !t && -1; + }; + }; + }, + function (t, r, o) { + var i = o(1134), + a = Math.max, + u = Math.min; + t.exports = function (t, r) { + return (t = i(t)) < 0 ? a(t + r, 0) : u(t, r); + }; + }, + function (t, r, o) { + var i = o(434), + a = o(523), + u = o(667); + t.exports = o(427) + ? Object.defineProperties + : function defineProperties(t, r) { + a(t); + for (var o, c = u(r), l = c.length, d = 0; l > d; ) + i.f(t, (o = c[d++]), r[o]); + return t; + }; + }, + function (t, r, o) { + var i = o(497), + a = o(1137).f, + u = {}.toString, + c = + "object" == typeof window && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) + : []; + t.exports.f = function getOwnPropertyNames(t) { + return c && "[object Window]" == u.call(t) + ? (function (t) { + try { + return a(t); + } catch (t) { + return c.slice(); + } + })(t) + : a(i(t)); + }; + }, + function (t, r, o) { + o(1133)("asyncIterator"); + }, + function (t, r, o) { + o(1133)("observable"); + }, + function (t, r, o) { + o(1109), o(1115), (t.exports = o(1112).f("iterator")); + }, + function (t, r, o) { + var i = o(1134), + a = o(1129); + t.exports = function (t) { + return function (r, o) { + var u, + c, + l = String(a(r)), + d = i(o), + p = l.length; + return d < 0 || d >= p + ? t + ? "" + : void 0 + : (u = l.charCodeAt(d)) < 55296 || + u > 56319 || + d + 1 === p || + (c = l.charCodeAt(d + 1)) < 56320 || + c > 57343 + ? t + ? l.charAt(d) + : u + : t + ? l.slice(d, d + 2) + : c - 56320 + ((u - 55296) << 10) + 65536; + }; + }; + }, + function (t, r, o) { + "use strict"; + var i = o(1127), + a = o(721), + u = o(1108), + c = {}; + o(525)(c, o(426)("iterator"), function () { + return this; + }), + (t.exports = function (t, r, o) { + (t.prototype = i(c, {next: a(1, o)})), u(t, r + " Iterator"); + }); + }, + function (t, r, o) { + "use strict"; + var i = o(1442), + a = o(1387), + u = o(722), + c = o(497); + (t.exports = o(1138)( + Array, + "Array", + function (t, r) { + (this._t = c(t)), (this._i = 0), (this._k = r); + }, + function () { + var t = this._t, + r = this._k, + o = this._i++; + return !t || o >= t.length + ? ((this._t = void 0), a(1)) + : a(0, "keys" == r ? o : "values" == r ? t[o] : [o, t[o]]); + }, + "values" + )), + (u.Arguments = u.Array), + i("keys"), + i("values"), + i("entries"); + }, + function (t, r) { + t.exports = function () {}; + }, + function (t, r, o) { + var i = o(1444); + t.exports = function (t, r) { + return new (i(t))(r); + }; + }, + function (t, r, o) { + var i = o(483), + a = o(1145), + u = o(426)("species"); + t.exports = function (t) { + var r; + return ( + a(t) && + ("function" != typeof (r = t.constructor) || + (r !== Array && !a(r.prototype)) || + (r = void 0), + i(r) && null === (r = r[u]) && (r = void 0)), + void 0 === r ? Array : r + ); + }; + }, + function (t, r, o) { + o(1446); + var i = o(323).Object; + t.exports = function getOwnPropertyDescriptor(t, r) { + return i.getOwnPropertyDescriptor(t, r); + }; + }, + function (t, r, o) { + var i = o(497), + a = o(1128).f; + o(1383)("getOwnPropertyDescriptor", function () { + return function getOwnPropertyDescriptor(t, r) { + return a(i(t), r); + }; + }); + }, + function (t, r, o) { + o(1448), (t.exports = o(323).Object.keys); + }, + function (t, r, o) { + var i = o(666), + a = o(667); + o(1383)("keys", function () { + return function keys(t) { + return a(i(t)); + }; + }); + }, + function (t, r, o) { + o(1384), (t.exports = o(323).Object.getOwnPropertySymbols); + }, + function (t, r, o) { + o(1451), (t.exports = o(323).Object.getOwnPropertyDescriptors); + }, + function (t, r, o) { + var i = o(405), + a = o(1452), + u = o(497), + c = o(1128), + l = o(1391); + i(i.S, "Object", { + getOwnPropertyDescriptors: function getOwnPropertyDescriptors(t) { + for (var r, o, i = u(t), d = c.f, p = a(i), v = {}, h = 0; p.length > h; ) + void 0 !== (o = d(i, (r = p[h++]))) && l(v, r, o); + return v; + }, + }); + }, + function (t, r, o) { + var i = o(1137), + a = o(1116), + u = o(523), + c = o(425).Reflect; + t.exports = + (c && c.ownKeys) || + function ownKeys(t) { + var r = i.f(u(t)), + o = a.f; + return o ? r.concat(o(t)) : r; + }; + }, + function (t, r, o) { + o(1454); + var i = o(323).Object; + t.exports = function defineProperty(t, r, o) { + return i.defineProperty(t, r, o); + }; + }, + function (t, r, o) { + var i = o(405); + i(i.S + i.F * !o(427), "Object", {defineProperty: o(434).f}); + }, + function (t, r, o) { + var i = o(1456), + a = o(527).default; + (t.exports = function _toPrimitive(t, r) { + if ("object" !== a(t) || null === t) return t; + var o = t[i]; + if (void 0 !== o) { + var u = o.call(t, r || "default"); + if ("object" !== a(u)) return u; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + t.exports = o(1457); + }, + function (t, r, o) { + t.exports = o(1112).f("toPrimitive"); + }, + function (t, r, o) { + var i = o(323), + a = i.JSON || (i.JSON = {stringify: JSON.stringify}); + t.exports = function stringify(t) { + return a.stringify.apply(a, arguments); + }; + }, + function (t, r, o) { + o(1109), o(1460), (t.exports = o(323).Array.from); + }, + function (t, r, o) { + "use strict"; + var i = o(665), + a = o(405), + u = o(666), + c = o(1388), + l = o(1389), + d = o(1113), + p = o(1391), + v = o(1390); + a( + a.S + + a.F * + !o(1425)(function (t) { + Array.from(t); + }), + "Array", + { + from: function from(t) { + var r, + o, + a, + h, + y = u(t), + _ = "function" == typeof this ? this : Array, + g = arguments.length, + b = g > 1 ? arguments[1] : void 0, + E = void 0 !== b, + m = 0, + w = v(y); + if ( + (E && (b = i(b, g > 2 ? arguments[2] : void 0, 2)), + null == w || (_ == Array && l(w))) + ) + for (o = new _((r = d(y.length))); r > m; m++) + p(o, m, E ? b(y[m], m) : y[m]); + else + for (h = w.call(y), o = new _(); !(a = h.next()).done; m++) + p(o, m, E ? c(h, b, [a.value, m], !0) : a.value); + return (o.length = m), o; + }, + } + ); + }, + function (t, r, o) { + o(1114), + o(1109), + o(1115), + o(1462), + o(1463), + o(1465), + o(1466), + (t.exports = o(323).Map); + }, + function (t, r, o) { + "use strict"; + var i = o(1392), + a = o(668), + u = "Map"; + t.exports = o(1147)( + u, + function (t) { + return function Map() { + return t(this, arguments.length > 0 ? arguments[0] : void 0); + }; + }, + { + get: function get(t) { + var r = i.getEntry(a(this, u), t); + return r && r.v; + }, + set: function set(t, r) { + return i.def(a(this, u), 0 === t ? 0 : t, r); + }, + }, + i, + !0 + ); + }, + function (t, r, o) { + var i = o(405); + i(i.P + i.R, "Map", {toJSON: o(1393)("Map")}); + }, + function (t, r, o) { + var i = o(723); + t.exports = function (t, r) { + var o = []; + return i(t, !1, o.push, o, r), o; + }; + }, + function (t, r, o) { + o(1148)("Map"); + }, + function (t, r, o) { + o(1149)("Map"); + }, + function (t, r, o) { + t.exports = o(1468); + }, + function (t, r, o) { + o(1469), (t.exports = o(323).Object.entries); + }, + function (t, r, o) { + var i = o(405), + a = o(1470)(!0); + i(i.S, "Object", { + entries: function entries(t) { + return a(t); + }, + }); + }, + function (t, r, o) { + var i = o(427), + a = o(667), + u = o(497), + c = o(728).f; + t.exports = function (t) { + return function (r) { + for (var o, l = u(r), d = a(l), p = d.length, v = 0, h = []; p > v; ) + (o = d[v++]), (i && !c.call(l, o)) || h.push(t ? [o, l[o]] : l[o]); + return h; + }; + }; + }, + function (t, r, o) { + t.exports = o(1472); + }, + function (t, r, o) { + o(1114), + o(1109), + o(1115), + o(1473), + o(1474), + o(1475), + o(1476), + (t.exports = o(323).Set); + }, + function (t, r, o) { + "use strict"; + var i = o(1392), + a = o(668); + t.exports = o(1147)( + "Set", + function (t) { + return function Set() { + return t(this, arguments.length > 0 ? arguments[0] : void 0); + }; + }, + { + add: function add(t) { + return i.def(a(this, "Set"), (t = 0 === t ? 0 : t), t); + }, + }, + i + ); + }, + function (t, r, o) { + var i = o(405); + i(i.P + i.R, "Set", {toJSON: o(1393)("Set")}); + }, + function (t, r, o) { + o(1148)("Set"); + }, + function (t, r, o) { + o(1149)("Set"); + }, + , + , + , + , + , + , + , + , + , + , + , + , + function (t, r, o) { + t.exports = o(1490); + }, + function (t, r, o) { + "use strict"; + o(1); + var i = o(527), + a = o(1118), + u = o(590), + c = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.default = r.Plaid = void 0), + o(1497); + var l = o(1396), + d = _interopRequireWildcard(o(1509)), + p = _interopRequireWildcard(o(1510)), + v = _interopRequireWildcard(o(1511)), + h = _interopRequireWildcard(o(1401)), + y = o(1180), + _ = o(100), + g = c(o(1512)), + b = o(1515); + function _getRequireWildcardCache(t) { + if ("function" != typeof a) return null; + var r = new a(), + o = new a(); + return (_getRequireWildcardCache = function _getRequireWildcardCache(t) { + return t ? o : r; + })(t); + } + function _interopRequireWildcard(t, r) { + if (!r && t && t.__esModule) return t; + if (null === t || ("object" !== i(t) && "function" != typeof t)) + return {default: t}; + var o = _getRequireWildcardCache(r); + if (o && o.has(t)) return o.get(t); + var a = {}, + c = Object.defineProperty && u; + for (var l in t) + if ("default" !== l && Object.prototype.hasOwnProperty.call(t, l)) { + var d = c ? u(t, l) : null; + d && (d.get || d.set) ? Object.defineProperty(a, l, d) : (a[l] = t[l]); + } + return (a.default = t), o && o.set(t, a), a; + } + (h.messageHandlerExtensions[y.PLAID_INTERNAL_NAMESPACE] = []), + h.messageHandlerExtensions[y.PLAID_INTERNAL_NAMESPACE].push(g.default), + h.messageHandlerExtensions[y.PLAID_INTERNAL_NAMESPACE].push( + d.extendMessageHandlers + ), + h.messageHandlerExtensions[y.PLAID_INTERNAL_NAMESPACE].push( + v.extendMessageHandlers + ), + (h.messageHandlerExtensions[_.PLAID_FLOW_INTERNAL_NAMESPACE] = []), + h.messageHandlerExtensions[_.PLAID_FLOW_INTERNAL_NAMESPACE].push( + p.extendMessageHandlers + ); + var E = {version: _.VERSION, create: l.create, createEmbedded: b.createEmbedded}; + (r.Plaid = E), + void 0 !== window.Plaid && + console.warn( + "Warning: The Plaid link-initialize.js script was embedded more than once. This is an unsupported configuration and may lead to unpredictable behavior. Please ensure Plaid Link is embedded only once per page." + ), + (window.Plaid = E); + var m = d.findScriptTag(); + d.setUp(E, m), (t.exports = E); + var w = E; + r.default = w; + }, + function (t, r, o) { + o(1114), o(1115), o(1492), o(1495), o(1496), (t.exports = o(323).WeakMap); + }, + function (t, r, o) { + "use strict"; + var i, + a = o(425), + u = o(1158)(0), + c = o(1143), + l = o(734), + d = o(1493), + p = o(1494), + v = o(483), + h = o(668), + y = o(668), + _ = !a.ActiveXObject && "ActiveXObject" in a, + g = "WeakMap", + b = l.getWeak, + E = Object.isExtensible, + m = p.ufstore, + wrapper = function (t) { + return function WeakMap() { + return t(this, arguments.length > 0 ? arguments[0] : void 0); + }; + }, + w = { + get: function get(t) { + if (v(t)) { + var r = b(t); + return !0 === r ? m(h(this, g)).get(t) : r ? r[this._i] : void 0; + } + }, + set: function set(t, r) { + return p.def(h(this, g), t, r); + }, + }, + S = (t.exports = o(1147)(g, wrapper, w, p, !0, !0)); + y && + _ && + (d((i = p.getConstructor(wrapper, g)).prototype, w), + (l.NEED = !0), + u(["delete", "has", "get", "set"], function (t) { + var r = S.prototype, + o = r[t]; + c(r, t, function (r, a) { + if (v(r) && !E(r)) { + this._f || (this._f = new i()); + var u = this._f[t](r, a); + return "set" == t ? this : u; + } + return o.call(this, r, a); + }); + })); + }, + function (t, r, o) { + "use strict"; + var i = o(427), + a = o(667), + u = o(1116), + c = o(728), + l = o(666), + d = o(1144), + p = Object.assign; + t.exports = + !p || + o(595)(function () { + var t = {}, + r = {}, + o = Symbol(), + i = "abcdefghijklmnopqrst"; + return ( + (t[o] = 7), + i.split("").forEach(function (t) { + r[t] = t; + }), + 7 != p({}, t)[o] || Object.keys(p({}, r)).join("") != i + ); + }) + ? function assign(t, r) { + for (var o = l(t), p = arguments.length, v = 1, h = u.f, y = c.f; p > v; ) + for ( + var _, + g = d(arguments[v++]), + b = h ? a(g).concat(h(g)) : a(g), + E = b.length, + m = 0; + E > m; + + ) + (_ = b[m++]), (i && !y.call(g, _)) || (o[_] = g[_]); + return o; + } + : p; + }, + function (t, r, o) { + "use strict"; + var i = o(1139), + a = o(734).getWeak, + u = o(523), + c = o(483), + l = o(1140), + d = o(723), + p = o(1158), + v = o(524), + h = o(668), + y = p(5), + _ = p(6), + g = 0, + uncaughtFrozenStore = function (t) { + return t._l || (t._l = new UncaughtFrozenStore()); + }, + UncaughtFrozenStore = function () { + this.a = []; + }, + findUncaughtFrozen = function (t, r) { + return y(t.a, function (t) { + return t[0] === r; + }); + }; + (UncaughtFrozenStore.prototype = { + get: function (t) { + var r = findUncaughtFrozen(this, t); + if (r) return r[1]; + }, + has: function (t) { + return !!findUncaughtFrozen(this, t); + }, + set: function (t, r) { + var o = findUncaughtFrozen(this, t); + o ? (o[1] = r) : this.a.push([t, r]); + }, + delete: function (t) { + var r = _(this.a, function (r) { + return r[0] === t; + }); + return ~r && this.a.splice(r, 1), !!~r; + }, + }), + (t.exports = { + getConstructor: function (t, r, o, u) { + var p = t(function (t, i) { + l(t, p, r, "_i"), + (t._t = r), + (t._i = g++), + (t._l = void 0), + null != i && d(i, o, t[u], t); + }); + return ( + i(p.prototype, { + delete: function (t) { + if (!c(t)) return !1; + var o = a(t); + return !0 === o + ? uncaughtFrozenStore(h(this, r)).delete(t) + : o && v(o, this._i) && delete o[this._i]; + }, + has: function has(t) { + if (!c(t)) return !1; + var o = a(t); + return !0 === o + ? uncaughtFrozenStore(h(this, r)).has(t) + : o && v(o, this._i); + }, + }), + p + ); + }, + def: function (t, r, o) { + var i = a(u(r), !0); + return !0 === i ? uncaughtFrozenStore(t).set(r, o) : (i[t._i] = o), t; + }, + ufstore: uncaughtFrozenStore, + }); + }, + function (t, r, o) { + o(1148)("WeakMap"); + }, + function (t, r, o) { + o(1149)("WeakMap"); + }, + function (t, r, o) { + "use strict"; + var i = o(100); + o.p = i.LINK_CLIENT_URL + "/"; + }, + function (t, r, o) { + "use strict"; + o(21), o(22), o(24), o(12), o(35), o(33), o(1), o(9), o(10), o(29), o(14); + var i = o(2), + a = o(11); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.create = void 0), + o(86), + o(121), + o(3), + o(18); + var u = i(o(26)), + c = i(o(8)), + l = _interopRequireWildcard(o(1499)), + d = _interopRequireWildcard(o(1500)), + p = _interopRequireWildcard(o(1397)), + v = _interopRequireWildcard(o(1398)), + h = o(231), + y = i(o(400)), + _ = i(o(417)), + g = o(1399), + b = o(1400); + function _getRequireWildcardCache(t) { + if ("function" != typeof WeakMap) return null; + var r = new WeakMap(), + o = new WeakMap(); + return (_getRequireWildcardCache = function _getRequireWildcardCache(t) { + return t ? o : r; + })(t); + } + function _interopRequireWildcard(t, r) { + if (!r && t && t.__esModule) return t; + if (null === t || ("object" !== a(t) && "function" != typeof t)) + return {default: t}; + var o = _getRequireWildcardCache(r); + if (o && o.has(t)) return o.get(t); + var i = {}, + u = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var c in t) + if ("default" !== c && Object.prototype.hasOwnProperty.call(t, c)) { + var l = u ? Object.getOwnPropertyDescriptor(t, c) : null; + l && (l.get || l.set) ? Object.defineProperty(i, c, l) : (i[c] = t[c]); + } + return (i.default = t), o && o.set(t, i), i; + } + function ownKeys(t, r) { + var o = Object.keys(t); + if (Object.getOwnPropertySymbols) { + var i = Object.getOwnPropertySymbols(t); + r && + (i = i.filter(function (r) { + return Object.getOwnPropertyDescriptor(t, r).enumerable; + })), + o.push.apply(o, i); + } + return o; + } + function _objectSpread(t) { + for (var r = 1; r < arguments.length; r++) { + var o = null != arguments[r] ? arguments[r] : {}; + r % 2 + ? ownKeys(Object(o), !0).forEach(function (r) { + (0, c.default)(t, r, o[r]); + }) + : Object.getOwnPropertyDescriptors + ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(o)) + : ownKeys(Object(o)).forEach(function (r) { + Object.defineProperty(t, r, Object.getOwnPropertyDescriptor(o, r)); + }); + } + return t; + } + r.create = function create(t) { + var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; + null != v.hooks.validateCreateOptions + ? v.hooks.validateCreateOptions(t) + : (0, b.validateCreateOptions)(t); + var o = Date.now(), + i = !0 === r.forceDesktop, + a = !0 === r.forceMobile, + c = (!i && (0, y.default)().isMobile) || a, + E = p.getUniqueId(), + m = (c ? d : l).create(), + w = _objectSpread({}, t); + delete w.onEvent, delete w.onExit, delete w.onLoad, delete w.onSuccess; + var S = _objectSpread( + { + isMobile: c, + uniqueId: E, + linkOpenId: p.uuid(), + origin: p.getWindowOrigin(), + linkSdkVersion: h.LINK_WEB_SDK_VERSION, + isLinkWebSdk: !0, + }, + null == v.hooks.getConfig ? w : v.hooks.getConfig(t, r) + ), + O = + null == v.hooks.getQueryParameters + ? _objectSpread({}, S) + : v.hooks.getQueryParameters(S), + x = p.buildLinkUrl(O), + I = h.LINK_CLIENT_CORS_ORIGIN; + null != v.hooks.updateLinkURL && + ((x = v.hooks.updateLinkURL(x, S)), (I = v.hooks.updateLinkURL(I, S))); + var P = function performOpen(t) { + p.sendMessage(m, I)(_objectSpread({action: "open"}, t)); + }, + T = function hideViewport() { + (S.linkOpenId = p.uuid()), m.hide(); + }, + A = function sendHeartBeat() { + var t = S.linkOpenId, + r = S.env, + o = S.token; + if (null != t && (null != r || null != o)) + try { + var i = _objectSpread( + _objectSpread({linkOpenId: t}, null != r && {env: r}), + null != o && {token: o} + ), + a = p.buildLinkUrl(i, { + LINK_CLIENT_STABLE_URL: h.LINK_CLIENT_STABLE_URL, + LINK_CLIENT_URL: h.LINK_CLIENT_URL, + LINK_HTML_PATH: h.LINK_OPEN_HTML_PATH, + }); + null != v.hooks.updateLinkURL && (a = v.hooks.updateLinkURL(a, S)), + null != v.hooks.emitLinkOpen + ? v.hooks.emitLinkOpen(a) + : (0, g.emitLinkOpen)(a); + } catch (t) {} + try { + var u, + c = new XMLHttpRequest(), + l = (0, _.default)(null !== (u = S.env) && void 0 !== u ? u : ""); + (c.onerror = function () {}), + c.open("POST", l + "/link/heartbeat", !0), + c.setRequestHeader("Content-Type", "application/json"), + c.send(JSON.stringify({a: !0, b: !0, link_open_id: t})); + } catch (t) {} + }, + R = {}; + R[h.PLAID_INTERNAL_NAMESPACE] = { + exit: function exit(r) { + "function" == typeof t.onExit && t.onExit(r.error, r.metadata), + T(), + (o = null); + }, + event: function event(r) { + "function" == typeof t.onEvent && t.onEvent(r.eventName, r.metadata); + }, + connected: function connected(r) { + t.onSuccess(r.metadata.public_token, r.metadata), T(); + }, + "ready-for-configure": function readyForConfigure() { + p.sendMessage(m, I)({action: "configure", config: S}); + }, + ready: function ready() { + (q = !0), + (G = null != o ? Date.now() - o : null), + z(), + "function" == typeof t.onLoad && t.onLoad(); + }, + resize: function resize(t) { + null != t.height && null != m.resize && m.resize(t.height); + }, + }; + for ( + var N = function _loop() { + var o = (0, u.default)(C[L], 2), + i = o[0]; + o[1].forEach(function (o) { + R[i] = o(R[i] || {}, t, r, m); + }); + }, + L = 0, + C = Object.entries(v.messageHandlerExtensions); + L < C.length; + L++ + ) + N(); + for (var k = [], M = 0, j = Object.entries(R); M < j.length; M++) { + var U = (0, u.default)(j[M], 2), + W = U[0], + D = U[1], + V = p.createMessageEventListener(W, E, D); + window.addEventListener("message", V, !1), k.push(V); + } + var K, + B = function exit(r) { + if (m.isOpen()) { + var o = {config: r}; + (0, b.validateExitOptions)(t, r), + p.sendMessage(m, I)(_objectSpread({action: "exit"}, o)); + } + }, + H = !1, + q = !1, + z = function onReady() {}, + G = null; + m.initialize(x, E); + var Q = function open() { + var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; + if (H) + throw new Error( + "Cannot call open() on Link handler that is already destroyed" + ); + var r = t || S.institution; + t && K !== r && ((S.institution = t || S.institution), (q = !1), m.refresh()), + (K = r), + m.show(), + A(); + var i = Date.now(), + a = null != o ? Date.now() - o : null; + q + ? P({ + institution: t, + openStartedAt: i, + createToOnLoadInterval: G, + createToOpenInterval: a, + linkOpenId: S.linkOpenId, + }) + : (z = function onReady() { + P({ + institution: t, + openStartedAt: i, + createToOnLoadInterval: G, + createToOpenInterval: a, + linkOpenId: S.linkOpenId, + }); + }); + }, + X = function submit(t) { + var r = t; + p.sendMessage(m, I)({action: "submit", data: r}); + }, + Y = function destroy() { + (H = !0), m.destroy(); + for (var t = 0, r = k; t < r.length; t++) { + var o = r[t]; + window.removeEventListener("message", o); + } + }; + return {exit: B, open: Q, submit: X, destroy: Y}; + }; + }, + function (t, r, o) { + "use strict"; + o(1), Object.defineProperty(r, "__esModule", {value: !0}), (r.create = void 0); + var i = o(231); + r.create = function create() { + var t = document.body.style.overflow, + r = null, + o = !1, + a = null, + u = function hide() { + (o = !1), + null != r && (r.style.display = "none"), + (document.body.style.overflow = t), + window.parent.focus(), + null != a && a.focus(); + }; + return { + initialize: function initialize(t, o) { + ((r = document.createElement("iframe")).id = "plaid-link-iframe-".concat(o)), + (r.title = "Plaid Link"), + (r.src = t), + (r.allow = "camera ".concat(i.LINK_IFRAME_FEATURE_POLICY_URLS, ";")), + r.setAttribute("sandbox", i.LINK_IFRAME_SANDBOX_PERMISSIONS), + (r.width = "100%"), + (r.height = "100%"), + (r.style.position = "fixed"), + (r.style.top = "0"), + (r.style.left = "0"), + (r.style.right = "0"), + (r.style.bottom = "0"), + (r.style.zIndex = "9999999999"), + (r.style.borderWidth = "0"), + (r.style.display = "none"), + (r.style.overflowX = "hidden"), + (r.style.overflowY = "auto"), + document.body.appendChild(r); + }, + refresh: function refresh() { + null != r && (r.src += ""); + }, + show: function show() { + (o = !0), + (t = document.body.style.overflow), + (document.body.style.overflow = "hidden"), + (a = document.activeElement), + null != r && + ((r.style.display = "block"), + null != r.contentWindow && r.contentWindow.focus()); + }, + hide: u, + postMessage: function postMessage(t, o) { + null != r && null != r.contentWindow && r.contentWindow.postMessage(t, o); + }, + isOpen: function isOpen() { + return !0 === o; + }, + resize: function resize() {}, + destroy: function destroy() { + var t; + (u(), null != r) && + (null === (t = r.parentElement) || void 0 === t || t.removeChild(r), + (r = null)); + }, + }; + }; + }, + function (t, r, o) { + "use strict"; + o(1); + var i = o(2); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.create = void 0), + o(75), + o(37); + var a = o(231), + u = i(o(400)), + c = "plaid-link-temporary-id", + l = "plaid-link-iframe", + d = "plaid-link-stylesheet", + p = "html" + Array(9).join("#".concat(c)), + v = "\n " + .concat(p, ",\n ") + .concat( + p, + " > body {\n border: 0 !important;\n height: 100% !important;\n margin: 0 !important;\n max-height: auto !important;\n max-width: auto !important;\n min-height: 0 !important;\n min-width: 0 !important;\n padding: 0 !important;\n position: static !important;\n width: auto !important;\n }\n " + ) + .concat(p, " > body > * {\n display: none !important;\n }\n ") + .concat(p, " > body > .") + .concat( + l, + " {\n border: 0 !important;\n height: auto !important;\n min-height: 100% !important;\n width: 100% !important;\n }\n" + ); + r.create = function create() { + var t = null, + r = !1, + o = "", + i = "", + p = "", + h = {x: 0, y: 0}, + y = null, + _ = function hide() { + (r = !1), + t && t.style.setProperty("display", "none", "important"), + (function restoreAllElements() { + var t = document.getElementById(d); + t && t.parentNode && t.parentNode.removeChild(t), + (document.documentElement.id = o), + document.documentElement.style.setProperty(i, p); + })(), + (function restoreScroll() { + window.scrollTo(h.x, h.y); + })(), + window.parent.focus(), + null != y && y.focus(); + }; + return { + refresh: function refresh() { + null != t && (t.src += ""); + }, + hide: _, + initialize: function initialize(r, o) { + ((t = document.createElement("iframe")).className = l), + (t.title = "Plaid Link"), + (t.id = "plaid-link-iframe-".concat(o)), + (t.src = r), + (t.allow = "camera ".concat(a.LINK_IFRAME_FEATURE_POLICY_URLS, ";")), + t.setAttribute("sandbox", a.LINK_IFRAME_SANDBOX_PERMISSIONS), + t.style.setProperty("display", "none", "important"), + document.body.appendChild(t); + }, + isOpen: function isOpen() { + return !0 === r; + }, + postMessage: function postMessage(r, o) { + null != t && null != t.contentWindow && t.contentWindow.postMessage(r, o); + }, + resize: function resize(t) { + document.documentElement.style.setProperty("height", t, "important"); + }, + show: function show() { + r || + ((r = !0), + (y = document.activeElement), + (function saveScroll() { + h = { + x: document.documentElement.scrollLeft, + y: document.documentElement.scrollTop, + }; + })(), + (function hideAllElements() { + (o = document.documentElement.id), + (i = document.documentElement.style.getPropertyValue("height")), + (p = document.documentElement.style.getPropertyPriority("height")); + var t = document.createElement("style"); + (t.id = d), (t.textContent = v); + var r = document.querySelector("head"); + null != r && r.appendChild(t), (document.documentElement.id = c); + })(), + window.scrollTo(0, 0), + t && + ((0, u.default)().isIOSChrome && + setTimeout(function () { + document.body.style.setProperty( + "height", + window.innerHeight + "px", + "important" + ); + }, 100), + t.style.setProperty("display", "block", "important"), + t.contentWindow && t.contentWindow.focus())); + }, + destroy: function destroy() { + var r; + (_(), null != t) && + (null === (r = t.parentElement) || void 0 === r || r.removeChild(t), + (t = null)); + }, + }; + }; + }, + function (t, r, o) { + var i = o(1502), + a = o(1506), + u = o(1507), + c = o(1508); + (t.exports = function _toConsumableArray(t) { + return i(t) || a(t) || u(t) || c(); + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + var i = o(1503), + a = o(1403); + (t.exports = function _arrayWithoutHoles(t) { + if (i(t)) return a(t); + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + t.exports = o(1504); + }, + function (t, r, o) { + o(1505), (t.exports = o(323).Array.isArray); + }, + function (t, r, o) { + var i = o(405); + i(i.S, "Array", {isArray: o(1145)}); + }, + function (t, r, o) { + var i = o(1130), + a = o(1146), + u = o(1117); + (t.exports = function _iterableToArray(t) { + if ((void 0 !== i && null != t[a]) || null != t["@@iterator"]) return u(t); + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + var i = o(1117), + a = o(1403); + (t.exports = function _unsupportedIterableToArray(t, r) { + if (t) { + if ("string" == typeof t) return a(t, r); + var o = Object.prototype.toString.call(t).slice(8, -1); + return ( + "Object" === o && t.constructor && (o = t.constructor.name), + "Map" === o || "Set" === o + ? i(t) + : "Arguments" === o || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o) + ? a(t, r) + : void 0 + ); + } + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r) { + (t.exports = function _nonIterableSpread() { + throw new TypeError( + "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." + ); + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + "use strict"; + o(24), o(3), o(18), o(33), o(1); + var i = o(495), + a = o(591), + u = o(590), + c = o(664), + l = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.setUp = r.findScriptTag = r.extendMessageHandlers = void 0); + var d = l(o(527)), + p = l(o(588)); + o(25), o(58), o(152), o(153), o(154), o(55), o(44), o(37), o(75), o(27), o(52); + var v = o(100); + function ownKeys(t, r) { + var o = i(t); + if (a) { + var c = a(t); + r && + (c = c.filter(function (r) { + return u(t, r).enumerable; + })), + o.push.apply(o, c); + } + return o; + } + function _objectSpread(t) { + for (var r = 1; r < arguments.length; r++) { + var o = null != arguments[r] ? arguments[r] : {}; + r % 2 + ? ownKeys(Object(o), !0).forEach(function (r) { + (0, p.default)(t, r, o[r]); + }) + : c + ? Object.defineProperties(t, c(o)) + : ownKeys(Object(o)).forEach(function (r) { + Object.defineProperty(t, r, u(o, r)); + }); + } + return t; + } + + r.findScriptTag = function findScriptTag() { + for ( + var t = document.getElementsByTagName("script"), r = 0, o = t.length; + r < o; + r += 1 + ) { + return t[r]; + } + throw new Error("Failed to find script"); + }; + r.extendMessageHandlers = function extendMessageHandlers(t, r, o, i) { + return _objectSpread( + _objectSpread({}, t), + {}, + { + acknowledged: function acknowledged() { + var t = document.getElementById(v.PLAID_LINK_BUTTON_ID); + null != t && (t.disabled = !1); + }, + } + ); + }; + var h = new RegExp( + "public-([a-z]+)-".concat( + "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}" + ) + ), + y = function traverse(t, r) { + var o = function _loop(o) { + "object" === (0, d.default)(t[o]) + ? traverse(t[o], function (t, i) { + r([o].concat(t), i); + }) + : r([o], t[o]); + }; + for (var i in t) o(i); + }; + r.setUp = function setUp(t, r) { + var o = r.getAttribute("data-form-id"); + if (null != o) { + var i = document.getElementById(o); + if (null == i) throw new Error("Uncaught Error: Specify a valid data-form-id"); + var a = r.getAttribute("data-api-version"), + u = r.getAttribute("data-client-name"), + c = r.getAttribute("data-product"), + l = r.getAttribute("data-key"), + d = r.getAttribute("data-env"), + p = "true" === r.getAttribute("data-select-account"), + _ = r.getAttribute("data-token"), + g = r.getAttribute("data-webhook"), + b = + null != r.getAttribute("data-longtail") || + null != r.getAttribute("data-long-tail") || + null, + E = t.create({ + apiVersion: a, + clientName: u, + env: d, + isSimpleIntegration: !0, + key: l, + longtail: b, + onSuccess: function onSuccess(t, r) { + y(r, function (t, r) { + var o = + t[0] + + t + .slice(1) + .map(function (t) { + return "[".concat(t, "]"); + }) + .join(""); + i.appendChild( + (function createHiddenInput(t, r) { + var o = document.createElement("input"); + return (o.type = "hidden"), (o.name = t), (o.value = r), o; + })(o, r) + ); + }), + i.submit(); + }, + product: c, + selectAccount: p, + token: _, + webhook: g, + }), + m = document.createElement("button"); + (m.id = v.PLAID_LINK_BUTTON_ID), + (m.textContent = (function isPublicToken(t) { + return null != t && h.test(t); + })(_) + ? "Link your bank account" + : "Relink your bank account"), + (m.onclick = function (t) { + t.preventDefault(), E.open(); + }), + i.appendChild(m); + } + }; + }, + function (t, r, o) { + "use strict"; + o(24), o(3), o(18), o(33), o(1); + var i = o(495), + a = o(591), + u = o(590), + c = o(664), + l = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.extendMessageHandlers = void 0); + var d = l(o(588)); + function ownKeys(t, r) { + var o = i(t); + if (a) { + var c = a(t); + r && + (c = c.filter(function (r) { + return u(t, r).enumerable; + })), + o.push.apply(o, c); + } + return o; + } + function _objectSpread(t) { + for (var r = 1; r < arguments.length; r++) { + var o = null != arguments[r] ? arguments[r] : {}; + r % 2 + ? ownKeys(Object(o), !0).forEach(function (r) { + (0, d.default)(t, r, o[r]); + }) + : c + ? Object.defineProperties(t, c(o)) + : ownKeys(Object(o)).forEach(function (r) { + Object.defineProperty(t, r, u(o, r)); + }); + } + return t; + } + r.extendMessageHandlers = function extendMessageHandlers(t, r, o, i) { + var a = !1; + return _objectSpread( + _objectSpread({}, t), + {}, + { + success: function success(t) { + (a = !0), "function" == typeof r.onSuccess && r.onSuccess("", t.metadata); + }, + exit: function exit(t) { + "function" != typeof r.onExit || a || r.onExit(t.error, t.metadata), + i.hide(); + }, + event: function event(t) { + "function" == typeof r.onEvent && r.onEvent(t.event_name, t.metadata); + }, + } + ); + }; + }, + function (t, r, o) { + "use strict"; + o(24), o(3), o(18), o(33), o(1); + var i = o(495), + a = o(591), + u = o(590), + c = o(664), + l = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), + (r.extendMessageHandlers = void 0); + var d = l(o(588)); + function ownKeys(t, r) { + var o = i(t); + if (a) { + var c = a(t); + r && + (c = c.filter(function (r) { + return u(t, r).enumerable; + })), + o.push.apply(o, c); + } + return o; + } + function _objectSpread(t) { + for (var r = 1; r < arguments.length; r++) { + var o = null != arguments[r] ? arguments[r] : {}; + r % 2 + ? ownKeys(Object(o), !0).forEach(function (r) { + (0, d.default)(t, r, o[r]); + }) + : c + ? Object.defineProperties(t, c(o)) + : ownKeys(Object(o)).forEach(function (r) { + Object.defineProperty(t, r, u(o, r)); + }); + } + return t; + } + r.extendMessageHandlers = function extendMessageHandlers(t, r, o, i) { + return _objectSpread( + _objectSpread({}, t), + {}, + { + result: function result(t) { + "function" == typeof r.onResult && r.onResult(t.incremental_result); + }, + } + ); + }; + }, + function (t, r, o) { + "use strict"; + o(24), o(3), o(18), o(33), o(1); + var i = o(527), + a = o(495), + u = o(591), + c = o(590), + l = o(664), + d = o(1118), + p = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), (r.default = void 0); + var v = p(o(588)), + h = (function _interopRequireWildcard(t, r) { + if (!r && t && t.__esModule) return t; + if (null === t || ("object" !== i(t) && "function" != typeof t)) + return {default: t}; + var o = _getRequireWildcardCache(r); + if (o && o.has(t)) return o.get(t); + var a = {}, + u = Object.defineProperty && c; + for (var l in t) + if ("default" !== l && Object.prototype.hasOwnProperty.call(t, l)) { + var d = u ? c(t, l) : null; + d && (d.get || d.set) ? Object.defineProperty(a, l, d) : (a[l] = t[l]); + } + (a.default = t), o && o.set(t, a); + return a; + })(o(1179)), + y = o(380), + _ = p(o(1513)), + g = p(o(1514)), + b = o(100); + function _getRequireWildcardCache(t) { + if ("function" != typeof d) return null; + var r = new d(), + o = new d(); + return (_getRequireWildcardCache = function _getRequireWildcardCache(t) { + return t ? o : r; + })(t); + } + function ownKeys(t, r) { + var o = a(t); + if (u) { + var i = u(t); + r && + (i = i.filter(function (r) { + return c(t, r).enumerable; + })), + o.push.apply(o, i); + } + return o; + } + function _objectSpread(t) { + for (var r = 1; r < arguments.length; r++) { + var o = null != arguments[r] ? arguments[r] : {}; + r % 2 + ? ownKeys(Object(o), !0).forEach(function (r) { + (0, v.default)(t, r, o[r]); + }) + : l + ? Object.defineProperties(t, l(o)) + : ownKeys(Object(o)).forEach(function (r) { + Object.defineProperty(t, r, c(o, r)); + }); + } + return t; + } + var E = function extendMessageHandlers(t, r, o, i) { + var a, + u = h.sendMessage(i), + c = {chainId: b.MAINNET_HEX_CHAIN_ID, rpcUrl: b.CLOUDFLARE_ETH_MAINNET_URL}; + return _objectSpread( + _objectSpread({}, t), + {}, + { + connected: function connected(r) { + var a = o.web3ConnectorCache; + if (a) { + var u = a.getConnector(); + if (!u) throw new Error("Unexpected state, missing connector"); + u.getProvider().then(function (t) { + if (!o.onProviderSuccess) + throw new Error("Unexpected state, missing onProviderSuccess"); + o.onProviderSuccess(t, r.metadata); + }), + i.hide(); + } else t.connected(r); + }, + "web3-message": function web3MessageHandler(t) { + a || + (a = (function getWeb3Bridge() { + if (o.web3Bridge) { + var t = o.web3Bridge; + return { + then: function then(r) { + return r(t); + }, + }; + } + return (0, _.default)().then(function (t) { + return (0, g.default)().then(function (r) { + return (0, r.validateChainOptionAndChainInformation)(c), new t(c); + }); + }); + })()), + a.then(function (r) { + r.setMessageSender(u), + (r.viewport = i), + t.message !== y.Web3MessageToTopWindow.START_BRIDGE && + r.handleWeb3Message(t); + }); + }, + } + ); + }; + r.default = E; + }, + function (t, r, o) { + "use strict"; + o.r(r), + (r.default = function () { + return Promise.all([o.e(0), o.e(2), o.e(10), o.e(11), o.e(48)]) + .then(o.t.bind(null, 1604, 7)) + .then(function (t) { + return t.Web3Bridge; + }); + }); + }, + function (t, r, o) { + "use strict"; + o.r(r), + (r.default = function () { + return Promise.all([o.e(0), o.e(26)]) + .then(o.t.bind(null, 1602, 7)) + .then(function (t) { + return { + validateChainOptionAndChainInformation: + t.validateChainOptionAndChainInformation, + }; + }); + }); + }, + function (t, r, o) { + "use strict"; + o(24), o(3), o(18), o(33), o(1); + var i = o(527), + a = o(495), + u = o(591), + c = o(590), + l = o(664), + d = o(1118), + p = o(493); + Object.defineProperty(r, "__esModule", {value: !0}), (r.createEmbedded = void 0); + var v = p(o(1380)), + h = p(o(588)), + y = p(o(1516)), + _ = _interopRequireWildcard(o(1179)), + g = o(100), + b = o(1400), + E = _interopRequireWildcard(o(1518)), + m = o(231), + w = p(o(400)), + S = o(1396), + O = o(1180), + x = o(1402), + I = ["embeddedComponentConfiguration"]; + function _getRequireWildcardCache(t) { + if ("function" != typeof d) return null; + var r = new d(), + o = new d(); + return (_getRequireWildcardCache = function _getRequireWildcardCache(t) { + return t ? o : r; + })(t); + } + function _interopRequireWildcard(t, r) { + if (!r && t && t.__esModule) return t; + if (null === t || ("object" !== i(t) && "function" != typeof t)) + return {default: t}; + var o = _getRequireWildcardCache(r); + if (o && o.has(t)) return o.get(t); + var a = {}, + u = Object.defineProperty && c; + for (var l in t) + if ("default" !== l && Object.prototype.hasOwnProperty.call(t, l)) { + var d = u ? c(t, l) : null; + d && (d.get || d.set) ? Object.defineProperty(a, l, d) : (a[l] = t[l]); + } + return (a.default = t), o && o.set(t, a), a; + } + function ownKeys(t, r) { + var o = a(t); + if (u) { + var i = u(t); + r && + (i = i.filter(function (r) { + return c(t, r).enumerable; + })), + o.push.apply(o, i); + } + return o; + } + function _objectSpread(t) { + for (var r = 1; r < arguments.length; r++) { + var o = null != arguments[r] ? arguments[r] : {}; + r % 2 + ? ownKeys(Object(o), !0).forEach(function (r) { + (0, h.default)(t, r, o[r]); + }) + : l + ? Object.defineProperties(t, l(o)) + : ownKeys(Object(o)).forEach(function (r) { + Object.defineProperty(t, r, c(o, r)); + }); + } + return t; + } + r.createEmbedded = function createEmbedded(t, r) { + var o = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, + i = t.embeddedComponentConfiguration, + a = (0, y.default)(t, I); + (0, b.validateCreateOptions)(a); + var u = _.getUniqueId(), + c = "embedded_".concat(u), + l = E.create(r), + d = (0, x.validateEmbeddedComponentConfiguration)(i), + p = _objectSpread( + _objectSpread({}, a), + {}, + { + isEmbedded: !0, + isEmbeddedLink: !0, + isLinkInitialize: !0, + useMockFingerprint: o.useMockFingerprint, + }, + !0 === o.forceDarkMode && {forceDarkMode: o.forceDarkMode} + ), + h = _objectSpread({}, p); + delete h.onEvent, delete h.onExit, delete h.onLoad, delete h.onSuccess; + var P, + T = (0, w.default)().isMobile, + A = _objectSpread( + { + isMobile: T, + uniqueId: c, + origin: _.getWindowOrigin(), + linkSdkVersion: m.LINK_WEB_SDK_VERSION, + isLinkWebSdk: !0, + }, + h + ), + R = { + ready: function ready() { + _.sendMessage(l)({action: "open"}); + }, + "ready-for-configure": function readyForConfigure() { + _.sendMessage(l)({ + action: "configure", + config: + null != d ? _objectSpread({embeddedComponentConfiguration: d}, A) : A, + }); + }, + "internal-event": function internalEvent(t) { + var r = t.event.start_link.link_token_configuration, + i = r.institution_id, + u = r.embedded_workflow_session_id; + null != P && P.destroy(), + (o.embeddedWorkflowSessionId = u), + (o.embeddedOpenLinkConfiguration = r.embedded_open_link_configuration), + (P = (0, S.create)(a, o)).open(i); + }, + }, + N = [], + L = _.createMessageEventListener(O.PLAID_INTERNAL_NAMESPACE, c, R); + window.addEventListener("message", L, !1), N.push(L); + var C = function destroy() { + l.destroy(); + for (var t = 0, r = N; t < r.length; t++) { + var o = r[t]; + window.removeEventListener("message", o); + } + P && P.destroy(); + }, + k = _objectSpread( + _objectSpread({}, A), + {}, + {experimentVariants: (0, v.default)(a.experimentVariants), version: g.VERSION} + ), + M = _.buildLinkUrl(k); + return l.initialize(M, c), {destroy: C}; + }; + }, + function (t, r, o) { + var i = o(591), + a = o(1517); + (t.exports = function _objectWithoutProperties(t, r) { + if (null == t) return {}; + var o, + u, + c = a(t, r); + if (i) { + var l = i(t); + for (u = 0; u < l.length; u++) + (o = l[u]), + r.indexOf(o) >= 0 || + (Object.prototype.propertyIsEnumerable.call(t, o) && (c[o] = t[o])); + } + return c; + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + var i = o(495); + (t.exports = function _objectWithoutPropertiesLoose(t, r) { + if (null == t) return {}; + var o, + a, + u = {}, + c = i(t); + for (a = 0; a < c.length; a++) (o = c[a]), r.indexOf(o) >= 0 || (u[o] = t[o]); + return u; + }), + (t.exports.__esModule = !0), + (t.exports.default = t.exports); + }, + function (t, r, o) { + "use strict"; + o(1), Object.defineProperty(r, "__esModule", {value: !0}), (r.create = void 0); + var i = o(231); + r.create = function create(t) { + var r = null; + return { + refresh: function refresh() { + null != r && (r.src += ""); + }, + initialize: function initialize(o, a) { + ((r = document.createElement("iframe")).id = + "plaid-embedded-link-iframe-".concat(a)), + (r.title = "Plaid Link"), + (r.src = o), + (r.allow = "".concat(i.LINK_IFRAME_FEATURE_POLICY_URLS, ";")), + (r.width = "100%"), + (r.height = "100%"), + (r.style.borderWidth = "0"), + t.replaceChildren.apply(t, [r]); + }, + show: function show() {}, + hide: function hide() {}, + postMessage: function postMessage(t, o) { + null != r && null != r.contentWindow && r.contentWindow.postMessage(t, o); + }, + isOpen: function isOpen() { + return !0; + }, + resize: function resize() {}, + destroy: function destroy() { + var t; + null != r && + (null === (t = r.parentElement) || void 0 === t || t.removeChild(r), + (r = null)); + }, + }; + }; + }, +]); diff --git a/account_statement_import_online_plaid/tests/__init__.py b/account_statement_import_online_plaid/tests/__init__.py new file mode 100644 index 0000000000..9b69b5907e --- /dev/null +++ b/account_statement_import_online_plaid/tests/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_plaid_interface +from . import test_account_statement_import_online_plaid diff --git a/account_statement_import_online_plaid/tests/test_account_statement_import_online_plaid.py b/account_statement_import_online_plaid/tests/test_account_statement_import_online_plaid.py new file mode 100644 index 0000000000..17c33eaf58 --- /dev/null +++ b/account_statement_import_online_plaid/tests/test_account_statement_import_online_plaid.py @@ -0,0 +1,206 @@ +# Copyright 2024 Binhex - Adasat Torres de León. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import datetime +from unittest.mock import MagicMock, patch + +from odoo.tests import common + +TRANSACTIONS = [ + { + "account_id": "Qxm5dj75QXuBe5QVPAwbIN1PgEMExnCGroLgv", + "account_owner": None, + "amount": 500.0, + "authorized_date": None, + "authorized_datetime": None, + "category": ["Food and Drink", "Restaurants"], + "category_id": "13005000", + "check_number": None, + "counterparties": [], + "date": datetime.date(2024, 6, 20), + "datetime": None, + "iso_currency_code": "USD", + "location": { + "address": None, + "city": None, + "country": None, + "lat": None, + "lon": None, + "postal_code": None, + "region": None, + "store_number": None, + }, + "logo_url": None, + "merchant_entity_id": None, + "merchant_name": None, + "name": "Tectra Inc", + "payment_channel": "in store", + "payment_meta": { + "by_order_of": None, + "payee": None, + "payer": None, + "payment_method": None, + "payment_processor": None, + "ppd_id": None, + "reason": None, + "reference_number": None, + }, + "pending": False, + "pending_transaction_id": None, + "personal_finance_category": { + "confidence_level": "LOW", + "detailed": "ENTERTAINMENT_SPORTING_EVENTS_AMUSEMENT_PARKS_AND_MUSEUMS", + "primary": "ENTERTAINMENT", + }, + "transaction_code": None, + "transaction_id": "Mro5zaR59jCV95J8gNedi4LjoLE76qCL6MMEe", + "transaction_type": "place", + "unofficial_currency_code": None, + "website": None, + }, + { + "account_id": "Qxm5dj75QXuBe5QVPAwbIN1PgEMExnCGroLgv", + "account_owner": None, + "amount": 30.0, + "authorized_date": None, + "authorized_datetime": None, + "category": ["Food and Drink", "Restaurants"], + "category_id": "13005000", + "check_number": None, + "counterparties": [], + "date": datetime.date(2024, 5, 7), + "datetime": None, + "iso_currency_code": "USD", + "location": { + "address": None, + "city": None, + "country": None, + "lat": None, + "lon": None, + "postal_code": None, + "region": None, + "store_number": None, + }, + "logo_url": None, + "merchant_entity_id": None, + "merchant_name": None, + "name": "Tectra Inc 2", + "payment_channel": "in store", + "payment_meta": { + "by_order_of": None, + "payee": None, + "payer": None, + "payment_method": None, + "payment_processor": None, + "ppd_id": None, + "reason": None, + "reference_number": None, + }, + "pending": False, + "pending_transaction_id": None, + "personal_finance_category": { + "confidence_level": "LOW", + "detailed": "ENTERTAINMENT_SPORTING_EVENTS_AMUSEMENT_PARKS_AND_MUSEUMS", + "primary": "ENTERTAINMENT", + }, + "transaction_code": None, + "transaction_id": "Mro5zaR59jCV95J8gNedi4LjoLE76qCL6MMEu", + "transaction_type": "place", + "unofficial_currency_code": None, + "website": None, + }, +] + +EMPTY_TRANSACTIONS = [] + + +class TestAccountStatementImportOnlinePlaid(common.TransactionCase): + post_install = True + + def setUp(self): + super().setUp() + + self.now = datetime.datetime.now() + self.currency_eur = self.env.ref("base.EUR") + self.currency_usd = self.env.ref("base.USD") + self.AccountJournal = self.env["account.journal"] + self.ResPartnerBank = self.env["res.partner.bank"] + self.OnlineBankStatementProvider = self.env["online.bank.statement.provider"] + self.AccountBankStatement = self.env["account.bank.statement"] + self.AccountBankStatementLine = self.env["account.bank.statement.line"] + self.AccountStatementPull = self.env["online.bank.statement.pull.wizard"] + + self.currency_eur.write({"active": True}) + + self.bank_account = self.ResPartnerBank.create( + { + "acc_number": "FR0214508000302245362775K46", + "partner_id": self.env.user.company_id.partner_id.id, + } + ) + self.journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "bank_account_id": self.bank_account.id, + } + ) + self.provider = self.OnlineBankStatementProvider.create( + { + "name": "plaid Provider", + "service": "plaid", + "username": "username", + "password": "password", + "plaid_host": "sandbox", + "plaid_access_token": "access_token", + "journal_id": self.journal.id, + # To get all the moves in a month at once + "statement_creation_mode": "monthly", + } + ) + + @patch("plaid.api.plaid_api.PlaidApi.transactions_get") + def test_import_online_bank_statement_plaid(self, trasactions_get): + trasactions_get.return_value = { + "transactions": TRANSACTIONS, + "total_transactions": len(TRANSACTIONS), + } + vals = { + "date_since": datetime.datetime(2024, 5, 1), + "date_until": datetime.datetime(2024, 6, 30), + } + wizard = ( + self.env["online.bank.statement.pull.wizard"] + .with_context( + active_model="account.journal", + active_id=self.journal.id, + ) + .create(vals) + ) + wizard.action_pull() + statements = self.env["account.bank.statement"].search( + [("journal_id", "=", self.journal.id)] + ) + self.assertEqual(len(statements), 2) + lines = statements.line_ids + self.assertEqual(len(lines), 2) + self.assertEqual(lines[0].amount, -500.0) + self.assertEqual(lines[1].amount, -30.0) + + def test_get_services(self): + services = self.provider._get_available_services() + self.assertTrue(services) + self.assertIn(("plaid", "Plaid.com"), services) + + @patch("plaid.api.plaid_api.PlaidApi.link_token_create") + def test_action_sycn_with_plaid(self, link_token_create): + link_token_create.return_value = MagicMock( + to_dict=lambda: {"link_token": "isalinktoken", "expiration": "isadate"} + ) + action = self.provider.action_sync_with_plaid() + self.assertTrue(action) + self.assertEqual(action["type"], "ir.actions.client") + self.assertEqual(action["tag"], "plaid_login") + self.assertEqual(action["params"]["token"], "isalinktoken") diff --git a/account_statement_import_online_plaid/tests/test_plaid_interface.py b/account_statement_import_online_plaid/tests/test_plaid_interface.py new file mode 100644 index 0000000000..9b3286e620 --- /dev/null +++ b/account_statement_import_online_plaid/tests/test_plaid_interface.py @@ -0,0 +1,140 @@ +# Copyright 2024 Binhex - Adasat Torres de León. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import datetime +from unittest.mock import MagicMock, patch + +import plaid +from dateutil.relativedelta import relativedelta + +from odoo.exceptions import ValidationError +from odoo.tests import common + +from .test_account_statement_import_online_plaid import TRANSACTIONS + + +class TestPlaidInterface(common.TransactionCase): + post_install = True + + def test_get_host(self): + """Test getting Plaid host.""" + interface_model = self.env["plaid.interface"] + self.assertEqual( + interface_model._get_host("sandbox"), plaid.Environment.Sandbox + ) + self.assertEqual( + interface_model._get_host("production"), plaid.Environment.Production + ) + self.assertFalse(interface_model._get_host("nonexistent")) + + @patch("plaid.api.plaid_api.PlaidApi") + def test_client(self, PlaidApi): + interface_model = self.env["plaid.interface"] + PlaidApi.return_value = MagicMock() + client = interface_model._client("client_id", "secret", "sandbox") + self.assertTrue(client) + + @patch( + "plaid.api.plaid_api.PlaidApi", + side_effect=plaid.ApiException("INVALID_SECRET", "This secret is invalid"), + ) + def test_client_error(self, PlaidApi): + interface_model = self.env["plaid.interface"] + self.assertRaises( + ValidationError, interface_model._client, "client_id", "secret2", "sandbox" + ) + + @patch("plaid.api.plaid_api.PlaidApi.link_token_create") + def test_link(self, link_token_create): + interface_model = self.env["plaid.interface"] + link_token_create.return_value = MagicMock( + to_dict=lambda: {"link_token": "isalinktoken", "expiration": "isadate"} + ) + client = interface_model._client("client_id", "secret", "sandbox") + link = interface_model._link( + client=client, + language="en", + country_code="US", + company_name="company", + products=["transactions"], + ) + self.assertTrue(link) + self.assertEqual(link, "isalinktoken") + + @patch( + "plaid.api.plaid_api.PlaidApi.link_token_create", + side_effect=plaid.ApiException( + "INVALID_CLIENT_ID", "This client id is invalid" + ), + ) + def test_link_error(self, link_token_create): + interface_model = self.env["plaid.interface"] + client = interface_model._client("client_id", "secret", "sandbox") + self.assertRaises( + ValidationError, + interface_model._link, + client, + "en", + "US", + "company", + ["transactions"], + ) + + @patch("plaid.api.plaid_api.PlaidApi.item_public_token_exchange") + def test_login(self, item_public_token_exchange): + interface_model = self.env["plaid.interface"] + item_public_token_exchange.return_value = MagicMock( + to_dict=lambda: {"access_token": "isaccesstoken"} + ) + client = interface_model._client("client_id", "secret", "sandbox") + public_token = "isapulbictoken" + access_token = interface_model._login(client, public_token) + self.assertTrue(access_token) + + @patch( + "plaid.api.plaid_api.PlaidApi.item_public_token_exchange", + side_effect=plaid.ApiException("INVALID_PUBLIC_TOKEN", "This token is invalid"), + ) + def test_login_error(self, item_public_token_exchange): + interface_model = self.env["plaid.interface"] + client = interface_model._client("client_id", "secret", "sandbox") + public_token = "isapulbictoken" + self.assertRaises(ValidationError, interface_model._login, client, public_token) + + @patch("plaid.api.plaid_api.PlaidApi.transactions_get") + def test_get_transactions(self, transactions_get): + interface_model = self.env["plaid.interface"] + client = interface_model._client("client_id", "secret", "sandbox") + transactions_get.return_value = { + "transactions": TRANSACTIONS, + "total_transactions": len(TRANSACTIONS), + } + + access_token = "isaccesstoken" + start_date = datetime.datetime.now() - relativedelta(months=1) + end_date = datetime.datetime.now() + res = interface_model._get_transactions( + client, access_token, start_date, end_date + ) + + self.assertTrue(res) + + @patch( + "plaid.api.plaid_api.PlaidApi.transactions_get", + side_effect=plaid.ApiException( + "INVALID_ACCESS_TOKEN", "This access token is invalid" + ), + ) + def test_get_transactions_error(self, transactions_get): + interface_model = self.env["plaid.interface"] + client = interface_model._client("client_id", "secret", "sandbox") + access_token = "isaccesstoken" + start_date = datetime.datetime.now() - relativedelta(months=1) + end_date = datetime.datetime.now() + self.assertRaises( + ValidationError, + interface_model._get_transactions, + client, + access_token, + start_date, + end_date, + ) diff --git a/account_statement_import_online_plaid/views/online_bank_statement_provider.xml b/account_statement_import_online_plaid/views/online_bank_statement_provider.xml new file mode 100644 index 0000000000..c5caa26760 --- /dev/null +++ b/account_statement_import_online_plaid/views/online_bank_statement_provider.xml @@ -0,0 +1,48 @@ + + + + online.bank.statement.provider.form + online.bank.statement.provider + + + + + + + + + + + +