# SEC Corporate Events MCP (`nexgendata/sec-corporate-events-mcp`) Actor

MCP server giving AI agents (Claude, Cursor, ChatGPT) 10 SEC corporate-event tools — buybacks, tender offers & M\&A, IPO prospectuses, delistings, going-private, comment letters, exec comp, activist proxies. Normalized JSON, pay-per-call, no EDGAR plumbing.

- **URL**: https://apify.com/nexgendata/sec-corporate-events-mcp.md
- **Developed by:** [NexGenData](https://apify.com/nexgendata) (community)
- **Categories:** MCP servers, Developer tools, AI
- **Stats:** 10 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## SEC Corporate Events MCP

**One MCP connection. Every market-moving corporate event the SEC sees first.**

SEC Corporate Events MCP is a [Model Context Protocol](https://modelcontextprotocol.io) server that gives any AI agent — Claude, ChatGPT, Cursor, or a custom LangChain/LlamaIndex pipeline — direct, structured access to the ten SEC filing streams that move stocks: buybacks, tender offers and mergers, IPO prospectuses, delistings, going-private deals, staff comment letters, executive compensation, new-insider Form 3s, foreign-issuer disclosures, and activist proxy fights.

Instead of wiring up ten separate EDGAR scrapers, parsing full-text-search responses, and babysitting form-type quirks, you connect once and call ten clean tools. Each returns normalized JSON your agent can reason over immediately.

---

### Why this exists

EDGAR is the most valuable free dataset in finance and one of the most painful to use. The full-text search API caps results, throttles aggressively, and returns raw filing-index rows with no normalization. Form types overlap and shift (a tender offer can surface as `SC TO-T`, `SC 14D9`, or `SC 13E3`; a going-private deal hides inside `SC 13E3` mixed with unrelated filings). Comment-letter correspondence (`UPLOAD`) is filed separately from the company it concerns. Building a reliable corporate-events feed means solving all of this — per event type — and keeping it solving as the SEC changes formats.

This MCP server does that work once and exposes the result as agent-native tools. The same infrastructure that powers NexGenData's standalone SEC trackers — used by quant desks, M&A advisors, and event-driven funds — now sits behind a single streamable-HTTP endpoint.

---

### What you get — the ten tools

| Tool | What it tracks | Why it matters |
|------|----------------|----------------|
| `track_stock_buybacks` | Share-repurchase / buyback program announcements | Capital-return signals, float reduction, EPS tailwinds |
| `track_tender_offers_ma` | Tender offers & M&A (`SC TO-T`, `SC 14D9`, `DEFM14A`) | Live takeover bids and deal terms |
| `track_ipo_prospectuses` | IPO registrations & prospectuses (`S-1`, `424B`, `F-1`) | IPO pipeline, pricing, lockups |
| `track_delistings` | Delistings & deregistrations (`Form 25`, `15-12B`) | Companies leaving public markets |
| `track_going_private` | Going-private transactions (`SC 13E3`) | Take-privates, squeeze-outs, buyout terms |
| `track_comment_letters` | SEC staff comment letters (`UPLOAD`) | Early warning of accounting/disclosure scrutiny |
| `track_exec_comp` | Executive compensation proxies (`DEF 14A`) | Pay-vs-performance, governance flags |
| `track_new_insiders` | New insider filings (`Form 3`) | New directors, officers, 10% holders |
| `track_foreign_issuers` | Foreign private issuers (`20-F`, `6-K`, `40-F`) | Non-US listed company disclosures |
| `track_activist_proxies` | Activist proxy solicitations (`PREC14A`, `DFAN14A`) | Shareholder activism, board fights |

Every tool accepts a `criteria` object (date ranges, keywords, ticker/CIK filters where supported) and a `limit`, and returns a uniform envelope: a human-readable summary plus `structuredContent` with the records.

---

### Quick start

#### Connect from Claude Desktop / any MCP client

Add the server to your MCP client configuration:

```json
{
  "mcpServers": {
    "sec-corporate-events": {
      "url": "https://nexgendata--sec-corporate-events-mcp.apify.actor/mcp",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
````

That's the whole setup. Your agent now has ten SEC corporate-event tools.

#### Call a tool

```jsonc
// tools/call
{
  "name": "track_tender_offers_ma",
  "arguments": {
    "criteria": { "startdt": "2026-01-01", "enddt": "2026-06-25" },
    "limit": 50
  }
}
```

#### Example response

```json
{
  "tool": "Tender Offers & M&A",
  "count": 2,
  "total_available": 37,
  "results": [
    {
      "company": "EXAMPLE TARGET CORP",
      "cik": "0001234567",
      "form": "SC TO-T",
      "filed": "2026-06-18",
      "accession": "0001193125-26-198765",
      "url": "https://www.sec.gov/Archives/edgar/data/1234567/000119312526198765.txt",
      "filer": "ACQUIRER HOLDINGS LP"
    }
  ]
}
```

***

### Built for agents, not dashboards

This is a **streamable-HTTP MCP server**, so it behaves the way modern agent frameworks expect:

- **Stateful sessions** — full MCP session lifecycle with idle cleanup, so long-running agents stay connected without leaking server runs.
- **Uniform envelopes** — every tool returns the same `{summary, structuredContent}` shape, so your prompt logic doesn't branch per tool.
- **Tool-level descriptions** — each tool ships rich descriptions and argument hints, so the model picks the right one without hand-holding.
- **No scraping glue** — you never touch EDGAR's full-text-search pagination, form-type aliasing, or rate limits.

***

### Pricing

This server is **pay-per-event**:

- **$0.10 per tool call** — you pay only when your agent actually queries.
- **$0.05 per bulk result** — added when a single call returns more than 10 records.
- **$0.0005 per session start** — negligible per-connection overhead.

There is no subscription, no seat license, and no minimum. A research agent that fires 200 targeted queries a month costs about $20 — versus four figures for a Bloomberg or terminal-based corporate-actions feed. You pay for the calls your agent makes and nothing else.

***

### Common agent workflows

These are the patterns users build most often. Each is a few tool calls your agent can chain on its own.

#### 1. Daily deal-flow digest

Have your agent call `track_tender_offers_ma`, `track_going_private`, and `track_ipo_prospectuses` each morning with `startdt` set to yesterday, then summarize the new filings into a briefing. You get a self-updating M\&A and IPO calendar without maintaining a single scraper.

#### 2. Buyback-and-insider conviction screen

Pair `track_stock_buybacks` with `track_new_insiders` over the same window. When a company announces a repurchase **and** insiders are filing fresh Form 3s, your agent can flag the overlap as a higher-conviction signal than either event alone.

#### 3. Risk and short-thesis early warning

Run `track_comment_letters` and `track_delistings` weekly. SEC staff comment letters often precede restatements or enforcement, and delisting filings mark the end state. An agent watching both can surface names worth a closer look before the headline hits.

#### 4. Activism and governance monitor

Combine `track_activist_proxies` with `track_exec_comp`. Activist campaigns frequently center on pay and board composition, so your agent can pull the proxy contest and the compensation disclosure together and explain the governance angle in one pass.

#### 5. Foreign-issuer coverage

Use `track_foreign_issuers` to keep a watchlist of non-US companies' `20-F`/`6-K` disclosures, which are easy to miss because they sit outside the domestic `10-K`/`10-Q` cadence. Your agent gets the same structured envelope it gets for US filings.

Because every tool returns the same shape, chaining them is trivial — your prompt logic doesn't change from one tool to the next.

### Data fields you can rely on

Every record in `structuredContent.results` includes a consistent core set of fields so your parser never has to special-case a tool:

- **company** — the issuer name as filed.
- **cik** — the SEC Central Index Key, a stable identifier you can use to join across tools and across time.
- **form** — the exact SEC form type (e.g. `SC TO-T`, `424B4`, `DEF 14A`).
- **filed** — the filing date in ISO format.
- **accession** — the SEC accession number, unique per filing.
- **url** — a direct link to the filing on sec.gov, ready to fetch or cite.
- **filer** — the filing party where it differs from the issuer (e.g. an acquirer in a tender offer, an activist in a proxy solicitation).

The top-level envelope always reports `count` (records returned), `total_available` (records matching before your `limit`), and `tool` (a human-readable label), so your agent can decide whether to paginate by raising `limit` on the next call.

### How it compares

**vs. building your own EDGAR pipeline:** You'd write and maintain ten scrapers, each handling a different cluster of form types, plus full-text-search pagination, retry logic for EDGAR's frequent 500s, and form-alias normalization. This server is that pipeline, already built, already normalized, behind one URL.

**vs. a terminal corporate-actions feed:** Terminals are built for human eyeballs and priced for institutions. This is built for agents and priced per call — and it returns machine-ready JSON with direct filing URLs, not a screen you have to scrape.

**vs. raw EDGAR full-text search:** EDGAR FTS is free but caps results, returns un-normalized index rows, throttles hard, and has no concept of "corporate event." This server adds the event layer EDGAR doesn't have.

***

### Companion servers

SEC Corporate Events MCP is part of the NexGenData regulatory-intelligence family. If you need broader coverage, pair it with:

- **Regulatory Filings MCP** — 17 tools across SEC, broader disclosure, and compliance filings (use this for general filing search; use *Corporate Events* for deal-driven signals).
- **Crypto & DeFi MCP** — on-chain, market, and prediction-market data.

The servers share the same connection model, so adding another is a one-line config change.

***

### FAQ

**Do I need an EDGAR account or API key?**
No. You only need an Apify token to authenticate to the MCP endpoint. EDGAR access is handled server-side.

**Is there an MCP server for SEC filings?**
Yes — this one focuses on corporate *events* (deals, buybacks, IPOs, activism). For broad filing search across all SEC form types, pair it with Regulatory Filings MCP.

**How much does it cost vs a terminal?**
Pay-per-call at about $0.10 per tool call. A research agent firing ~200 queries a month costs roughly $20 — versus four figures for a Bloomberg or terminal-based corporate-actions feed.

**How fresh is the data?**
Each tool queries SEC EDGAR live at call time, so you get filings as soon as they're indexed in full-text search (typically minutes to hours after acceptance).

**Can I filter by company or ticker?**
Yes — pass identifiers and date ranges in the `criteria` object. Supported filters depend on the underlying form stream; date ranges (`startdt`, `enddt`) and keyword search work across all ten tools.

**What forms does each tool cover?**
See the tool table above — each tool maps to a curated cluster of SEC form types chosen so you don't have to know EDGAR's form taxonomy.

**Is the response schema stable?**
Yes. Every tool returns the same envelope (`summary` + `structuredContent.results`), so you can write one parser for all ten.

**What happens on an SEC outage?**
Tools return a structured error envelope (never a crash), so your agent can retry or fall back gracefully.

***

### Support & feedback

Issues, feature requests, or want a form stream added? Reach out through the Apify Store contact on the NexGenData publisher page. We ship updates to this server regularly and add new event tools based on user demand.

*SEC Corporate Events MCP — by NexGenData. Market-moving filings, agent-ready.*

### Related NexGenData actors

- [SEC Form 8K Material Events Scraper](https://apify.com/nexgendata/sec-form-8k-material-events-scraper?fpr=2ayu9b)
- [SEC Form 4 Insider Trading Scraper](https://apify.com/nexgendata/sec-form-4-insider-trading-scraper?fpr=2ayu9b)
- [SEC Schedule 13Dg Activist Tracker](https://apify.com/nexgendata/sec-schedule-13dg-activist-tracker?fpr=2ayu9b)
- [SEC Form D Tracker](https://apify.com/nexgendata/sec-form-d-tracker?fpr=2ayu9b)
- [Stock Buyback Announcement Tracker](https://apify.com/nexgendata/stock-buyback-announcement-tracker?fpr=2ayu9b)
- [SEC Tender Offer & M\&A Tracker](https://apify.com/nexgendata/sec-tender-offer-ma-tracker?fpr=2ayu9b)
- [SEC IPO Prospectus Tracker](https://apify.com/nexgendata/sec-ipo-prospectus-tracker?fpr=2ayu9b)

# Actor input Schema

## Actor input object example

```json
{}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgendata/sec-corporate-events-mcp").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("nexgendata/sec-corporate-events-mcp").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call nexgendata/sec-corporate-events-mcp --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nexgendata/sec-corporate-events-mcp",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SEC Corporate Events MCP",
        "description": "MCP server giving AI agents (Claude, Cursor, ChatGPT) 10 SEC corporate-event tools — buybacks, tender offers & M&A, IPO prospectuses, delistings, going-private, comment letters, exec comp, activist proxies. Normalized JSON, pay-per-call, no EDGAR plumbing.",
        "version": "0.0",
        "x-build-id": "agb1cYD27dQwMG8SY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nexgendata~sec-corporate-events-mcp/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nexgendata-sec-corporate-events-mcp",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/nexgendata~sec-corporate-events-mcp/runs": {
            "post": {
                "operationId": "runs-sync-nexgendata-sec-corporate-events-mcp",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/nexgendata~sec-corporate-events-mcp/run-sync": {
            "post": {
                "operationId": "run-sync-nexgendata-sec-corporate-events-mcp",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {}
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
