> ## Documentation Index
> Fetch the complete documentation index at: https://docs-staging-docs-5625.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Node 12および16からNode 18への移行

> Node.js v12、16からNode.js v18への移行で影響を受けるAuth0 Actionsアイテムについて説明します。

Node.js 12および16の長期サポート（LTS）は、2023年に終了しました。つまり、Node.js開発チームが、重要なセキュリティ修正をこれらのバージョンにバックポートしないことを意味します。Node 12または16のランタイムで実行することは、拡張コードをセキュリティ脆弱性にさらす可能性があります。

Node 18の拡張ランタイムは、弊社の一連の拡張オファリングにおいて、一般利用可能（GA）です。これにはアクション、ルール、フック、データベーススクリプト、カスタムソーシャル接続が含まれます。コードセキュリティのベストプラクティスに従うために、できるだけ早くNode 18にアップデートすることを強くお勧めします。

## 一般的な考慮事項

### RulesおよびHooksをActionsに移行する

廃止された拡張ランタイムを使用している場合は、（Node 18）Actionsに移行する機会として、RulesおよびHooksの実装を確認することをお勧めします。[Actionsの制限](/docs/ja-jp/customize/actions/limitations)を確認して、Actionsに移行できるRulesおよびHooksを判断してください。RulesおよびHooksをActionsに移行する方法については、「[Actionsへの移行](/docs/ja-jp/customize/actions/migrate)」をご覧ください。

### Marketplaceの統合

#### ソーシャル接続の統合

Nodeランタイムバージョンの変更が影響を与える可能性があるソーシャル接続の全リストを確認するには、[Management API](/docs/ja-jp/api/management/v2)を使用します。特に、カスタムソーシャル接続として明示的に作成されたものか、Marketplaceを通して最初に追加されたものかを問わず、影響を受ける可能性があるソーシャル接続はすべて、`oauth1`か`oauth2`のいずれかの値の`strategy`属性を持ちます。

`GET`接続<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=management-api" tip="Management API: 顧客が管理タスクを実行できるようにするための製品。" cta="用語集の表示">Management API</Tooltip>エンドポイントを使用して、ある特定のテナント内での既存のカスタムソーシャル接続すべてをページネーションできます。たとえば、以下のクエリオプションは、最大100のカスタムソーシャル接続の名前と識別子を返します。

```lines theme={null}
/api/v2/connections?strategy=oauth1&strategy=oauth2&include_totals=true&fields=name&per_page=100
```

<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=auth0-dashboard" tip="Auth0 Dashboard: サービスを構成するためのAuth0の主製品。" cta="用語集の表示">Auth0 Dashboard</Tooltip>は、Marketplaceを通して追加されたカスタムソーシャル接続のスクリプトの更新を許可しません。スクリプトの変更がNode 18との互換性を必要とする場合は、Management APIを使用する必要があります。

## 移行タスク

### 新しいカスタムActionsを作成する

Auth0 Dashboardを通してNode 18で新しいカスタムActionsを作成するには、

1. [［Auth0 Dashboard］>［Actions（アクション）］>［Library（ライブラリー）］](https://manage.auth0.com/#/dashboard/actions/library)に移動します。
2. **［Create Action（Actionを作成）］>［Build from scratch（初めから構築する）］** の順に選択します。
3. **［Runtime\*（ランタイム）］** フィールドで、**Node 18 (Recommended)（Node 18（推奨））** を選択します。
4. Node 18にカスタムActionsを記述し、テストして、準備が完了したらデプロイします。

### 既存のカスタムActionsをアップグレード

Node 12または16で構築された既存のカスタムActionsをNode 18に個々にアップグレードでき、また古いランタイムを使用して[前のバージョンに戻す](/docs/ja-jp/customize/actions/manage-versions#revert-actions)ことができます。ActionsをNode 18にアップグレードするには、必要な変更を加えて、ランタイムでNode 18が使用されるように設定して、既存の実装の新しいバージョンを作成してデプロイします。

### 他の拡張製品のためにNode 18を選択する

残りの（Actions以外の）拡張オファリングに使用されるランタイムは、テナントの詳細設定レベルでグローバルに定義されます。この設定を変更すると、同時に以下の機能性に影響を及ぼします。

* ルール
* フック
* カスタムデータベースのスクリプト
* カスタムソーシャル接続のスクリプト

Auth0 Dashboardでテナントの拡張ランタイム設定を変更するには、

1. **［Dashboard］>［Settings（設定）］>［Advanced（詳細設定）］** に移動します。
2. **［Extensibility（拡張）］** セクションにスクロールします。
3. **［Runtime（ランタイム）］** で、**Node 18** を選択します。

これが複数の拡張機能に同時に影響を与えるグローバル設定の場合、最初に開発テナントでこのステップを実施し、該当するすべての拡張機能のテストを完了し、開発で問題がみられない場合のみ、運用テナントに進むことをお勧めします。

Node 12拡張ランタイムは、拡張コードで明示的に要求することなく特定の`npm`モジュールを使用することをサポートしています。Node 16ランタイムから、弊社は、以下のモジュールのこの種類の使用法に対するサポートを終了しました。

## 既知の破壊的変更

### マジックnpmモジュール

まだNode 12で実行している拡張がある場合、コードをNode 18に直接アップデートする時には、上記を考慮してください。モジュールを使用する前に、明示的に要求されていることを必ず確認してください。

* \_
* async
* Auth0
* azure\_storage
* bcrypt
* crypto
* couchbase
* cql
* ip
* <Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=json-web-token" tip="JSON Web Token（JWT）: 二者間のクレームを安全に表現するために使用される標準IDトークン形式（および多くの場合、アクセストークン形式）。" cta="用語集の表示">jwt</Tooltip>
* Knex
* mongo
* mysql
* mysql\_pool
* ObjectID
* pbkdf2
* pg
* postgres
* Pubnub
* q
* querystring
* sqlserver
* uuid
* xml2js
* xmldom
* xpath
* xtend

Rules、カスタムデータベース接続、カスタムソーシャル接続においては、[Node 18に利用可能だと記載されている](https://auth0-extensions.github.io/canirequire/)モジュールのバージョンを明示的に要求する必要があります。

HooksおよびActionsにおいては、モジュールを要求する前に、明示的な依存関係として意図された対象バージョンを追加する必要があります。

[Can I Require](https://auth0-extensions.github.io/canirequire/)のNode 18ランタイムについて以下にリストした特定のバージョンのモジュールに対するサポートを終了しました。この変更は、Rules、カスタムデータベース接続スクリプト、カスタムソーシャル接続スクリプトに関連する拡張コードに影響を与えます。

### Can I Requireモジュールバージョンの削除

<Warning>
  次のカスタムソーシャル接続（[Indeed](https://marketplace.auth0.com/integrations/indeed-social-connection)、[monday.com](https://marketplace.auth0.com/integrations/monday-com-monday-com-social-connection)、[Snapchat](https://marketplace.auth0.com/integrations/snapchat-social-connection)、および[Tumblr](https://marketplace.auth0.com/integrations/tumblr-social-connection)）のユーザープロファイルの取得スクリプトは、Marketplaceで利用可能で、`0.22.0`バージョンの`axios`モジュールを使用していましたが、Node 18では利用できません。これらの接続のいずれかを使用する場合は、必要に応じて[Management API](/docs/ja-jp/api/management/v2)を通じてそのスクリプトを確認し、更新してください。
</Warning>

| モジュール | バージョン |
| - | - |
| @analytics/google-analytics | 0.4.0 |
| @auth0/hapi | 13.5.1, 13.6.0 |
| @auth0/rule-utilities | 0.1.0 |
| @gitbeaker/node | 17.0.1 |
| @incognia/api | 1.0.0 |
| @octokit/rest | 15.8.2 |
| @sentry/node | 5.6.2, 5.15.5, 6.2.0 |
| acorn | 1.2.2 |
| airbrake | 1.0.2 |
| airgram | 3.1.1 |
| ajv | 6.10.1 |
| amazon-dax-client | 1.2.2 |
| amazon-mws-node | 1.0.3 |
| analytics | 0.5.1 |
| analytics-node | 2.0.1, 3.5.0 |
| applicationinsights | 0.15.8, 0.18.0, 1.5.0, 1.8.8 |
| async | 1.0.0, 0.9.0, 2.1.2, 2.6.1 |
| auth0 | 2.4.0, 2.1.0, 2.0.0, 0.8.2, 2.6.0, 2.7.0, 2.8.0, 2.9.1, 2.13.0, 2.17.0, 2.17.1, 2.19.0, 2.23.0, 2.27.0, 2.27.1, 2.30.0, 2.31.0, 2.32.0, 2.34.2, 2.35.0, 2.36.1, 2.36.2, 2.39.0, 3.0.1 |
| auth0-authz-rules-api | 4.0.0 |
| auth0-ext-template-renderers | 0.4.2 |
| auth0-extension-express-tools | 1.0.2, 1.1.5, 1.1.6, 2.0.0 |
| auth0-extension-hapi-tools | 1.0.0, 1.1.0, 1.2.0, 1.2.1, 1.2.2, 1.3.0 |
| auth0-extension-tools | 1.0.0, 1.2.1, 1.3.1, 1.3.2, 1.4.0 |
| auth0-magic | 3.1.0 |
| auth0-oauth2-express | 0.0.1, 0.0.3, 1.1.5 |
| auth0-source-control-extension-tools | 3.0.10, 3.0.9, 3.1.4, 3.4.0, 3.5.1, 4.0.3, 4.0.5, 4.0.6, 4.0.7, 4.1.1, 4.1.2, 4.1.3, 4.1.5, 4.1.7, 4.1.9 |
| aws-sdk | 2.2.30, 2.1.31, 2.1.13, 2.4.13, 2.5.3, 2.197.0, 2.291.0, 2.458.0, 2.593.0 |
| axios | 0.15.2, 0.18.0, 0.19.2, 0.21.1, 0.21.3, 0.22.0, 0.27.2 |
| azure | 0.10.6 |
| azure-storage | 0.4.4, 0.4.1, 0.9.0 |
| babel | 5.4.7, 5.1.9 |
| bcrypt | 4.0.0 |
| bluebird | 2.9.26, 3.4.6 |
| body-parser | 1.12.4 |
| boom | 2.7.2 |
| botbuilder | 0.9.0 |
| bson | 0.3.2, 4.4.0 |
| cookie-parser | 1.3.5 |
| datadog-metrics | 0.8.2, 0.9.0, 0.9.2, 0.9.3 |
| disposable-email-domains | 1.0.14, 1.0.15, 1.0.56 |
| dockerode | 2.1.4, 2.0.3 |
| dotenv | 0.4.0, 2.0.0 |
| easy-pbkdf2 | 0.0.2 |
| ejs | 2.3.1 |
| engine.io-client | 1.5.1 |
| express | 4.12.4, 4.14.0, 4.16.3 |
| express-jwt | 3.1.0, 5.1.0 |
| faunadb | 2.11.1, 4.1.1 |
| filter-object | 2.1.0 |
| firebase | 7.12.0 |
| firebase-admin | 4.0.4, 5.0.0, 6.0.0, 8.0.0, 8.12.1 |
| form-data | 0.2.0 |
| getstream | 3.4.1 |
| gitlab | 1.7.0 |
| google-auth-library | 1.0.0 |
| google-libphonenumber | 2.0.7, 3.2.8, 3.2.10 |
| googleapis | 2.1.6, 34.0.0 |
| got | 3.2.0, 9.2.1, 10.7.0, 11.3.0, 11.5.2 |
| hapi | 13.5.0 |
| hapi-auth-jwt2 | 7.0.1 |
| hapi-swagger | 7.4.0 |
| hoek | 2.14.0 |
| http-proxy | 1.11.1 |
| ibm\_db | 2.6.4 |
| ip | 0.3.2, 0.0.1 |
| ipaddr.js | 1.0.1 |
| joi | 6.10.1 |
| jose | 3.19.0 |
| jsforce | 1.6.0 |
| jsonwebtoken | 5.7.0, 5.0.1, 5.0.0, 7.1.9, 8.5.0 |
| jwks-rsa | 1.0.0, 1.1.1, 1.6.0 |
| ldapjs | 1.0.0 |
| lodash | 3.10.1, 3.9.3, 2.4.1, 4.8.2, 4.17.10, 4.17.19 |
| lru-cache | 2.6.4 |
| mixpanel | 0.4.0 |
| mkdirp | 0.5.1 |
| moment | 2.10.3, 2.11.2 |
| mongodb | 2.0.48, 2.0.33, 2.0.27, 2.2.11, 3.1.4, 4.1.0, 3.6.10, 3.5.11 |
| mongoose | 4.1.6 |
| morgan | 1.5.3 |
| mysql | 2.7.0, 2.6.2, 2.0.0-alpha8, 2.15.0 |
| mysql2 | 1.5.3 |
| nano | 6.2.0 |
| neo4j-driver | 1.7.1 |
| node-fetch | 2.6.0 |
| node-jose | 0.9.2 |
| node-rdkafka | 2.10.1 |
| nodemailer | 2.5.0 |
| nsp | 2.4.0 |
| oauth | 0.9.12 |
| passport-wsfed-saml2 | 2.11.4 |
| pg | 4.5.7, 4.3.0, 4.1.1, 6.1.2, 7.17.1 |
| postmark | 1.3.1 |
| q | 1.0.1 |
| qs | 3.1.0 |
| ramda | 0.18.0, 0.23.0 |
| range\_check | 0.0.1 |
| raw-body | 2.1.0 |
| react | 15.3.2 |
| redis | 0.12.1 |
| request | 2.56.0, 2.55.0, 2.27.0, 2.67.0, 2.73.0, 2.75.0, 2.81.0, 2.83.0, 2.88.0 |
| rethinkdb | 2.1.1, 2.0.0-1, 2.0.0 |
| rollbar | 0.6.2, 2.12.2 |
| semver | 4.3.4 |
| sendgrid | 1.8.0, 3.0.7 |
| sequelize | 3.1.1 |
| soap | 0.23.0 |
| socket.io | 1.3.5 |
| socket.io-client | 1.3.5 |
| splunk-bunyan-logger | 0.9.1 |
| ssh2 | 0.4.13 |
| stamplay | 1.0.6, 1.0.5, 1.0.3 |
| stripe | 3.3.4, 4.14.0, 4.24.0, 7.1.0, 7.4.0, 8.52.0 |
| sumo-logger | 1.5.5 |
| superagent | 1.2.0, 3.8.3, 4.1.0 |
| tedious | 6.6.2, 1.11.0, 0.1.4, 8.3.1, 9.2.1 |
| tough-cookie | 1.2.0 |
| twilio | 2.2.1, 3.6.0, 3.57.0 |
| twit | 1.1.20 |
| uuid | 2.0.3, 2.0.1, 3.1.0, 3.3.2, 7.0.3, 8.0.0 |
| vso-node-api | 3.1.1 |
| watson-developer-cloud | 2.0.1 |
| winston | 1.0.0, 0.8.1, 3.1.0 |
| xml2js | 0.4.8, 0.2.8 |
| xmlbuilder | 2.6.4 |
| xmldom | 0.1.19, 0.1.13 |
| xpath | 0.0.5 |
| xtend | 1.0.3 |

| モジュール | バージョン |
| - | - |
| @analytics/google-analytics | 0.4.0 |
| @auth0/hapi | 13.5.1, 13.6.0 |
| @auth0/rule-utilities | 0.1.0 |
| @gitbeaker/node | 17.0.1 |
| @incognia/api | 1.0.0 |
| @octokit/rest | 15.8.2 |
| @sentry/node | 5.6.2, 5.15.5, 6.2.0 |
| acorn | 1.2.2 |
| airbrake | 1.0.2 |
| airgram | 3.1.1 |
| ajv | 6.10.1 |
| amazon-dax-client | 1.2.2 |
| amazon-mws-node | 1.0.3 |
| analytics | 0.5.1 |
| analytics-node | 2.0.1, 3.5.0 |
| applicationinsights | 0.15.8, 0.18.0, 1.5.0, 1.8.8 |
| async | 1.0.0, 0.9.0, 2.1.2, 2.6.1 |
| auth0 | 2.4.0, 2.1.0, 2.0.0, 0.8.2, 2.6.0, 2.7.0, 2.8.0, 2.9.1, 2.13.0, 2.17.0, 2.17.1, 2.19.0, 2.23.0, 2.27.0, 2.27.1, 2.30.0, 2.31.0, 2.32.0, 2.34.2, 2.35.0, 2.36.1, 2.36.2, 2.39.0, 3.0.1 |
| auth0-authz-rules-api | 4.0.0 |
| auth0-ext-template-renderers | 0.4.2 |
| auth0-extension-express-tools | 1.0.2, 1.1.5, 1.1.6, 2.0.0 |
| auth0-extension-hapi-tools | 1.0.0, 1.1.0, 1.2.0, 1.2.1, 1.2.2, 1.3.0 |
| auth0-extension-tools | 1.0.0, 1.2.1, 1.3.1, 1.3.2, 1.4.0 |
| auth0-magic | 3.1.0 |
| auth0-oauth2-express | 0.0.1, 0.0.3, 1.1.5 |
| auth0-source-control-extension-tools | 3.0.10, 3.0.9, 3.1.4, 3.4.0, 3.5.1, 4.0.3, 4.0.5, 4.0.6, 4.0.7, 4.1.1, 4.1.2, 4.1.3, 4.1.5, 4.1.7, 4.1.9 |
| aws-sdk | 2.2.30, 2.1.31, 2.1.13, 2.4.13, 2.5.3, 2.197.0, 2.291.0, 2.458.0, 2.593.0 |
| axios | 0.15.2, 0.18.0, 0.19.2, 0.21.1, 0.21.3, 0.22.0, 0.27.2 |
| azure | 0.10.6 |
| azure-storage | 0.4.4, 0.4.1, 0.9.0 |
| babel | 5.4.7, 5.1.9 |
| bcrypt | 4.0.0 |
| bluebird | 2.9.26, 3.4.6 |
| body-parser | 1.12.4 |
| boom | 2.7.2 |
| botbuilder | 0.9.0 |
| bson | 0.3.2, 4.4.0 |
| cookie-parser | 1.3.5 |
| datadog-metrics | 0.8.2, 0.9.0, 0.9.2, 0.9.3 |
| disposable-email-domains | 1.0.14, 1.0.15, 1.0.56 |
| dockerode | 2.1.4, 2.0.3 |
| dotenv | 0.4.0, 2.0.0 |
| easy-pbkdf2 | 0.0.2 |
| ejs | 2.3.1 |
| engine.io-client | 1.5.1 |
| express | 4.12.4, 4.14.0, 4.16.3 |
| express-jwt | 3.1.0, 5.1.0 |
| faunadb | 2.11.1, 4.1.1 |
| filter-object | 2.1.0 |
| firebase | 7.12.0 |
| firebase-admin | 4.0.4, 5.0.0, 6.0.0, 8.0.0, 8.12.1 |
| form-data | 0.2.0 |
| getstream | 3.4.1 |
| gitlab | 1.7.0 |
| google-auth-library | 1.0.0 |
| google-libphonenumber | 2.0.7, 3.2.8, 3.2.10 |
| googleapis | 2.1.6, 34.0.0 |
| got | 3.2.0, 9.2.1, 10.7.0, 11.3.0, 11.5.2 |
| hapi | 13.5.0 |
| hapi-auth-jwt2 | 7.0.1 |
| hapi-swagger | 7.4.0 |
| hoek | 2.14.0 |
| http-proxy | 1.11.1 |
| ibm\_db | 2.6.4 |
| ip | 0.3.2, 0.0.1 |
| ipaddr.js | 1.0.1 |
| joi | 6.10.1 |
| jose | 3.19.0 |
| jsforce | 1.6.0 |
| jsonwebtoken | 5.7.0, 5.0.1, 5.0.0, 7.1.9, 8.5.0 |
| jwks-rsa | 1.0.0, 1.1.1, 1.6.0 |
| ldapjs | 1.0.0 |
| lodash | 3.10.1, 3.9.3, 2.4.1, 4.8.2, 4.17.10, 4.17.19 |
| lru-cache | 2.6.4 |
| mixpanel | 0.4.0 |
| mkdirp | 0.5.1 |
| moment | 2.10.3, 2.11.2 |
| mongodb | 2.0.48, 2.0.33, 2.0.27, 2.2.11, 3.1.4, 4.1.0, 3.6.10, 3.5.11 |
| mongoose | 4.1.6 |
| morgan | 1.5.3 |
| mysql | 2.7.0, 2.6.2, 2.0.0-alpha8, 2.15.0 |
| mysql2 | 1.5.3 |
| nano | 6.2.0 |
| neo4j-driver | 1.7.1 |
| node-fetch | 2.6.0 |
| node-jose | 0.9.2 |
| node-rdkafka | 2.10.1 |
| nodemailer | 2.5.0 |
| nsp | 2.4.0 |
| oauth | 0.9.12 |
| passport-wsfed-saml2 | 2.11.4 |
| pg | 4.5.7, 4.3.0, 4.1.1, 6.1.2, 7.17.1 |
| postmark | 1.3.1 |
| q | 1.0.1 |
| qs | 3.1.0 |
| ramda | 0.18.0, 0.23.0 |
| range\_check | 0.0.1 |
| raw-body | 2.1.0 |
| react | 15.3.2 |
| redis | 0.12.1 |
| request | 2.56.0, 2.55.0, 2.27.0, 2.67.0, 2.73.0, 2.75.0, 2.81.0, 2.83.0, 2.88.0 |
| rethinkdb | 2.1.1, 2.0.0-1, 2.0.0 |
| rollbar | 0.6.2, 2.12.2 |
| semver | 4.3.4 |
| sendgrid | 1.8.0, 3.0.7 |
| sequelize | 3.1.1 |
| soap | 0.23.0 |
| socket.io | 1.3.5 |
| socket.io-client | 1.3.5 |
| splunk-bunyan-logger | 0.9.1 |
| ssh2 | 0.4.13 |
| stamplay | 1.0.6, 1.0.5, 1.0.3 |
| stripe | 3.3.4, 4.14.0, 4.24.0, 7.1.0, 7.4.0, 8.52.0 |
| sumo-logger | 1.5.5 |
| superagent | 1.2.0, 3.8.3, 4.1.0 |
| tedious | 6.6.2, 1.11.0, 0.1.4, 8.3.1, 9.2.1 |
| tough-cookie | 1.2.0 |
| twilio | 2.2.1, 3.6.0, 3.57.0 |
| twit | 1.1.20 |
| uuid | 2.0.3, 2.0.1, 3.1.0, 3.3.2, 7.0.3, 8.0.0 |
| vso-node-api | 3.1.1 |
| watson-developer-cloud | 2.0.1 |
| winston | 1.0.0, 0.8.1, 3.1.0 |
| xml2js | 0.4.8, 0.2.8 |
| xmlbuilder | 2.6.4 |
| xmldom | 0.1.19, 0.1.13 |
| xpath | 0.0.5 |
| xtend | 1.0.3 |

### TLS接続にデフォルトで必要となる安全な再ネゴシエーション

拡張コードが外部ネットワーク呼び出しを行う場合、ターゲットサーバーは安全な再ネゴシエーションをサポートしていなければならず、そうでなければ要求は失敗し、以下のようなエラーを受け取ります。

```lines theme={null}
Error: write EPROTO C0BAF076:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled:../deps/openssl/openssl/ssl/statem/extensions.c:922:
```

このセキュリティに関する変更を考慮して、ターゲットサーバーすべてが、安全な再ネゴシエーションをサポートするようにアップデートされていることを確認してください。管理下にないサードパーティーのサーバーの場合は、以前の動作にオプトインする可能性を評価します。

たとえば、`axios`ライブラリーについては、以下のコードスニペットが、旧来の動作にオプトインする方法を示しています。

```javascript lines theme={null}
const axios = require('axios');
const https = require('https');
const crypto = require('crypto');

axios.get(
  'https://[LEGACY_SERVER]', 
  {
    httpsAgent: new https.Agent(
      {
        secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT
      }
    )
  })
```

```javascript lines theme={null}
const axios = require('axios');
const https = require('https');
const crypto = require('crypto');

axios.get(
  'https://[LEGACY_SERVER]', 
  {
    httpsAgent: new https.Agent(
      {
        secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT
      }
    )
  })
```
