# Replacements Ltd Scraper (`crawlerbros/replacements-scraper`) Actor

Scrape Replacements, Ltd. - discontinued & active china, crystal, silver, and collectibles patterns. Search by keyword, look up by ID, browse a brand's full catalog, or list a category's brands/patterns. No auth, no proxy.

- **URL**: https://apify.com/crawlerbros/replacements-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Replacements Ltd Scraper

Scrape [Replacements, Ltd.](https://www.replacements.com) — the world's largest source of discontinued and active china, crystal, silver/flatware, and collectibles patterns. Search by keyword, look up products by ID, pull every piece in a specific pattern, list a brand's full catalog, or browse the brand/pattern taxonomy of a category. HTTP-only with Chrome TLS impersonation. No auth, no proxy, no login.

### What this actor does

- **Search** — free-text keyword search across the whole catalog (patterns, brands, piece types)
- **Direct lookup** — fetch specific products by ID or URL
- **Pattern browsing** — every piece available in a specific china/crystal/silver/collectibles pattern
- **Brand browsing** — a brand's entire catalog across all its patterns
- **Taxonomy discovery** — list every brand or every popular pattern in a category
- Filters: price range, in-stock only
- Product images are re-hosted to a permanent, publicly-reachable URL
- Empty fields are omitted

### Output per product

- `productId`, `name`, `description`
- `brand`, `manufacturer`
- `category` — China / Crystal / Silver / Collectibles
- `patternName`, `itemLabel` (piece type, e.g. "Dinner Plate")
- `price`, `priceCurrency`, `priceValidUntil` (only for in-stock items with a real price)
- `condition` — e.g. `Used`
- `availability` — `InStock` / `OutOfStock`
- `dimensions` — e.g. `10 1/2 in`
- `imageUrl` (permanently re-hosted), `imageUrlOriginal`
- `productUrl`, `sourceUrl`
- `breadcrumb[]` — full category → brand → pattern → item path
- `recordType: "product"`, `scrapedAt`

### Output per brand (`browseBrands` mode)

- `brandName`, `brandUrl`, `category`, `recordType: "brand"`, `scrapedAt`

### Output per pattern (`browsePatterns` mode)

- `patternName`, `patternUrl`, `brandName` (when known), `category`, `recordType: "pattern"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byProductIds` / `byPatternUrls` / `byBrand` / `browseBrands` / `browsePatterns` |
| `searchQuery` | string | `lenox` | Free-text query (mode=search) |
| `productIds` | array | `[]` | Numeric product IDs or product URLs (mode=byProductIds) |
| `patternUrls` | array | `[]` | Full pattern page URLs (mode=byPatternUrls) |
| `category` | string | `collectibles` | `china` / `crystal` / `silver` / `collectibles` (mode=byBrand, browseBrands, browsePatterns) |
| `brandName` | string | `Lladro` | Brand name, fuzzy-matched (required for byBrand; optional for browsePatterns) |
| `priceMin` | int | – | Drop products priced below this (USD) |
| `priceMax` | int | – | Drop products priced above this (USD) |
| `inStockOnly` | bool | `false` | Only emit in-stock products with a real price |
| `maxItems` | int | `20` | Hard cap (1–1000) |

#### Example: search by keyword

```json
{
  "mode": "search",
  "searchQuery": "blue willow",
  "inStockOnly": true,
  "maxItems": 50
}
````

#### Example: every piece in a specific pattern

```json
{
  "mode": "byPatternUrls",
  "patternUrls": ["https://www.replacements.com/china-spode-christmas-tree/c/95690"],
  "maxItems": 100
}
```

#### Example: a brand's full catalog

```json
{
  "mode": "byBrand",
  "category": "collectibles",
  "brandName": "Lladro",
  "priceMax": 500,
  "maxItems": 100
}
```

#### Example: list every brand in a category

```json
{
  "mode": "browseBrands",
  "category": "china",
  "maxItems": 100
}
```

#### Example: list a category's most popular patterns

```json
{
  "mode": "browsePatterns",
  "category": "collectibles",
  "maxItems": 50
}
```

#### Example: direct product lookup

```json
{
  "mode": "byProductIds",
  "productIds": ["102826601", "https://www.replacements.com/p/64494561"]
}
```

### Use cases

- **Collector research** — identify and price a discontinued china, crystal, or silver pattern
- **Estate & inheritance appraisal** — value inherited tableware and collectibles sets
- **Price-guide / market research** — track real asking prices across brands and patterns
- **Antiques dealer sourcing** — discover available inventory for a specific brand or pattern
- **Insurance appraisal** — document replacement value for scheduled personal property
- **Collectibles cataloging** — bulk-export a brand's figurine/ornament catalog (Lladro, Hummel, Department 56, etc.)

### FAQ

**Do I need an account or cookies?**  No. Replacements.com is fully public — no login, no API key, no proxy required.

**What's the difference between `byBrand` and `browsePatterns` with a `brandName`?**  `byBrand` returns actual **products** (with price, condition, images) across every pattern the brand makes. `browsePatterns` with a `brandName` returns just the **pattern list itself** (name + URL) — useful for discovery before deciding which pattern to pull products from.

**Why does `silver` category have no `browsePatterns` without a brand?**  Replacements.com's own site structure doesn't expose a combined "most popular patterns" page for the general `silver` category (it splits sterling vs. stainless flatware differently). Supply `brandName` for silver — `byBrand`/`browsePatterns` with a brand both work normally.

**What happens if I search for an exact brand name (e.g. "Royal Doulton")?**  The site itself redirects an exact brand match to a brand landing page instead of a flat product list. The actor detects this automatically and pulls products from that brand's first few patterns so you still get real results — or use `mode=byBrand` directly for the brand's full catalog.

**Why are some products missing a `price`?**  Only in-stock items have a real price on Replacements.com. Out-of-stock items are still returned (unless `inStockOnly=true`) but the `price` field is omitted rather than shown as `$0`.

**What does `condition: "Used"` mean?**  Replacements.com sources most inventory as pre-owned/estate pieces, so nearly all listings carry a "Used" condition regardless of physical wear — this reflects the site's own listing data, not a quality assessment.

**How fresh is the data?**  Real-time — every run fetches live pages directly from replacements.com.

**Can I combine filters?**  Yes — `priceMin`/`priceMax`/`inStockOnly` all apply together across every mode that returns products.

**Why do some `imageUrl` values point to `images.replacements.com` instead of a re-hosted URL?**  The actor always tries to re-host each product image to a permanent, publicly-reachable URL. That succeeds most of the time, but Replacements.com's image CDN is protected by the same bot-management as the rest of the site, and it occasionally rejects the re-host attempt from cloud infrastructure. When that happens, the actor falls back to the original `images.replacements.com` URL — which is a real, correct image that opens normally in any web browser; it just isn't always fetchable by an automated/server-side HTTP request.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Free-text query (mode=search), e.g. a pattern name, brand, or piece type. Example: `lenox`, `blue willow`, `fiesta dinner plate`.

## `productIds` (type: `array`):

Numeric product IDs (e.g. `102826601`) or full product URLs (e.g. `https://www.replacements.com/p/102826601`).

## `patternUrls` (type: `array`):

Full pattern page URLs, e.g. `https://www.replacements.com/china-spode-christmas-tree/c/95690`. Copy these from `patternUrl` in `browsePatterns` output, or from the website.

## `category` (type: `string`):

Product category (mode=byBrand, browseBrands, browsePatterns).

## `brandName` (type: `string`):

Brand/manufacturer name, matched against the category's brand list (e.g. `Lenox`, `Spode`, `Lladro`, `Waterford`). Required for mode=byBrand; optional for mode=browsePatterns (lists that brand's patterns instead of the category's most-popular patterns).

## `priceMin` (type: `integer`):

Drop products priced below this (USD). Only applies to in-stock products with a real price.

## `priceMax` (type: `integer`):

Drop products priced above this (USD).

## `inStockOnly` (type: `boolean`):

Only emit products currently in stock with a real price.

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "lenox",
  "productIds": [],
  "patternUrls": [],
  "category": "collectibles",
  "brandName": "Lladro",
  "inStockOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

## `items` (type: `string`):

Dataset containing all scraped products, brands, and patterns.

# 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 = {
    "mode": "search",
    "searchQuery": "lenox",
    "productIds": [],
    "patternUrls": [],
    "category": "collectibles",
    "brandName": "Lladro",
    "inStockOnly": false,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/replacements-scraper").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 = {
    "mode": "search",
    "searchQuery": "lenox",
    "productIds": [],
    "patternUrls": [],
    "category": "collectibles",
    "brandName": "Lladro",
    "inStockOnly": False,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/replacements-scraper").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 '{
  "mode": "search",
  "searchQuery": "lenox",
  "productIds": [],
  "patternUrls": [],
  "category": "collectibles",
  "brandName": "Lladro",
  "inStockOnly": false,
  "maxItems": 20
}' |
apify call crawlerbros/replacements-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Replacements Ltd Scraper",
        "description": "Scrape Replacements, Ltd. - discontinued & active china, crystal, silver, and collectibles patterns. Search by keyword, look up by ID, browse a brand's full catalog, or list a category's brands/patterns. No auth, no proxy.",
        "version": "1.0",
        "x-build-id": "UxeKYAjLZGw1nscQa"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~replacements-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-replacements-scraper",
                "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/crawlerbros~replacements-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-replacements-scraper",
                "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/crawlerbros~replacements-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-replacements-scraper",
                "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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "byProductIds",
                            "byPatternUrls",
                            "byBrand",
                            "browseBrands",
                            "browsePatterns"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Free-text query (mode=search), e.g. a pattern name, brand, or piece type. Example: `lenox`, `blue willow`, `fiesta dinner plate`.",
                        "default": "lenox"
                    },
                    "productIds": {
                        "title": "Product IDs or URLs (mode=byProductIds)",
                        "type": "array",
                        "description": "Numeric product IDs (e.g. `102826601`) or full product URLs (e.g. `https://www.replacements.com/p/102826601`).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "patternUrls": {
                        "title": "Pattern URLs (mode=byPatternUrls)",
                        "type": "array",
                        "description": "Full pattern page URLs, e.g. `https://www.replacements.com/china-spode-christmas-tree/c/95690`. Copy these from `patternUrl` in `browsePatterns` output, or from the website.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "china",
                            "crystal",
                            "silver",
                            "collectibles"
                        ],
                        "type": "string",
                        "description": "Product category (mode=byBrand, browseBrands, browsePatterns).",
                        "default": "collectibles"
                    },
                    "brandName": {
                        "title": "Brand name",
                        "type": "string",
                        "description": "Brand/manufacturer name, matched against the category's brand list (e.g. `Lenox`, `Spode`, `Lladro`, `Waterford`). Required for mode=byBrand; optional for mode=browsePatterns (lists that brand's patterns instead of the category's most-popular patterns).",
                        "default": "Lladro"
                    },
                    "priceMin": {
                        "title": "Min price (USD)",
                        "minimum": 0,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Drop products priced below this (USD). Only applies to in-stock products with a real price."
                    },
                    "priceMax": {
                        "title": "Max price (USD)",
                        "minimum": 0,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Drop products priced above this (USD)."
                    },
                    "inStockOnly": {
                        "title": "In-stock only",
                        "type": "boolean",
                        "description": "Only emit products currently in stock with a real price.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on emitted records.",
                        "default": 20
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
