{
  "id": "Nc381f2WfFyzrJvl",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "1. Scrape Stack Overflow for Leads",
  "tags": [],
  "nodes": [
    {
      "id": "02eb1076-060e-484d-84c4-fe2dcb3ed706",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        260,
        320
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "a8c0862a-6b53-414b-ac82-ccabefad2345",
      "name": "Start Scraping",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -200,
        0
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f54199e8-8fa1-4ffa-b442-3700755d4a0a",
      "name": "Input Setup",
      "type": "n8n-nodes-base.set",
      "position": [
        20,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c1e742bf-8bd2-4d18-9a51-dac7cfaa51fd",
              "name": "url",
              "type": "string",
              "value": "https://stackoverflow.com/users"
            },
            {
              "id": "107ffa9d-231b-4991-b362-415ec08505b7",
              "name": "format",
              "type": "string",
              "value": "scrape_as_markdown"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1894bff8-13de-4fba-93ed-f021407d4e13",
      "name": "AI Agent: Generate Scraper Instructions",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        440,
        0
      ],
      "parameters": {
        "text": "=Scrape all users data as per the provided URL:  {{ $json.url }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2
    },
    {
      "id": "0f166f7a-e7ac-4d14-8171-7c1c36f18680",
      "name": "MCP Client to Scrape as HTML",
      "type": "n8n-nodes-mcp.mcpClientTool",
      "position": [
        620,
        320
      ],
      "parameters": {
        "toolName": "scrape_as_html",
        "operation": "executeTool",
        "toolParameters": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Tool_Parameters', ``, 'json') }}",
        "descriptionType": "manual",
        "toolDescription": "Scrape a single webpage URL with advanced options for content extraction and get back the results in html"
      },
      "credentials": {
        "mcpClientApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "195a2e71-91c7-4947-ab5a-26e4e7b9e3d6",
      "name": "Conversation Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        460,
        320
      ],
      "parameters": {
        "sessionKey": "=Perform the web scraping for the below URL  {{ $json.url }}",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "c425d7fc-2207-4df6-8833-76265394f9b3",
      "name": "Format Data for Google Sheets",
      "type": "n8n-nodes-base.code",
      "position": [
        1020,
        0
      ],
      "parameters": {
        "jsCode": "// Get the array of users from the incoming item\nconst forums = items[0].json.output.forums;\n\nconst results = forums.map(user => {\n  return {\n    json: {\n      baseUrl: user.baseUrl,\n      profileUrl: user.exampleProfile,\n      name: user.selectors.name,\n      location: user.selectors.location,\n      reputation: user.selectors.reputation,\n      tags: user.selectors.tags\n    }\n  };\n});\n\nreturn results;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "51380d2d-c833-4748-a9fb-376add68cc87",
      "name": "Save Leads to Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1240,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "={{ $json.name }}",
            "Tags": "={{ $json.tags }}",
            "baseUrl": "={{ $json.baseUrl }}",
            "Location": "={{ $json.location }}",
            "Raputation": "={{ $json.reputation }}",
            "Profile URL": "={{ $json.profileUrl }}"
          },
          "schema": [
            {
              "id": "baseUrl",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "baseUrl",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Profile URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Profile URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Raputation",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Raputation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Tags",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Tags",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/121-9GYz9uIhC-cBQaJ2Rg26paivPVDAvTE9pwgZ7MCA/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "121-9GYz9uIhC-cBQaJ2Rg26paivPVDAvTE9pwgZ7MCA",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/121-9GYz9uIhC-cBQaJ2Rg26paivPVDAvTE9pwgZ7MCA/edit?usp=drivesdk",
          "cachedResultName": "Stackoverflow users data"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "08fb0bc0-e489-4a6c-98b3-f95d838e353f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -220,
        -1140
      ],
      "parameters": {
        "color": 6,
        "width": 360,
        "height": 1320,
        "content": "## \ud83d\ude80 **Section 1: Trigger & Input Setup**\n\n> *\u201cStart the engine and define what we want.\u201d*\n\n### \ud83d\udd18 **Start Scraping**\n\n\ud83d\udccc **What it does**:\nThis is a **manual trigger node** \u2014 it means you click a button to start the automation whenever you're ready.\n\n\ud83d\udca1 **Why it's useful**:\nIt gives **you control**. You don\u2019t have to rely on a schedule or external webhook to run your bot.\n\n---\n\n### \u270f\ufe0f **Input Setup**\n\n\ud83d\udccc **What it does**:\nThis node allows you to **edit or define any optional fields** before running the scraper. For example, you could:\n\n* Choose which forum to target\n* Add filters like location or tags (optional)\n* Enter how many profiles to scrape\n\n\ud83d\udca1 **Why it's useful**:\nYou can **dynamically control** the scraper without touching the workflow logic.\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "24fa8529-56ac-473b-b8f6-280a6219d29e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        380,
        -1660
      ],
      "parameters": {
        "color": 3,
        "width": 360,
        "height": 1820,
        "content": "## \ud83e\udd16 **Section 2: AI-Powered Scraping Brain**\n\n> *\u201cLet the AI handle the heavy lifting.\u201d*\n\n### \ud83e\udd16 **AI Agent: Generate Scraper Instructions**\n\n\ud83d\udccc **What it does**:\nThis is the **core automation brain**. It receives the input, uses your prompt and memory, and knows it should activate Bright Data to scrape user profiles from Stack Overflow.\n\n\ud83d\udca1 **Why it's useful**:\nInstead of coding every scraping rule manually, you let an **AI agent manage tools and instructions**.\n\n---\n\n#### \ud83d\udd17 **Connected Sub-Tools**:\n\n##### \ud83e\udde0 **Conversation Memory**\n\n\ud83e\uddca Saves context between steps so the agent \u201cremembers\u201d what the task is about.\n\n##### \ud83d\udd0c **Bright Data: StackOverflow Scraper (HTML)**\n\n\ud83d\udd78 Executes the **HTML scraping tool on Bright Data MCP**.\nIt grabs the page, processes the DOM, and scrapes user profile data.\n\n##### \ud83e\udde9 **Parse Scraped Profiles**\n\n\ud83d\udcd1 Uses a structured output parser to **convert the scraped HTML/markdown** into clean JSON data like:\n\n```json\n{\n  \"name\": \"Jon Skeet\",\n  \"location\": \"UK\",\n  \"profileUrl\": \"...\",\n  \"tags\": \"java, c#\",\n  \"reputation\": \"320\"\n}\n```\n\n\ud83d\udca1 **Why it's useful**:\nYou don\u2019t need to manually extract data using selectors \u2014 the AI does it intelligently.\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8e696519-51cf-42ea-9f1c-4b531e183696",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        960,
        -1200
      ],
      "parameters": {
        "color": 5,
        "width": 420,
        "height": 1380,
        "content": "## \ud83d\udcca **Section 3: Format & Save to Sheets**\n\n> *\u201cPolish and preserve your gold.\u201d*\n\n### \ud83e\uddfe **Format Data for Google Sheets**\n\n\ud83d\udccc **What it does**:\nThis `Code` node **cleans the scraped data**, picks only what you care about (name, location, reputation, etc.), and **outputs one item per user**.\n\n\ud83d\udca1 **Why it's useful**:\nIt makes sure your data is **structured and ready for Sheets**. Clean in = clean out.\n\n---\n\n### \ud83d\udcc4 **Save Leads to Google Sheet**\n\n\ud83d\udccc **What it does**:\nTakes each formatted item and **appends it to a connected Google Sheet**.\n\n\ud83d\udca1 **Why it's useful**:\nThis is your **automated storage system**. You can build a list of Stack Overflow leads, update CRMs, or just keep it for research.\n\n---\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7cf77dc6-7b55-400d-a7da-a85d906f8a99",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2120,
        -1140
      ],
      "parameters": {
        "color": 4,
        "width": 1300,
        "height": 320,
        "content": "=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"
      },
      "typeVersion": 1
    },
    {
      "id": "93f5ad00-0cd0-4e53-b0d5-eba652b3fb61",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2120,
        -800
      ],
      "parameters": {
        "color": 4,
        "width": 1289,
        "height": 3018,
        "content": "# \ud83e\udde0\u2728 **AI-Powered Stack Overflow Lead Scraper**\n\n### *Scrape, Parse, and Save Developer Profiles to Google Sheets Using Bright Data & n8n*\n\n---\n\n## \ud83d\ude80 **Section 1: Trigger & Input Setup**\n\n> *\u201cStart the engine and define what we want.\u201d*\n\n### \ud83d\udd18 **Start Scraping**\n\n\ud83d\udccc **What it does**:\nThis is a **manual trigger node** \u2014 it means you click a button to start the automation whenever you're ready.\n\n\ud83d\udca1 **Why it's useful**:\nIt gives **you control**. You don\u2019t have to rely on a schedule or external webhook to run your bot.\n\n---\n\n### \u270f\ufe0f **Input Setup**\n\n\ud83d\udccc **What it does**:\nThis node allows you to **edit or define any optional fields** before running the scraper. For example, you could:\n\n* Choose which forum to target\n* Add filters like location or tags (optional)\n* Enter how many profiles to scrape\n\n\ud83d\udca1 **Why it's useful**:\nYou can **dynamically control** the scraper without touching the workflow logic.\n\n---\n\n## \ud83e\udd16 **Section 2: AI-Powered Scraping Brain**\n\n> *\u201cLet the AI handle the heavy lifting.\u201d*\n\n### \ud83e\udd16 **AI Agent: Generate Scraper Instructions**\n\n\ud83d\udccc **What it does**:\nThis is the **core automation brain**. It receives the input, uses your prompt and memory, and knows it should activate Bright Data to scrape user profiles from Stack Overflow.\n\n\ud83d\udca1 **Why it's useful**:\nInstead of coding every scraping rule manually, you let an **AI agent manage tools and instructions**.\n\n---\n\n#### \ud83d\udd17 **Connected Sub-Tools**:\n\n##### \ud83e\udde0 **Conversation Memory**\n\n\ud83e\uddca Saves context between steps so the agent \u201cremembers\u201d what the task is about.\n\n##### \ud83d\udd0c **Bright Data: StackOverflow Scraper (HTML)**\n\n\ud83d\udd78 Executes the **HTML scraping tool on Bright Data MCP**.\nIt grabs the page, processes the DOM, and scrapes user profile data.\n\n##### \ud83e\udde9 **Parse Scraped Profiles**\n\n\ud83d\udcd1 Uses a structured output parser to **convert the scraped HTML/markdown** into clean JSON data like:\n\n```json\n{\n  \"name\": \"Jon Skeet\",\n  \"location\": \"UK\",\n  \"profileUrl\": \"...\",\n  \"tags\": \"java, c#\",\n  \"reputation\": \"320\"\n}\n```\n\n\ud83d\udca1 **Why it's useful**:\nYou don\u2019t need to manually extract data using selectors \u2014 the AI does it intelligently.\n\n---\n\n## \ud83d\udcca **Section 3: Format & Save to Sheets**\n\n> *\u201cPolish and preserve your gold.\u201d*\n\n### \ud83e\uddfe **Format Data for Google Sheets**\n\n\ud83d\udccc **What it does**:\nThis `Code` node **cleans the scraped data**, picks only what you care about (name, location, reputation, etc.), and **outputs one item per user**.\n\n\ud83d\udca1 **Why it's useful**:\nIt makes sure your data is **structured and ready for Sheets**. Clean in = clean out.\n\n---\n\n### \ud83d\udcc4 **Save Leads to Google Sheet**\n\n\ud83d\udccc **What it does**:\nTakes each formatted item and **appends it to a connected Google Sheet**.\n\n\ud83d\udca1 **Why it's useful**:\nThis is your **automated storage system**. You can build a list of Stack Overflow leads, update CRMs, or just keep it for research.\n\n---\n\n## \ud83c\udf1f Final Benefits for You\n\n\u2705 No manual copy-pasting\n\u2705 AI handles scraping + parsing\n\u2705 Exported automatically to Sheets\n\u2705 Fully reusable with Bright Data MCP\n\u2705 Friendly for beginners with room to scale\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8c6bf091-2ca5-484e-b677-c83bbcd569b1",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1500,
        -1200
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 240,
        "content": "## I\u2019ll receive a tiny commission if you join Bright Data through this link\u2014thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"
      },
      "typeVersion": 1
    },
    {
      "id": "d1886048-1c41-48d7-9172-81d01a99045b",
      "name": "Auto-fixing Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        800,
        320
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "3ac5af36-f7ea-4e1e-9989-53f4f7b1820c",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        780,
        540
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c134bbb5-c328-4e32-bce6-506b568d3acc",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        940,
        540
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"target\": \"https://stackoverflow.com/users\",\n  \"forums\": [\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/6309/vonc\",\n      \"selectors\": {\n        \"name\": \"VonC\",\n        \"location\": \"France\",\n        \"reputation\": \"603\",\n        \"tags\": \"git, github, docker\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/2402272/john-bollinger\",\n      \"selectors\": {\n        \"name\": \"John Bollinger\",\n        \"location\": \"\",\n        \"reputation\": \"375\",\n        \"tags\": \"c, java, linux\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/6196568/shingo\",\n      \"selectors\": {\n        \"name\": \"shingo\",\n        \"location\": \"On the Earth\",\n        \"reputation\": \"340\",\n        \"tags\": \"c#, unity-game-engine, php\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/5133585/sweeper\",\n      \"selectors\": {\n        \"name\": \"Sweeper\",\n        \"location\": \"UK\",\n        \"reputation\": \"325\",\n        \"tags\": \"swift, java, c#\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/22656/jon-skeet\",\n      \"selectors\": {\n        \"name\": \"Jon Skeet\",\n        \"location\": \"Reading, United Kingdom\",\n        \"reputation\": \"320\",\n        \"tags\": \"c#, java, .net\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/1774667/yakk-adam-nevraumont\",\n      \"selectors\": {\n        \"name\": \"Yakk - Adam Nevraumont\",\n        \"location\": \"Canada\",\n        \"reputation\": \"313\",\n        \"tags\": \"c++, c++11, templates\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/6461462/m\",\n      \"selectors\": {\n        \"name\": \"M--\",\n        \"location\": \"TBA\",\n        \"reputation\": \"301\",\n        \"tags\": \"r, dataframe, ggplot2\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/51717/jason-c\",\n      \"selectors\": {\n        \"name\": \"Jason C\",\n        \"location\": \"\",\n        \"reputation\": \"300\",\n        \"tags\": \"linux, iptables, ipv6\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/12500315/allan-cameron\",\n      \"selectors\": {\n        \"name\": \"Allan Cameron\",\n        \"location\": \"UK\",\n        \"reputation\": \"285\",\n        \"tags\": \"r, ggplot2, dplyr\"\n      }\n    },\n    {\n      \"name\": \"Stack Overflow Users\",\n      \"baseUrl\": \"https://stackoverflow.com/users\",\n      \"exampleProfile\": \"https://stackoverflow.com/users/16752210/halo\",\n      \"selectors\": {\n        \"name\": \"Halo\",\n        \"location\": \"USA\",\n        \"reputation\": \"280\",\n        \"tags\": \"three.js, javascript, css\"\n      }\n    }\n  ]\n}\n"
      },
      "typeVersion": 1.2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "05d835bd-ef3d-47f9-a22d-e0a47f5094bd",
  "connections": {
    "Input Setup": {
      "main": [
        [
          {
            "node": "AI Agent: Generate Scraper Instructions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Scraping": {
      "main": [
        [
          {
            "node": "Input Setup",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent: Generate Scraper Instructions",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Conversation Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent: Generate Scraper Instructions",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Auto-fixing Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent: Generate Scraper Instructions",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "MCP Client to Scrape as HTML": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Generate Scraper Instructions",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Format Data for Google Sheets": {
      "main": [
        [
          {
            "node": "Save Leads to Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent: Generate Scraper Instructions": {
      "main": [
        [
          {
            "node": "Format Data for Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}