[{"data":1,"prerenderedAt":13645},["ShallowReactive",2],{"blog-/blog/ai-skepticism-in-data-engineering":3,"content-query-goRDbrk8M4":3934,"content-query-htH3n4t0FK":7294,"content-query-X7YCAXcy3Q":10654},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"coverPosition":11,"date":12,"readingTime":13,"category":14,"tags":15,"author":25,"body":29,"_type":2175,"_id":3929,"_source":3930,"_file":3931,"_stem":3932,"_extension":3933},"/blog/ai-skepticism-in-data-engineering","blog",false,"","Why It's Reasonable to Be Skeptical About AI in Data - and Why It's Fixable","A practical framework for building an AI context layer using open-source tools, turning skepticism about AI in data engineering into a working solution with self-healing pipelines and iterative team adoption.","/img/blog/covers/ai-skepticism.png","bottom","2026-04-21",25,"Opinion",[16,17,18,19,20,21,22,23,24],"AI","data engineering","data quality","context layer","self-healing pipelines","open source","MCP","data governance","opinion",{"name":26,"role":27,"image":28},"Arsalan Noorafkan","Developer Advocate","/img/blog/arsalan.png",{"type":30,"children":31,"toc":3897},"root",[32,40,45,50,55,59,66,71,76,81,86,91,94,100,105,110,115,120,123,129,134,178,183,188,193,216,223,228,257,262,275,280,285,290,357,360,366,371,376,381,387,392,399,451,457,525,531,536,580,593,854,860,872,893,898,926,1552,1565,1571,1576,1581,2038,2043,2155,2161,2166,2171,2337,2343,2348,2523,2526,2532,2537,2542,2547,2552,2557,2562,2568,2586,2592,2605,2610,2736,2742,2760,2766,2771,2776,2781,2896,2899,2905,2934,2939,2944,2949,2954,3011,3449,3470,3473,3479,3484,3490,3495,3500,3505,3510,3573,3578,3584,3589,3594,3599,3611,3616,3621,3649,3654,3660,3665,3670,3675,3680,3694,3699,3704,3707,3713,3718,3723,3728,3751,3756,3761,3767,3772,3777,3790,3795,3808,3814,3819,3847,3852,3858,3863,3881,3886,3891],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37],{"type":38,"value":39},"text","I was quite skeptical about AI coding agents, and honestly for a while I think I was right to be. I'd try them, the agent would hallucinate something that doesn't exist or generate 400 lines of code I couldn't even meaningfully review. Every time I'd walk away thinking \"this just created more work for me\". What changed was realizing the problem wasn't the agent, it was me. I was throwing it at a codebase with zero context and expecting magic, which is something I would never do with a real engineer joining the team.",{"type":33,"tag":34,"props":41,"children":42},{},[43],{"type":38,"value":44},"This is the key difference between AI in data versus software engineering - in software, the code breaks or the result is visibly wrong, but in data the agent returns a confident response and validating it takes longer, so people either blindly trust it or become too skeptical to even try it. The problem is rooted in the inability to create and maintain the context layer - and this is usually a time constraint, not a money one.",{"type":33,"tag":34,"props":46,"children":47},{},[48],{"type":38,"value":49},"Most teams don't have proper documentation or data governance, so when a new hire joins they read the pipeline code, query the tables, and ask questions. That's exactly what an LLM needs to do too. Your existing pipelines, models, and data warehouse already have most of the context you need, and you just have to organize it. This framework proposes giving agents access to existing open-source tools and a set of specific instructions that utilize the agents' ability to perform a constant loop of scanning pipelines, querying tables, and reading metadata and logs to update the model/assets files inside pipelines with descriptions, definitions, tags, quality checks, and additional metadata. This way your context also lives right inside the files that contain the SQL, Python, YML, etc. files in your pipeline - instead of creating a separate system, database, knowledge base, or some other vendor-locked format.",{"type":33,"tag":34,"props":51,"children":52},{},[53],{"type":38,"value":54},"In this post I'll break down why the skepticism is valid, why the root cause is missing context and not model quality, and then walk through how to actually build that context layer using open-source CLI tools, SQL, Python, and LLMs. We'll also get into self-healing pipeline tasks that keep the data and context healthy, and how to manage the transition with your team and stakeholders - because the technical solution is only half of it.",{"type":33,"tag":56,"props":57,"children":58},"hr",{},[],{"type":33,"tag":60,"props":61,"children":63},"h2",{"id":62},"why-the-skepticism-is-reasonable",[64],{"type":38,"value":65},"Why the Skepticism Is Reasonable",{"type":33,"tag":34,"props":67,"children":68},{},[69],{"type":38,"value":70},"Trust is essential when it comes to working with data - if you lose the trust of the data consumers, then all the pipelines, tables, and reports lose their value. This was already an issue even when only humans were involved, but now with the introduction of AI agents trying to make changes to pipelines and tables or creating dashboards and reports, the issue has reached a critical point.",{"type":33,"tag":34,"props":72,"children":73},{},[74],{"type":38,"value":75},"Here's how my journey started... 8 months ago I wanted to troubleshoot some missing data. I finally set up Bruin MCP in Cursor (also after resisting to use Cursor in the first place), asked it to query every table in the downstream lineage of the raw table to find where the missing data happens. It almost correctly found where the problem was but without me asking it, it changed the query by changing an inner join to a left join, in addition to completely messing up all the existing inline comments and asset definitions. I was so frustrated I immediately deleted the branch, opened VS Code and created a new branch and went back to doing it myself. Every time I tried it, I was disappointed. But to be honest, I was testing its limits by giving a vague prompt and expecting magic - and quite frankly, that's exactly how I'd feel with interns and juniors too, I give them a task like \"investigate the missing data\" without giving them any context and then they submit a PR where they ALSO changed the inner to right join.",{"type":33,"tag":34,"props":77,"children":78},{},[79],{"type":38,"value":80},"Around 2 months after my first attempt with AI, I was in the process of completing a major pipeline redesign that was a business critical and operational pipeline. It also coincided with my knowledge transfer and offboarding from the company. So I finally did it - I locked myself in my office at home for a week and as I built the new pipeline (this time with some help from Cursor) but I really put effort into writing down all the business context inside a pipeline readme file with also full explanation of the pipeline schedule & orchestration logic, as well as inline comments to each CTE explaining what/why of the logic and custom quality checks that acted as unit tests so that if a future person/agent makes a change that fundamentally changes the table then the check would fail (e.g. the aggregation level). This was not easy but by the end of it, I was able to ask Cursor to query the data for me, enhance the table & column level descriptions, run the pipeline, and even finally help with investigations and troubleshooting.",{"type":33,"tag":34,"props":82,"children":83},{},[84],{"type":38,"value":85},"Albeit the models and MCP servers have improved since then, but I learned that patience is key - the same way that hiring and onboarding a new engineer would be. A week or two of handholding will go a long way.",{"type":33,"tag":34,"props":87,"children":88},{},[89],{"type":38,"value":90},"My journey from extreme skepticism to now using Conductor to have a dozen different agents working like minions on different things has been transformational and quite shocking to myself even. Now let's dive deeper into the details.",{"type":33,"tag":56,"props":92,"children":93},{},[],{"type":33,"tag":60,"props":95,"children":97},{"id":96},"the-root-problem-bad-context-is-a-symptom-not-the-problem",[98],{"type":38,"value":99},"The Root Problem: Bad Context is a Symptom, Not the Problem",{"type":33,"tag":34,"props":101,"children":102},{},[103],{"type":38,"value":104},"Missing or weak context is not the root problem but rather just a symptom. The problem is rooted in the inability to create and maintain the context layer - and this is usually a time constraint, not a money one. Even expensive and sophisticated services require a substantial investment of time and effort to deploy and maintain. Even when it is done, new models and frameworks fundamentally disrupt previous implementations and make them obsolete.",{"type":33,"tag":34,"props":106,"children":107},{},[108],{"type":38,"value":109},"There have been attempts at building context managers for data stacks, but they are quite often made obsolete with new models that handle context better. This normally involves complex processes to extract information from the pipelines and warehouse, as well as people's minds, and loading them into isolated systems (very often vendor-locked) that are solely set up for context management - think of vector DBs, RAGs, MCPs, etc. Separate systems are hard to integrate into the existing workflows and processes of data teams and architecture, which demands a significant commitment of time and effort; especially when such systems are threatened by disruptive models.",{"type":33,"tag":34,"props":111,"children":112},{},[113],{"type":38,"value":114},"There's also a contrary belief that new models with bigger context windows can sift through all the pipelines and warehouse metadata to obtain the context - but setting aside the needle in a haystack problem, this doesn't solve the problem of stale or wrong information and if the agents were to validate everything by querying every table, they would then have to do this every time a session is started and the warehouse costs will explode (not even considering how slow it would be).",{"type":33,"tag":34,"props":116,"children":117},{},[118],{"type":38,"value":119},"The \"inability\" to create and maintain a context layer is also a symptom of what data engineers' roles have become. In between adhoc requests, fixing broken pipelines, integrating new data sources, and so on... it becomes difficult to allocate time to such things. But I still think that the \"inability\" is tied into the complexity, effort, and prioritization constraints caused by using the wrong tools, and even more importantly the weak change management and implementation plan. Which is why we will dive deeper into \"what\" tools to use and \"how\" to implement it.",{"type":33,"tag":56,"props":121,"children":122},{},[],{"type":33,"tag":60,"props":124,"children":126},{"id":125},"onboard-your-ai-like-a-new-hire",[127],{"type":38,"value":128},"Onboard Your AI Like a New Hire",{"type":33,"tag":34,"props":130,"children":131},{},[132],{"type":38,"value":133},"Here's the classic onboarding process of a new data engineer, scientist, or analyst:",{"type":33,"tag":135,"props":136,"children":137},"ul",{},[138,144,149,163,168,173],{"type":33,"tag":139,"props":140,"children":141},"li",{},[142],{"type":38,"value":143},"they start with getting access to the repo, pipelines, warehouse, and any available documentation",{"type":33,"tag":139,"props":145,"children":146},{},[147],{"type":38,"value":148},"they ask \"what should I focus on\" - in other words, what are the current active/operational pipelines and tables",{"type":33,"tag":139,"props":150,"children":151},{},[152,154,161],{"type":38,"value":153},"they start with opening a table and running a ",{"type":33,"tag":155,"props":156,"children":158},"code",{"className":157},[],[159],{"type":38,"value":160},"select * from xyz limit 10",{"type":38,"value":162}," to see what the table looks like",{"type":33,"tag":139,"props":164,"children":165},{},[166],{"type":38,"value":167},"they cross-reference the table with the pipeline and lineage to understand where the data comes from and how it is processed",{"type":33,"tag":139,"props":169,"children":170},{},[171],{"type":38,"value":172},"they will start investigating the why/how - so they start running a few more queries, checking the Python & SQL code, and reading table/column descriptions and any inline comments and documentations",{"type":33,"tag":139,"props":174,"children":175},{},[176],{"type":38,"value":177},"lastly, they will talk to data consumers and read the queries coming from users and dashboards to understand where/how the data is actually used",{"type":33,"tag":34,"props":179,"children":180},{},[181],{"type":38,"value":182},"This framework proposes giving agents access to tools and a set of specific instructions that utilize the agents' ability to perform a constant loop of scanning pipelines, querying tables, and reading metadata and logs to update the model/assets files inside pipelines with descriptions, definitions, tags, quality checks, and additional metadata. This task can be built into the pipeline itself so that it constantly updates the context. Essentially identical to the exact same process a new hire does - they don't read the documentation (there usually isn't any), they read the pipeline code, query the tables, and then ask questions.",{"type":33,"tag":34,"props":184,"children":185},{},[186],{"type":38,"value":187},"I'll be honest, anytime I hired someone (or even when I joined a company myself) the first task was to create/update the docs in the pipeline. This is a great way to create and maintain docs, but if it takes a new hire to do, then it's definitely not a reliable solution. Also, let's be honest, after the initial onboarding everyone is too busy to really maintain the docs which is why it becomes stale - and this is very dangerous for AI because it assumes the docs are correct and will rely on them to generate text-to-sql, resulting in garbage output.",{"type":33,"tag":34,"props":189,"children":190},{},[191],{"type":38,"value":192},"There are a few core principles of this framework:",{"type":33,"tag":135,"props":194,"children":195},{},[196,201,206,211],{"type":33,"tag":139,"props":197,"children":198},{},[199],{"type":38,"value":200},"keep it simple (no new tech)",{"type":33,"tag":139,"props":202,"children":203},{},[204],{"type":38,"value":205},"keep it inside existing systems (no extra configs)",{"type":33,"tag":139,"props":207,"children":208},{},[209],{"type":38,"value":210},"keep it iterative (no magic pill)",{"type":33,"tag":139,"props":212,"children":213},{},[214],{"type":38,"value":215},"keep it human (no black box)",{"type":33,"tag":217,"props":218,"children":220},"h3",{"id":219},"the-socratic-method-require-the-agent-to-ask-questions",[221],{"type":38,"value":222},"The Socratic Method: Require the Agent to Ask Questions",{"type":33,"tag":34,"props":224,"children":225},{},[226],{"type":38,"value":227},"Building these tasks inside the pipelines allows the agents to get 90% of the metadata and context under control, while delivering the 10% as a set of questions and tasks that someone in the data team should resolve. It is also important to build this step into existing workflows - for example, sending a message in Slack and tagging the team that can answer. It will look something like:",{"type":33,"tag":135,"props":229,"children":230},{},[231,244],{"type":33,"tag":139,"props":232,"children":233},{},[234,236],{"type":38,"value":235},"@marketing-emea is the Q2 ARPDAU target increase for Germany really 500%?\n",{"type":33,"tag":135,"props":237,"children":238},{},[239],{"type":33,"tag":139,"props":240,"children":241},{},[242],{"type":38,"value":243},"marketing-emea: yes that is normal, we launched a new marketing campaign (ID: 1234) and we increased the target",{"type":33,"tag":139,"props":245,"children":246},{},[247,249],{"type":38,"value":248},"@data-eng is it normal that table xyz_f hasn't been updated since last month?\n",{"type":33,"tag":135,"props":250,"children":251},{},[252],{"type":33,"tag":139,"props":253,"children":254},{},[255],{"type":38,"value":256},"data-eng: yes that is normal, that is a legacy table and the correct table is xyz_t",{"type":33,"tag":34,"props":258,"children":259},{},[260],{"type":38,"value":261},"The ultimate goal is not to eliminate the human involvement in managing the context, but reducing it down to a digestible amount. This helps breakdown the tasks/questions into 2 categories:",{"type":33,"tag":135,"props":263,"children":264},{},[265,270],{"type":33,"tag":139,"props":266,"children":267},{},[268],{"type":38,"value":269},"ones that are answered naturally through conversations like in Slack",{"type":33,"tag":139,"props":271,"children":272},{},[273],{"type":38,"value":274},"creates a backlog of tasks (in Jira, Linear, GitHub Issues) for the data team to address",{"type":33,"tag":34,"props":276,"children":277},{},[278],{"type":38,"value":279},"The key here is that the agent should be instructed to ask questions when it encounters ambiguity rather than guessing - and those questions need to be surfaced to the right people, whether that's a Slack message, a PR comment, or a ticket in Linear. This is exactly what a good new hire does, they ask a lot of questions early on and that's a good thing. The difference is that every time someone answers one of these questions, the answer gets written back into the asset metadata or the glossary as a permanent record. So the context layer doesn't just get built once, it gets built continuously through every interaction and every question that gets answered.",{"type":33,"tag":34,"props":281,"children":282},{},[283],{"type":38,"value":284},"I'm sorry for being blunt, but AI is not lazy like us humans - if you instruct it to always follow the same process and update the docs then it will do it, there's no \"oh I forgot\" or \"I'll do that later\".",{"type":33,"tag":34,"props":286,"children":287},{},[288],{"type":38,"value":289},"Here's a concrete example of this socratic method:",{"type":33,"tag":135,"props":291,"children":292},{},[293,312,317,337,342,347,352],{"type":33,"tag":139,"props":294,"children":295},{},[296,298,304,306],{"type":38,"value":297},"the agent is analyzing the ",{"type":33,"tag":155,"props":299,"children":301},{"className":300},[],[302],{"type":38,"value":303},"orders",{"type":38,"value":305}," table and sees a column called ",{"type":33,"tag":155,"props":307,"children":309},{"className":308},[],[310],{"type":38,"value":311},"total_amount",{"type":33,"tag":139,"props":313,"children":314},{},[315],{"type":38,"value":316},"it doesn't know if this is gross revenue or net revenue after refunds",{"type":33,"tag":139,"props":318,"children":319},{},[320,322,327,329,335],{"type":38,"value":321},"instead of assuming, it flags it: \"the column ",{"type":33,"tag":155,"props":323,"children":325},{"className":324},[],[326],{"type":38,"value":311},{"type":38,"value":328}," in ",{"type":33,"tag":155,"props":330,"children":332},{"className":331},[],[333],{"type":38,"value":334},"analytics.orders",{"type":38,"value":336}," has no description - is this gross or net revenue? should refunded orders be excluded?\"",{"type":33,"tag":139,"props":338,"children":339},{},[340],{"type":38,"value":341},"data team answers in Slack \"net revenue after refunds, exclude cancelled orders\"",{"type":33,"tag":139,"props":343,"children":344},{},[345],{"type":38,"value":346},"that answer then gets written back into the asset file as the column description and into the glossary under the Revenue entity",{"type":33,"tag":139,"props":348,"children":349},{},[350],{"type":38,"value":351},"based on the permissions and instructions, it will push it or make a PR for review",{"type":33,"tag":139,"props":353,"children":354},{},[355],{"type":38,"value":356},"next time any agent or any new hire encounters that column, the answer is already there",{"type":33,"tag":56,"props":358,"children":359},{},[],{"type":33,"tag":60,"props":361,"children":363},{"id":362},"building-the-context-layer-a-technical-deep-dive",[364],{"type":38,"value":365},"Building the Context Layer: A Technical Deep Dive",{"type":33,"tag":34,"props":367,"children":368},{},[369],{"type":38,"value":370},"I know it is easier said than done and I'd be lying if I said it is magic, it definitely is not. The goal here is to make it easier and faster to get started on building the semantic layer, but more importantly making it easier to maintain.",{"type":33,"tag":34,"props":372,"children":373},{},[374],{"type":38,"value":375},"In the example below I will utilize Bruin's open-source CLI features but the same principles and methodology apply to any tool out there.",{"type":33,"tag":34,"props":377,"children":378},{},[379],{"type":38,"value":380},"If you're already using Bruin for your data pipelines, step 1 and 2 will be irrelevant since you already have pipelines and tables/assets.",{"type":33,"tag":217,"props":382,"children":384},{"id":383},"step-1-scaffold-and-connect",[385],{"type":38,"value":386},"Step 1: Scaffold and Connect",{"type":33,"tag":34,"props":388,"children":389},{},[390],{"type":38,"value":391},"Set up your connection to your database/warehouse - keep in mind that this connection and its permissions will be used by the agent so make sure it is secure.",{"type":33,"tag":393,"props":394,"children":396},"h4",{"id":395},"create-a-new-projectrepo",[397],{"type":38,"value":398},"Create a new project/repo",{"type":33,"tag":400,"props":401,"children":405},"pre",{"className":402,"code":403,"language":404,"meta":7,"style":7},"language-bash shiki shiki-themes github-dark","bruin init empty my-analytics\ncd my-analytics\n","bash",[406],{"type":33,"tag":155,"props":407,"children":408},{"__ignoreMap":7},[409,437],{"type":33,"tag":410,"props":411,"children":414},"span",{"class":412,"line":413},"line",1,[415,421,427,432],{"type":33,"tag":410,"props":416,"children":418},{"style":417},"--shiki-default:#B392F0",[419],{"type":38,"value":420},"bruin",{"type":33,"tag":410,"props":422,"children":424},{"style":423},"--shiki-default:#9ECBFF",[425],{"type":38,"value":426}," init",{"type":33,"tag":410,"props":428,"children":429},{"style":423},[430],{"type":38,"value":431}," empty",{"type":33,"tag":410,"props":433,"children":434},{"style":423},[435],{"type":38,"value":436}," my-analytics\n",{"type":33,"tag":410,"props":438,"children":440},{"class":412,"line":439},2,[441,447],{"type":33,"tag":410,"props":442,"children":444},{"style":443},"--shiki-default:#79B8FF",[445],{"type":38,"value":446},"cd",{"type":33,"tag":410,"props":448,"children":449},{"style":423},[450],{"type":38,"value":436},{"type":33,"tag":393,"props":452,"children":454},{"id":453},"create-the-connection",[455],{"type":38,"value":456},"Create the connection",{"type":33,"tag":400,"props":458,"children":460},{"className":402,"code":459,"language":404,"meta":7,"style":7},"bruin connections add --type bigquery --name my-dwh\nbruin connections test --name my-dwh\n",[461],{"type":33,"tag":155,"props":462,"children":463},{"__ignoreMap":7},[464,501],{"type":33,"tag":410,"props":465,"children":466},{"class":412,"line":413},[467,471,476,481,486,491,496],{"type":33,"tag":410,"props":468,"children":469},{"style":417},[470],{"type":38,"value":420},{"type":33,"tag":410,"props":472,"children":473},{"style":423},[474],{"type":38,"value":475}," connections",{"type":33,"tag":410,"props":477,"children":478},{"style":423},[479],{"type":38,"value":480}," add",{"type":33,"tag":410,"props":482,"children":483},{"style":443},[484],{"type":38,"value":485}," --type",{"type":33,"tag":410,"props":487,"children":488},{"style":423},[489],{"type":38,"value":490}," bigquery",{"type":33,"tag":410,"props":492,"children":493},{"style":443},[494],{"type":38,"value":495}," --name",{"type":33,"tag":410,"props":497,"children":498},{"style":423},[499],{"type":38,"value":500}," my-dwh\n",{"type":33,"tag":410,"props":502,"children":503},{"class":412,"line":439},[504,508,512,517,521],{"type":33,"tag":410,"props":505,"children":506},{"style":417},[507],{"type":38,"value":420},{"type":33,"tag":410,"props":509,"children":510},{"style":423},[511],{"type":38,"value":475},{"type":33,"tag":410,"props":513,"children":514},{"style":423},[515],{"type":38,"value":516}," test",{"type":33,"tag":410,"props":518,"children":519},{"style":443},[520],{"type":38,"value":495},{"type":33,"tag":410,"props":522,"children":523},{"style":423},[524],{"type":38,"value":500},{"type":33,"tag":217,"props":526,"children":528},{"id":527},"step-2-import-your-existing-schema",[529],{"type":38,"value":530},"Step 2: Import Your Existing Schema",{"type":33,"tag":34,"props":532,"children":533},{},[534],{"type":38,"value":535},"Let's get started by bringing in the basic schema of our tables, this will create a skeleton \"pipeline\" which consists of empty assets (no SQL code) that represent each table.",{"type":33,"tag":400,"props":537,"children":539},{"className":402,"code":538,"language":404,"meta":7,"style":7},"bruin import database --connection my-dwh --schema analytics\n",[540],{"type":33,"tag":155,"props":541,"children":542},{"__ignoreMap":7},[543],{"type":33,"tag":410,"props":544,"children":545},{"class":412,"line":413},[546,550,555,560,565,570,575],{"type":33,"tag":410,"props":547,"children":548},{"style":417},[549],{"type":38,"value":420},{"type":33,"tag":410,"props":551,"children":552},{"style":423},[553],{"type":38,"value":554}," import",{"type":33,"tag":410,"props":556,"children":557},{"style":423},[558],{"type":38,"value":559}," database",{"type":33,"tag":410,"props":561,"children":562},{"style":443},[563],{"type":38,"value":564}," --connection",{"type":33,"tag":410,"props":566,"children":567},{"style":423},[568],{"type":38,"value":569}," my-dwh",{"type":33,"tag":410,"props":571,"children":572},{"style":443},[573],{"type":38,"value":574}," --schema",{"type":33,"tag":410,"props":576,"children":577},{"style":423},[578],{"type":38,"value":579}," analytics\n",{"type":33,"tag":34,"props":581,"children":582},{},[583,585,591],{"type":38,"value":584},"The ",{"type":33,"tag":155,"props":586,"children":588},{"className":587},[],[589],{"type":38,"value":590},"bruin import database",{"type":38,"value":592}," will create empty assets like this:",{"type":33,"tag":400,"props":594,"children":598},{"className":595,"code":596,"language":597,"meta":7,"style":7},"language-yaml shiki shiki-themes github-dark","# assets/analytics/orders.asset.yml (before enhancement)\nname: analytics.orders\ntype: bq.source\ncolumns:\n  - name: order_id\n    type: INTEGER\n  - name: customer_id\n    type: INTEGER\n  - name: status\n    type: VARCHAR\n  - name: total_amount\n    type: FLOAT\n  - name: created_at\n    type: TIMESTAMP\n","yaml",[599],{"type":33,"tag":155,"props":600,"children":601},{"__ignoreMap":7},[602,611,631,649,663,685,703,724,740,761,778,799,816,837],{"type":33,"tag":410,"props":603,"children":604},{"class":412,"line":413},[605],{"type":33,"tag":410,"props":606,"children":608},{"style":607},"--shiki-default:#6A737D",[609],{"type":38,"value":610},"# assets/analytics/orders.asset.yml (before enhancement)\n",{"type":33,"tag":410,"props":612,"children":613},{"class":412,"line":439},[614,620,626],{"type":33,"tag":410,"props":615,"children":617},{"style":616},"--shiki-default:#85E89D",[618],{"type":38,"value":619},"name",{"type":33,"tag":410,"props":621,"children":623},{"style":622},"--shiki-default:#E1E4E8",[624],{"type":38,"value":625},": ",{"type":33,"tag":410,"props":627,"children":628},{"style":423},[629],{"type":38,"value":630},"analytics.orders\n",{"type":33,"tag":410,"props":632,"children":634},{"class":412,"line":633},3,[635,640,644],{"type":33,"tag":410,"props":636,"children":637},{"style":616},[638],{"type":38,"value":639},"type",{"type":33,"tag":410,"props":641,"children":642},{"style":622},[643],{"type":38,"value":625},{"type":33,"tag":410,"props":645,"children":646},{"style":423},[647],{"type":38,"value":648},"bq.source\n",{"type":33,"tag":410,"props":650,"children":652},{"class":412,"line":651},4,[653,658],{"type":33,"tag":410,"props":654,"children":655},{"style":616},[656],{"type":38,"value":657},"columns",{"type":33,"tag":410,"props":659,"children":660},{"style":622},[661],{"type":38,"value":662},":\n",{"type":33,"tag":410,"props":664,"children":666},{"class":412,"line":665},5,[667,672,676,680],{"type":33,"tag":410,"props":668,"children":669},{"style":622},[670],{"type":38,"value":671},"  - ",{"type":33,"tag":410,"props":673,"children":674},{"style":616},[675],{"type":38,"value":619},{"type":33,"tag":410,"props":677,"children":678},{"style":622},[679],{"type":38,"value":625},{"type":33,"tag":410,"props":681,"children":682},{"style":423},[683],{"type":38,"value":684},"order_id\n",{"type":33,"tag":410,"props":686,"children":688},{"class":412,"line":687},6,[689,694,698],{"type":33,"tag":410,"props":690,"children":691},{"style":616},[692],{"type":38,"value":693},"    type",{"type":33,"tag":410,"props":695,"children":696},{"style":622},[697],{"type":38,"value":625},{"type":33,"tag":410,"props":699,"children":700},{"style":423},[701],{"type":38,"value":702},"INTEGER\n",{"type":33,"tag":410,"props":704,"children":706},{"class":412,"line":705},7,[707,711,715,719],{"type":33,"tag":410,"props":708,"children":709},{"style":622},[710],{"type":38,"value":671},{"type":33,"tag":410,"props":712,"children":713},{"style":616},[714],{"type":38,"value":619},{"type":33,"tag":410,"props":716,"children":717},{"style":622},[718],{"type":38,"value":625},{"type":33,"tag":410,"props":720,"children":721},{"style":423},[722],{"type":38,"value":723},"customer_id\n",{"type":33,"tag":410,"props":725,"children":727},{"class":412,"line":726},8,[728,732,736],{"type":33,"tag":410,"props":729,"children":730},{"style":616},[731],{"type":38,"value":693},{"type":33,"tag":410,"props":733,"children":734},{"style":622},[735],{"type":38,"value":625},{"type":33,"tag":410,"props":737,"children":738},{"style":423},[739],{"type":38,"value":702},{"type":33,"tag":410,"props":741,"children":743},{"class":412,"line":742},9,[744,748,752,756],{"type":33,"tag":410,"props":745,"children":746},{"style":622},[747],{"type":38,"value":671},{"type":33,"tag":410,"props":749,"children":750},{"style":616},[751],{"type":38,"value":619},{"type":33,"tag":410,"props":753,"children":754},{"style":622},[755],{"type":38,"value":625},{"type":33,"tag":410,"props":757,"children":758},{"style":423},[759],{"type":38,"value":760},"status\n",{"type":33,"tag":410,"props":762,"children":764},{"class":412,"line":763},10,[765,769,773],{"type":33,"tag":410,"props":766,"children":767},{"style":616},[768],{"type":38,"value":693},{"type":33,"tag":410,"props":770,"children":771},{"style":622},[772],{"type":38,"value":625},{"type":33,"tag":410,"props":774,"children":775},{"style":423},[776],{"type":38,"value":777},"VARCHAR\n",{"type":33,"tag":410,"props":779,"children":781},{"class":412,"line":780},11,[782,786,790,794],{"type":33,"tag":410,"props":783,"children":784},{"style":622},[785],{"type":38,"value":671},{"type":33,"tag":410,"props":787,"children":788},{"style":616},[789],{"type":38,"value":619},{"type":33,"tag":410,"props":791,"children":792},{"style":622},[793],{"type":38,"value":625},{"type":33,"tag":410,"props":795,"children":796},{"style":423},[797],{"type":38,"value":798},"total_amount\n",{"type":33,"tag":410,"props":800,"children":802},{"class":412,"line":801},12,[803,807,811],{"type":33,"tag":410,"props":804,"children":805},{"style":616},[806],{"type":38,"value":693},{"type":33,"tag":410,"props":808,"children":809},{"style":622},[810],{"type":38,"value":625},{"type":33,"tag":410,"props":812,"children":813},{"style":423},[814],{"type":38,"value":815},"FLOAT\n",{"type":33,"tag":410,"props":817,"children":819},{"class":412,"line":818},13,[820,824,828,832],{"type":33,"tag":410,"props":821,"children":822},{"style":622},[823],{"type":38,"value":671},{"type":33,"tag":410,"props":825,"children":826},{"style":616},[827],{"type":38,"value":619},{"type":33,"tag":410,"props":829,"children":830},{"style":622},[831],{"type":38,"value":625},{"type":33,"tag":410,"props":833,"children":834},{"style":423},[835],{"type":38,"value":836},"created_at\n",{"type":33,"tag":410,"props":838,"children":840},{"class":412,"line":839},14,[841,845,849],{"type":33,"tag":410,"props":842,"children":843},{"style":616},[844],{"type":38,"value":693},{"type":33,"tag":410,"props":846,"children":847},{"style":622},[848],{"type":38,"value":625},{"type":33,"tag":410,"props":850,"children":851},{"style":423},[852],{"type":38,"value":853},"TIMESTAMP\n",{"type":33,"tag":217,"props":855,"children":857},{"id":856},"step-3-ai-powered-metadata-enrichment",[858],{"type":38,"value":859},"Step 3: AI-Powered Metadata Enrichment",{"type":33,"tag":34,"props":861,"children":862},{},[863,864,870],{"type":38,"value":584},{"type":33,"tag":155,"props":865,"children":867},{"className":866},[],[868],{"type":38,"value":869},"ai enhance",{"type":38,"value":871}," command analyzes each table as a data analyst would traditionally do, everything from checking min/max/unique values for each column to finding the aggregation level and so on, then adding all that metadata to the context files it creates.",{"type":33,"tag":34,"props":873,"children":874},{},[875,877,882,884],{"type":38,"value":876},"At its core, this ",{"type":33,"tag":155,"props":878,"children":880},{"className":879},[],[881],{"type":38,"value":869},{"type":38,"value":883}," feature is just a long prompt to the agent instructing it to analyze the data - you can check out the repo to see the prompt: ",{"type":33,"tag":885,"props":886,"children":890},"a",{"href":887,"rel":888},"https://github.com/bruin-data/bruin",[889],"nofollow",[891],{"type":38,"value":892},"github.com/bruin-data/bruin",{"type":33,"tag":34,"props":894,"children":895},{},[896],{"type":38,"value":897},"This function will generate table and column level descriptions, tags, quality checks, and table metadata.",{"type":33,"tag":400,"props":899,"children":901},{"className":402,"code":900,"language":404,"meta":7,"style":7},"bruin ai enhance my-analytics\n",[902],{"type":33,"tag":155,"props":903,"children":904},{"__ignoreMap":7},[905],{"type":33,"tag":410,"props":906,"children":907},{"class":412,"line":413},[908,912,917,922],{"type":33,"tag":410,"props":909,"children":910},{"style":417},[911],{"type":38,"value":420},{"type":33,"tag":410,"props":913,"children":914},{"style":423},[915],{"type":38,"value":916}," ai",{"type":33,"tag":410,"props":918,"children":919},{"style":423},[920],{"type":38,"value":921}," enhance",{"type":33,"tag":410,"props":923,"children":924},{"style":423},[925],{"type":38,"value":436},{"type":33,"tag":400,"props":927,"children":929},{"className":595,"code":928,"language":597,"meta":7,"style":7},"# assets/analytics/orders.asset.yml (after enhancement)\nname: analytics.orders\ntype: bq.source\ndescription: \"Customer orders with purchase details and fulfillment status. One row per order. Granularity: order-level.\"\ntags:\n  - ecommerce\n  - transactions\ncolumns:\n  - name: order_id\n    type: INTEGER\n    description: \"Unique identifier for each order\"\n    checks:\n      - name: not_null\n      - name: unique\n  - name: customer_id\n    type: INTEGER\n    description: \"Foreign key to analytics.customers\"\n    checks:\n      - name: not_null\n  - name: status\n    type: VARCHAR\n    description: \"Current fulfillment status of the order\"\n    checks:\n      - name: accepted_values\n        value: [\"pending\", \"shipped\", \"delivered\", \"refunded\"]\n  - name: total_amount\n    type: FLOAT\n    description: \"Net order total in USD after discounts, before tax\"\n    checks:\n      - name: not_null\n      - name: positive\n  - name: created_at\n    type: TIMESTAMP\n    description: \"Timestamp when the order was placed (UTC)\"\n    checks:\n      - name: not_null\n",[930],{"type":33,"tag":155,"props":931,"children":932},{"__ignoreMap":7},[933,941,956,971,988,1000,1012,1024,1035,1054,1069,1086,1098,1119,1139,1159,1175,1192,1204,1224,1244,1260,1277,1289,1310,1361,1381,1397,1414,1426,1446,1467,1487,1503,1520,1532],{"type":33,"tag":410,"props":934,"children":935},{"class":412,"line":413},[936],{"type":33,"tag":410,"props":937,"children":938},{"style":607},[939],{"type":38,"value":940},"# assets/analytics/orders.asset.yml (after enhancement)\n",{"type":33,"tag":410,"props":942,"children":943},{"class":412,"line":439},[944,948,952],{"type":33,"tag":410,"props":945,"children":946},{"style":616},[947],{"type":38,"value":619},{"type":33,"tag":410,"props":949,"children":950},{"style":622},[951],{"type":38,"value":625},{"type":33,"tag":410,"props":953,"children":954},{"style":423},[955],{"type":38,"value":630},{"type":33,"tag":410,"props":957,"children":958},{"class":412,"line":633},[959,963,967],{"type":33,"tag":410,"props":960,"children":961},{"style":616},[962],{"type":38,"value":639},{"type":33,"tag":410,"props":964,"children":965},{"style":622},[966],{"type":38,"value":625},{"type":33,"tag":410,"props":968,"children":969},{"style":423},[970],{"type":38,"value":648},{"type":33,"tag":410,"props":972,"children":973},{"class":412,"line":651},[974,979,983],{"type":33,"tag":410,"props":975,"children":976},{"style":616},[977],{"type":38,"value":978},"description",{"type":33,"tag":410,"props":980,"children":981},{"style":622},[982],{"type":38,"value":625},{"type":33,"tag":410,"props":984,"children":985},{"style":423},[986],{"type":38,"value":987},"\"Customer orders with purchase details and fulfillment status. One row per order. Granularity: order-level.\"\n",{"type":33,"tag":410,"props":989,"children":990},{"class":412,"line":665},[991,996],{"type":33,"tag":410,"props":992,"children":993},{"style":616},[994],{"type":38,"value":995},"tags",{"type":33,"tag":410,"props":997,"children":998},{"style":622},[999],{"type":38,"value":662},{"type":33,"tag":410,"props":1001,"children":1002},{"class":412,"line":687},[1003,1007],{"type":33,"tag":410,"props":1004,"children":1005},{"style":622},[1006],{"type":38,"value":671},{"type":33,"tag":410,"props":1008,"children":1009},{"style":423},[1010],{"type":38,"value":1011},"ecommerce\n",{"type":33,"tag":410,"props":1013,"children":1014},{"class":412,"line":705},[1015,1019],{"type":33,"tag":410,"props":1016,"children":1017},{"style":622},[1018],{"type":38,"value":671},{"type":33,"tag":410,"props":1020,"children":1021},{"style":423},[1022],{"type":38,"value":1023},"transactions\n",{"type":33,"tag":410,"props":1025,"children":1026},{"class":412,"line":726},[1027,1031],{"type":33,"tag":410,"props":1028,"children":1029},{"style":616},[1030],{"type":38,"value":657},{"type":33,"tag":410,"props":1032,"children":1033},{"style":622},[1034],{"type":38,"value":662},{"type":33,"tag":410,"props":1036,"children":1037},{"class":412,"line":742},[1038,1042,1046,1050],{"type":33,"tag":410,"props":1039,"children":1040},{"style":622},[1041],{"type":38,"value":671},{"type":33,"tag":410,"props":1043,"children":1044},{"style":616},[1045],{"type":38,"value":619},{"type":33,"tag":410,"props":1047,"children":1048},{"style":622},[1049],{"type":38,"value":625},{"type":33,"tag":410,"props":1051,"children":1052},{"style":423},[1053],{"type":38,"value":684},{"type":33,"tag":410,"props":1055,"children":1056},{"class":412,"line":763},[1057,1061,1065],{"type":33,"tag":410,"props":1058,"children":1059},{"style":616},[1060],{"type":38,"value":693},{"type":33,"tag":410,"props":1062,"children":1063},{"style":622},[1064],{"type":38,"value":625},{"type":33,"tag":410,"props":1066,"children":1067},{"style":423},[1068],{"type":38,"value":702},{"type":33,"tag":410,"props":1070,"children":1071},{"class":412,"line":780},[1072,1077,1081],{"type":33,"tag":410,"props":1073,"children":1074},{"style":616},[1075],{"type":38,"value":1076},"    description",{"type":33,"tag":410,"props":1078,"children":1079},{"style":622},[1080],{"type":38,"value":625},{"type":33,"tag":410,"props":1082,"children":1083},{"style":423},[1084],{"type":38,"value":1085},"\"Unique identifier for each order\"\n",{"type":33,"tag":410,"props":1087,"children":1088},{"class":412,"line":801},[1089,1094],{"type":33,"tag":410,"props":1090,"children":1091},{"style":616},[1092],{"type":38,"value":1093},"    checks",{"type":33,"tag":410,"props":1095,"children":1096},{"style":622},[1097],{"type":38,"value":662},{"type":33,"tag":410,"props":1099,"children":1100},{"class":412,"line":818},[1101,1106,1110,1114],{"type":33,"tag":410,"props":1102,"children":1103},{"style":622},[1104],{"type":38,"value":1105},"      - ",{"type":33,"tag":410,"props":1107,"children":1108},{"style":616},[1109],{"type":38,"value":619},{"type":33,"tag":410,"props":1111,"children":1112},{"style":622},[1113],{"type":38,"value":625},{"type":33,"tag":410,"props":1115,"children":1116},{"style":423},[1117],{"type":38,"value":1118},"not_null\n",{"type":33,"tag":410,"props":1120,"children":1121},{"class":412,"line":839},[1122,1126,1130,1134],{"type":33,"tag":410,"props":1123,"children":1124},{"style":622},[1125],{"type":38,"value":1105},{"type":33,"tag":410,"props":1127,"children":1128},{"style":616},[1129],{"type":38,"value":619},{"type":33,"tag":410,"props":1131,"children":1132},{"style":622},[1133],{"type":38,"value":625},{"type":33,"tag":410,"props":1135,"children":1136},{"style":423},[1137],{"type":38,"value":1138},"unique\n",{"type":33,"tag":410,"props":1140,"children":1142},{"class":412,"line":1141},15,[1143,1147,1151,1155],{"type":33,"tag":410,"props":1144,"children":1145},{"style":622},[1146],{"type":38,"value":671},{"type":33,"tag":410,"props":1148,"children":1149},{"style":616},[1150],{"type":38,"value":619},{"type":33,"tag":410,"props":1152,"children":1153},{"style":622},[1154],{"type":38,"value":625},{"type":33,"tag":410,"props":1156,"children":1157},{"style":423},[1158],{"type":38,"value":723},{"type":33,"tag":410,"props":1160,"children":1162},{"class":412,"line":1161},16,[1163,1167,1171],{"type":33,"tag":410,"props":1164,"children":1165},{"style":616},[1166],{"type":38,"value":693},{"type":33,"tag":410,"props":1168,"children":1169},{"style":622},[1170],{"type":38,"value":625},{"type":33,"tag":410,"props":1172,"children":1173},{"style":423},[1174],{"type":38,"value":702},{"type":33,"tag":410,"props":1176,"children":1178},{"class":412,"line":1177},17,[1179,1183,1187],{"type":33,"tag":410,"props":1180,"children":1181},{"style":616},[1182],{"type":38,"value":1076},{"type":33,"tag":410,"props":1184,"children":1185},{"style":622},[1186],{"type":38,"value":625},{"type":33,"tag":410,"props":1188,"children":1189},{"style":423},[1190],{"type":38,"value":1191},"\"Foreign key to analytics.customers\"\n",{"type":33,"tag":410,"props":1193,"children":1195},{"class":412,"line":1194},18,[1196,1200],{"type":33,"tag":410,"props":1197,"children":1198},{"style":616},[1199],{"type":38,"value":1093},{"type":33,"tag":410,"props":1201,"children":1202},{"style":622},[1203],{"type":38,"value":662},{"type":33,"tag":410,"props":1205,"children":1207},{"class":412,"line":1206},19,[1208,1212,1216,1220],{"type":33,"tag":410,"props":1209,"children":1210},{"style":622},[1211],{"type":38,"value":1105},{"type":33,"tag":410,"props":1213,"children":1214},{"style":616},[1215],{"type":38,"value":619},{"type":33,"tag":410,"props":1217,"children":1218},{"style":622},[1219],{"type":38,"value":625},{"type":33,"tag":410,"props":1221,"children":1222},{"style":423},[1223],{"type":38,"value":1118},{"type":33,"tag":410,"props":1225,"children":1227},{"class":412,"line":1226},20,[1228,1232,1236,1240],{"type":33,"tag":410,"props":1229,"children":1230},{"style":622},[1231],{"type":38,"value":671},{"type":33,"tag":410,"props":1233,"children":1234},{"style":616},[1235],{"type":38,"value":619},{"type":33,"tag":410,"props":1237,"children":1238},{"style":622},[1239],{"type":38,"value":625},{"type":33,"tag":410,"props":1241,"children":1242},{"style":423},[1243],{"type":38,"value":760},{"type":33,"tag":410,"props":1245,"children":1247},{"class":412,"line":1246},21,[1248,1252,1256],{"type":33,"tag":410,"props":1249,"children":1250},{"style":616},[1251],{"type":38,"value":693},{"type":33,"tag":410,"props":1253,"children":1254},{"style":622},[1255],{"type":38,"value":625},{"type":33,"tag":410,"props":1257,"children":1258},{"style":423},[1259],{"type":38,"value":777},{"type":33,"tag":410,"props":1261,"children":1263},{"class":412,"line":1262},22,[1264,1268,1272],{"type":33,"tag":410,"props":1265,"children":1266},{"style":616},[1267],{"type":38,"value":1076},{"type":33,"tag":410,"props":1269,"children":1270},{"style":622},[1271],{"type":38,"value":625},{"type":33,"tag":410,"props":1273,"children":1274},{"style":423},[1275],{"type":38,"value":1276},"\"Current fulfillment status of the order\"\n",{"type":33,"tag":410,"props":1278,"children":1280},{"class":412,"line":1279},23,[1281,1285],{"type":33,"tag":410,"props":1282,"children":1283},{"style":616},[1284],{"type":38,"value":1093},{"type":33,"tag":410,"props":1286,"children":1287},{"style":622},[1288],{"type":38,"value":662},{"type":33,"tag":410,"props":1290,"children":1292},{"class":412,"line":1291},24,[1293,1297,1301,1305],{"type":33,"tag":410,"props":1294,"children":1295},{"style":622},[1296],{"type":38,"value":1105},{"type":33,"tag":410,"props":1298,"children":1299},{"style":616},[1300],{"type":38,"value":619},{"type":33,"tag":410,"props":1302,"children":1303},{"style":622},[1304],{"type":38,"value":625},{"type":33,"tag":410,"props":1306,"children":1307},{"style":423},[1308],{"type":38,"value":1309},"accepted_values\n",{"type":33,"tag":410,"props":1311,"children":1312},{"class":412,"line":13},[1313,1318,1323,1328,1333,1338,1342,1347,1351,1356],{"type":33,"tag":410,"props":1314,"children":1315},{"style":616},[1316],{"type":38,"value":1317},"        value",{"type":33,"tag":410,"props":1319,"children":1320},{"style":622},[1321],{"type":38,"value":1322},": [",{"type":33,"tag":410,"props":1324,"children":1325},{"style":423},[1326],{"type":38,"value":1327},"\"pending\"",{"type":33,"tag":410,"props":1329,"children":1330},{"style":622},[1331],{"type":38,"value":1332},", ",{"type":33,"tag":410,"props":1334,"children":1335},{"style":423},[1336],{"type":38,"value":1337},"\"shipped\"",{"type":33,"tag":410,"props":1339,"children":1340},{"style":622},[1341],{"type":38,"value":1332},{"type":33,"tag":410,"props":1343,"children":1344},{"style":423},[1345],{"type":38,"value":1346},"\"delivered\"",{"type":33,"tag":410,"props":1348,"children":1349},{"style":622},[1350],{"type":38,"value":1332},{"type":33,"tag":410,"props":1352,"children":1353},{"style":423},[1354],{"type":38,"value":1355},"\"refunded\"",{"type":33,"tag":410,"props":1357,"children":1358},{"style":622},[1359],{"type":38,"value":1360},"]\n",{"type":33,"tag":410,"props":1362,"children":1364},{"class":412,"line":1363},26,[1365,1369,1373,1377],{"type":33,"tag":410,"props":1366,"children":1367},{"style":622},[1368],{"type":38,"value":671},{"type":33,"tag":410,"props":1370,"children":1371},{"style":616},[1372],{"type":38,"value":619},{"type":33,"tag":410,"props":1374,"children":1375},{"style":622},[1376],{"type":38,"value":625},{"type":33,"tag":410,"props":1378,"children":1379},{"style":423},[1380],{"type":38,"value":798},{"type":33,"tag":410,"props":1382,"children":1384},{"class":412,"line":1383},27,[1385,1389,1393],{"type":33,"tag":410,"props":1386,"children":1387},{"style":616},[1388],{"type":38,"value":693},{"type":33,"tag":410,"props":1390,"children":1391},{"style":622},[1392],{"type":38,"value":625},{"type":33,"tag":410,"props":1394,"children":1395},{"style":423},[1396],{"type":38,"value":815},{"type":33,"tag":410,"props":1398,"children":1400},{"class":412,"line":1399},28,[1401,1405,1409],{"type":33,"tag":410,"props":1402,"children":1403},{"style":616},[1404],{"type":38,"value":1076},{"type":33,"tag":410,"props":1406,"children":1407},{"style":622},[1408],{"type":38,"value":625},{"type":33,"tag":410,"props":1410,"children":1411},{"style":423},[1412],{"type":38,"value":1413},"\"Net order total in USD after discounts, before tax\"\n",{"type":33,"tag":410,"props":1415,"children":1417},{"class":412,"line":1416},29,[1418,1422],{"type":33,"tag":410,"props":1419,"children":1420},{"style":616},[1421],{"type":38,"value":1093},{"type":33,"tag":410,"props":1423,"children":1424},{"style":622},[1425],{"type":38,"value":662},{"type":33,"tag":410,"props":1427,"children":1429},{"class":412,"line":1428},30,[1430,1434,1438,1442],{"type":33,"tag":410,"props":1431,"children":1432},{"style":622},[1433],{"type":38,"value":1105},{"type":33,"tag":410,"props":1435,"children":1436},{"style":616},[1437],{"type":38,"value":619},{"type":33,"tag":410,"props":1439,"children":1440},{"style":622},[1441],{"type":38,"value":625},{"type":33,"tag":410,"props":1443,"children":1444},{"style":423},[1445],{"type":38,"value":1118},{"type":33,"tag":410,"props":1447,"children":1449},{"class":412,"line":1448},31,[1450,1454,1458,1462],{"type":33,"tag":410,"props":1451,"children":1452},{"style":622},[1453],{"type":38,"value":1105},{"type":33,"tag":410,"props":1455,"children":1456},{"style":616},[1457],{"type":38,"value":619},{"type":33,"tag":410,"props":1459,"children":1460},{"style":622},[1461],{"type":38,"value":625},{"type":33,"tag":410,"props":1463,"children":1464},{"style":423},[1465],{"type":38,"value":1466},"positive\n",{"type":33,"tag":410,"props":1468,"children":1470},{"class":412,"line":1469},32,[1471,1475,1479,1483],{"type":33,"tag":410,"props":1472,"children":1473},{"style":622},[1474],{"type":38,"value":671},{"type":33,"tag":410,"props":1476,"children":1477},{"style":616},[1478],{"type":38,"value":619},{"type":33,"tag":410,"props":1480,"children":1481},{"style":622},[1482],{"type":38,"value":625},{"type":33,"tag":410,"props":1484,"children":1485},{"style":423},[1486],{"type":38,"value":836},{"type":33,"tag":410,"props":1488,"children":1490},{"class":412,"line":1489},33,[1491,1495,1499],{"type":33,"tag":410,"props":1492,"children":1493},{"style":616},[1494],{"type":38,"value":693},{"type":33,"tag":410,"props":1496,"children":1497},{"style":622},[1498],{"type":38,"value":625},{"type":33,"tag":410,"props":1500,"children":1501},{"style":423},[1502],{"type":38,"value":853},{"type":33,"tag":410,"props":1504,"children":1506},{"class":412,"line":1505},34,[1507,1511,1515],{"type":33,"tag":410,"props":1508,"children":1509},{"style":616},[1510],{"type":38,"value":1076},{"type":33,"tag":410,"props":1512,"children":1513},{"style":622},[1514],{"type":38,"value":625},{"type":33,"tag":410,"props":1516,"children":1517},{"style":423},[1518],{"type":38,"value":1519},"\"Timestamp when the order was placed (UTC)\"\n",{"type":33,"tag":410,"props":1521,"children":1523},{"class":412,"line":1522},35,[1524,1528],{"type":33,"tag":410,"props":1525,"children":1526},{"style":616},[1527],{"type":38,"value":1093},{"type":33,"tag":410,"props":1529,"children":1530},{"style":622},[1531],{"type":38,"value":662},{"type":33,"tag":410,"props":1533,"children":1535},{"class":412,"line":1534},36,[1536,1540,1544,1548],{"type":33,"tag":410,"props":1537,"children":1538},{"style":622},[1539],{"type":38,"value":1105},{"type":33,"tag":410,"props":1541,"children":1542},{"style":616},[1543],{"type":38,"value":619},{"type":33,"tag":410,"props":1545,"children":1546},{"style":622},[1547],{"type":38,"value":625},{"type":33,"tag":410,"props":1549,"children":1550},{"style":423},[1551],{"type":38,"value":1118},{"type":33,"tag":34,"props":1553,"children":1554},{},[1555,1557,1563],{"type":38,"value":1556},"What surprised me most was how much the metadata mattered. The first version of the agent answered poorly because it had no context. After running ",{"type":33,"tag":155,"props":1558,"children":1560},{"className":1559},[],[1561],{"type":38,"value":1562},"bruin ai enhance",{"type":38,"value":1564},", the descriptions, column tags, and quality checks made the agent far more reliable. I spent more time cleaning metadata than tweaking prompts, and it paid off.",{"type":33,"tag":217,"props":1566,"children":1568},{"id":1567},"step-4-build-a-business-glossary",[1569],{"type":38,"value":1570},"Step 4: Build a Business Glossary",{"type":33,"tag":34,"props":1572,"children":1573},{},[1574],{"type":38,"value":1575},"Bruin also has a feature called Glossary and right now we're working on integrating that into this as well, with also built-in integrations into your knowledge base (Confluence, Notion, etc.) so that it can create a glossary/dictionary of all your key metrics, terminology, definitions, etc.",{"type":33,"tag":34,"props":1577,"children":1578},{},[1579],{"type":38,"value":1580},"Here's what the glossary looks like:",{"type":33,"tag":400,"props":1582,"children":1584},{"className":595,"code":1583,"language":597,"meta":7,"style":7},"# glossary.yml\ndomains:\n  finance:\n    description: Revenue, costs, and margin analysis\n    owners:\n      - \"Finance Team\"\n    contact:\n      - type: \"slack\"\n        address: \"#finance-data\"\n\nentities:\n  Revenue:\n    description: Net revenue after refunds and discounts, in USD.\n    domains:\n      - finance\n    attributes:\n      Monthly:\n        type: decimal\n        description: \"Sum of total_amount for delivered orders in a calendar month\"\n      Gross:\n        type: decimal\n        description: \"Sum of total_amount before refunds\"\n\n  Customer:\n    description: An individual or business that has completed at least one purchase.\n    domains:\n      - finance\n    attributes:\n      ID:\n        type: integer\n        description: The unique identifier of the customer in our systems.\n      LTV:\n        type: decimal\n        description: \"Lifetime value: total revenue attributed to this customer\"\n",[1585],{"type":33,"tag":155,"props":1586,"children":1587},{"__ignoreMap":7},[1588,1596,1608,1620,1636,1648,1660,1672,1692,1709,1718,1730,1742,1758,1770,1782,1794,1806,1823,1840,1852,1867,1883,1890,1902,1918,1929,1940,1951,1963,1979,1995,2007,2022],{"type":33,"tag":410,"props":1589,"children":1590},{"class":412,"line":413},[1591],{"type":33,"tag":410,"props":1592,"children":1593},{"style":607},[1594],{"type":38,"value":1595},"# glossary.yml\n",{"type":33,"tag":410,"props":1597,"children":1598},{"class":412,"line":439},[1599,1604],{"type":33,"tag":410,"props":1600,"children":1601},{"style":616},[1602],{"type":38,"value":1603},"domains",{"type":33,"tag":410,"props":1605,"children":1606},{"style":622},[1607],{"type":38,"value":662},{"type":33,"tag":410,"props":1609,"children":1610},{"class":412,"line":633},[1611,1616],{"type":33,"tag":410,"props":1612,"children":1613},{"style":616},[1614],{"type":38,"value":1615},"  finance",{"type":33,"tag":410,"props":1617,"children":1618},{"style":622},[1619],{"type":38,"value":662},{"type":33,"tag":410,"props":1621,"children":1622},{"class":412,"line":651},[1623,1627,1631],{"type":33,"tag":410,"props":1624,"children":1625},{"style":616},[1626],{"type":38,"value":1076},{"type":33,"tag":410,"props":1628,"children":1629},{"style":622},[1630],{"type":38,"value":625},{"type":33,"tag":410,"props":1632,"children":1633},{"style":423},[1634],{"type":38,"value":1635},"Revenue, costs, and margin analysis\n",{"type":33,"tag":410,"props":1637,"children":1638},{"class":412,"line":665},[1639,1644],{"type":33,"tag":410,"props":1640,"children":1641},{"style":616},[1642],{"type":38,"value":1643},"    owners",{"type":33,"tag":410,"props":1645,"children":1646},{"style":622},[1647],{"type":38,"value":662},{"type":33,"tag":410,"props":1649,"children":1650},{"class":412,"line":687},[1651,1655],{"type":33,"tag":410,"props":1652,"children":1653},{"style":622},[1654],{"type":38,"value":1105},{"type":33,"tag":410,"props":1656,"children":1657},{"style":423},[1658],{"type":38,"value":1659},"\"Finance Team\"\n",{"type":33,"tag":410,"props":1661,"children":1662},{"class":412,"line":705},[1663,1668],{"type":33,"tag":410,"props":1664,"children":1665},{"style":616},[1666],{"type":38,"value":1667},"    contact",{"type":33,"tag":410,"props":1669,"children":1670},{"style":622},[1671],{"type":38,"value":662},{"type":33,"tag":410,"props":1673,"children":1674},{"class":412,"line":726},[1675,1679,1683,1687],{"type":33,"tag":410,"props":1676,"children":1677},{"style":622},[1678],{"type":38,"value":1105},{"type":33,"tag":410,"props":1680,"children":1681},{"style":616},[1682],{"type":38,"value":639},{"type":33,"tag":410,"props":1684,"children":1685},{"style":622},[1686],{"type":38,"value":625},{"type":33,"tag":410,"props":1688,"children":1689},{"style":423},[1690],{"type":38,"value":1691},"\"slack\"\n",{"type":33,"tag":410,"props":1693,"children":1694},{"class":412,"line":742},[1695,1700,1704],{"type":33,"tag":410,"props":1696,"children":1697},{"style":616},[1698],{"type":38,"value":1699},"        address",{"type":33,"tag":410,"props":1701,"children":1702},{"style":622},[1703],{"type":38,"value":625},{"type":33,"tag":410,"props":1705,"children":1706},{"style":423},[1707],{"type":38,"value":1708},"\"#finance-data\"\n",{"type":33,"tag":410,"props":1710,"children":1711},{"class":412,"line":763},[1712],{"type":33,"tag":410,"props":1713,"children":1715},{"emptyLinePlaceholder":1714},true,[1716],{"type":38,"value":1717},"\n",{"type":33,"tag":410,"props":1719,"children":1720},{"class":412,"line":780},[1721,1726],{"type":33,"tag":410,"props":1722,"children":1723},{"style":616},[1724],{"type":38,"value":1725},"entities",{"type":33,"tag":410,"props":1727,"children":1728},{"style":622},[1729],{"type":38,"value":662},{"type":33,"tag":410,"props":1731,"children":1732},{"class":412,"line":801},[1733,1738],{"type":33,"tag":410,"props":1734,"children":1735},{"style":616},[1736],{"type":38,"value":1737},"  Revenue",{"type":33,"tag":410,"props":1739,"children":1740},{"style":622},[1741],{"type":38,"value":662},{"type":33,"tag":410,"props":1743,"children":1744},{"class":412,"line":818},[1745,1749,1753],{"type":33,"tag":410,"props":1746,"children":1747},{"style":616},[1748],{"type":38,"value":1076},{"type":33,"tag":410,"props":1750,"children":1751},{"style":622},[1752],{"type":38,"value":625},{"type":33,"tag":410,"props":1754,"children":1755},{"style":423},[1756],{"type":38,"value":1757},"Net revenue after refunds and discounts, in USD.\n",{"type":33,"tag":410,"props":1759,"children":1760},{"class":412,"line":839},[1761,1766],{"type":33,"tag":410,"props":1762,"children":1763},{"style":616},[1764],{"type":38,"value":1765},"    domains",{"type":33,"tag":410,"props":1767,"children":1768},{"style":622},[1769],{"type":38,"value":662},{"type":33,"tag":410,"props":1771,"children":1772},{"class":412,"line":1141},[1773,1777],{"type":33,"tag":410,"props":1774,"children":1775},{"style":622},[1776],{"type":38,"value":1105},{"type":33,"tag":410,"props":1778,"children":1779},{"style":423},[1780],{"type":38,"value":1781},"finance\n",{"type":33,"tag":410,"props":1783,"children":1784},{"class":412,"line":1161},[1785,1790],{"type":33,"tag":410,"props":1786,"children":1787},{"style":616},[1788],{"type":38,"value":1789},"    attributes",{"type":33,"tag":410,"props":1791,"children":1792},{"style":622},[1793],{"type":38,"value":662},{"type":33,"tag":410,"props":1795,"children":1796},{"class":412,"line":1177},[1797,1802],{"type":33,"tag":410,"props":1798,"children":1799},{"style":616},[1800],{"type":38,"value":1801},"      Monthly",{"type":33,"tag":410,"props":1803,"children":1804},{"style":622},[1805],{"type":38,"value":662},{"type":33,"tag":410,"props":1807,"children":1808},{"class":412,"line":1194},[1809,1814,1818],{"type":33,"tag":410,"props":1810,"children":1811},{"style":616},[1812],{"type":38,"value":1813},"        type",{"type":33,"tag":410,"props":1815,"children":1816},{"style":622},[1817],{"type":38,"value":625},{"type":33,"tag":410,"props":1819,"children":1820},{"style":423},[1821],{"type":38,"value":1822},"decimal\n",{"type":33,"tag":410,"props":1824,"children":1825},{"class":412,"line":1206},[1826,1831,1835],{"type":33,"tag":410,"props":1827,"children":1828},{"style":616},[1829],{"type":38,"value":1830},"        description",{"type":33,"tag":410,"props":1832,"children":1833},{"style":622},[1834],{"type":38,"value":625},{"type":33,"tag":410,"props":1836,"children":1837},{"style":423},[1838],{"type":38,"value":1839},"\"Sum of total_amount for delivered orders in a calendar month\"\n",{"type":33,"tag":410,"props":1841,"children":1842},{"class":412,"line":1226},[1843,1848],{"type":33,"tag":410,"props":1844,"children":1845},{"style":616},[1846],{"type":38,"value":1847},"      Gross",{"type":33,"tag":410,"props":1849,"children":1850},{"style":622},[1851],{"type":38,"value":662},{"type":33,"tag":410,"props":1853,"children":1854},{"class":412,"line":1246},[1855,1859,1863],{"type":33,"tag":410,"props":1856,"children":1857},{"style":616},[1858],{"type":38,"value":1813},{"type":33,"tag":410,"props":1860,"children":1861},{"style":622},[1862],{"type":38,"value":625},{"type":33,"tag":410,"props":1864,"children":1865},{"style":423},[1866],{"type":38,"value":1822},{"type":33,"tag":410,"props":1868,"children":1869},{"class":412,"line":1262},[1870,1874,1878],{"type":33,"tag":410,"props":1871,"children":1872},{"style":616},[1873],{"type":38,"value":1830},{"type":33,"tag":410,"props":1875,"children":1876},{"style":622},[1877],{"type":38,"value":625},{"type":33,"tag":410,"props":1879,"children":1880},{"style":423},[1881],{"type":38,"value":1882},"\"Sum of total_amount before refunds\"\n",{"type":33,"tag":410,"props":1884,"children":1885},{"class":412,"line":1279},[1886],{"type":33,"tag":410,"props":1887,"children":1888},{"emptyLinePlaceholder":1714},[1889],{"type":38,"value":1717},{"type":33,"tag":410,"props":1891,"children":1892},{"class":412,"line":1291},[1893,1898],{"type":33,"tag":410,"props":1894,"children":1895},{"style":616},[1896],{"type":38,"value":1897},"  Customer",{"type":33,"tag":410,"props":1899,"children":1900},{"style":622},[1901],{"type":38,"value":662},{"type":33,"tag":410,"props":1903,"children":1904},{"class":412,"line":13},[1905,1909,1913],{"type":33,"tag":410,"props":1906,"children":1907},{"style":616},[1908],{"type":38,"value":1076},{"type":33,"tag":410,"props":1910,"children":1911},{"style":622},[1912],{"type":38,"value":625},{"type":33,"tag":410,"props":1914,"children":1915},{"style":423},[1916],{"type":38,"value":1917},"An individual or business that has completed at least one purchase.\n",{"type":33,"tag":410,"props":1919,"children":1920},{"class":412,"line":1363},[1921,1925],{"type":33,"tag":410,"props":1922,"children":1923},{"style":616},[1924],{"type":38,"value":1765},{"type":33,"tag":410,"props":1926,"children":1927},{"style":622},[1928],{"type":38,"value":662},{"type":33,"tag":410,"props":1930,"children":1931},{"class":412,"line":1383},[1932,1936],{"type":33,"tag":410,"props":1933,"children":1934},{"style":622},[1935],{"type":38,"value":1105},{"type":33,"tag":410,"props":1937,"children":1938},{"style":423},[1939],{"type":38,"value":1781},{"type":33,"tag":410,"props":1941,"children":1942},{"class":412,"line":1399},[1943,1947],{"type":33,"tag":410,"props":1944,"children":1945},{"style":616},[1946],{"type":38,"value":1789},{"type":33,"tag":410,"props":1948,"children":1949},{"style":622},[1950],{"type":38,"value":662},{"type":33,"tag":410,"props":1952,"children":1953},{"class":412,"line":1416},[1954,1959],{"type":33,"tag":410,"props":1955,"children":1956},{"style":616},[1957],{"type":38,"value":1958},"      ID",{"type":33,"tag":410,"props":1960,"children":1961},{"style":622},[1962],{"type":38,"value":662},{"type":33,"tag":410,"props":1964,"children":1965},{"class":412,"line":1428},[1966,1970,1974],{"type":33,"tag":410,"props":1967,"children":1968},{"style":616},[1969],{"type":38,"value":1813},{"type":33,"tag":410,"props":1971,"children":1972},{"style":622},[1973],{"type":38,"value":625},{"type":33,"tag":410,"props":1975,"children":1976},{"style":423},[1977],{"type":38,"value":1978},"integer\n",{"type":33,"tag":410,"props":1980,"children":1981},{"class":412,"line":1448},[1982,1986,1990],{"type":33,"tag":410,"props":1983,"children":1984},{"style":616},[1985],{"type":38,"value":1830},{"type":33,"tag":410,"props":1987,"children":1988},{"style":622},[1989],{"type":38,"value":625},{"type":33,"tag":410,"props":1991,"children":1992},{"style":423},[1993],{"type":38,"value":1994},"The unique identifier of the customer in our systems.\n",{"type":33,"tag":410,"props":1996,"children":1997},{"class":412,"line":1469},[1998,2003],{"type":33,"tag":410,"props":1999,"children":2000},{"style":616},[2001],{"type":38,"value":2002},"      LTV",{"type":33,"tag":410,"props":2004,"children":2005},{"style":622},[2006],{"type":38,"value":662},{"type":33,"tag":410,"props":2008,"children":2009},{"class":412,"line":1489},[2010,2014,2018],{"type":33,"tag":410,"props":2011,"children":2012},{"style":616},[2013],{"type":38,"value":1813},{"type":33,"tag":410,"props":2015,"children":2016},{"style":622},[2017],{"type":38,"value":625},{"type":33,"tag":410,"props":2019,"children":2020},{"style":423},[2021],{"type":38,"value":1822},{"type":33,"tag":410,"props":2023,"children":2024},{"class":412,"line":1505},[2025,2029,2033],{"type":33,"tag":410,"props":2026,"children":2027},{"style":616},[2028],{"type":38,"value":1830},{"type":33,"tag":410,"props":2030,"children":2031},{"style":622},[2032],{"type":38,"value":625},{"type":33,"tag":410,"props":2034,"children":2035},{"style":423},[2036],{"type":38,"value":2037},"\"Lifetime value: total revenue attributed to this customer\"\n",{"type":33,"tag":34,"props":2039,"children":2040},{},[2041],{"type":38,"value":2042},"Inside an asset you can extend the glossary definitions and attributes like this:",{"type":33,"tag":400,"props":2044,"children":2046},{"className":595,"code":2045,"language":597,"meta":7,"style":7},"# assets/analytics/orders.asset.yml - linking to glossary\nname: analytics.orders\ncolumns:\n  - name: customer_id\n    extends: Customer.ID\n  - name: total_amount\n    extends: Revenue.Gross\n",[2047],{"type":33,"tag":155,"props":2048,"children":2049},{"__ignoreMap":7},[2050,2058,2073,2084,2103,2120,2139],{"type":33,"tag":410,"props":2051,"children":2052},{"class":412,"line":413},[2053],{"type":33,"tag":410,"props":2054,"children":2055},{"style":607},[2056],{"type":38,"value":2057},"# assets/analytics/orders.asset.yml - linking to glossary\n",{"type":33,"tag":410,"props":2059,"children":2060},{"class":412,"line":439},[2061,2065,2069],{"type":33,"tag":410,"props":2062,"children":2063},{"style":616},[2064],{"type":38,"value":619},{"type":33,"tag":410,"props":2066,"children":2067},{"style":622},[2068],{"type":38,"value":625},{"type":33,"tag":410,"props":2070,"children":2071},{"style":423},[2072],{"type":38,"value":630},{"type":33,"tag":410,"props":2074,"children":2075},{"class":412,"line":633},[2076,2080],{"type":33,"tag":410,"props":2077,"children":2078},{"style":616},[2079],{"type":38,"value":657},{"type":33,"tag":410,"props":2081,"children":2082},{"style":622},[2083],{"type":38,"value":662},{"type":33,"tag":410,"props":2085,"children":2086},{"class":412,"line":651},[2087,2091,2095,2099],{"type":33,"tag":410,"props":2088,"children":2089},{"style":622},[2090],{"type":38,"value":671},{"type":33,"tag":410,"props":2092,"children":2093},{"style":616},[2094],{"type":38,"value":619},{"type":33,"tag":410,"props":2096,"children":2097},{"style":622},[2098],{"type":38,"value":625},{"type":33,"tag":410,"props":2100,"children":2101},{"style":423},[2102],{"type":38,"value":723},{"type":33,"tag":410,"props":2104,"children":2105},{"class":412,"line":665},[2106,2111,2115],{"type":33,"tag":410,"props":2107,"children":2108},{"style":616},[2109],{"type":38,"value":2110},"    extends",{"type":33,"tag":410,"props":2112,"children":2113},{"style":622},[2114],{"type":38,"value":625},{"type":33,"tag":410,"props":2116,"children":2117},{"style":423},[2118],{"type":38,"value":2119},"Customer.ID\n",{"type":33,"tag":410,"props":2121,"children":2122},{"class":412,"line":687},[2123,2127,2131,2135],{"type":33,"tag":410,"props":2124,"children":2125},{"style":622},[2126],{"type":38,"value":671},{"type":33,"tag":410,"props":2128,"children":2129},{"style":616},[2130],{"type":38,"value":619},{"type":33,"tag":410,"props":2132,"children":2133},{"style":622},[2134],{"type":38,"value":625},{"type":33,"tag":410,"props":2136,"children":2137},{"style":423},[2138],{"type":38,"value":798},{"type":33,"tag":410,"props":2140,"children":2141},{"class":412,"line":705},[2142,2146,2150],{"type":33,"tag":410,"props":2143,"children":2144},{"style":616},[2145],{"type":38,"value":2110},{"type":33,"tag":410,"props":2147,"children":2148},{"style":622},[2149],{"type":38,"value":625},{"type":33,"tag":410,"props":2151,"children":2152},{"style":423},[2153],{"type":38,"value":2154},"Revenue.Gross\n",{"type":33,"tag":217,"props":2156,"children":2158},{"id":2157},"step-5-write-agent-instructions",[2159],{"type":38,"value":2160},"Step 5: Write Agent Instructions",{"type":33,"tag":34,"props":2162,"children":2163},{},[2164],{"type":38,"value":2165},"It is always best practice to set up general instructions, rules, restrictions, and context that the agent can follow - the best way to do this is by creating an AGENTS.md file.",{"type":33,"tag":34,"props":2167,"children":2168},{},[2169],{"type":38,"value":2170},"In this file, you will give the agent general instructions on which tools to use and how to use them, but also include some general business context - although, it is best to keep business context inside the pipeline itself, either in the glossary, asset, or pipeline readme file.",{"type":33,"tag":400,"props":2172,"children":2176},{"className":2173,"code":2174,"language":2175,"meta":7,"style":7},"language-markdown shiki shiki-themes github-dark","# AGENTS.md\n\n## Data access\n- Utilize Bruin MCP and Bruin CLI to connect to the warehouse and query the data.\n- Use `bruin query --connection my-dwh --query \"\u003CSQL>\"` for all data access\n- Always show the SQL query and explain your reasoning before executing it\n- Use LIMIT 10 when exploring unfamiliar tables or testing complex queries\n- Read the `assets/` directory to understand available tables and their schemas before querying\n- This is a **read-only** environment - never run INSERT, UPDATE, DELETE, or DROP statements\n\n## Domain context\n- \"Revenue\" always means net revenue after refunds unless explicitly stated otherwise\n- All timestamps are stored in UTC\n- The `status` field in orders uses: pending, shipped, delivered, refunded\n- Q1 = Jan-Mar, Q2 = Apr-Jun, Q3 = Jul-Sep, Q4 = Oct-Dec (calendar year)\n\n## When you're unsure\n- If a metric definition is ambiguous, check the glossary.yml first\n- If the glossary doesn't have the answer, ASK - do not guess\n- Format questions as: \"I found X in the data but expected Y - should I interpret this as Z?\"\n","markdown",[2177],{"type":33,"tag":155,"props":2178,"children":2179},{"__ignoreMap":7},[2180,2188,2195,2203,2211,2219,2227,2235,2243,2251,2258,2266,2274,2282,2290,2298,2305,2313,2321,2329],{"type":33,"tag":410,"props":2181,"children":2182},{"class":412,"line":413},[2183],{"type":33,"tag":410,"props":2184,"children":2185},{},[2186],{"type":38,"value":2187},"# AGENTS.md\n",{"type":33,"tag":410,"props":2189,"children":2190},{"class":412,"line":439},[2191],{"type":33,"tag":410,"props":2192,"children":2193},{"emptyLinePlaceholder":1714},[2194],{"type":38,"value":1717},{"type":33,"tag":410,"props":2196,"children":2197},{"class":412,"line":633},[2198],{"type":33,"tag":410,"props":2199,"children":2200},{},[2201],{"type":38,"value":2202},"## Data access\n",{"type":33,"tag":410,"props":2204,"children":2205},{"class":412,"line":651},[2206],{"type":33,"tag":410,"props":2207,"children":2208},{},[2209],{"type":38,"value":2210},"- Utilize Bruin MCP and Bruin CLI to connect to the warehouse and query the data.\n",{"type":33,"tag":410,"props":2212,"children":2213},{"class":412,"line":665},[2214],{"type":33,"tag":410,"props":2215,"children":2216},{},[2217],{"type":38,"value":2218},"- Use `bruin query --connection my-dwh --query \"\u003CSQL>\"` for all data access\n",{"type":33,"tag":410,"props":2220,"children":2221},{"class":412,"line":687},[2222],{"type":33,"tag":410,"props":2223,"children":2224},{},[2225],{"type":38,"value":2226},"- Always show the SQL query and explain your reasoning before executing it\n",{"type":33,"tag":410,"props":2228,"children":2229},{"class":412,"line":705},[2230],{"type":33,"tag":410,"props":2231,"children":2232},{},[2233],{"type":38,"value":2234},"- Use LIMIT 10 when exploring unfamiliar tables or testing complex queries\n",{"type":33,"tag":410,"props":2236,"children":2237},{"class":412,"line":726},[2238],{"type":33,"tag":410,"props":2239,"children":2240},{},[2241],{"type":38,"value":2242},"- Read the `assets/` directory to understand available tables and their schemas before querying\n",{"type":33,"tag":410,"props":2244,"children":2245},{"class":412,"line":742},[2246],{"type":33,"tag":410,"props":2247,"children":2248},{},[2249],{"type":38,"value":2250},"- This is a **read-only** environment - never run INSERT, UPDATE, DELETE, or DROP statements\n",{"type":33,"tag":410,"props":2252,"children":2253},{"class":412,"line":763},[2254],{"type":33,"tag":410,"props":2255,"children":2256},{"emptyLinePlaceholder":1714},[2257],{"type":38,"value":1717},{"type":33,"tag":410,"props":2259,"children":2260},{"class":412,"line":780},[2261],{"type":33,"tag":410,"props":2262,"children":2263},{},[2264],{"type":38,"value":2265},"## Domain context\n",{"type":33,"tag":410,"props":2267,"children":2268},{"class":412,"line":801},[2269],{"type":33,"tag":410,"props":2270,"children":2271},{},[2272],{"type":38,"value":2273},"- \"Revenue\" always means net revenue after refunds unless explicitly stated otherwise\n",{"type":33,"tag":410,"props":2275,"children":2276},{"class":412,"line":818},[2277],{"type":33,"tag":410,"props":2278,"children":2279},{},[2280],{"type":38,"value":2281},"- All timestamps are stored in UTC\n",{"type":33,"tag":410,"props":2283,"children":2284},{"class":412,"line":839},[2285],{"type":33,"tag":410,"props":2286,"children":2287},{},[2288],{"type":38,"value":2289},"- The `status` field in orders uses: pending, shipped, delivered, refunded\n",{"type":33,"tag":410,"props":2291,"children":2292},{"class":412,"line":1141},[2293],{"type":33,"tag":410,"props":2294,"children":2295},{},[2296],{"type":38,"value":2297},"- Q1 = Jan-Mar, Q2 = Apr-Jun, Q3 = Jul-Sep, Q4 = Oct-Dec (calendar year)\n",{"type":33,"tag":410,"props":2299,"children":2300},{"class":412,"line":1161},[2301],{"type":33,"tag":410,"props":2302,"children":2303},{"emptyLinePlaceholder":1714},[2304],{"type":38,"value":1717},{"type":33,"tag":410,"props":2306,"children":2307},{"class":412,"line":1177},[2308],{"type":33,"tag":410,"props":2309,"children":2310},{},[2311],{"type":38,"value":2312},"## When you're unsure\n",{"type":33,"tag":410,"props":2314,"children":2315},{"class":412,"line":1194},[2316],{"type":33,"tag":410,"props":2317,"children":2318},{},[2319],{"type":38,"value":2320},"- If a metric definition is ambiguous, check the glossary.yml first\n",{"type":33,"tag":410,"props":2322,"children":2323},{"class":412,"line":1206},[2324],{"type":33,"tag":410,"props":2325,"children":2326},{},[2327],{"type":38,"value":2328},"- If the glossary doesn't have the answer, ASK - do not guess\n",{"type":33,"tag":410,"props":2330,"children":2331},{"class":412,"line":1226},[2332],{"type":33,"tag":410,"props":2333,"children":2334},{},[2335],{"type":38,"value":2336},"- Format questions as: \"I found X in the data but expected Y - should I interpret this as Z?\"\n",{"type":33,"tag":217,"props":2338,"children":2340},{"id":2339},"step-6-connect-the-agent-via-mcp",[2341],{"type":38,"value":2342},"Step 6: Connect the Agent via MCP",{"type":33,"tag":34,"props":2344,"children":2345},{},[2346],{"type":38,"value":2347},"Add Bruin MCP to your agent so that it knows how to use Bruin's functions. If you're using another tool, then connect that tool's MCP.",{"type":33,"tag":400,"props":2349,"children":2351},{"className":402,"code":2350,"language":404,"meta":7,"style":7},"# For Claude Code\nclaude mcp add bruin -- bruin mcp\n\n# For Cursor (.cursor/mcp.json)\n{\n  \"mcpServers\": {\n    \"bruin\": {\n      \"command\": \"bruin\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n",[2352],{"type":33,"tag":155,"props":2353,"children":2354},{"__ignoreMap":7},[2355,2363,2399,2406,2414,2422,2440,2456,2473,2499,2507,2515],{"type":33,"tag":410,"props":2356,"children":2357},{"class":412,"line":413},[2358],{"type":33,"tag":410,"props":2359,"children":2360},{"style":607},[2361],{"type":38,"value":2362},"# For Claude Code\n",{"type":33,"tag":410,"props":2364,"children":2365},{"class":412,"line":439},[2366,2371,2376,2380,2385,2390,2394],{"type":33,"tag":410,"props":2367,"children":2368},{"style":417},[2369],{"type":38,"value":2370},"claude",{"type":33,"tag":410,"props":2372,"children":2373},{"style":423},[2374],{"type":38,"value":2375}," mcp",{"type":33,"tag":410,"props":2377,"children":2378},{"style":423},[2379],{"type":38,"value":480},{"type":33,"tag":410,"props":2381,"children":2382},{"style":423},[2383],{"type":38,"value":2384}," bruin",{"type":33,"tag":410,"props":2386,"children":2387},{"style":443},[2388],{"type":38,"value":2389}," --",{"type":33,"tag":410,"props":2391,"children":2392},{"style":423},[2393],{"type":38,"value":2384},{"type":33,"tag":410,"props":2395,"children":2396},{"style":423},[2397],{"type":38,"value":2398}," mcp\n",{"type":33,"tag":410,"props":2400,"children":2401},{"class":412,"line":633},[2402],{"type":33,"tag":410,"props":2403,"children":2404},{"emptyLinePlaceholder":1714},[2405],{"type":38,"value":1717},{"type":33,"tag":410,"props":2407,"children":2408},{"class":412,"line":651},[2409],{"type":33,"tag":410,"props":2410,"children":2411},{"style":607},[2412],{"type":38,"value":2413},"# For Cursor (.cursor/mcp.json)\n",{"type":33,"tag":410,"props":2415,"children":2416},{"class":412,"line":665},[2417],{"type":33,"tag":410,"props":2418,"children":2419},{"style":622},[2420],{"type":38,"value":2421},"{\n",{"type":33,"tag":410,"props":2423,"children":2424},{"class":412,"line":687},[2425,2430,2435],{"type":33,"tag":410,"props":2426,"children":2427},{"style":417},[2428],{"type":38,"value":2429},"  \"mcpServers\"",{"type":33,"tag":410,"props":2431,"children":2432},{"style":443},[2433],{"type":38,"value":2434},":",{"type":33,"tag":410,"props":2436,"children":2437},{"style":423},[2438],{"type":38,"value":2439}," {\n",{"type":33,"tag":410,"props":2441,"children":2442},{"class":412,"line":705},[2443,2448,2452],{"type":33,"tag":410,"props":2444,"children":2445},{"style":417},[2446],{"type":38,"value":2447},"    \"bruin\"",{"type":33,"tag":410,"props":2449,"children":2450},{"style":443},[2451],{"type":38,"value":2434},{"type":33,"tag":410,"props":2453,"children":2454},{"style":423},[2455],{"type":38,"value":2439},{"type":33,"tag":410,"props":2457,"children":2458},{"class":412,"line":726},[2459,2464,2468],{"type":33,"tag":410,"props":2460,"children":2461},{"style":417},[2462],{"type":38,"value":2463},"      \"command\"",{"type":33,"tag":410,"props":2465,"children":2466},{"style":443},[2467],{"type":38,"value":2434},{"type":33,"tag":410,"props":2469,"children":2470},{"style":423},[2471],{"type":38,"value":2472}," \"bruin\",\n",{"type":33,"tag":410,"props":2474,"children":2475},{"class":412,"line":742},[2476,2481,2485,2490,2495],{"type":33,"tag":410,"props":2477,"children":2478},{"style":417},[2479],{"type":38,"value":2480},"      \"args\"",{"type":33,"tag":410,"props":2482,"children":2483},{"style":443},[2484],{"type":38,"value":2434},{"type":33,"tag":410,"props":2486,"children":2487},{"style":622},[2488],{"type":38,"value":2489}," [",{"type":33,"tag":410,"props":2491,"children":2492},{"style":423},[2493],{"type":38,"value":2494},"\"mcp\"",{"type":33,"tag":410,"props":2496,"children":2497},{"style":622},[2498],{"type":38,"value":1360},{"type":33,"tag":410,"props":2500,"children":2501},{"class":412,"line":763},[2502],{"type":33,"tag":410,"props":2503,"children":2504},{"style":622},[2505],{"type":38,"value":2506},"    }\n",{"type":33,"tag":410,"props":2508,"children":2509},{"class":412,"line":780},[2510],{"type":33,"tag":410,"props":2511,"children":2512},{"style":622},[2513],{"type":38,"value":2514},"  }\n",{"type":33,"tag":410,"props":2516,"children":2517},{"class":412,"line":801},[2518],{"type":33,"tag":410,"props":2519,"children":2520},{"style":622},[2521],{"type":38,"value":2522},"}\n",{"type":33,"tag":56,"props":2524,"children":2525},{},[],{"type":33,"tag":60,"props":2527,"children":2529},{"id":2528},"self-healing-pipeline-tasks",[2530],{"type":38,"value":2531},"Self-Healing Pipeline Tasks",{"type":33,"tag":34,"props":2533,"children":2534},{},[2535],{"type":38,"value":2536},"A context layer is only as good as the data underneath it - if the pipelines are broken or the data is stale, the context is wrong and the agents reach the wrong conclusions. The classic garbage-in & garbage-out pitfall is in full effect here.",{"type":33,"tag":34,"props":2538,"children":2539},{},[2540],{"type":38,"value":2541},"Since the method I introduced above requires clean and healthy data for the agent to build the context layer on top of, it becomes quintessential for your pipelines and tables to be accurate and reliable. Hence all the buzz around \"self-healing pipelines\", but let's look into what that actually looks like.",{"type":33,"tag":34,"props":2543,"children":2544},{},[2545],{"type":38,"value":2546},"Building processes inside pipelines that trigger agents to complete specific tasks to check the health of pipelines, models, and data itself is important. A set of rule-based and scope-restricted tasks allow agents to automatically address common issues or flag, triage, and quarantine for human review.",{"type":33,"tag":34,"props":2548,"children":2549},{},[2550],{"type":38,"value":2551},"Data contracts might be useful here too. Sometimes it is needed to define specific behaviour based on a quality check or fallback plan. For example if table xyz has less than avg 100 data points per minute per location, then don't insert and instead use table abc (for example to prevent ML pipelines making inference with low quality data). Most of the times you can implement dynamic pipelines with your existing pipeline orchestrator, whether it supports it out of the box or needs to be handled manually.",{"type":33,"tag":34,"props":2553,"children":2554},{},[2555],{"type":38,"value":2556},"Let's explore some examples of how self-healing pipelines work - what the agent investigates and triages, how it communicates it to the team, and what steps are taken to resolve the issue.",{"type":33,"tag":34,"props":2558,"children":2559},{},[2560],{"type":38,"value":2561},"Keep in mind, in all these examples the agent is responsible for the initial investigation and proposed solution(s), but depending on the permissions/instructions the agent will either send a message to the team, create a ticket or PR, or just merge the fix. This all depends on your risk appetite and how much freedom and autonomy you want to give to the agent.",{"type":33,"tag":217,"props":2563,"children":2565},{"id":2564},"schema-drift-handling",[2566],{"type":38,"value":2567},"Schema Drift Handling",{"type":33,"tag":135,"props":2569,"children":2570},{},[2571,2576,2581],{"type":33,"tag":139,"props":2572,"children":2573},{},[2574],{"type":38,"value":2575},"new column appears, downstream does a select star -> update to explicitly select columns used downstream",{"type":33,"tag":139,"props":2577,"children":2578},{},[2579],{"type":38,"value":2580},"column type changes -> auto-cast or query the data to infer the type",{"type":33,"tag":139,"props":2582,"children":2583},{},[2584],{"type":38,"value":2585},"column renamed -> match by similarity and refactor references",{"type":33,"tag":217,"props":2587,"children":2589},{"id":2588},"freshness-and-staleness",[2590],{"type":38,"value":2591},"Freshness and Staleness",{"type":33,"tag":135,"props":2593,"children":2594},{},[2595,2600],{"type":33,"tag":139,"props":2596,"children":2597},{},[2598],{"type":38,"value":2599},"scheduled ingestion delayed -> run a backfill run of transformation jobs to catch up",{"type":33,"tag":139,"props":2601,"children":2602},{},[2603],{"type":38,"value":2604},"only 1 new row in source table -> check expected rows and run backfill or flag for review",{"type":33,"tag":34,"props":2606,"children":2607},{},[2608],{"type":38,"value":2609},"Here's a pseudo-code example of what a check could look like with pre-defined actions for the agent.",{"type":33,"tag":400,"props":2611,"children":2613},{"className":595,"code":2612,"language":597,"meta":7,"style":7},"# Freshness check in an asset file\nchecks:\n  - name: freshness\n    params:\n      column: created_at\n      max_delay: \"2 hours\"\n      action: run-backfill\n      alert: data-eng\n",[2614],{"type":33,"tag":155,"props":2615,"children":2616},{"__ignoreMap":7},[2617,2625,2637,2657,2669,2685,2702,2719],{"type":33,"tag":410,"props":2618,"children":2619},{"class":412,"line":413},[2620],{"type":33,"tag":410,"props":2621,"children":2622},{"style":607},[2623],{"type":38,"value":2624},"# Freshness check in an asset file\n",{"type":33,"tag":410,"props":2626,"children":2627},{"class":412,"line":439},[2628,2633],{"type":33,"tag":410,"props":2629,"children":2630},{"style":616},[2631],{"type":38,"value":2632},"checks",{"type":33,"tag":410,"props":2634,"children":2635},{"style":622},[2636],{"type":38,"value":662},{"type":33,"tag":410,"props":2638,"children":2639},{"class":412,"line":633},[2640,2644,2648,2652],{"type":33,"tag":410,"props":2641,"children":2642},{"style":622},[2643],{"type":38,"value":671},{"type":33,"tag":410,"props":2645,"children":2646},{"style":616},[2647],{"type":38,"value":619},{"type":33,"tag":410,"props":2649,"children":2650},{"style":622},[2651],{"type":38,"value":625},{"type":33,"tag":410,"props":2653,"children":2654},{"style":423},[2655],{"type":38,"value":2656},"freshness\n",{"type":33,"tag":410,"props":2658,"children":2659},{"class":412,"line":651},[2660,2665],{"type":33,"tag":410,"props":2661,"children":2662},{"style":616},[2663],{"type":38,"value":2664},"    params",{"type":33,"tag":410,"props":2666,"children":2667},{"style":622},[2668],{"type":38,"value":662},{"type":33,"tag":410,"props":2670,"children":2671},{"class":412,"line":665},[2672,2677,2681],{"type":33,"tag":410,"props":2673,"children":2674},{"style":616},[2675],{"type":38,"value":2676},"      column",{"type":33,"tag":410,"props":2678,"children":2679},{"style":622},[2680],{"type":38,"value":625},{"type":33,"tag":410,"props":2682,"children":2683},{"style":423},[2684],{"type":38,"value":836},{"type":33,"tag":410,"props":2686,"children":2687},{"class":412,"line":687},[2688,2693,2697],{"type":33,"tag":410,"props":2689,"children":2690},{"style":616},[2691],{"type":38,"value":2692},"      max_delay",{"type":33,"tag":410,"props":2694,"children":2695},{"style":622},[2696],{"type":38,"value":625},{"type":33,"tag":410,"props":2698,"children":2699},{"style":423},[2700],{"type":38,"value":2701},"\"2 hours\"\n",{"type":33,"tag":410,"props":2703,"children":2704},{"class":412,"line":705},[2705,2710,2714],{"type":33,"tag":410,"props":2706,"children":2707},{"style":616},[2708],{"type":38,"value":2709},"      action",{"type":33,"tag":410,"props":2711,"children":2712},{"style":622},[2713],{"type":38,"value":625},{"type":33,"tag":410,"props":2715,"children":2716},{"style":423},[2717],{"type":38,"value":2718},"run-backfill\n",{"type":33,"tag":410,"props":2720,"children":2721},{"class":412,"line":726},[2722,2727,2731],{"type":33,"tag":410,"props":2723,"children":2724},{"style":616},[2725],{"type":38,"value":2726},"      alert",{"type":33,"tag":410,"props":2728,"children":2729},{"style":622},[2730],{"type":38,"value":625},{"type":33,"tag":410,"props":2732,"children":2733},{"style":423},[2734],{"type":38,"value":2735},"data-eng\n",{"type":33,"tag":217,"props":2737,"children":2739},{"id":2738},"data-quality-governance",[2740],{"type":38,"value":2741},"Data Quality & Governance",{"type":33,"tag":135,"props":2743,"children":2744},{},[2745,2750,2755],{"type":33,"tag":139,"props":2746,"children":2747},{},[2748],{"type":38,"value":2749},"volume anomaly in source table -> halt run and escalate",{"type":33,"tag":139,"props":2751,"children":2752},{},[2753],{"type":38,"value":2754},"date format changes -> auto-detect pattern",{"type":33,"tag":139,"props":2756,"children":2757},{},[2758],{"type":38,"value":2759},"new column without description -> auto-generate description or flag",{"type":33,"tag":217,"props":2761,"children":2763},{"id":2762},"monitoring",[2764],{"type":38,"value":2765},"Monitoring",{"type":33,"tag":34,"props":2767,"children":2768},{},[2769],{"type":38,"value":2770},"In terms of monitoring, one thing I've done before and I'm not sure if it's the best way, is to create tasks in between other SQL tasks (or inside a python task) that logs specific things inside a table (e.g. pipeline status, error logs, row counts, quality check status, etc), and then connect those tables to Grafana to create monitoring dashboards and alerts.",{"type":33,"tag":34,"props":2772,"children":2773},{},[2774],{"type":38,"value":2775},"One way of utilizing these monitoring tables is to create scheduled agent tasks (e.g. daily) that check these tables and if there is something that needs to be escalated, it will send a message in Slack with charts and graphs visualizing the logs - this is much more efficient than setting a reminder to check the monitoring dashboards. This is similar to classic alerting systems but it goes a step further because the agent comes to you with not just an alert, but the data visualized and analyzed, and even with a proposed solution and a PR ready for review.",{"type":33,"tag":34,"props":2777,"children":2778},{},[2779],{"type":38,"value":2780},"Here's an example:",{"type":33,"tag":135,"props":2782,"children":2783},{},[2784,2789,2802,2822,2850,2891],{"type":33,"tag":139,"props":2785,"children":2786},{},[2787],{"type":38,"value":2788},"a weekly scheduled agent task runs every Monday morning to check for anomalies in website traffic",{"type":33,"tag":139,"props":2790,"children":2791},{},[2792,2794,2800],{"type":38,"value":2793},"this week it notices that ",{"type":33,"tag":155,"props":2795,"children":2797},{"className":2796},[],[2798],{"type":38,"value":2799},"paid_social",{"type":38,"value":2801}," traffic has been declining day over day for 7 days",{"type":33,"tag":139,"props":2803,"children":2804},{},[2805,2807,2813,2814,2820],{"type":38,"value":2806},"at the same time, a new UTM appeared (",{"type":33,"tag":155,"props":2808,"children":2810},{"className":2809},[],[2811],{"type":38,"value":2812},"utm_source=fb_spring25",{"type":38,"value":1332},{"type":33,"tag":155,"props":2815,"children":2817},{"className":2816},[],[2818],{"type":38,"value":2819},"utm_medium=NULL",{"type":38,"value":2821},") and its traffic has been growing at roughly the same rate",{"type":33,"tag":139,"props":2823,"children":2824},{},[2825,2827,2833,2835,2841,2843,2848],{"type":38,"value":2826},"because ",{"type":33,"tag":155,"props":2828,"children":2830},{"className":2829},[],[2831],{"type":38,"value":2832},"utm_medium",{"type":38,"value":2834}," is null, this traffic gets bucketed into the ",{"type":33,"tag":155,"props":2836,"children":2838},{"className":2837},[],[2839],{"type":38,"value":2840},"not set",{"type":38,"value":2842}," channel instead of ",{"type":33,"tag":155,"props":2844,"children":2846},{"className":2845},[],[2847],{"type":38,"value":2799},{"type":38,"value":2849}," - so the traffic didn't actually drop, it was just misattributed",{"type":33,"tag":139,"props":2851,"children":2852},{},[2853,2855,2861,2863,2868,2870,2876,2878,2884,2886],{"type":38,"value":2854},"the agent sends a message in ",{"type":33,"tag":155,"props":2856,"children":2858},{"className":2857},[],[2859],{"type":38,"value":2860},"#marketing-data",{"type":38,"value":2862}," with a chart showing both trends side by side, identifies that the campaign links were likely updated around April 14 with the new UTMs missing ",{"type":33,"tag":155,"props":2864,"children":2866},{"className":2865},[],[2867],{"type":38,"value":2832},{"type":38,"value":2869}," and ",{"type":33,"tag":155,"props":2871,"children":2873},{"className":2872},[],[2874],{"type":38,"value":2875},"utm_campaign",{"type":38,"value":2877},", and proposes a fix: either update the campaign links or add a mapping rule in the pipeline that maps ",{"type":33,"tag":155,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":38,"value":2883},"fb_spring25",{"type":38,"value":2885}," to ",{"type":33,"tag":155,"props":2887,"children":2889},{"className":2888},[],[2890],{"type":38,"value":2799},{"type":33,"tag":139,"props":2892,"children":2893},{},[2894],{"type":38,"value":2895},"without this agent, the marketing team would notice the drop in their weekly report, open a ticket, the data team would investigate and it would take days to figure out it was just a UTM tagging issue",{"type":33,"tag":56,"props":2897,"children":2898},{},[],{"type":33,"tag":60,"props":2900,"children":2902},{"id":2901},"strategies-and-methods-for-helping-agents-query-data",[2903],{"type":38,"value":2904},"Strategies and Methods for Helping Agents Query Data",{"type":33,"tag":34,"props":2906,"children":2907},{},[2908,2910,2916,2918,2924,2926,2932],{"type":38,"value":2909},"Most databases and warehouses support some form of table-valued functions (TVFs) - in BigQuery it's called ",{"type":33,"tag":155,"props":2911,"children":2913},{"className":2912},[],[2914],{"type":38,"value":2915},"TABLE FUNCTION",{"type":38,"value":2917},", in Snowflake it's ",{"type":33,"tag":155,"props":2919,"children":2921},{"className":2920},[],[2922],{"type":38,"value":2923},"UDTF",{"type":38,"value":2925},", in PostgreSQL it's a function with ",{"type":33,"tag":155,"props":2927,"children":2929},{"className":2928},[],[2930],{"type":38,"value":2931},"RETURNS TABLE",{"type":38,"value":2933},", and SQL Server has had TVFs for a long time. The naming is different but the concept is the same, you define a function that takes specific parameters and returns a table as a result.",{"type":33,"tag":34,"props":2935,"children":2936},{},[2937],{"type":38,"value":2938},"One interesting method that I found effective is the use of TVF as the interface between your agent and the data - you essentially define a function that is used to query tables, think of it as an API interface for the table(s). This way you only expose these TVFs to the agents and they have to provide the specific parameters to get a result back.",{"type":33,"tag":34,"props":2940,"children":2941},{},[2942],{"type":38,"value":2943},"In other words, instead of trusting that the agent will query the table the correct way, you offload some of that responsibility to a built-in function that enforces it. This is especially important when querying large tables that must be filtered by partition, otherwise you'll have agents querying TBs of data just to answer a simple question.",{"type":33,"tag":34,"props":2945,"children":2946},{},[2947],{"type":38,"value":2948},"The reason this works so well for agents is that some tables have very specific query logic that needs to be followed - certain filters that must always be applied, certain joins that need to happen in a specific order, certain aggregation levels that shouldn't be changed. If you let an agent write a raw SQL query against these tables, there's a real chance it will miss a critical filter or join incorrectly and return results that look right but are wrong. By wrapping the table in a TVF, you bake in the correct logic and the agent just has to provide the parameters - it literally cannot query the data the wrong way.",{"type":33,"tag":34,"props":2950,"children":2951},{},[2952],{"type":38,"value":2953},"Here's a concrete example:",{"type":33,"tag":135,"props":2955,"children":2956},{},[2957,2985,2998],{"type":33,"tag":139,"props":2958,"children":2959},{},[2960,2962,2967,2969,2975,2977,2983],{"type":38,"value":2961},"you have an ",{"type":33,"tag":155,"props":2963,"children":2965},{"className":2964},[],[2966],{"type":38,"value":334},{"type":38,"value":2968}," table that should always be filtered by date range, should always exclude test orders (",{"type":33,"tag":155,"props":2970,"children":2972},{"className":2971},[],[2973],{"type":38,"value":2974},"is_test = false",{"type":38,"value":2976},"), and should always join with ",{"type":33,"tag":155,"props":2978,"children":2980},{"className":2979},[],[2981],{"type":38,"value":2982},"analytics.customers",{"type":38,"value":2984}," to get the customer region",{"type":33,"tag":139,"props":2986,"children":2987},{},[2988,2990,2996],{"type":38,"value":2989},"without a TVF, the agent might run ",{"type":33,"tag":155,"props":2991,"children":2993},{"className":2992},[],[2994],{"type":38,"value":2995},"SELECT * FROM analytics.orders WHERE created_at > '2025-01-01'",{"type":38,"value":2997}," and get results that include test orders and have no region info",{"type":33,"tag":139,"props":2999,"children":3000},{},[3001,3003,3009],{"type":38,"value":3002},"with a TVF, the agent calls ",{"type":33,"tag":155,"props":3004,"children":3006},{"className":3005},[],[3007],{"type":38,"value":3008},"SELECT * FROM analytics.fn_orders(start_date, end_date, region)",{"type":38,"value":3010}," and the function handles the test order filter, the customer join, and the date range logic internally",{"type":33,"tag":400,"props":3012,"children":3016},{"className":3013,"code":3014,"language":3015,"meta":7,"style":7},"language-sql shiki shiki-themes github-dark","-- BigQuery example\nCREATE TABLE FUNCTION analytics.fn_orders(\n  start_date DATE,\n  end_date DATE,\n  region STRING\n)\nAS (\n  SELECT\n    o.order_id,\n    o.customer_id,\n    c.region,\n    o.status,\n    o.total_amount,\n    o.created_at\n  FROM analytics.orders o\n  JOIN analytics.customers c ON o.customer_id = c.customer_id\n  WHERE o.is_test = false\n    AND o.created_at BETWEEN start_date AND end_date\n    AND c.region = region\n);\n","sql",[3017],{"type":33,"tag":155,"props":3018,"children":3019},{"__ignoreMap":7},[3020,3028,3067,3085,3102,3110,3118,3131,3139,3160,3180,3201,3221,3240,3255,3280,3342,3372,3413,3441],{"type":33,"tag":410,"props":3021,"children":3022},{"class":412,"line":413},[3023],{"type":33,"tag":410,"props":3024,"children":3025},{"style":607},[3026],{"type":38,"value":3027},"-- BigQuery example\n",{"type":33,"tag":410,"props":3029,"children":3030},{"class":412,"line":439},[3031,3037,3042,3047,3052,3057,3062],{"type":33,"tag":410,"props":3032,"children":3034},{"style":3033},"--shiki-default:#F97583",[3035],{"type":38,"value":3036},"CREATE",{"type":33,"tag":410,"props":3038,"children":3039},{"style":3033},[3040],{"type":38,"value":3041}," TABLE",{"type":33,"tag":410,"props":3043,"children":3044},{"style":417},[3045],{"type":38,"value":3046}," FUNCTION",{"type":33,"tag":410,"props":3048,"children":3049},{"style":443},[3050],{"type":38,"value":3051}," analytics",{"type":33,"tag":410,"props":3053,"children":3054},{"style":622},[3055],{"type":38,"value":3056},".",{"type":33,"tag":410,"props":3058,"children":3059},{"style":443},[3060],{"type":38,"value":3061},"fn_orders",{"type":33,"tag":410,"props":3063,"children":3064},{"style":622},[3065],{"type":38,"value":3066},"(\n",{"type":33,"tag":410,"props":3068,"children":3069},{"class":412,"line":633},[3070,3075,3080],{"type":33,"tag":410,"props":3071,"children":3072},{"style":3033},[3073],{"type":38,"value":3074},"  start_date",{"type":33,"tag":410,"props":3076,"children":3077},{"style":3033},[3078],{"type":38,"value":3079}," DATE",{"type":33,"tag":410,"props":3081,"children":3082},{"style":622},[3083],{"type":38,"value":3084},",\n",{"type":33,"tag":410,"props":3086,"children":3087},{"class":412,"line":651},[3088,3093,3098],{"type":33,"tag":410,"props":3089,"children":3090},{"style":622},[3091],{"type":38,"value":3092},"  end_date ",{"type":33,"tag":410,"props":3094,"children":3095},{"style":3033},[3096],{"type":38,"value":3097},"DATE",{"type":33,"tag":410,"props":3099,"children":3100},{"style":622},[3101],{"type":38,"value":3084},{"type":33,"tag":410,"props":3103,"children":3104},{"class":412,"line":665},[3105],{"type":33,"tag":410,"props":3106,"children":3107},{"style":622},[3108],{"type":38,"value":3109},"  region STRING\n",{"type":33,"tag":410,"props":3111,"children":3112},{"class":412,"line":687},[3113],{"type":33,"tag":410,"props":3114,"children":3115},{"style":622},[3116],{"type":38,"value":3117},")\n",{"type":33,"tag":410,"props":3119,"children":3120},{"class":412,"line":705},[3121,3126],{"type":33,"tag":410,"props":3122,"children":3123},{"style":3033},[3124],{"type":38,"value":3125},"AS",{"type":33,"tag":410,"props":3127,"children":3128},{"style":622},[3129],{"type":38,"value":3130}," (\n",{"type":33,"tag":410,"props":3132,"children":3133},{"class":412,"line":726},[3134],{"type":33,"tag":410,"props":3135,"children":3136},{"style":3033},[3137],{"type":38,"value":3138},"  SELECT\n",{"type":33,"tag":410,"props":3140,"children":3141},{"class":412,"line":742},[3142,3147,3151,3156],{"type":33,"tag":410,"props":3143,"children":3144},{"style":443},[3145],{"type":38,"value":3146},"    o",{"type":33,"tag":410,"props":3148,"children":3149},{"style":622},[3150],{"type":38,"value":3056},{"type":33,"tag":410,"props":3152,"children":3153},{"style":443},[3154],{"type":38,"value":3155},"order_id",{"type":33,"tag":410,"props":3157,"children":3158},{"style":622},[3159],{"type":38,"value":3084},{"type":33,"tag":410,"props":3161,"children":3162},{"class":412,"line":763},[3163,3167,3171,3176],{"type":33,"tag":410,"props":3164,"children":3165},{"style":443},[3166],{"type":38,"value":3146},{"type":33,"tag":410,"props":3168,"children":3169},{"style":622},[3170],{"type":38,"value":3056},{"type":33,"tag":410,"props":3172,"children":3173},{"style":443},[3174],{"type":38,"value":3175},"customer_id",{"type":33,"tag":410,"props":3177,"children":3178},{"style":622},[3179],{"type":38,"value":3084},{"type":33,"tag":410,"props":3181,"children":3182},{"class":412,"line":780},[3183,3188,3192,3197],{"type":33,"tag":410,"props":3184,"children":3185},{"style":443},[3186],{"type":38,"value":3187},"    c",{"type":33,"tag":410,"props":3189,"children":3190},{"style":622},[3191],{"type":38,"value":3056},{"type":33,"tag":410,"props":3193,"children":3194},{"style":443},[3195],{"type":38,"value":3196},"region",{"type":33,"tag":410,"props":3198,"children":3199},{"style":622},[3200],{"type":38,"value":3084},{"type":33,"tag":410,"props":3202,"children":3203},{"class":412,"line":801},[3204,3208,3212,3217],{"type":33,"tag":410,"props":3205,"children":3206},{"style":443},[3207],{"type":38,"value":3146},{"type":33,"tag":410,"props":3209,"children":3210},{"style":622},[3211],{"type":38,"value":3056},{"type":33,"tag":410,"props":3213,"children":3214},{"style":443},[3215],{"type":38,"value":3216},"status",{"type":33,"tag":410,"props":3218,"children":3219},{"style":622},[3220],{"type":38,"value":3084},{"type":33,"tag":410,"props":3222,"children":3223},{"class":412,"line":818},[3224,3228,3232,3236],{"type":33,"tag":410,"props":3225,"children":3226},{"style":443},[3227],{"type":38,"value":3146},{"type":33,"tag":410,"props":3229,"children":3230},{"style":622},[3231],{"type":38,"value":3056},{"type":33,"tag":410,"props":3233,"children":3234},{"style":443},[3235],{"type":38,"value":311},{"type":33,"tag":410,"props":3237,"children":3238},{"style":622},[3239],{"type":38,"value":3084},{"type":33,"tag":410,"props":3241,"children":3242},{"class":412,"line":839},[3243,3247,3251],{"type":33,"tag":410,"props":3244,"children":3245},{"style":443},[3246],{"type":38,"value":3146},{"type":33,"tag":410,"props":3248,"children":3249},{"style":622},[3250],{"type":38,"value":3056},{"type":33,"tag":410,"props":3252,"children":3253},{"style":443},[3254],{"type":38,"value":836},{"type":33,"tag":410,"props":3256,"children":3257},{"class":412,"line":1141},[3258,3263,3267,3271,3275],{"type":33,"tag":410,"props":3259,"children":3260},{"style":3033},[3261],{"type":38,"value":3262},"  FROM",{"type":33,"tag":410,"props":3264,"children":3265},{"style":443},[3266],{"type":38,"value":3051},{"type":33,"tag":410,"props":3268,"children":3269},{"style":622},[3270],{"type":38,"value":3056},{"type":33,"tag":410,"props":3272,"children":3273},{"style":443},[3274],{"type":38,"value":303},{"type":33,"tag":410,"props":3276,"children":3277},{"style":622},[3278],{"type":38,"value":3279}," o\n",{"type":33,"tag":410,"props":3281,"children":3282},{"class":412,"line":1161},[3283,3288,3292,3296,3301,3306,3311,3316,3320,3324,3329,3334,3338],{"type":33,"tag":410,"props":3284,"children":3285},{"style":3033},[3286],{"type":38,"value":3287},"  JOIN",{"type":33,"tag":410,"props":3289,"children":3290},{"style":443},[3291],{"type":38,"value":3051},{"type":33,"tag":410,"props":3293,"children":3294},{"style":622},[3295],{"type":38,"value":3056},{"type":33,"tag":410,"props":3297,"children":3298},{"style":443},[3299],{"type":38,"value":3300},"customers",{"type":33,"tag":410,"props":3302,"children":3303},{"style":622},[3304],{"type":38,"value":3305}," c ",{"type":33,"tag":410,"props":3307,"children":3308},{"style":3033},[3309],{"type":38,"value":3310},"ON",{"type":33,"tag":410,"props":3312,"children":3313},{"style":443},[3314],{"type":38,"value":3315}," o",{"type":33,"tag":410,"props":3317,"children":3318},{"style":622},[3319],{"type":38,"value":3056},{"type":33,"tag":410,"props":3321,"children":3322},{"style":443},[3323],{"type":38,"value":3175},{"type":33,"tag":410,"props":3325,"children":3326},{"style":3033},[3327],{"type":38,"value":3328}," =",{"type":33,"tag":410,"props":3330,"children":3331},{"style":443},[3332],{"type":38,"value":3333}," c",{"type":33,"tag":410,"props":3335,"children":3336},{"style":622},[3337],{"type":38,"value":3056},{"type":33,"tag":410,"props":3339,"children":3340},{"style":443},[3341],{"type":38,"value":723},{"type":33,"tag":410,"props":3343,"children":3344},{"class":412,"line":1177},[3345,3350,3354,3358,3363,3367],{"type":33,"tag":410,"props":3346,"children":3347},{"style":3033},[3348],{"type":38,"value":3349},"  WHERE",{"type":33,"tag":410,"props":3351,"children":3352},{"style":443},[3353],{"type":38,"value":3315},{"type":33,"tag":410,"props":3355,"children":3356},{"style":622},[3357],{"type":38,"value":3056},{"type":33,"tag":410,"props":3359,"children":3360},{"style":443},[3361],{"type":38,"value":3362},"is_test",{"type":33,"tag":410,"props":3364,"children":3365},{"style":3033},[3366],{"type":38,"value":3328},{"type":33,"tag":410,"props":3368,"children":3369},{"style":622},[3370],{"type":38,"value":3371}," false\n",{"type":33,"tag":410,"props":3373,"children":3374},{"class":412,"line":1194},[3375,3380,3384,3388,3393,3398,3403,3408],{"type":33,"tag":410,"props":3376,"children":3377},{"style":3033},[3378],{"type":38,"value":3379},"    AND",{"type":33,"tag":410,"props":3381,"children":3382},{"style":443},[3383],{"type":38,"value":3315},{"type":33,"tag":410,"props":3385,"children":3386},{"style":622},[3387],{"type":38,"value":3056},{"type":33,"tag":410,"props":3389,"children":3390},{"style":443},[3391],{"type":38,"value":3392},"created_at",{"type":33,"tag":410,"props":3394,"children":3395},{"style":3033},[3396],{"type":38,"value":3397}," BETWEEN",{"type":33,"tag":410,"props":3399,"children":3400},{"style":3033},[3401],{"type":38,"value":3402}," start_date",{"type":33,"tag":410,"props":3404,"children":3405},{"style":3033},[3406],{"type":38,"value":3407}," AND",{"type":33,"tag":410,"props":3409,"children":3410},{"style":622},[3411],{"type":38,"value":3412}," end_date\n",{"type":33,"tag":410,"props":3414,"children":3415},{"class":412,"line":1206},[3416,3420,3424,3428,3432,3436],{"type":33,"tag":410,"props":3417,"children":3418},{"style":3033},[3419],{"type":38,"value":3379},{"type":33,"tag":410,"props":3421,"children":3422},{"style":443},[3423],{"type":38,"value":3333},{"type":33,"tag":410,"props":3425,"children":3426},{"style":622},[3427],{"type":38,"value":3056},{"type":33,"tag":410,"props":3429,"children":3430},{"style":443},[3431],{"type":38,"value":3196},{"type":33,"tag":410,"props":3433,"children":3434},{"style":3033},[3435],{"type":38,"value":3328},{"type":33,"tag":410,"props":3437,"children":3438},{"style":622},[3439],{"type":38,"value":3440}," region\n",{"type":33,"tag":410,"props":3442,"children":3443},{"class":412,"line":1226},[3444],{"type":33,"tag":410,"props":3445,"children":3446},{"style":622},[3447],{"type":38,"value":3448},");\n",{"type":33,"tag":34,"props":3450,"children":3451},{},[3452,3454,3460,3462,3468],{"type":38,"value":3453},"Then in your ",{"type":33,"tag":155,"props":3455,"children":3457},{"className":3456},[],[3458],{"type":38,"value":3459},"AGENTS.md",{"type":38,"value":3461}," you just tell the agent to use ",{"type":33,"tag":155,"props":3463,"children":3465},{"className":3464},[],[3466],{"type":38,"value":3467},"analytics.fn_orders",{"type":38,"value":3469}," instead of querying the raw table directly - the agent doesn't need to know about the test order filter or the customer join, it just provides the date range and region and gets clean results back.",{"type":33,"tag":56,"props":3471,"children":3472},{},[],{"type":33,"tag":60,"props":3474,"children":3476},{"id":3475},"managing-the-transition-teams-and-stakeholders",[3477],{"type":38,"value":3478},"Managing the Transition: Teams and Stakeholders",{"type":33,"tag":34,"props":3480,"children":3481},{},[3482],{"type":38,"value":3483},"Everything above is the technical solution, but that's only half the battle. The other half is getting your team and stakeholders on board with this new way of working. You can build the best context layer in the world but if your data engineers don't trust the agents and your stakeholders don't understand what's changing then it won't matter.",{"type":33,"tag":217,"props":3485,"children":3487},{"id":3486},"start-with-your-data-engineering-team",[3488],{"type":38,"value":3489},"Start With Your Data Engineering Team",{"type":33,"tag":34,"props":3491,"children":3492},{},[3493],{"type":38,"value":3494},"The pattern I've seen work well is a gradual ramp up. It usually starts with using MCP integrations with cursor or claude code to just lookup the data platforms' documentation and query the warehouse to find the specific part of a query or script that was causing some issue. Then after creating some extensive agent rules/instructions documentation as well as creating a readme for each pipeline that contains some business context, the team can start relying on agents to build pipelines or make major changes.",{"type":33,"tag":34,"props":3496,"children":3497},{},[3498],{"type":38,"value":3499},"The next step is usually a more structured workflow that involves AI agents completing some tasks - such as linting, automated pipeline runs, code review, and most importantly updating the documentation.",{"type":33,"tag":34,"props":3501,"children":3502},{},[3503],{"type":38,"value":3504},"The data engineering team must act as role models. No other team will trust AI if the team responsible for creating the data infrastructure doesn't. This is also the time to test things internally before giving data consumers access.",{"type":33,"tag":34,"props":3506,"children":3507},{},[3508],{"type":38,"value":3509},"Here's an overview of what an iterative roll-out internally within the data eng team looks like:",{"type":33,"tag":135,"props":3511,"children":3512},{},[3513,3518,3523,3528,3533,3538,3543,3555,3560],{"type":33,"tag":139,"props":3514,"children":3515},{},[3516],{"type":38,"value":3517},"set up agents and MCPs with access to your pipelines and repos",{"type":33,"tag":139,"props":3519,"children":3520},{},[3521],{"type":38,"value":3522},"ask the agents to help with basic auto-fill, syntax, and documentation lookup tasks",{"type":33,"tag":139,"props":3524,"children":3525},{},[3526],{"type":38,"value":3527},"ask the agents to query the data and investigate reported issues, only helping with the preliminary investigation",{"type":33,"tag":139,"props":3529,"children":3530},{},[3531],{"type":38,"value":3532},"ask the agents to write inline comments, table/column level descriptions, and create readme files for each pipeline",{"type":33,"tag":139,"props":3534,"children":3535},{},[3536],{"type":38,"value":3537},"create an AGENTS.md file that acts as your Data Engineering Bible - consolidation of your data architecture, styleguide, best practices, and design principles",{"type":33,"tag":139,"props":3539,"children":3540},{},[3541],{"type":38,"value":3542},"ask the agents to help with proposing solutions to problems, optimize queries, and create the skeleton of new pipelines/assets",{"type":33,"tag":139,"props":3544,"children":3545},{},[3546,3548,3553],{"type":38,"value":3547},"create the 1.0 version of the context layer - run the ",{"type":33,"tag":155,"props":3549,"children":3551},{"className":3550},[],[3552],{"type":38,"value":869},{"type":38,"value":3554}," or similar functions to complete any missing documentation, metadata, and context",{"type":33,"tag":139,"props":3556,"children":3557},{},[3558],{"type":38,"value":3559},"build more strict and consistent tasks for constantly updating/maintaining your documentation and context (don't hold back here, be relentless and keep going until every pipeline, table, column, and even CTE is documented)",{"type":33,"tag":139,"props":3561,"children":3562},{},[3563,3565],{"type":38,"value":3564},"start putting everything to the test - ask the agent to query and analyze, investigate and troubleshoot, propose ideas and solutions, and even build a pipeline end-to-end (this is the only way to truly put it to the test)\n",{"type":33,"tag":135,"props":3566,"children":3567},{},[3568],{"type":33,"tag":139,"props":3569,"children":3570},{},[3571],{"type":38,"value":3572},"important reminder: during this stage, you will be frustrated, impatient, and feel like giving up but try to take the failures as feedback that needs to be addressed - the same way when a new hire makes a mistake, you don't immediately fire them, it is a signal that there's a lack of context or tools to do their job",{"type":33,"tag":34,"props":3574,"children":3575},{},[3576],{"type":38,"value":3577},"This not a step-by-step guide but it is a general overview of the journey I've been through and noticed other teams experience as well. This is also not the finish line, it's just the first checkpoint before you get the data consumers involved.",{"type":33,"tag":217,"props":3579,"children":3581},{"id":3580},"partnering-with-stakeholders",[3582],{"type":38,"value":3583},"Partnering With Stakeholders",{"type":33,"tag":34,"props":3585,"children":3586},{},[3587],{"type":38,"value":3588},"After the internal data engineering effort is done, you will reach the point where domain expertise really matters.",{"type":33,"tag":34,"props":3590,"children":3591},{},[3592],{"type":38,"value":3593},"One of the important things to keep in mind when you get to this phase is to avoid investing into a costly, vendor locked-in, and effortful solution. You still haven't proven the efficacy of an AI agent to justify the investment. That's why using free open-source tools is the answer.",{"type":33,"tag":34,"props":3595,"children":3596},{},[3597],{"type":38,"value":3598},"This might require you to find a few champions in the analytics, marketing, product, and other teams where you will hop on a call with them, install cursor or claude code, set up the MCP and warehouse connection, and show them how to ask questions and get an answer.",{"type":33,"tag":34,"props":3600,"children":3601},{},[3602,3604],{"type":38,"value":3603},"There are many tools you can use to implement a simple solution like this, for Bruin I've put together this tutorial to set up the whole thing end-to-end: ",{"type":33,"tag":885,"props":3605,"children":3608},{"href":3606,"rel":3607},"https://getbruin.com/learn/ai-data-analyst",[889],[3609],{"type":38,"value":3610},"getbruin.com/learn/ai-data-analyst",{"type":33,"tag":34,"props":3612,"children":3613},{},[3614],{"type":38,"value":3615},"Get these early-adopters and champions to put it to the test, share feedback, and (again) most importantly improve the context but this time from a business domain perspective.",{"type":33,"tag":34,"props":3617,"children":3618},{},[3619],{"type":38,"value":3620},"For example, a product marketing analyst might:",{"type":33,"tag":135,"props":3622,"children":3623},{},[3624,3629,3634,3639,3644],{"type":33,"tag":139,"props":3625,"children":3626},{},[3627],{"type":38,"value":3628},"ask the agent \"what was our conversion rate from the spring campaign by region?\"",{"type":33,"tag":139,"props":3630,"children":3631},{},[3632],{"type":38,"value":3633},"the agent queries the data and returns a result, but the analyst notices something off - the agent included free trial signups in the conversion calculation",{"type":33,"tag":139,"props":3635,"children":3636},{},[3637],{"type":38,"value":3638},"the analyst corrects it: \"conversions should only count paid signups, free trials are tracked separately\"",{"type":33,"tag":139,"props":3640,"children":3641},{},[3642],{"type":38,"value":3643},"that feedback gets written back into the glossary under the Conversion entity: \"Conversion: a completed paid signup. Free trial signups are excluded and tracked under the Trial entity.\"",{"type":33,"tag":139,"props":3645,"children":3646},{},[3647],{"type":38,"value":3648},"from this point on, every agent and every new team member knows the correct definition",{"type":33,"tag":34,"props":3650,"children":3651},{},[3652],{"type":38,"value":3653},"This is the kind of context that the data engineering team would never have on their own - it lives in the heads of the domain experts. The whole point of involving these champions early is to extract that knowledge and bake it into the context layer so that the agents can actually be useful to the broader team.",{"type":33,"tag":217,"props":3655,"children":3657},{"id":3656},"moving-towards-self-service",[3658],{"type":38,"value":3659},"Moving Towards Self-Service",{"type":33,"tag":34,"props":3661,"children":3662},{},[3663],{"type":38,"value":3664},"At this point you've got the context layer built, the data engineering team is on board, and a few champions from other teams have been testing it. Now you want to roll this out to the rest of the company - but it doesn't make sense to set up cursor or claude code locally for every data consumer, that's not scalable and most of them won't bother with the setup anyway. You need something that lives where people already work, like Slack or Teams or even WhatsApp.",{"type":33,"tag":34,"props":3666,"children":3667},{},[3668],{"type":38,"value":3669},"The agent should be self-learning, meaning that every conversation it has with a data consumer is an opportunity to improve the context. When someone corrects the agent or provides a clarification, that gets written back into the documentation. But here's where it gets interesting, the agent also needs to detect conflicts. If person A from marketing says \"conversion means paid signups only\" but person B from product says \"conversion includes free trials\", the agent should detect this conflict and escalate it rather than just overwriting the previous definition. Not every correction should be treated equally either - you need to set up specific permissions and rules for who's response is actionable. Asset owners should have the authority to make changes to the context for their assets, but a random person in sales shouldn't be able to override a definition set by the finance team.",{"type":33,"tag":34,"props":3671,"children":3672},{},[3673],{"type":38,"value":3674},"Access management is also critical here. Each team or department's agent should only have access to the data they are allowed to access - marketing shouldn't be able to query finance and HR tables, and the product team shouldn't have access to raw customer PII unless they have the right permissions. This is where the connection and warehouse level permissions come into play, you can create separate connections with different access levels and assign them to the agents for each team.",{"type":33,"tag":34,"props":3676,"children":3677},{},[3678],{"type":38,"value":3679},"Beyond just asking questions and getting responses, teams will also want to access traditional dashboards and scheduled reports, but at this point they want an \"agentic\" way to create them and ask follow up questions. Imagine a product manager creates an entire dashboard by just asking question to the agent, and then one day they realize a specific trend and want to further analyze it, so they tag that specific chart (essentially adding the chart's query and metadata) and ask a follow up question - this basically mimics the exact same interaction that a product manager and a product analyst would normally have.",{"type":33,"tag":34,"props":3681,"children":3682},{},[3683,3685,3692],{"type":38,"value":3684},"Bruin Cloud supports this out of the box: ",{"type":33,"tag":885,"props":3686,"children":3689},{"href":3687,"rel":3688},"https://getbruin.com/dashboards/",[889],[3690],{"type":38,"value":3691},"getbruin.com/dashboards",{"type":38,"value":3693}," - but regardless of the tool you use, the important thing is that data consumers can go from asking a question to saving it as a recurring report without needing to involve the data engineering team every time.",{"type":33,"tag":34,"props":3695,"children":3696},{},[3697],{"type":38,"value":3698},"And inevitably, teams will find issues - whether it's a wrong number in a response, a broken chart in a dashboard, or a report that doesn't look right. The agent should be able to take the context from the conversation and create a detailed ticket in Jira, Linear, or GitHub Issues. Not just a vague \"data looks wrong\" ticket but an actual detailed issue with the query that ran, the expected vs actual result, the tables involved, and even a preliminary investigation into what might be causing it (e.g. in the asset reports.sales_emea the CTE \"dedup_customers\" is missing \"transaction_id\" in the QUALIFY statement). This by itself will save a ton of back-n-forth between data consumers and the data engineering team because normally the first 3-4 messages in a ticket are just the data engineer asking which table? which column? what date range? what did you expect? - the agent already has all of that context from the conversation.",{"type":33,"tag":34,"props":3700,"children":3701},{},[3702],{"type":38,"value":3703},"The ultimate question that remains is how to convince the C-suite, executives, and management to get onboard. That's exactly why I propose this iterative and \"start small, free, and minimal-effort\" solution because it is much more convincing when you go and say \"here's what we've done so far, here's the impact, here's the adoption rate\" instead of just proposing a hypothetical plan with arbitrary targets. Setting aside IT restrictions for now, a proof-of-concept and minimal viable product is the easiest way to prove the value of such a solution before investing more time and money.",{"type":33,"tag":56,"props":3705,"children":3706},{},[],{"type":33,"tag":60,"props":3708,"children":3710},{"id":3709},"conclusion",[3711],{"type":38,"value":3712},"Conclusion",{"type":33,"tag":34,"props":3714,"children":3715},{},[3716],{"type":38,"value":3717},"Using AI in data engineering and data analysis is inevitable, but it is also facing the most amount of resistance because agents can return results that look plausible when they are completely wrong - data is used to make decisions, and quite often they are decisions that can make or break a company. That's why the level of skepticism and hesitation from data teams to rely on AI is understandable.",{"type":33,"tag":34,"props":3719,"children":3720},{},[3721],{"type":38,"value":3722},"Every company wants to solve this problem because they understand the value, but the data team is saying \"context is broken\" and they don't have the time and effort to invest into fixing it.",{"type":33,"tag":34,"props":3724,"children":3725},{},[3726],{"type":38,"value":3727},"That's why a ground-up, iterative, and patient approach is necessary:",{"type":33,"tag":135,"props":3729,"children":3730},{},[3731,3736,3741,3746],{"type":33,"tag":139,"props":3732,"children":3733},{},[3734],{"type":38,"value":3735},"start small and onboard your AI agent like a new hire, get it to analyze the data, read your pipeline code, and explore - focus on the existing knowledge, not that 10% of context that lives outside the pipelines",{"type":33,"tag":139,"props":3737,"children":3738},{},[3739],{"type":38,"value":3740},"stress test the agent internally in the data engineering team using free open-source tools that require minimal set up - focus on improving data quality and documentation, not the smartest or fastest LLM model",{"type":33,"tag":139,"props":3742,"children":3743},{},[3744],{"type":38,"value":3745},"roll out the agent to a few champions across different teams - focus on translating their business domain into context (the 10% left from before), not some fancy expensive \"semantic tool\"",{"type":33,"tag":139,"props":3747,"children":3748},{},[3749],{"type":38,"value":3750},"integrate the agent inside the communication channels and workflows already in use (Slack, Teams, WhatsApp, etc.) - focus on the feedback loop that feels \"human\", not a cold robot that no one wants to talk to",{"type":33,"tag":34,"props":3752,"children":3753},{},[3754],{"type":38,"value":3755},"In this article, we've gone through the journey from an individual data engineer, the entire data engineering team, the early adopters in your organization, all the data consumers, and finally the executives and decision makers.",{"type":33,"tag":34,"props":3757,"children":3758},{},[3759],{"type":38,"value":3760},"Let's recap the key points below.",{"type":33,"tag":217,"props":3762,"children":3764},{"id":3763},"problem-solution",[3765],{"type":38,"value":3766},"Problem & Solution",{"type":33,"tag":34,"props":3768,"children":3769},{},[3770],{"type":38,"value":3771},"The problem isn't the model, it's the inability to create and maintain a context layer - and that inability is a time and tooling problem, not a money one.",{"type":33,"tag":34,"props":3773,"children":3774},{},[3775],{"type":38,"value":3776},"The problem:",{"type":33,"tag":135,"props":3778,"children":3779},{},[3780,3785],{"type":33,"tag":139,"props":3781,"children":3782},{},[3783],{"type":38,"value":3784},"agents return confident but wrong answers because they don't have the context to know for example how \"revenue\" is defined in different teams or which table is stale or which join is required - they guess instead of ask",{"type":33,"tag":139,"props":3786,"children":3787},{},[3788],{"type":38,"value":3789},"existing solutions like vector DBs, RAGs, and other vendor-locked context managers are complex to set up, hard to maintain, made obsolete every time a new model drops, but more importantly require too much effort to get started and prove its value",{"type":33,"tag":34,"props":3791,"children":3792},{},[3793],{"type":38,"value":3794},"The solution:",{"type":33,"tag":135,"props":3796,"children":3797},{},[3798,3803],{"type":33,"tag":139,"props":3799,"children":3800},{},[3801],{"type":38,"value":3802},"start simple with open-source free tools to improve the context using the knowledge that already exists inside your pipelines and infrastructure - asset definitions, glossaries, inline comments, quality checks, all living directly in your pipeline files so it stays close to the code and gets maintained as part of the normal workflow",{"type":33,"tag":139,"props":3804,"children":3805},{},[3806],{"type":38,"value":3807},"roll it out step-by-step, at each step enhancing the context using business domain knowledge from the people who actually use the data - this way you prove the value using an MVP before approaching execs with a big proposal",{"type":33,"tag":217,"props":3809,"children":3811},{"id":3810},"technical-plan",[3812],{"type":38,"value":3813},"Technical Plan",{"type":33,"tag":34,"props":3815,"children":3816},{},[3817],{"type":38,"value":3818},"Onboard the agent like a new hire - give it access to your existing pipelines and warehouse and let it explore.",{"type":33,"tag":135,"props":3820,"children":3821},{},[3822,3827,3832,3837,3842],{"type":33,"tag":139,"props":3823,"children":3824},{},[3825],{"type":38,"value":3826},"map out the tables and schema, write basic descriptions, improve docs and inline comments - get the agent to do the heavy lifting here by analyzing the data and generating the initial metadata",{"type":33,"tag":139,"props":3828,"children":3829},{},[3830],{"type":38,"value":3831},"back-n-forth with the data eng team to improve the context and metadata - treat every wrong answer as a signal that something is missing and fill in the gap (reminder: BE PATIENT)",{"type":33,"tag":139,"props":3833,"children":3834},{},[3835],{"type":38,"value":3836},"set up self-healing tasks inside the pipelines to make sure the underlying data is healthy and accurate - the context layer is useless if the data underneath it is broken",{"type":33,"tag":139,"props":3838,"children":3839},{},[3840],{"type":38,"value":3841},"roll it out to champions that have most of the domain expertise (and data literacy), this will further close the gap in the missing context that the data engineering team wouldn't have on their own",{"type":33,"tag":139,"props":3843,"children":3844},{},[3845],{"type":38,"value":3846},"integrate the agent inside existing communication channels where data consumers can ask questions, create dashboards, and schedule reports",{"type":33,"tag":34,"props":3848,"children":3849},{},[3850],{"type":38,"value":3851},"Next step is to take this proof-of-concept to the execs and show them the value.",{"type":33,"tag":217,"props":3853,"children":3855},{"id":3854},"implementation-plan",[3856],{"type":38,"value":3857},"Implementation Plan",{"type":33,"tag":34,"props":3859,"children":3860},{},[3861],{"type":38,"value":3862},"Start with the data engineering team, expand to domain champions, then roll it out to the rest of the company through the channels they already use.",{"type":33,"tag":135,"props":3864,"children":3865},{},[3866,3871,3876],{"type":33,"tag":139,"props":3867,"children":3868},{},[3869],{"type":38,"value":3870},"get the data eng team comfortable first - start with documentation lookup and investigation, then gradually expand to pipeline building and code review until the 1.0 context layer is solid enough to put in front of other teams",{"type":33,"tag":139,"props":3872,"children":3873},{},[3874],{"type":38,"value":3875},"find champions in marketing, product, finance, etc. and let them break it - their corrections and feedback must be treated gracefully and patiently, involve them as design partners and not just data consumers",{"type":33,"tag":139,"props":3877,"children":3878},{},[3879],{"type":38,"value":3880},"roll it out to the rest of the company via the common communication channels - focus on proper access management, conflict detection, self-service dashboards and reports, and automatic ticket creation and troubleshooting",{"type":33,"tag":34,"props":3882,"children":3883},{},[3884],{"type":38,"value":3885},"Don't go to the C-suite with a hypothetical plan and arbitrary targets - go with a working proof-of-concept, real adoption numbers, and concrete examples of time saved.",{"type":33,"tag":34,"props":3887,"children":3888},{},[3889],{"type":38,"value":3890},"Start small, start free, prove the value, then scale.",{"type":33,"tag":3892,"props":3893,"children":3894},"style",{},[3895],{"type":38,"value":3896},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":439,"depth":439,"links":3898},[3899,3900,3901,3904,3912,3918,3919,3924],{"id":62,"depth":439,"text":65},{"id":96,"depth":439,"text":99},{"id":125,"depth":439,"text":128,"children":3902},[3903],{"id":219,"depth":633,"text":222},{"id":362,"depth":439,"text":365,"children":3905},[3906,3907,3908,3909,3910,3911],{"id":383,"depth":633,"text":386},{"id":527,"depth":633,"text":530},{"id":856,"depth":633,"text":859},{"id":1567,"depth":633,"text":1570},{"id":2157,"depth":633,"text":2160},{"id":2339,"depth":633,"text":2342},{"id":2528,"depth":439,"text":2531,"children":3913},[3914,3915,3916,3917],{"id":2564,"depth":633,"text":2567},{"id":2588,"depth":633,"text":2591},{"id":2738,"depth":633,"text":2741},{"id":2762,"depth":633,"text":2765},{"id":2901,"depth":439,"text":2904},{"id":3475,"depth":439,"text":3478,"children":3920},[3921,3922,3923],{"id":3486,"depth":633,"text":3489},{"id":3580,"depth":633,"text":3583},{"id":3656,"depth":633,"text":3659},{"id":3709,"depth":439,"text":3712,"children":3925},[3926,3927,3928],{"id":3763,"depth":633,"text":3766},{"id":3810,"depth":633,"text":3813},{"id":3854,"depth":633,"text":3857},"content:blog:ai-skepticism-in-data-engineering.md","content","blog/ai-skepticism-in-data-engineering.md","blog/ai-skepticism-in-data-engineering","md",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"coverPosition":11,"date":12,"readingTime":13,"category":14,"tags":3935,"author":3936,"body":3937,"_type":2175,"_id":3929,"_source":3930,"_file":3931,"_stem":3932,"_extension":3933},[16,17,18,19,20,21,22,23,24],{"name":26,"role":27,"image":28},{"type":30,"children":3938,"toc":7262},[3939,3943,3947,3951,3955,3958,3962,3966,3970,3974,3978,3982,3985,3989,3993,3997,4001,4005,4008,4012,4016,4049,4053,4057,4061,4080,4084,4088,4113,4117,4128,4132,4136,4140,4194,4197,4201,4205,4209,4213,4217,4221,4225,4261,4265,4325,4329,4333,4370,4380,4604,4608,4618,4633,4637,4662,5240,5250,5254,5258,5262,5686,5690,5797,5801,5805,5809,5955,5959,5963,6117,6120,6124,6128,6132,6136,6140,6144,6148,6152,6167,6171,6182,6186,6300,6304,6319,6323,6327,6331,6335,6427,6430,6434,6456,6460,6464,6468,6472,6517,6907,6923,6926,6930,6934,6938,6942,6946,6950,6954,7006,7010,7014,7018,7022,7026,7035,7039,7043,7066,7070,7074,7078,7082,7086,7090,7100,7104,7108,7111,7115,7119,7123,7127,7146,7150,7154,7158,7162,7166,7177,7181,7192,7196,7200,7223,7227,7231,7235,7250,7254,7258],{"type":33,"tag":34,"props":3940,"children":3941},{},[3942],{"type":38,"value":39},{"type":33,"tag":34,"props":3944,"children":3945},{},[3946],{"type":38,"value":44},{"type":33,"tag":34,"props":3948,"children":3949},{},[3950],{"type":38,"value":49},{"type":33,"tag":34,"props":3952,"children":3953},{},[3954],{"type":38,"value":54},{"type":33,"tag":56,"props":3956,"children":3957},{},[],{"type":33,"tag":60,"props":3959,"children":3960},{"id":62},[3961],{"type":38,"value":65},{"type":33,"tag":34,"props":3963,"children":3964},{},[3965],{"type":38,"value":70},{"type":33,"tag":34,"props":3967,"children":3968},{},[3969],{"type":38,"value":75},{"type":33,"tag":34,"props":3971,"children":3972},{},[3973],{"type":38,"value":80},{"type":33,"tag":34,"props":3975,"children":3976},{},[3977],{"type":38,"value":85},{"type":33,"tag":34,"props":3979,"children":3980},{},[3981],{"type":38,"value":90},{"type":33,"tag":56,"props":3983,"children":3984},{},[],{"type":33,"tag":60,"props":3986,"children":3987},{"id":96},[3988],{"type":38,"value":99},{"type":33,"tag":34,"props":3990,"children":3991},{},[3992],{"type":38,"value":104},{"type":33,"tag":34,"props":3994,"children":3995},{},[3996],{"type":38,"value":109},{"type":33,"tag":34,"props":3998,"children":3999},{},[4000],{"type":38,"value":114},{"type":33,"tag":34,"props":4002,"children":4003},{},[4004],{"type":38,"value":119},{"type":33,"tag":56,"props":4006,"children":4007},{},[],{"type":33,"tag":60,"props":4009,"children":4010},{"id":125},[4011],{"type":38,"value":128},{"type":33,"tag":34,"props":4013,"children":4014},{},[4015],{"type":38,"value":133},{"type":33,"tag":135,"props":4017,"children":4018},{},[4019,4023,4027,4037,4041,4045],{"type":33,"tag":139,"props":4020,"children":4021},{},[4022],{"type":38,"value":143},{"type":33,"tag":139,"props":4024,"children":4025},{},[4026],{"type":38,"value":148},{"type":33,"tag":139,"props":4028,"children":4029},{},[4030,4031,4036],{"type":38,"value":153},{"type":33,"tag":155,"props":4032,"children":4034},{"className":4033},[],[4035],{"type":38,"value":160},{"type":38,"value":162},{"type":33,"tag":139,"props":4038,"children":4039},{},[4040],{"type":38,"value":167},{"type":33,"tag":139,"props":4042,"children":4043},{},[4044],{"type":38,"value":172},{"type":33,"tag":139,"props":4046,"children":4047},{},[4048],{"type":38,"value":177},{"type":33,"tag":34,"props":4050,"children":4051},{},[4052],{"type":38,"value":182},{"type":33,"tag":34,"props":4054,"children":4055},{},[4056],{"type":38,"value":187},{"type":33,"tag":34,"props":4058,"children":4059},{},[4060],{"type":38,"value":192},{"type":33,"tag":135,"props":4062,"children":4063},{},[4064,4068,4072,4076],{"type":33,"tag":139,"props":4065,"children":4066},{},[4067],{"type":38,"value":200},{"type":33,"tag":139,"props":4069,"children":4070},{},[4071],{"type":38,"value":205},{"type":33,"tag":139,"props":4073,"children":4074},{},[4075],{"type":38,"value":210},{"type":33,"tag":139,"props":4077,"children":4078},{},[4079],{"type":38,"value":215},{"type":33,"tag":217,"props":4081,"children":4082},{"id":219},[4083],{"type":38,"value":222},{"type":33,"tag":34,"props":4085,"children":4086},{},[4087],{"type":38,"value":227},{"type":33,"tag":135,"props":4089,"children":4090},{},[4091,4102],{"type":33,"tag":139,"props":4092,"children":4093},{},[4094,4095],{"type":38,"value":235},{"type":33,"tag":135,"props":4096,"children":4097},{},[4098],{"type":33,"tag":139,"props":4099,"children":4100},{},[4101],{"type":38,"value":243},{"type":33,"tag":139,"props":4103,"children":4104},{},[4105,4106],{"type":38,"value":248},{"type":33,"tag":135,"props":4107,"children":4108},{},[4109],{"type":33,"tag":139,"props":4110,"children":4111},{},[4112],{"type":38,"value":256},{"type":33,"tag":34,"props":4114,"children":4115},{},[4116],{"type":38,"value":261},{"type":33,"tag":135,"props":4118,"children":4119},{},[4120,4124],{"type":33,"tag":139,"props":4121,"children":4122},{},[4123],{"type":38,"value":269},{"type":33,"tag":139,"props":4125,"children":4126},{},[4127],{"type":38,"value":274},{"type":33,"tag":34,"props":4129,"children":4130},{},[4131],{"type":38,"value":279},{"type":33,"tag":34,"props":4133,"children":4134},{},[4135],{"type":38,"value":284},{"type":33,"tag":34,"props":4137,"children":4138},{},[4139],{"type":38,"value":289},{"type":33,"tag":135,"props":4141,"children":4142},{},[4143,4158,4162,4178,4182,4186,4190],{"type":33,"tag":139,"props":4144,"children":4145},{},[4146,4147,4152,4153],{"type":38,"value":297},{"type":33,"tag":155,"props":4148,"children":4150},{"className":4149},[],[4151],{"type":38,"value":303},{"type":38,"value":305},{"type":33,"tag":155,"props":4154,"children":4156},{"className":4155},[],[4157],{"type":38,"value":311},{"type":33,"tag":139,"props":4159,"children":4160},{},[4161],{"type":38,"value":316},{"type":33,"tag":139,"props":4163,"children":4164},{},[4165,4166,4171,4172,4177],{"type":38,"value":321},{"type":33,"tag":155,"props":4167,"children":4169},{"className":4168},[],[4170],{"type":38,"value":311},{"type":38,"value":328},{"type":33,"tag":155,"props":4173,"children":4175},{"className":4174},[],[4176],{"type":38,"value":334},{"type":38,"value":336},{"type":33,"tag":139,"props":4179,"children":4180},{},[4181],{"type":38,"value":341},{"type":33,"tag":139,"props":4183,"children":4184},{},[4185],{"type":38,"value":346},{"type":33,"tag":139,"props":4187,"children":4188},{},[4189],{"type":38,"value":351},{"type":33,"tag":139,"props":4191,"children":4192},{},[4193],{"type":38,"value":356},{"type":33,"tag":56,"props":4195,"children":4196},{},[],{"type":33,"tag":60,"props":4198,"children":4199},{"id":362},[4200],{"type":38,"value":365},{"type":33,"tag":34,"props":4202,"children":4203},{},[4204],{"type":38,"value":370},{"type":33,"tag":34,"props":4206,"children":4207},{},[4208],{"type":38,"value":375},{"type":33,"tag":34,"props":4210,"children":4211},{},[4212],{"type":38,"value":380},{"type":33,"tag":217,"props":4214,"children":4215},{"id":383},[4216],{"type":38,"value":386},{"type":33,"tag":34,"props":4218,"children":4219},{},[4220],{"type":38,"value":391},{"type":33,"tag":393,"props":4222,"children":4223},{"id":395},[4224],{"type":38,"value":398},{"type":33,"tag":400,"props":4226,"children":4227},{"className":402,"code":403,"language":404,"meta":7,"style":7},[4228],{"type":33,"tag":155,"props":4229,"children":4230},{"__ignoreMap":7},[4231,4250],{"type":33,"tag":410,"props":4232,"children":4233},{"class":412,"line":413},[4234,4238,4242,4246],{"type":33,"tag":410,"props":4235,"children":4236},{"style":417},[4237],{"type":38,"value":420},{"type":33,"tag":410,"props":4239,"children":4240},{"style":423},[4241],{"type":38,"value":426},{"type":33,"tag":410,"props":4243,"children":4244},{"style":423},[4245],{"type":38,"value":431},{"type":33,"tag":410,"props":4247,"children":4248},{"style":423},[4249],{"type":38,"value":436},{"type":33,"tag":410,"props":4251,"children":4252},{"class":412,"line":439},[4253,4257],{"type":33,"tag":410,"props":4254,"children":4255},{"style":443},[4256],{"type":38,"value":446},{"type":33,"tag":410,"props":4258,"children":4259},{"style":423},[4260],{"type":38,"value":436},{"type":33,"tag":393,"props":4262,"children":4263},{"id":453},[4264],{"type":38,"value":456},{"type":33,"tag":400,"props":4266,"children":4267},{"className":402,"code":459,"language":404,"meta":7,"style":7},[4268],{"type":33,"tag":155,"props":4269,"children":4270},{"__ignoreMap":7},[4271,4302],{"type":33,"tag":410,"props":4272,"children":4273},{"class":412,"line":413},[4274,4278,4282,4286,4290,4294,4298],{"type":33,"tag":410,"props":4275,"children":4276},{"style":417},[4277],{"type":38,"value":420},{"type":33,"tag":410,"props":4279,"children":4280},{"style":423},[4281],{"type":38,"value":475},{"type":33,"tag":410,"props":4283,"children":4284},{"style":423},[4285],{"type":38,"value":480},{"type":33,"tag":410,"props":4287,"children":4288},{"style":443},[4289],{"type":38,"value":485},{"type":33,"tag":410,"props":4291,"children":4292},{"style":423},[4293],{"type":38,"value":490},{"type":33,"tag":410,"props":4295,"children":4296},{"style":443},[4297],{"type":38,"value":495},{"type":33,"tag":410,"props":4299,"children":4300},{"style":423},[4301],{"type":38,"value":500},{"type":33,"tag":410,"props":4303,"children":4304},{"class":412,"line":439},[4305,4309,4313,4317,4321],{"type":33,"tag":410,"props":4306,"children":4307},{"style":417},[4308],{"type":38,"value":420},{"type":33,"tag":410,"props":4310,"children":4311},{"style":423},[4312],{"type":38,"value":475},{"type":33,"tag":410,"props":4314,"children":4315},{"style":423},[4316],{"type":38,"value":516},{"type":33,"tag":410,"props":4318,"children":4319},{"style":443},[4320],{"type":38,"value":495},{"type":33,"tag":410,"props":4322,"children":4323},{"style":423},[4324],{"type":38,"value":500},{"type":33,"tag":217,"props":4326,"children":4327},{"id":527},[4328],{"type":38,"value":530},{"type":33,"tag":34,"props":4330,"children":4331},{},[4332],{"type":38,"value":535},{"type":33,"tag":400,"props":4334,"children":4335},{"className":402,"code":538,"language":404,"meta":7,"style":7},[4336],{"type":33,"tag":155,"props":4337,"children":4338},{"__ignoreMap":7},[4339],{"type":33,"tag":410,"props":4340,"children":4341},{"class":412,"line":413},[4342,4346,4350,4354,4358,4362,4366],{"type":33,"tag":410,"props":4343,"children":4344},{"style":417},[4345],{"type":38,"value":420},{"type":33,"tag":410,"props":4347,"children":4348},{"style":423},[4349],{"type":38,"value":554},{"type":33,"tag":410,"props":4351,"children":4352},{"style":423},[4353],{"type":38,"value":559},{"type":33,"tag":410,"props":4355,"children":4356},{"style":443},[4357],{"type":38,"value":564},{"type":33,"tag":410,"props":4359,"children":4360},{"style":423},[4361],{"type":38,"value":569},{"type":33,"tag":410,"props":4363,"children":4364},{"style":443},[4365],{"type":38,"value":574},{"type":33,"tag":410,"props":4367,"children":4368},{"style":423},[4369],{"type":38,"value":579},{"type":33,"tag":34,"props":4371,"children":4372},{},[4373,4374,4379],{"type":38,"value":584},{"type":33,"tag":155,"props":4375,"children":4377},{"className":4376},[],[4378],{"type":38,"value":590},{"type":38,"value":592},{"type":33,"tag":400,"props":4381,"children":4382},{"className":595,"code":596,"language":597,"meta":7,"style":7},[4383],{"type":33,"tag":155,"props":4384,"children":4385},{"__ignoreMap":7},[4386,4393,4408,4423,4434,4453,4468,4487,4502,4521,4536,4555,4570,4589],{"type":33,"tag":410,"props":4387,"children":4388},{"class":412,"line":413},[4389],{"type":33,"tag":410,"props":4390,"children":4391},{"style":607},[4392],{"type":38,"value":610},{"type":33,"tag":410,"props":4394,"children":4395},{"class":412,"line":439},[4396,4400,4404],{"type":33,"tag":410,"props":4397,"children":4398},{"style":616},[4399],{"type":38,"value":619},{"type":33,"tag":410,"props":4401,"children":4402},{"style":622},[4403],{"type":38,"value":625},{"type":33,"tag":410,"props":4405,"children":4406},{"style":423},[4407],{"type":38,"value":630},{"type":33,"tag":410,"props":4409,"children":4410},{"class":412,"line":633},[4411,4415,4419],{"type":33,"tag":410,"props":4412,"children":4413},{"style":616},[4414],{"type":38,"value":639},{"type":33,"tag":410,"props":4416,"children":4417},{"style":622},[4418],{"type":38,"value":625},{"type":33,"tag":410,"props":4420,"children":4421},{"style":423},[4422],{"type":38,"value":648},{"type":33,"tag":410,"props":4424,"children":4425},{"class":412,"line":651},[4426,4430],{"type":33,"tag":410,"props":4427,"children":4428},{"style":616},[4429],{"type":38,"value":657},{"type":33,"tag":410,"props":4431,"children":4432},{"style":622},[4433],{"type":38,"value":662},{"type":33,"tag":410,"props":4435,"children":4436},{"class":412,"line":665},[4437,4441,4445,4449],{"type":33,"tag":410,"props":4438,"children":4439},{"style":622},[4440],{"type":38,"value":671},{"type":33,"tag":410,"props":4442,"children":4443},{"style":616},[4444],{"type":38,"value":619},{"type":33,"tag":410,"props":4446,"children":4447},{"style":622},[4448],{"type":38,"value":625},{"type":33,"tag":410,"props":4450,"children":4451},{"style":423},[4452],{"type":38,"value":684},{"type":33,"tag":410,"props":4454,"children":4455},{"class":412,"line":687},[4456,4460,4464],{"type":33,"tag":410,"props":4457,"children":4458},{"style":616},[4459],{"type":38,"value":693},{"type":33,"tag":410,"props":4461,"children":4462},{"style":622},[4463],{"type":38,"value":625},{"type":33,"tag":410,"props":4465,"children":4466},{"style":423},[4467],{"type":38,"value":702},{"type":33,"tag":410,"props":4469,"children":4470},{"class":412,"line":705},[4471,4475,4479,4483],{"type":33,"tag":410,"props":4472,"children":4473},{"style":622},[4474],{"type":38,"value":671},{"type":33,"tag":410,"props":4476,"children":4477},{"style":616},[4478],{"type":38,"value":619},{"type":33,"tag":410,"props":4480,"children":4481},{"style":622},[4482],{"type":38,"value":625},{"type":33,"tag":410,"props":4484,"children":4485},{"style":423},[4486],{"type":38,"value":723},{"type":33,"tag":410,"props":4488,"children":4489},{"class":412,"line":726},[4490,4494,4498],{"type":33,"tag":410,"props":4491,"children":4492},{"style":616},[4493],{"type":38,"value":693},{"type":33,"tag":410,"props":4495,"children":4496},{"style":622},[4497],{"type":38,"value":625},{"type":33,"tag":410,"props":4499,"children":4500},{"style":423},[4501],{"type":38,"value":702},{"type":33,"tag":410,"props":4503,"children":4504},{"class":412,"line":742},[4505,4509,4513,4517],{"type":33,"tag":410,"props":4506,"children":4507},{"style":622},[4508],{"type":38,"value":671},{"type":33,"tag":410,"props":4510,"children":4511},{"style":616},[4512],{"type":38,"value":619},{"type":33,"tag":410,"props":4514,"children":4515},{"style":622},[4516],{"type":38,"value":625},{"type":33,"tag":410,"props":4518,"children":4519},{"style":423},[4520],{"type":38,"value":760},{"type":33,"tag":410,"props":4522,"children":4523},{"class":412,"line":763},[4524,4528,4532],{"type":33,"tag":410,"props":4525,"children":4526},{"style":616},[4527],{"type":38,"value":693},{"type":33,"tag":410,"props":4529,"children":4530},{"style":622},[4531],{"type":38,"value":625},{"type":33,"tag":410,"props":4533,"children":4534},{"style":423},[4535],{"type":38,"value":777},{"type":33,"tag":410,"props":4537,"children":4538},{"class":412,"line":780},[4539,4543,4547,4551],{"type":33,"tag":410,"props":4540,"children":4541},{"style":622},[4542],{"type":38,"value":671},{"type":33,"tag":410,"props":4544,"children":4545},{"style":616},[4546],{"type":38,"value":619},{"type":33,"tag":410,"props":4548,"children":4549},{"style":622},[4550],{"type":38,"value":625},{"type":33,"tag":410,"props":4552,"children":4553},{"style":423},[4554],{"type":38,"value":798},{"type":33,"tag":410,"props":4556,"children":4557},{"class":412,"line":801},[4558,4562,4566],{"type":33,"tag":410,"props":4559,"children":4560},{"style":616},[4561],{"type":38,"value":693},{"type":33,"tag":410,"props":4563,"children":4564},{"style":622},[4565],{"type":38,"value":625},{"type":33,"tag":410,"props":4567,"children":4568},{"style":423},[4569],{"type":38,"value":815},{"type":33,"tag":410,"props":4571,"children":4572},{"class":412,"line":818},[4573,4577,4581,4585],{"type":33,"tag":410,"props":4574,"children":4575},{"style":622},[4576],{"type":38,"value":671},{"type":33,"tag":410,"props":4578,"children":4579},{"style":616},[4580],{"type":38,"value":619},{"type":33,"tag":410,"props":4582,"children":4583},{"style":622},[4584],{"type":38,"value":625},{"type":33,"tag":410,"props":4586,"children":4587},{"style":423},[4588],{"type":38,"value":836},{"type":33,"tag":410,"props":4590,"children":4591},{"class":412,"line":839},[4592,4596,4600],{"type":33,"tag":410,"props":4593,"children":4594},{"style":616},[4595],{"type":38,"value":693},{"type":33,"tag":410,"props":4597,"children":4598},{"style":622},[4599],{"type":38,"value":625},{"type":33,"tag":410,"props":4601,"children":4602},{"style":423},[4603],{"type":38,"value":853},{"type":33,"tag":217,"props":4605,"children":4606},{"id":856},[4607],{"type":38,"value":859},{"type":33,"tag":34,"props":4609,"children":4610},{},[4611,4612,4617],{"type":38,"value":584},{"type":33,"tag":155,"props":4613,"children":4615},{"className":4614},[],[4616],{"type":38,"value":869},{"type":38,"value":871},{"type":33,"tag":34,"props":4619,"children":4620},{},[4621,4622,4627,4628],{"type":38,"value":876},{"type":33,"tag":155,"props":4623,"children":4625},{"className":4624},[],[4626],{"type":38,"value":869},{"type":38,"value":883},{"type":33,"tag":885,"props":4629,"children":4631},{"href":887,"rel":4630},[889],[4632],{"type":38,"value":892},{"type":33,"tag":34,"props":4634,"children":4635},{},[4636],{"type":38,"value":897},{"type":33,"tag":400,"props":4638,"children":4639},{"className":402,"code":900,"language":404,"meta":7,"style":7},[4640],{"type":33,"tag":155,"props":4641,"children":4642},{"__ignoreMap":7},[4643],{"type":33,"tag":410,"props":4644,"children":4645},{"class":412,"line":413},[4646,4650,4654,4658],{"type":33,"tag":410,"props":4647,"children":4648},{"style":417},[4649],{"type":38,"value":420},{"type":33,"tag":410,"props":4651,"children":4652},{"style":423},[4653],{"type":38,"value":916},{"type":33,"tag":410,"props":4655,"children":4656},{"style":423},[4657],{"type":38,"value":921},{"type":33,"tag":410,"props":4659,"children":4660},{"style":423},[4661],{"type":38,"value":436},{"type":33,"tag":400,"props":4663,"children":4664},{"className":595,"code":928,"language":597,"meta":7,"style":7},[4665],{"type":33,"tag":155,"props":4666,"children":4667},{"__ignoreMap":7},[4668,4675,4690,4705,4720,4731,4742,4753,4764,4783,4798,4813,4824,4843,4862,4881,4896,4911,4922,4941,4960,4975,4990,5001,5020,5063,5082,5097,5112,5123,5142,5161,5180,5195,5210,5221],{"type":33,"tag":410,"props":4669,"children":4670},{"class":412,"line":413},[4671],{"type":33,"tag":410,"props":4672,"children":4673},{"style":607},[4674],{"type":38,"value":940},{"type":33,"tag":410,"props":4676,"children":4677},{"class":412,"line":439},[4678,4682,4686],{"type":33,"tag":410,"props":4679,"children":4680},{"style":616},[4681],{"type":38,"value":619},{"type":33,"tag":410,"props":4683,"children":4684},{"style":622},[4685],{"type":38,"value":625},{"type":33,"tag":410,"props":4687,"children":4688},{"style":423},[4689],{"type":38,"value":630},{"type":33,"tag":410,"props":4691,"children":4692},{"class":412,"line":633},[4693,4697,4701],{"type":33,"tag":410,"props":4694,"children":4695},{"style":616},[4696],{"type":38,"value":639},{"type":33,"tag":410,"props":4698,"children":4699},{"style":622},[4700],{"type":38,"value":625},{"type":33,"tag":410,"props":4702,"children":4703},{"style":423},[4704],{"type":38,"value":648},{"type":33,"tag":410,"props":4706,"children":4707},{"class":412,"line":651},[4708,4712,4716],{"type":33,"tag":410,"props":4709,"children":4710},{"style":616},[4711],{"type":38,"value":978},{"type":33,"tag":410,"props":4713,"children":4714},{"style":622},[4715],{"type":38,"value":625},{"type":33,"tag":410,"props":4717,"children":4718},{"style":423},[4719],{"type":38,"value":987},{"type":33,"tag":410,"props":4721,"children":4722},{"class":412,"line":665},[4723,4727],{"type":33,"tag":410,"props":4724,"children":4725},{"style":616},[4726],{"type":38,"value":995},{"type":33,"tag":410,"props":4728,"children":4729},{"style":622},[4730],{"type":38,"value":662},{"type":33,"tag":410,"props":4732,"children":4733},{"class":412,"line":687},[4734,4738],{"type":33,"tag":410,"props":4735,"children":4736},{"style":622},[4737],{"type":38,"value":671},{"type":33,"tag":410,"props":4739,"children":4740},{"style":423},[4741],{"type":38,"value":1011},{"type":33,"tag":410,"props":4743,"children":4744},{"class":412,"line":705},[4745,4749],{"type":33,"tag":410,"props":4746,"children":4747},{"style":622},[4748],{"type":38,"value":671},{"type":33,"tag":410,"props":4750,"children":4751},{"style":423},[4752],{"type":38,"value":1023},{"type":33,"tag":410,"props":4754,"children":4755},{"class":412,"line":726},[4756,4760],{"type":33,"tag":410,"props":4757,"children":4758},{"style":616},[4759],{"type":38,"value":657},{"type":33,"tag":410,"props":4761,"children":4762},{"style":622},[4763],{"type":38,"value":662},{"type":33,"tag":410,"props":4765,"children":4766},{"class":412,"line":742},[4767,4771,4775,4779],{"type":33,"tag":410,"props":4768,"children":4769},{"style":622},[4770],{"type":38,"value":671},{"type":33,"tag":410,"props":4772,"children":4773},{"style":616},[4774],{"type":38,"value":619},{"type":33,"tag":410,"props":4776,"children":4777},{"style":622},[4778],{"type":38,"value":625},{"type":33,"tag":410,"props":4780,"children":4781},{"style":423},[4782],{"type":38,"value":684},{"type":33,"tag":410,"props":4784,"children":4785},{"class":412,"line":763},[4786,4790,4794],{"type":33,"tag":410,"props":4787,"children":4788},{"style":616},[4789],{"type":38,"value":693},{"type":33,"tag":410,"props":4791,"children":4792},{"style":622},[4793],{"type":38,"value":625},{"type":33,"tag":410,"props":4795,"children":4796},{"style":423},[4797],{"type":38,"value":702},{"type":33,"tag":410,"props":4799,"children":4800},{"class":412,"line":780},[4801,4805,4809],{"type":33,"tag":410,"props":4802,"children":4803},{"style":616},[4804],{"type":38,"value":1076},{"type":33,"tag":410,"props":4806,"children":4807},{"style":622},[4808],{"type":38,"value":625},{"type":33,"tag":410,"props":4810,"children":4811},{"style":423},[4812],{"type":38,"value":1085},{"type":33,"tag":410,"props":4814,"children":4815},{"class":412,"line":801},[4816,4820],{"type":33,"tag":410,"props":4817,"children":4818},{"style":616},[4819],{"type":38,"value":1093},{"type":33,"tag":410,"props":4821,"children":4822},{"style":622},[4823],{"type":38,"value":662},{"type":33,"tag":410,"props":4825,"children":4826},{"class":412,"line":818},[4827,4831,4835,4839],{"type":33,"tag":410,"props":4828,"children":4829},{"style":622},[4830],{"type":38,"value":1105},{"type":33,"tag":410,"props":4832,"children":4833},{"style":616},[4834],{"type":38,"value":619},{"type":33,"tag":410,"props":4836,"children":4837},{"style":622},[4838],{"type":38,"value":625},{"type":33,"tag":410,"props":4840,"children":4841},{"style":423},[4842],{"type":38,"value":1118},{"type":33,"tag":410,"props":4844,"children":4845},{"class":412,"line":839},[4846,4850,4854,4858],{"type":33,"tag":410,"props":4847,"children":4848},{"style":622},[4849],{"type":38,"value":1105},{"type":33,"tag":410,"props":4851,"children":4852},{"style":616},[4853],{"type":38,"value":619},{"type":33,"tag":410,"props":4855,"children":4856},{"style":622},[4857],{"type":38,"value":625},{"type":33,"tag":410,"props":4859,"children":4860},{"style":423},[4861],{"type":38,"value":1138},{"type":33,"tag":410,"props":4863,"children":4864},{"class":412,"line":1141},[4865,4869,4873,4877],{"type":33,"tag":410,"props":4866,"children":4867},{"style":622},[4868],{"type":38,"value":671},{"type":33,"tag":410,"props":4870,"children":4871},{"style":616},[4872],{"type":38,"value":619},{"type":33,"tag":410,"props":4874,"children":4875},{"style":622},[4876],{"type":38,"value":625},{"type":33,"tag":410,"props":4878,"children":4879},{"style":423},[4880],{"type":38,"value":723},{"type":33,"tag":410,"props":4882,"children":4883},{"class":412,"line":1161},[4884,4888,4892],{"type":33,"tag":410,"props":4885,"children":4886},{"style":616},[4887],{"type":38,"value":693},{"type":33,"tag":410,"props":4889,"children":4890},{"style":622},[4891],{"type":38,"value":625},{"type":33,"tag":410,"props":4893,"children":4894},{"style":423},[4895],{"type":38,"value":702},{"type":33,"tag":410,"props":4897,"children":4898},{"class":412,"line":1177},[4899,4903,4907],{"type":33,"tag":410,"props":4900,"children":4901},{"style":616},[4902],{"type":38,"value":1076},{"type":33,"tag":410,"props":4904,"children":4905},{"style":622},[4906],{"type":38,"value":625},{"type":33,"tag":410,"props":4908,"children":4909},{"style":423},[4910],{"type":38,"value":1191},{"type":33,"tag":410,"props":4912,"children":4913},{"class":412,"line":1194},[4914,4918],{"type":33,"tag":410,"props":4915,"children":4916},{"style":616},[4917],{"type":38,"value":1093},{"type":33,"tag":410,"props":4919,"children":4920},{"style":622},[4921],{"type":38,"value":662},{"type":33,"tag":410,"props":4923,"children":4924},{"class":412,"line":1206},[4925,4929,4933,4937],{"type":33,"tag":410,"props":4926,"children":4927},{"style":622},[4928],{"type":38,"value":1105},{"type":33,"tag":410,"props":4930,"children":4931},{"style":616},[4932],{"type":38,"value":619},{"type":33,"tag":410,"props":4934,"children":4935},{"style":622},[4936],{"type":38,"value":625},{"type":33,"tag":410,"props":4938,"children":4939},{"style":423},[4940],{"type":38,"value":1118},{"type":33,"tag":410,"props":4942,"children":4943},{"class":412,"line":1226},[4944,4948,4952,4956],{"type":33,"tag":410,"props":4945,"children":4946},{"style":622},[4947],{"type":38,"value":671},{"type":33,"tag":410,"props":4949,"children":4950},{"style":616},[4951],{"type":38,"value":619},{"type":33,"tag":410,"props":4953,"children":4954},{"style":622},[4955],{"type":38,"value":625},{"type":33,"tag":410,"props":4957,"children":4958},{"style":423},[4959],{"type":38,"value":760},{"type":33,"tag":410,"props":4961,"children":4962},{"class":412,"line":1246},[4963,4967,4971],{"type":33,"tag":410,"props":4964,"children":4965},{"style":616},[4966],{"type":38,"value":693},{"type":33,"tag":410,"props":4968,"children":4969},{"style":622},[4970],{"type":38,"value":625},{"type":33,"tag":410,"props":4972,"children":4973},{"style":423},[4974],{"type":38,"value":777},{"type":33,"tag":410,"props":4976,"children":4977},{"class":412,"line":1262},[4978,4982,4986],{"type":33,"tag":410,"props":4979,"children":4980},{"style":616},[4981],{"type":38,"value":1076},{"type":33,"tag":410,"props":4983,"children":4984},{"style":622},[4985],{"type":38,"value":625},{"type":33,"tag":410,"props":4987,"children":4988},{"style":423},[4989],{"type":38,"value":1276},{"type":33,"tag":410,"props":4991,"children":4992},{"class":412,"line":1279},[4993,4997],{"type":33,"tag":410,"props":4994,"children":4995},{"style":616},[4996],{"type":38,"value":1093},{"type":33,"tag":410,"props":4998,"children":4999},{"style":622},[5000],{"type":38,"value":662},{"type":33,"tag":410,"props":5002,"children":5003},{"class":412,"line":1291},[5004,5008,5012,5016],{"type":33,"tag":410,"props":5005,"children":5006},{"style":622},[5007],{"type":38,"value":1105},{"type":33,"tag":410,"props":5009,"children":5010},{"style":616},[5011],{"type":38,"value":619},{"type":33,"tag":410,"props":5013,"children":5014},{"style":622},[5015],{"type":38,"value":625},{"type":33,"tag":410,"props":5017,"children":5018},{"style":423},[5019],{"type":38,"value":1309},{"type":33,"tag":410,"props":5021,"children":5022},{"class":412,"line":13},[5023,5027,5031,5035,5039,5043,5047,5051,5055,5059],{"type":33,"tag":410,"props":5024,"children":5025},{"style":616},[5026],{"type":38,"value":1317},{"type":33,"tag":410,"props":5028,"children":5029},{"style":622},[5030],{"type":38,"value":1322},{"type":33,"tag":410,"props":5032,"children":5033},{"style":423},[5034],{"type":38,"value":1327},{"type":33,"tag":410,"props":5036,"children":5037},{"style":622},[5038],{"type":38,"value":1332},{"type":33,"tag":410,"props":5040,"children":5041},{"style":423},[5042],{"type":38,"value":1337},{"type":33,"tag":410,"props":5044,"children":5045},{"style":622},[5046],{"type":38,"value":1332},{"type":33,"tag":410,"props":5048,"children":5049},{"style":423},[5050],{"type":38,"value":1346},{"type":33,"tag":410,"props":5052,"children":5053},{"style":622},[5054],{"type":38,"value":1332},{"type":33,"tag":410,"props":5056,"children":5057},{"style":423},[5058],{"type":38,"value":1355},{"type":33,"tag":410,"props":5060,"children":5061},{"style":622},[5062],{"type":38,"value":1360},{"type":33,"tag":410,"props":5064,"children":5065},{"class":412,"line":1363},[5066,5070,5074,5078],{"type":33,"tag":410,"props":5067,"children":5068},{"style":622},[5069],{"type":38,"value":671},{"type":33,"tag":410,"props":5071,"children":5072},{"style":616},[5073],{"type":38,"value":619},{"type":33,"tag":410,"props":5075,"children":5076},{"style":622},[5077],{"type":38,"value":625},{"type":33,"tag":410,"props":5079,"children":5080},{"style":423},[5081],{"type":38,"value":798},{"type":33,"tag":410,"props":5083,"children":5084},{"class":412,"line":1383},[5085,5089,5093],{"type":33,"tag":410,"props":5086,"children":5087},{"style":616},[5088],{"type":38,"value":693},{"type":33,"tag":410,"props":5090,"children":5091},{"style":622},[5092],{"type":38,"value":625},{"type":33,"tag":410,"props":5094,"children":5095},{"style":423},[5096],{"type":38,"value":815},{"type":33,"tag":410,"props":5098,"children":5099},{"class":412,"line":1399},[5100,5104,5108],{"type":33,"tag":410,"props":5101,"children":5102},{"style":616},[5103],{"type":38,"value":1076},{"type":33,"tag":410,"props":5105,"children":5106},{"style":622},[5107],{"type":38,"value":625},{"type":33,"tag":410,"props":5109,"children":5110},{"style":423},[5111],{"type":38,"value":1413},{"type":33,"tag":410,"props":5113,"children":5114},{"class":412,"line":1416},[5115,5119],{"type":33,"tag":410,"props":5116,"children":5117},{"style":616},[5118],{"type":38,"value":1093},{"type":33,"tag":410,"props":5120,"children":5121},{"style":622},[5122],{"type":38,"value":662},{"type":33,"tag":410,"props":5124,"children":5125},{"class":412,"line":1428},[5126,5130,5134,5138],{"type":33,"tag":410,"props":5127,"children":5128},{"style":622},[5129],{"type":38,"value":1105},{"type":33,"tag":410,"props":5131,"children":5132},{"style":616},[5133],{"type":38,"value":619},{"type":33,"tag":410,"props":5135,"children":5136},{"style":622},[5137],{"type":38,"value":625},{"type":33,"tag":410,"props":5139,"children":5140},{"style":423},[5141],{"type":38,"value":1118},{"type":33,"tag":410,"props":5143,"children":5144},{"class":412,"line":1448},[5145,5149,5153,5157],{"type":33,"tag":410,"props":5146,"children":5147},{"style":622},[5148],{"type":38,"value":1105},{"type":33,"tag":410,"props":5150,"children":5151},{"style":616},[5152],{"type":38,"value":619},{"type":33,"tag":410,"props":5154,"children":5155},{"style":622},[5156],{"type":38,"value":625},{"type":33,"tag":410,"props":5158,"children":5159},{"style":423},[5160],{"type":38,"value":1466},{"type":33,"tag":410,"props":5162,"children":5163},{"class":412,"line":1469},[5164,5168,5172,5176],{"type":33,"tag":410,"props":5165,"children":5166},{"style":622},[5167],{"type":38,"value":671},{"type":33,"tag":410,"props":5169,"children":5170},{"style":616},[5171],{"type":38,"value":619},{"type":33,"tag":410,"props":5173,"children":5174},{"style":622},[5175],{"type":38,"value":625},{"type":33,"tag":410,"props":5177,"children":5178},{"style":423},[5179],{"type":38,"value":836},{"type":33,"tag":410,"props":5181,"children":5182},{"class":412,"line":1489},[5183,5187,5191],{"type":33,"tag":410,"props":5184,"children":5185},{"style":616},[5186],{"type":38,"value":693},{"type":33,"tag":410,"props":5188,"children":5189},{"style":622},[5190],{"type":38,"value":625},{"type":33,"tag":410,"props":5192,"children":5193},{"style":423},[5194],{"type":38,"value":853},{"type":33,"tag":410,"props":5196,"children":5197},{"class":412,"line":1505},[5198,5202,5206],{"type":33,"tag":410,"props":5199,"children":5200},{"style":616},[5201],{"type":38,"value":1076},{"type":33,"tag":410,"props":5203,"children":5204},{"style":622},[5205],{"type":38,"value":625},{"type":33,"tag":410,"props":5207,"children":5208},{"style":423},[5209],{"type":38,"value":1519},{"type":33,"tag":410,"props":5211,"children":5212},{"class":412,"line":1522},[5213,5217],{"type":33,"tag":410,"props":5214,"children":5215},{"style":616},[5216],{"type":38,"value":1093},{"type":33,"tag":410,"props":5218,"children":5219},{"style":622},[5220],{"type":38,"value":662},{"type":33,"tag":410,"props":5222,"children":5223},{"class":412,"line":1534},[5224,5228,5232,5236],{"type":33,"tag":410,"props":5225,"children":5226},{"style":622},[5227],{"type":38,"value":1105},{"type":33,"tag":410,"props":5229,"children":5230},{"style":616},[5231],{"type":38,"value":619},{"type":33,"tag":410,"props":5233,"children":5234},{"style":622},[5235],{"type":38,"value":625},{"type":33,"tag":410,"props":5237,"children":5238},{"style":423},[5239],{"type":38,"value":1118},{"type":33,"tag":34,"props":5241,"children":5242},{},[5243,5244,5249],{"type":38,"value":1556},{"type":33,"tag":155,"props":5245,"children":5247},{"className":5246},[],[5248],{"type":38,"value":1562},{"type":38,"value":1564},{"type":33,"tag":217,"props":5251,"children":5252},{"id":1567},[5253],{"type":38,"value":1570},{"type":33,"tag":34,"props":5255,"children":5256},{},[5257],{"type":38,"value":1575},{"type":33,"tag":34,"props":5259,"children":5260},{},[5261],{"type":38,"value":1580},{"type":33,"tag":400,"props":5263,"children":5264},{"className":595,"code":1583,"language":597,"meta":7,"style":7},[5265],{"type":33,"tag":155,"props":5266,"children":5267},{"__ignoreMap":7},[5268,5275,5286,5297,5312,5323,5334,5345,5364,5379,5386,5397,5408,5423,5434,5445,5456,5467,5482,5497,5508,5523,5538,5545,5556,5571,5582,5593,5604,5615,5630,5645,5656,5671],{"type":33,"tag":410,"props":5269,"children":5270},{"class":412,"line":413},[5271],{"type":33,"tag":410,"props":5272,"children":5273},{"style":607},[5274],{"type":38,"value":1595},{"type":33,"tag":410,"props":5276,"children":5277},{"class":412,"line":439},[5278,5282],{"type":33,"tag":410,"props":5279,"children":5280},{"style":616},[5281],{"type":38,"value":1603},{"type":33,"tag":410,"props":5283,"children":5284},{"style":622},[5285],{"type":38,"value":662},{"type":33,"tag":410,"props":5287,"children":5288},{"class":412,"line":633},[5289,5293],{"type":33,"tag":410,"props":5290,"children":5291},{"style":616},[5292],{"type":38,"value":1615},{"type":33,"tag":410,"props":5294,"children":5295},{"style":622},[5296],{"type":38,"value":662},{"type":33,"tag":410,"props":5298,"children":5299},{"class":412,"line":651},[5300,5304,5308],{"type":33,"tag":410,"props":5301,"children":5302},{"style":616},[5303],{"type":38,"value":1076},{"type":33,"tag":410,"props":5305,"children":5306},{"style":622},[5307],{"type":38,"value":625},{"type":33,"tag":410,"props":5309,"children":5310},{"style":423},[5311],{"type":38,"value":1635},{"type":33,"tag":410,"props":5313,"children":5314},{"class":412,"line":665},[5315,5319],{"type":33,"tag":410,"props":5316,"children":5317},{"style":616},[5318],{"type":38,"value":1643},{"type":33,"tag":410,"props":5320,"children":5321},{"style":622},[5322],{"type":38,"value":662},{"type":33,"tag":410,"props":5324,"children":5325},{"class":412,"line":687},[5326,5330],{"type":33,"tag":410,"props":5327,"children":5328},{"style":622},[5329],{"type":38,"value":1105},{"type":33,"tag":410,"props":5331,"children":5332},{"style":423},[5333],{"type":38,"value":1659},{"type":33,"tag":410,"props":5335,"children":5336},{"class":412,"line":705},[5337,5341],{"type":33,"tag":410,"props":5338,"children":5339},{"style":616},[5340],{"type":38,"value":1667},{"type":33,"tag":410,"props":5342,"children":5343},{"style":622},[5344],{"type":38,"value":662},{"type":33,"tag":410,"props":5346,"children":5347},{"class":412,"line":726},[5348,5352,5356,5360],{"type":33,"tag":410,"props":5349,"children":5350},{"style":622},[5351],{"type":38,"value":1105},{"type":33,"tag":410,"props":5353,"children":5354},{"style":616},[5355],{"type":38,"value":639},{"type":33,"tag":410,"props":5357,"children":5358},{"style":622},[5359],{"type":38,"value":625},{"type":33,"tag":410,"props":5361,"children":5362},{"style":423},[5363],{"type":38,"value":1691},{"type":33,"tag":410,"props":5365,"children":5366},{"class":412,"line":742},[5367,5371,5375],{"type":33,"tag":410,"props":5368,"children":5369},{"style":616},[5370],{"type":38,"value":1699},{"type":33,"tag":410,"props":5372,"children":5373},{"style":622},[5374],{"type":38,"value":625},{"type":33,"tag":410,"props":5376,"children":5377},{"style":423},[5378],{"type":38,"value":1708},{"type":33,"tag":410,"props":5380,"children":5381},{"class":412,"line":763},[5382],{"type":33,"tag":410,"props":5383,"children":5384},{"emptyLinePlaceholder":1714},[5385],{"type":38,"value":1717},{"type":33,"tag":410,"props":5387,"children":5388},{"class":412,"line":780},[5389,5393],{"type":33,"tag":410,"props":5390,"children":5391},{"style":616},[5392],{"type":38,"value":1725},{"type":33,"tag":410,"props":5394,"children":5395},{"style":622},[5396],{"type":38,"value":662},{"type":33,"tag":410,"props":5398,"children":5399},{"class":412,"line":801},[5400,5404],{"type":33,"tag":410,"props":5401,"children":5402},{"style":616},[5403],{"type":38,"value":1737},{"type":33,"tag":410,"props":5405,"children":5406},{"style":622},[5407],{"type":38,"value":662},{"type":33,"tag":410,"props":5409,"children":5410},{"class":412,"line":818},[5411,5415,5419],{"type":33,"tag":410,"props":5412,"children":5413},{"style":616},[5414],{"type":38,"value":1076},{"type":33,"tag":410,"props":5416,"children":5417},{"style":622},[5418],{"type":38,"value":625},{"type":33,"tag":410,"props":5420,"children":5421},{"style":423},[5422],{"type":38,"value":1757},{"type":33,"tag":410,"props":5424,"children":5425},{"class":412,"line":839},[5426,5430],{"type":33,"tag":410,"props":5427,"children":5428},{"style":616},[5429],{"type":38,"value":1765},{"type":33,"tag":410,"props":5431,"children":5432},{"style":622},[5433],{"type":38,"value":662},{"type":33,"tag":410,"props":5435,"children":5436},{"class":412,"line":1141},[5437,5441],{"type":33,"tag":410,"props":5438,"children":5439},{"style":622},[5440],{"type":38,"value":1105},{"type":33,"tag":410,"props":5442,"children":5443},{"style":423},[5444],{"type":38,"value":1781},{"type":33,"tag":410,"props":5446,"children":5447},{"class":412,"line":1161},[5448,5452],{"type":33,"tag":410,"props":5449,"children":5450},{"style":616},[5451],{"type":38,"value":1789},{"type":33,"tag":410,"props":5453,"children":5454},{"style":622},[5455],{"type":38,"value":662},{"type":33,"tag":410,"props":5457,"children":5458},{"class":412,"line":1177},[5459,5463],{"type":33,"tag":410,"props":5460,"children":5461},{"style":616},[5462],{"type":38,"value":1801},{"type":33,"tag":410,"props":5464,"children":5465},{"style":622},[5466],{"type":38,"value":662},{"type":33,"tag":410,"props":5468,"children":5469},{"class":412,"line":1194},[5470,5474,5478],{"type":33,"tag":410,"props":5471,"children":5472},{"style":616},[5473],{"type":38,"value":1813},{"type":33,"tag":410,"props":5475,"children":5476},{"style":622},[5477],{"type":38,"value":625},{"type":33,"tag":410,"props":5479,"children":5480},{"style":423},[5481],{"type":38,"value":1822},{"type":33,"tag":410,"props":5483,"children":5484},{"class":412,"line":1206},[5485,5489,5493],{"type":33,"tag":410,"props":5486,"children":5487},{"style":616},[5488],{"type":38,"value":1830},{"type":33,"tag":410,"props":5490,"children":5491},{"style":622},[5492],{"type":38,"value":625},{"type":33,"tag":410,"props":5494,"children":5495},{"style":423},[5496],{"type":38,"value":1839},{"type":33,"tag":410,"props":5498,"children":5499},{"class":412,"line":1226},[5500,5504],{"type":33,"tag":410,"props":5501,"children":5502},{"style":616},[5503],{"type":38,"value":1847},{"type":33,"tag":410,"props":5505,"children":5506},{"style":622},[5507],{"type":38,"value":662},{"type":33,"tag":410,"props":5509,"children":5510},{"class":412,"line":1246},[5511,5515,5519],{"type":33,"tag":410,"props":5512,"children":5513},{"style":616},[5514],{"type":38,"value":1813},{"type":33,"tag":410,"props":5516,"children":5517},{"style":622},[5518],{"type":38,"value":625},{"type":33,"tag":410,"props":5520,"children":5521},{"style":423},[5522],{"type":38,"value":1822},{"type":33,"tag":410,"props":5524,"children":5525},{"class":412,"line":1262},[5526,5530,5534],{"type":33,"tag":410,"props":5527,"children":5528},{"style":616},[5529],{"type":38,"value":1830},{"type":33,"tag":410,"props":5531,"children":5532},{"style":622},[5533],{"type":38,"value":625},{"type":33,"tag":410,"props":5535,"children":5536},{"style":423},[5537],{"type":38,"value":1882},{"type":33,"tag":410,"props":5539,"children":5540},{"class":412,"line":1279},[5541],{"type":33,"tag":410,"props":5542,"children":5543},{"emptyLinePlaceholder":1714},[5544],{"type":38,"value":1717},{"type":33,"tag":410,"props":5546,"children":5547},{"class":412,"line":1291},[5548,5552],{"type":33,"tag":410,"props":5549,"children":5550},{"style":616},[5551],{"type":38,"value":1897},{"type":33,"tag":410,"props":5553,"children":5554},{"style":622},[5555],{"type":38,"value":662},{"type":33,"tag":410,"props":5557,"children":5558},{"class":412,"line":13},[5559,5563,5567],{"type":33,"tag":410,"props":5560,"children":5561},{"style":616},[5562],{"type":38,"value":1076},{"type":33,"tag":410,"props":5564,"children":5565},{"style":622},[5566],{"type":38,"value":625},{"type":33,"tag":410,"props":5568,"children":5569},{"style":423},[5570],{"type":38,"value":1917},{"type":33,"tag":410,"props":5572,"children":5573},{"class":412,"line":1363},[5574,5578],{"type":33,"tag":410,"props":5575,"children":5576},{"style":616},[5577],{"type":38,"value":1765},{"type":33,"tag":410,"props":5579,"children":5580},{"style":622},[5581],{"type":38,"value":662},{"type":33,"tag":410,"props":5583,"children":5584},{"class":412,"line":1383},[5585,5589],{"type":33,"tag":410,"props":5586,"children":5587},{"style":622},[5588],{"type":38,"value":1105},{"type":33,"tag":410,"props":5590,"children":5591},{"style":423},[5592],{"type":38,"value":1781},{"type":33,"tag":410,"props":5594,"children":5595},{"class":412,"line":1399},[5596,5600],{"type":33,"tag":410,"props":5597,"children":5598},{"style":616},[5599],{"type":38,"value":1789},{"type":33,"tag":410,"props":5601,"children":5602},{"style":622},[5603],{"type":38,"value":662},{"type":33,"tag":410,"props":5605,"children":5606},{"class":412,"line":1416},[5607,5611],{"type":33,"tag":410,"props":5608,"children":5609},{"style":616},[5610],{"type":38,"value":1958},{"type":33,"tag":410,"props":5612,"children":5613},{"style":622},[5614],{"type":38,"value":662},{"type":33,"tag":410,"props":5616,"children":5617},{"class":412,"line":1428},[5618,5622,5626],{"type":33,"tag":410,"props":5619,"children":5620},{"style":616},[5621],{"type":38,"value":1813},{"type":33,"tag":410,"props":5623,"children":5624},{"style":622},[5625],{"type":38,"value":625},{"type":33,"tag":410,"props":5627,"children":5628},{"style":423},[5629],{"type":38,"value":1978},{"type":33,"tag":410,"props":5631,"children":5632},{"class":412,"line":1448},[5633,5637,5641],{"type":33,"tag":410,"props":5634,"children":5635},{"style":616},[5636],{"type":38,"value":1830},{"type":33,"tag":410,"props":5638,"children":5639},{"style":622},[5640],{"type":38,"value":625},{"type":33,"tag":410,"props":5642,"children":5643},{"style":423},[5644],{"type":38,"value":1994},{"type":33,"tag":410,"props":5646,"children":5647},{"class":412,"line":1469},[5648,5652],{"type":33,"tag":410,"props":5649,"children":5650},{"style":616},[5651],{"type":38,"value":2002},{"type":33,"tag":410,"props":5653,"children":5654},{"style":622},[5655],{"type":38,"value":662},{"type":33,"tag":410,"props":5657,"children":5658},{"class":412,"line":1489},[5659,5663,5667],{"type":33,"tag":410,"props":5660,"children":5661},{"style":616},[5662],{"type":38,"value":1813},{"type":33,"tag":410,"props":5664,"children":5665},{"style":622},[5666],{"type":38,"value":625},{"type":33,"tag":410,"props":5668,"children":5669},{"style":423},[5670],{"type":38,"value":1822},{"type":33,"tag":410,"props":5672,"children":5673},{"class":412,"line":1505},[5674,5678,5682],{"type":33,"tag":410,"props":5675,"children":5676},{"style":616},[5677],{"type":38,"value":1830},{"type":33,"tag":410,"props":5679,"children":5680},{"style":622},[5681],{"type":38,"value":625},{"type":33,"tag":410,"props":5683,"children":5684},{"style":423},[5685],{"type":38,"value":2037},{"type":33,"tag":34,"props":5687,"children":5688},{},[5689],{"type":38,"value":2042},{"type":33,"tag":400,"props":5691,"children":5692},{"className":595,"code":2045,"language":597,"meta":7,"style":7},[5693],{"type":33,"tag":155,"props":5694,"children":5695},{"__ignoreMap":7},[5696,5703,5718,5729,5748,5763,5782],{"type":33,"tag":410,"props":5697,"children":5698},{"class":412,"line":413},[5699],{"type":33,"tag":410,"props":5700,"children":5701},{"style":607},[5702],{"type":38,"value":2057},{"type":33,"tag":410,"props":5704,"children":5705},{"class":412,"line":439},[5706,5710,5714],{"type":33,"tag":410,"props":5707,"children":5708},{"style":616},[5709],{"type":38,"value":619},{"type":33,"tag":410,"props":5711,"children":5712},{"style":622},[5713],{"type":38,"value":625},{"type":33,"tag":410,"props":5715,"children":5716},{"style":423},[5717],{"type":38,"value":630},{"type":33,"tag":410,"props":5719,"children":5720},{"class":412,"line":633},[5721,5725],{"type":33,"tag":410,"props":5722,"children":5723},{"style":616},[5724],{"type":38,"value":657},{"type":33,"tag":410,"props":5726,"children":5727},{"style":622},[5728],{"type":38,"value":662},{"type":33,"tag":410,"props":5730,"children":5731},{"class":412,"line":651},[5732,5736,5740,5744],{"type":33,"tag":410,"props":5733,"children":5734},{"style":622},[5735],{"type":38,"value":671},{"type":33,"tag":410,"props":5737,"children":5738},{"style":616},[5739],{"type":38,"value":619},{"type":33,"tag":410,"props":5741,"children":5742},{"style":622},[5743],{"type":38,"value":625},{"type":33,"tag":410,"props":5745,"children":5746},{"style":423},[5747],{"type":38,"value":723},{"type":33,"tag":410,"props":5749,"children":5750},{"class":412,"line":665},[5751,5755,5759],{"type":33,"tag":410,"props":5752,"children":5753},{"style":616},[5754],{"type":38,"value":2110},{"type":33,"tag":410,"props":5756,"children":5757},{"style":622},[5758],{"type":38,"value":625},{"type":33,"tag":410,"props":5760,"children":5761},{"style":423},[5762],{"type":38,"value":2119},{"type":33,"tag":410,"props":5764,"children":5765},{"class":412,"line":687},[5766,5770,5774,5778],{"type":33,"tag":410,"props":5767,"children":5768},{"style":622},[5769],{"type":38,"value":671},{"type":33,"tag":410,"props":5771,"children":5772},{"style":616},[5773],{"type":38,"value":619},{"type":33,"tag":410,"props":5775,"children":5776},{"style":622},[5777],{"type":38,"value":625},{"type":33,"tag":410,"props":5779,"children":5780},{"style":423},[5781],{"type":38,"value":798},{"type":33,"tag":410,"props":5783,"children":5784},{"class":412,"line":705},[5785,5789,5793],{"type":33,"tag":410,"props":5786,"children":5787},{"style":616},[5788],{"type":38,"value":2110},{"type":33,"tag":410,"props":5790,"children":5791},{"style":622},[5792],{"type":38,"value":625},{"type":33,"tag":410,"props":5794,"children":5795},{"style":423},[5796],{"type":38,"value":2154},{"type":33,"tag":217,"props":5798,"children":5799},{"id":2157},[5800],{"type":38,"value":2160},{"type":33,"tag":34,"props":5802,"children":5803},{},[5804],{"type":38,"value":2165},{"type":33,"tag":34,"props":5806,"children":5807},{},[5808],{"type":38,"value":2170},{"type":33,"tag":400,"props":5810,"children":5811},{"className":2173,"code":2174,"language":2175,"meta":7,"style":7},[5812],{"type":33,"tag":155,"props":5813,"children":5814},{"__ignoreMap":7},[5815,5822,5829,5836,5843,5850,5857,5864,5871,5878,5885,5892,5899,5906,5913,5920,5927,5934,5941,5948],{"type":33,"tag":410,"props":5816,"children":5817},{"class":412,"line":413},[5818],{"type":33,"tag":410,"props":5819,"children":5820},{},[5821],{"type":38,"value":2187},{"type":33,"tag":410,"props":5823,"children":5824},{"class":412,"line":439},[5825],{"type":33,"tag":410,"props":5826,"children":5827},{"emptyLinePlaceholder":1714},[5828],{"type":38,"value":1717},{"type":33,"tag":410,"props":5830,"children":5831},{"class":412,"line":633},[5832],{"type":33,"tag":410,"props":5833,"children":5834},{},[5835],{"type":38,"value":2202},{"type":33,"tag":410,"props":5837,"children":5838},{"class":412,"line":651},[5839],{"type":33,"tag":410,"props":5840,"children":5841},{},[5842],{"type":38,"value":2210},{"type":33,"tag":410,"props":5844,"children":5845},{"class":412,"line":665},[5846],{"type":33,"tag":410,"props":5847,"children":5848},{},[5849],{"type":38,"value":2218},{"type":33,"tag":410,"props":5851,"children":5852},{"class":412,"line":687},[5853],{"type":33,"tag":410,"props":5854,"children":5855},{},[5856],{"type":38,"value":2226},{"type":33,"tag":410,"props":5858,"children":5859},{"class":412,"line":705},[5860],{"type":33,"tag":410,"props":5861,"children":5862},{},[5863],{"type":38,"value":2234},{"type":33,"tag":410,"props":5865,"children":5866},{"class":412,"line":726},[5867],{"type":33,"tag":410,"props":5868,"children":5869},{},[5870],{"type":38,"value":2242},{"type":33,"tag":410,"props":5872,"children":5873},{"class":412,"line":742},[5874],{"type":33,"tag":410,"props":5875,"children":5876},{},[5877],{"type":38,"value":2250},{"type":33,"tag":410,"props":5879,"children":5880},{"class":412,"line":763},[5881],{"type":33,"tag":410,"props":5882,"children":5883},{"emptyLinePlaceholder":1714},[5884],{"type":38,"value":1717},{"type":33,"tag":410,"props":5886,"children":5887},{"class":412,"line":780},[5888],{"type":33,"tag":410,"props":5889,"children":5890},{},[5891],{"type":38,"value":2265},{"type":33,"tag":410,"props":5893,"children":5894},{"class":412,"line":801},[5895],{"type":33,"tag":410,"props":5896,"children":5897},{},[5898],{"type":38,"value":2273},{"type":33,"tag":410,"props":5900,"children":5901},{"class":412,"line":818},[5902],{"type":33,"tag":410,"props":5903,"children":5904},{},[5905],{"type":38,"value":2281},{"type":33,"tag":410,"props":5907,"children":5908},{"class":412,"line":839},[5909],{"type":33,"tag":410,"props":5910,"children":5911},{},[5912],{"type":38,"value":2289},{"type":33,"tag":410,"props":5914,"children":5915},{"class":412,"line":1141},[5916],{"type":33,"tag":410,"props":5917,"children":5918},{},[5919],{"type":38,"value":2297},{"type":33,"tag":410,"props":5921,"children":5922},{"class":412,"line":1161},[5923],{"type":33,"tag":410,"props":5924,"children":5925},{"emptyLinePlaceholder":1714},[5926],{"type":38,"value":1717},{"type":33,"tag":410,"props":5928,"children":5929},{"class":412,"line":1177},[5930],{"type":33,"tag":410,"props":5931,"children":5932},{},[5933],{"type":38,"value":2312},{"type":33,"tag":410,"props":5935,"children":5936},{"class":412,"line":1194},[5937],{"type":33,"tag":410,"props":5938,"children":5939},{},[5940],{"type":38,"value":2320},{"type":33,"tag":410,"props":5942,"children":5943},{"class":412,"line":1206},[5944],{"type":33,"tag":410,"props":5945,"children":5946},{},[5947],{"type":38,"value":2328},{"type":33,"tag":410,"props":5949,"children":5950},{"class":412,"line":1226},[5951],{"type":33,"tag":410,"props":5952,"children":5953},{},[5954],{"type":38,"value":2336},{"type":33,"tag":217,"props":5956,"children":5957},{"id":2339},[5958],{"type":38,"value":2342},{"type":33,"tag":34,"props":5960,"children":5961},{},[5962],{"type":38,"value":2347},{"type":33,"tag":400,"props":5964,"children":5965},{"className":402,"code":2350,"language":404,"meta":7,"style":7},[5966],{"type":33,"tag":155,"props":5967,"children":5968},{"__ignoreMap":7},[5969,5976,6007,6014,6021,6028,6043,6058,6073,6096,6103,6110],{"type":33,"tag":410,"props":5970,"children":5971},{"class":412,"line":413},[5972],{"type":33,"tag":410,"props":5973,"children":5974},{"style":607},[5975],{"type":38,"value":2362},{"type":33,"tag":410,"props":5977,"children":5978},{"class":412,"line":439},[5979,5983,5987,5991,5995,5999,6003],{"type":33,"tag":410,"props":5980,"children":5981},{"style":417},[5982],{"type":38,"value":2370},{"type":33,"tag":410,"props":5984,"children":5985},{"style":423},[5986],{"type":38,"value":2375},{"type":33,"tag":410,"props":5988,"children":5989},{"style":423},[5990],{"type":38,"value":480},{"type":33,"tag":410,"props":5992,"children":5993},{"style":423},[5994],{"type":38,"value":2384},{"type":33,"tag":410,"props":5996,"children":5997},{"style":443},[5998],{"type":38,"value":2389},{"type":33,"tag":410,"props":6000,"children":6001},{"style":423},[6002],{"type":38,"value":2384},{"type":33,"tag":410,"props":6004,"children":6005},{"style":423},[6006],{"type":38,"value":2398},{"type":33,"tag":410,"props":6008,"children":6009},{"class":412,"line":633},[6010],{"type":33,"tag":410,"props":6011,"children":6012},{"emptyLinePlaceholder":1714},[6013],{"type":38,"value":1717},{"type":33,"tag":410,"props":6015,"children":6016},{"class":412,"line":651},[6017],{"type":33,"tag":410,"props":6018,"children":6019},{"style":607},[6020],{"type":38,"value":2413},{"type":33,"tag":410,"props":6022,"children":6023},{"class":412,"line":665},[6024],{"type":33,"tag":410,"props":6025,"children":6026},{"style":622},[6027],{"type":38,"value":2421},{"type":33,"tag":410,"props":6029,"children":6030},{"class":412,"line":687},[6031,6035,6039],{"type":33,"tag":410,"props":6032,"children":6033},{"style":417},[6034],{"type":38,"value":2429},{"type":33,"tag":410,"props":6036,"children":6037},{"style":443},[6038],{"type":38,"value":2434},{"type":33,"tag":410,"props":6040,"children":6041},{"style":423},[6042],{"type":38,"value":2439},{"type":33,"tag":410,"props":6044,"children":6045},{"class":412,"line":705},[6046,6050,6054],{"type":33,"tag":410,"props":6047,"children":6048},{"style":417},[6049],{"type":38,"value":2447},{"type":33,"tag":410,"props":6051,"children":6052},{"style":443},[6053],{"type":38,"value":2434},{"type":33,"tag":410,"props":6055,"children":6056},{"style":423},[6057],{"type":38,"value":2439},{"type":33,"tag":410,"props":6059,"children":6060},{"class":412,"line":726},[6061,6065,6069],{"type":33,"tag":410,"props":6062,"children":6063},{"style":417},[6064],{"type":38,"value":2463},{"type":33,"tag":410,"props":6066,"children":6067},{"style":443},[6068],{"type":38,"value":2434},{"type":33,"tag":410,"props":6070,"children":6071},{"style":423},[6072],{"type":38,"value":2472},{"type":33,"tag":410,"props":6074,"children":6075},{"class":412,"line":742},[6076,6080,6084,6088,6092],{"type":33,"tag":410,"props":6077,"children":6078},{"style":417},[6079],{"type":38,"value":2480},{"type":33,"tag":410,"props":6081,"children":6082},{"style":443},[6083],{"type":38,"value":2434},{"type":33,"tag":410,"props":6085,"children":6086},{"style":622},[6087],{"type":38,"value":2489},{"type":33,"tag":410,"props":6089,"children":6090},{"style":423},[6091],{"type":38,"value":2494},{"type":33,"tag":410,"props":6093,"children":6094},{"style":622},[6095],{"type":38,"value":1360},{"type":33,"tag":410,"props":6097,"children":6098},{"class":412,"line":763},[6099],{"type":33,"tag":410,"props":6100,"children":6101},{"style":622},[6102],{"type":38,"value":2506},{"type":33,"tag":410,"props":6104,"children":6105},{"class":412,"line":780},[6106],{"type":33,"tag":410,"props":6107,"children":6108},{"style":622},[6109],{"type":38,"value":2514},{"type":33,"tag":410,"props":6111,"children":6112},{"class":412,"line":801},[6113],{"type":33,"tag":410,"props":6114,"children":6115},{"style":622},[6116],{"type":38,"value":2522},{"type":33,"tag":56,"props":6118,"children":6119},{},[],{"type":33,"tag":60,"props":6121,"children":6122},{"id":2528},[6123],{"type":38,"value":2531},{"type":33,"tag":34,"props":6125,"children":6126},{},[6127],{"type":38,"value":2536},{"type":33,"tag":34,"props":6129,"children":6130},{},[6131],{"type":38,"value":2541},{"type":33,"tag":34,"props":6133,"children":6134},{},[6135],{"type":38,"value":2546},{"type":33,"tag":34,"props":6137,"children":6138},{},[6139],{"type":38,"value":2551},{"type":33,"tag":34,"props":6141,"children":6142},{},[6143],{"type":38,"value":2556},{"type":33,"tag":34,"props":6145,"children":6146},{},[6147],{"type":38,"value":2561},{"type":33,"tag":217,"props":6149,"children":6150},{"id":2564},[6151],{"type":38,"value":2567},{"type":33,"tag":135,"props":6153,"children":6154},{},[6155,6159,6163],{"type":33,"tag":139,"props":6156,"children":6157},{},[6158],{"type":38,"value":2575},{"type":33,"tag":139,"props":6160,"children":6161},{},[6162],{"type":38,"value":2580},{"type":33,"tag":139,"props":6164,"children":6165},{},[6166],{"type":38,"value":2585},{"type":33,"tag":217,"props":6168,"children":6169},{"id":2588},[6170],{"type":38,"value":2591},{"type":33,"tag":135,"props":6172,"children":6173},{},[6174,6178],{"type":33,"tag":139,"props":6175,"children":6176},{},[6177],{"type":38,"value":2599},{"type":33,"tag":139,"props":6179,"children":6180},{},[6181],{"type":38,"value":2604},{"type":33,"tag":34,"props":6183,"children":6184},{},[6185],{"type":38,"value":2609},{"type":33,"tag":400,"props":6187,"children":6188},{"className":595,"code":2612,"language":597,"meta":7,"style":7},[6189],{"type":33,"tag":155,"props":6190,"children":6191},{"__ignoreMap":7},[6192,6199,6210,6229,6240,6255,6270,6285],{"type":33,"tag":410,"props":6193,"children":6194},{"class":412,"line":413},[6195],{"type":33,"tag":410,"props":6196,"children":6197},{"style":607},[6198],{"type":38,"value":2624},{"type":33,"tag":410,"props":6200,"children":6201},{"class":412,"line":439},[6202,6206],{"type":33,"tag":410,"props":6203,"children":6204},{"style":616},[6205],{"type":38,"value":2632},{"type":33,"tag":410,"props":6207,"children":6208},{"style":622},[6209],{"type":38,"value":662},{"type":33,"tag":410,"props":6211,"children":6212},{"class":412,"line":633},[6213,6217,6221,6225],{"type":33,"tag":410,"props":6214,"children":6215},{"style":622},[6216],{"type":38,"value":671},{"type":33,"tag":410,"props":6218,"children":6219},{"style":616},[6220],{"type":38,"value":619},{"type":33,"tag":410,"props":6222,"children":6223},{"style":622},[6224],{"type":38,"value":625},{"type":33,"tag":410,"props":6226,"children":6227},{"style":423},[6228],{"type":38,"value":2656},{"type":33,"tag":410,"props":6230,"children":6231},{"class":412,"line":651},[6232,6236],{"type":33,"tag":410,"props":6233,"children":6234},{"style":616},[6235],{"type":38,"value":2664},{"type":33,"tag":410,"props":6237,"children":6238},{"style":622},[6239],{"type":38,"value":662},{"type":33,"tag":410,"props":6241,"children":6242},{"class":412,"line":665},[6243,6247,6251],{"type":33,"tag":410,"props":6244,"children":6245},{"style":616},[6246],{"type":38,"value":2676},{"type":33,"tag":410,"props":6248,"children":6249},{"style":622},[6250],{"type":38,"value":625},{"type":33,"tag":410,"props":6252,"children":6253},{"style":423},[6254],{"type":38,"value":836},{"type":33,"tag":410,"props":6256,"children":6257},{"class":412,"line":687},[6258,6262,6266],{"type":33,"tag":410,"props":6259,"children":6260},{"style":616},[6261],{"type":38,"value":2692},{"type":33,"tag":410,"props":6263,"children":6264},{"style":622},[6265],{"type":38,"value":625},{"type":33,"tag":410,"props":6267,"children":6268},{"style":423},[6269],{"type":38,"value":2701},{"type":33,"tag":410,"props":6271,"children":6272},{"class":412,"line":705},[6273,6277,6281],{"type":33,"tag":410,"props":6274,"children":6275},{"style":616},[6276],{"type":38,"value":2709},{"type":33,"tag":410,"props":6278,"children":6279},{"style":622},[6280],{"type":38,"value":625},{"type":33,"tag":410,"props":6282,"children":6283},{"style":423},[6284],{"type":38,"value":2718},{"type":33,"tag":410,"props":6286,"children":6287},{"class":412,"line":726},[6288,6292,6296],{"type":33,"tag":410,"props":6289,"children":6290},{"style":616},[6291],{"type":38,"value":2726},{"type":33,"tag":410,"props":6293,"children":6294},{"style":622},[6295],{"type":38,"value":625},{"type":33,"tag":410,"props":6297,"children":6298},{"style":423},[6299],{"type":38,"value":2735},{"type":33,"tag":217,"props":6301,"children":6302},{"id":2738},[6303],{"type":38,"value":2741},{"type":33,"tag":135,"props":6305,"children":6306},{},[6307,6311,6315],{"type":33,"tag":139,"props":6308,"children":6309},{},[6310],{"type":38,"value":2749},{"type":33,"tag":139,"props":6312,"children":6313},{},[6314],{"type":38,"value":2754},{"type":33,"tag":139,"props":6316,"children":6317},{},[6318],{"type":38,"value":2759},{"type":33,"tag":217,"props":6320,"children":6321},{"id":2762},[6322],{"type":38,"value":2765},{"type":33,"tag":34,"props":6324,"children":6325},{},[6326],{"type":38,"value":2770},{"type":33,"tag":34,"props":6328,"children":6329},{},[6330],{"type":38,"value":2775},{"type":33,"tag":34,"props":6332,"children":6333},{},[6334],{"type":38,"value":2780},{"type":33,"tag":135,"props":6336,"children":6337},{},[6338,6342,6352,6368,6390,6423],{"type":33,"tag":139,"props":6339,"children":6340},{},[6341],{"type":38,"value":2788},{"type":33,"tag":139,"props":6343,"children":6344},{},[6345,6346,6351],{"type":38,"value":2793},{"type":33,"tag":155,"props":6347,"children":6349},{"className":6348},[],[6350],{"type":38,"value":2799},{"type":38,"value":2801},{"type":33,"tag":139,"props":6353,"children":6354},{},[6355,6356,6361,6362,6367],{"type":38,"value":2806},{"type":33,"tag":155,"props":6357,"children":6359},{"className":6358},[],[6360],{"type":38,"value":2812},{"type":38,"value":1332},{"type":33,"tag":155,"props":6363,"children":6365},{"className":6364},[],[6366],{"type":38,"value":2819},{"type":38,"value":2821},{"type":33,"tag":139,"props":6369,"children":6370},{},[6371,6372,6377,6378,6383,6384,6389],{"type":38,"value":2826},{"type":33,"tag":155,"props":6373,"children":6375},{"className":6374},[],[6376],{"type":38,"value":2832},{"type":38,"value":2834},{"type":33,"tag":155,"props":6379,"children":6381},{"className":6380},[],[6382],{"type":38,"value":2840},{"type":38,"value":2842},{"type":33,"tag":155,"props":6385,"children":6387},{"className":6386},[],[6388],{"type":38,"value":2799},{"type":38,"value":2849},{"type":33,"tag":139,"props":6391,"children":6392},{},[6393,6394,6399,6400,6405,6406,6411,6412,6417,6418],{"type":38,"value":2854},{"type":33,"tag":155,"props":6395,"children":6397},{"className":6396},[],[6398],{"type":38,"value":2860},{"type":38,"value":2862},{"type":33,"tag":155,"props":6401,"children":6403},{"className":6402},[],[6404],{"type":38,"value":2832},{"type":38,"value":2869},{"type":33,"tag":155,"props":6407,"children":6409},{"className":6408},[],[6410],{"type":38,"value":2875},{"type":38,"value":2877},{"type":33,"tag":155,"props":6413,"children":6415},{"className":6414},[],[6416],{"type":38,"value":2883},{"type":38,"value":2885},{"type":33,"tag":155,"props":6419,"children":6421},{"className":6420},[],[6422],{"type":38,"value":2799},{"type":33,"tag":139,"props":6424,"children":6425},{},[6426],{"type":38,"value":2895},{"type":33,"tag":56,"props":6428,"children":6429},{},[],{"type":33,"tag":60,"props":6431,"children":6432},{"id":2901},[6433],{"type":38,"value":2904},{"type":33,"tag":34,"props":6435,"children":6436},{},[6437,6438,6443,6444,6449,6450,6455],{"type":38,"value":2909},{"type":33,"tag":155,"props":6439,"children":6441},{"className":6440},[],[6442],{"type":38,"value":2915},{"type":38,"value":2917},{"type":33,"tag":155,"props":6445,"children":6447},{"className":6446},[],[6448],{"type":38,"value":2923},{"type":38,"value":2925},{"type":33,"tag":155,"props":6451,"children":6453},{"className":6452},[],[6454],{"type":38,"value":2931},{"type":38,"value":2933},{"type":33,"tag":34,"props":6457,"children":6458},{},[6459],{"type":38,"value":2938},{"type":33,"tag":34,"props":6461,"children":6462},{},[6463],{"type":38,"value":2943},{"type":33,"tag":34,"props":6465,"children":6466},{},[6467],{"type":38,"value":2948},{"type":33,"tag":34,"props":6469,"children":6470},{},[6471],{"type":38,"value":2953},{"type":33,"tag":135,"props":6473,"children":6474},{},[6475,6497,6507],{"type":33,"tag":139,"props":6476,"children":6477},{},[6478,6479,6484,6485,6490,6491,6496],{"type":38,"value":2961},{"type":33,"tag":155,"props":6480,"children":6482},{"className":6481},[],[6483],{"type":38,"value":334},{"type":38,"value":2968},{"type":33,"tag":155,"props":6486,"children":6488},{"className":6487},[],[6489],{"type":38,"value":2974},{"type":38,"value":2976},{"type":33,"tag":155,"props":6492,"children":6494},{"className":6493},[],[6495],{"type":38,"value":2982},{"type":38,"value":2984},{"type":33,"tag":139,"props":6498,"children":6499},{},[6500,6501,6506],{"type":38,"value":2989},{"type":33,"tag":155,"props":6502,"children":6504},{"className":6503},[],[6505],{"type":38,"value":2995},{"type":38,"value":2997},{"type":33,"tag":139,"props":6508,"children":6509},{},[6510,6511,6516],{"type":38,"value":3002},{"type":33,"tag":155,"props":6512,"children":6514},{"className":6513},[],[6515],{"type":38,"value":3008},{"type":38,"value":3010},{"type":33,"tag":400,"props":6518,"children":6519},{"className":3013,"code":3014,"language":3015,"meta":7,"style":7},[6520],{"type":33,"tag":155,"props":6521,"children":6522},{"__ignoreMap":7},[6523,6530,6561,6576,6591,6598,6605,6616,6623,6642,6661,6680,6699,6718,6733,6756,6811,6838,6873,6900],{"type":33,"tag":410,"props":6524,"children":6525},{"class":412,"line":413},[6526],{"type":33,"tag":410,"props":6527,"children":6528},{"style":607},[6529],{"type":38,"value":3027},{"type":33,"tag":410,"props":6531,"children":6532},{"class":412,"line":439},[6533,6537,6541,6545,6549,6553,6557],{"type":33,"tag":410,"props":6534,"children":6535},{"style":3033},[6536],{"type":38,"value":3036},{"type":33,"tag":410,"props":6538,"children":6539},{"style":3033},[6540],{"type":38,"value":3041},{"type":33,"tag":410,"props":6542,"children":6543},{"style":417},[6544],{"type":38,"value":3046},{"type":33,"tag":410,"props":6546,"children":6547},{"style":443},[6548],{"type":38,"value":3051},{"type":33,"tag":410,"props":6550,"children":6551},{"style":622},[6552],{"type":38,"value":3056},{"type":33,"tag":410,"props":6554,"children":6555},{"style":443},[6556],{"type":38,"value":3061},{"type":33,"tag":410,"props":6558,"children":6559},{"style":622},[6560],{"type":38,"value":3066},{"type":33,"tag":410,"props":6562,"children":6563},{"class":412,"line":633},[6564,6568,6572],{"type":33,"tag":410,"props":6565,"children":6566},{"style":3033},[6567],{"type":38,"value":3074},{"type":33,"tag":410,"props":6569,"children":6570},{"style":3033},[6571],{"type":38,"value":3079},{"type":33,"tag":410,"props":6573,"children":6574},{"style":622},[6575],{"type":38,"value":3084},{"type":33,"tag":410,"props":6577,"children":6578},{"class":412,"line":651},[6579,6583,6587],{"type":33,"tag":410,"props":6580,"children":6581},{"style":622},[6582],{"type":38,"value":3092},{"type":33,"tag":410,"props":6584,"children":6585},{"style":3033},[6586],{"type":38,"value":3097},{"type":33,"tag":410,"props":6588,"children":6589},{"style":622},[6590],{"type":38,"value":3084},{"type":33,"tag":410,"props":6592,"children":6593},{"class":412,"line":665},[6594],{"type":33,"tag":410,"props":6595,"children":6596},{"style":622},[6597],{"type":38,"value":3109},{"type":33,"tag":410,"props":6599,"children":6600},{"class":412,"line":687},[6601],{"type":33,"tag":410,"props":6602,"children":6603},{"style":622},[6604],{"type":38,"value":3117},{"type":33,"tag":410,"props":6606,"children":6607},{"class":412,"line":705},[6608,6612],{"type":33,"tag":410,"props":6609,"children":6610},{"style":3033},[6611],{"type":38,"value":3125},{"type":33,"tag":410,"props":6613,"children":6614},{"style":622},[6615],{"type":38,"value":3130},{"type":33,"tag":410,"props":6617,"children":6618},{"class":412,"line":726},[6619],{"type":33,"tag":410,"props":6620,"children":6621},{"style":3033},[6622],{"type":38,"value":3138},{"type":33,"tag":410,"props":6624,"children":6625},{"class":412,"line":742},[6626,6630,6634,6638],{"type":33,"tag":410,"props":6627,"children":6628},{"style":443},[6629],{"type":38,"value":3146},{"type":33,"tag":410,"props":6631,"children":6632},{"style":622},[6633],{"type":38,"value":3056},{"type":33,"tag":410,"props":6635,"children":6636},{"style":443},[6637],{"type":38,"value":3155},{"type":33,"tag":410,"props":6639,"children":6640},{"style":622},[6641],{"type":38,"value":3084},{"type":33,"tag":410,"props":6643,"children":6644},{"class":412,"line":763},[6645,6649,6653,6657],{"type":33,"tag":410,"props":6646,"children":6647},{"style":443},[6648],{"type":38,"value":3146},{"type":33,"tag":410,"props":6650,"children":6651},{"style":622},[6652],{"type":38,"value":3056},{"type":33,"tag":410,"props":6654,"children":6655},{"style":443},[6656],{"type":38,"value":3175},{"type":33,"tag":410,"props":6658,"children":6659},{"style":622},[6660],{"type":38,"value":3084},{"type":33,"tag":410,"props":6662,"children":6663},{"class":412,"line":780},[6664,6668,6672,6676],{"type":33,"tag":410,"props":6665,"children":6666},{"style":443},[6667],{"type":38,"value":3187},{"type":33,"tag":410,"props":6669,"children":6670},{"style":622},[6671],{"type":38,"value":3056},{"type":33,"tag":410,"props":6673,"children":6674},{"style":443},[6675],{"type":38,"value":3196},{"type":33,"tag":410,"props":6677,"children":6678},{"style":622},[6679],{"type":38,"value":3084},{"type":33,"tag":410,"props":6681,"children":6682},{"class":412,"line":801},[6683,6687,6691,6695],{"type":33,"tag":410,"props":6684,"children":6685},{"style":443},[6686],{"type":38,"value":3146},{"type":33,"tag":410,"props":6688,"children":6689},{"style":622},[6690],{"type":38,"value":3056},{"type":33,"tag":410,"props":6692,"children":6693},{"style":443},[6694],{"type":38,"value":3216},{"type":33,"tag":410,"props":6696,"children":6697},{"style":622},[6698],{"type":38,"value":3084},{"type":33,"tag":410,"props":6700,"children":6701},{"class":412,"line":818},[6702,6706,6710,6714],{"type":33,"tag":410,"props":6703,"children":6704},{"style":443},[6705],{"type":38,"value":3146},{"type":33,"tag":410,"props":6707,"children":6708},{"style":622},[6709],{"type":38,"value":3056},{"type":33,"tag":410,"props":6711,"children":6712},{"style":443},[6713],{"type":38,"value":311},{"type":33,"tag":410,"props":6715,"children":6716},{"style":622},[6717],{"type":38,"value":3084},{"type":33,"tag":410,"props":6719,"children":6720},{"class":412,"line":839},[6721,6725,6729],{"type":33,"tag":410,"props":6722,"children":6723},{"style":443},[6724],{"type":38,"value":3146},{"type":33,"tag":410,"props":6726,"children":6727},{"style":622},[6728],{"type":38,"value":3056},{"type":33,"tag":410,"props":6730,"children":6731},{"style":443},[6732],{"type":38,"value":836},{"type":33,"tag":410,"props":6734,"children":6735},{"class":412,"line":1141},[6736,6740,6744,6748,6752],{"type":33,"tag":410,"props":6737,"children":6738},{"style":3033},[6739],{"type":38,"value":3262},{"type":33,"tag":410,"props":6741,"children":6742},{"style":443},[6743],{"type":38,"value":3051},{"type":33,"tag":410,"props":6745,"children":6746},{"style":622},[6747],{"type":38,"value":3056},{"type":33,"tag":410,"props":6749,"children":6750},{"style":443},[6751],{"type":38,"value":303},{"type":33,"tag":410,"props":6753,"children":6754},{"style":622},[6755],{"type":38,"value":3279},{"type":33,"tag":410,"props":6757,"children":6758},{"class":412,"line":1161},[6759,6763,6767,6771,6775,6779,6783,6787,6791,6795,6799,6803,6807],{"type":33,"tag":410,"props":6760,"children":6761},{"style":3033},[6762],{"type":38,"value":3287},{"type":33,"tag":410,"props":6764,"children":6765},{"style":443},[6766],{"type":38,"value":3051},{"type":33,"tag":410,"props":6768,"children":6769},{"style":622},[6770],{"type":38,"value":3056},{"type":33,"tag":410,"props":6772,"children":6773},{"style":443},[6774],{"type":38,"value":3300},{"type":33,"tag":410,"props":6776,"children":6777},{"style":622},[6778],{"type":38,"value":3305},{"type":33,"tag":410,"props":6780,"children":6781},{"style":3033},[6782],{"type":38,"value":3310},{"type":33,"tag":410,"props":6784,"children":6785},{"style":443},[6786],{"type":38,"value":3315},{"type":33,"tag":410,"props":6788,"children":6789},{"style":622},[6790],{"type":38,"value":3056},{"type":33,"tag":410,"props":6792,"children":6793},{"style":443},[6794],{"type":38,"value":3175},{"type":33,"tag":410,"props":6796,"children":6797},{"style":3033},[6798],{"type":38,"value":3328},{"type":33,"tag":410,"props":6800,"children":6801},{"style":443},[6802],{"type":38,"value":3333},{"type":33,"tag":410,"props":6804,"children":6805},{"style":622},[6806],{"type":38,"value":3056},{"type":33,"tag":410,"props":6808,"children":6809},{"style":443},[6810],{"type":38,"value":723},{"type":33,"tag":410,"props":6812,"children":6813},{"class":412,"line":1177},[6814,6818,6822,6826,6830,6834],{"type":33,"tag":410,"props":6815,"children":6816},{"style":3033},[6817],{"type":38,"value":3349},{"type":33,"tag":410,"props":6819,"children":6820},{"style":443},[6821],{"type":38,"value":3315},{"type":33,"tag":410,"props":6823,"children":6824},{"style":622},[6825],{"type":38,"value":3056},{"type":33,"tag":410,"props":6827,"children":6828},{"style":443},[6829],{"type":38,"value":3362},{"type":33,"tag":410,"props":6831,"children":6832},{"style":3033},[6833],{"type":38,"value":3328},{"type":33,"tag":410,"props":6835,"children":6836},{"style":622},[6837],{"type":38,"value":3371},{"type":33,"tag":410,"props":6839,"children":6840},{"class":412,"line":1194},[6841,6845,6849,6853,6857,6861,6865,6869],{"type":33,"tag":410,"props":6842,"children":6843},{"style":3033},[6844],{"type":38,"value":3379},{"type":33,"tag":410,"props":6846,"children":6847},{"style":443},[6848],{"type":38,"value":3315},{"type":33,"tag":410,"props":6850,"children":6851},{"style":622},[6852],{"type":38,"value":3056},{"type":33,"tag":410,"props":6854,"children":6855},{"style":443},[6856],{"type":38,"value":3392},{"type":33,"tag":410,"props":6858,"children":6859},{"style":3033},[6860],{"type":38,"value":3397},{"type":33,"tag":410,"props":6862,"children":6863},{"style":3033},[6864],{"type":38,"value":3402},{"type":33,"tag":410,"props":6866,"children":6867},{"style":3033},[6868],{"type":38,"value":3407},{"type":33,"tag":410,"props":6870,"children":6871},{"style":622},[6872],{"type":38,"value":3412},{"type":33,"tag":410,"props":6874,"children":6875},{"class":412,"line":1206},[6876,6880,6884,6888,6892,6896],{"type":33,"tag":410,"props":6877,"children":6878},{"style":3033},[6879],{"type":38,"value":3379},{"type":33,"tag":410,"props":6881,"children":6882},{"style":443},[6883],{"type":38,"value":3333},{"type":33,"tag":410,"props":6885,"children":6886},{"style":622},[6887],{"type":38,"value":3056},{"type":33,"tag":410,"props":6889,"children":6890},{"style":443},[6891],{"type":38,"value":3196},{"type":33,"tag":410,"props":6893,"children":6894},{"style":3033},[6895],{"type":38,"value":3328},{"type":33,"tag":410,"props":6897,"children":6898},{"style":622},[6899],{"type":38,"value":3440},{"type":33,"tag":410,"props":6901,"children":6902},{"class":412,"line":1226},[6903],{"type":33,"tag":410,"props":6904,"children":6905},{"style":622},[6906],{"type":38,"value":3448},{"type":33,"tag":34,"props":6908,"children":6909},{},[6910,6911,6916,6917,6922],{"type":38,"value":3453},{"type":33,"tag":155,"props":6912,"children":6914},{"className":6913},[],[6915],{"type":38,"value":3459},{"type":38,"value":3461},{"type":33,"tag":155,"props":6918,"children":6920},{"className":6919},[],[6921],{"type":38,"value":3467},{"type":38,"value":3469},{"type":33,"tag":56,"props":6924,"children":6925},{},[],{"type":33,"tag":60,"props":6927,"children":6928},{"id":3475},[6929],{"type":38,"value":3478},{"type":33,"tag":34,"props":6931,"children":6932},{},[6933],{"type":38,"value":3483},{"type":33,"tag":217,"props":6935,"children":6936},{"id":3486},[6937],{"type":38,"value":3489},{"type":33,"tag":34,"props":6939,"children":6940},{},[6941],{"type":38,"value":3494},{"type":33,"tag":34,"props":6943,"children":6944},{},[6945],{"type":38,"value":3499},{"type":33,"tag":34,"props":6947,"children":6948},{},[6949],{"type":38,"value":3504},{"type":33,"tag":34,"props":6951,"children":6952},{},[6953],{"type":38,"value":3509},{"type":33,"tag":135,"props":6955,"children":6956},{},[6957,6961,6965,6969,6973,6977,6981,6991,6995],{"type":33,"tag":139,"props":6958,"children":6959},{},[6960],{"type":38,"value":3517},{"type":33,"tag":139,"props":6962,"children":6963},{},[6964],{"type":38,"value":3522},{"type":33,"tag":139,"props":6966,"children":6967},{},[6968],{"type":38,"value":3527},{"type":33,"tag":139,"props":6970,"children":6971},{},[6972],{"type":38,"value":3532},{"type":33,"tag":139,"props":6974,"children":6975},{},[6976],{"type":38,"value":3537},{"type":33,"tag":139,"props":6978,"children":6979},{},[6980],{"type":38,"value":3542},{"type":33,"tag":139,"props":6982,"children":6983},{},[6984,6985,6990],{"type":38,"value":3547},{"type":33,"tag":155,"props":6986,"children":6988},{"className":6987},[],[6989],{"type":38,"value":869},{"type":38,"value":3554},{"type":33,"tag":139,"props":6992,"children":6993},{},[6994],{"type":38,"value":3559},{"type":33,"tag":139,"props":6996,"children":6997},{},[6998,6999],{"type":38,"value":3564},{"type":33,"tag":135,"props":7000,"children":7001},{},[7002],{"type":33,"tag":139,"props":7003,"children":7004},{},[7005],{"type":38,"value":3572},{"type":33,"tag":34,"props":7007,"children":7008},{},[7009],{"type":38,"value":3577},{"type":33,"tag":217,"props":7011,"children":7012},{"id":3580},[7013],{"type":38,"value":3583},{"type":33,"tag":34,"props":7015,"children":7016},{},[7017],{"type":38,"value":3588},{"type":33,"tag":34,"props":7019,"children":7020},{},[7021],{"type":38,"value":3593},{"type":33,"tag":34,"props":7023,"children":7024},{},[7025],{"type":38,"value":3598},{"type":33,"tag":34,"props":7027,"children":7028},{},[7029,7030],{"type":38,"value":3603},{"type":33,"tag":885,"props":7031,"children":7033},{"href":3606,"rel":7032},[889],[7034],{"type":38,"value":3610},{"type":33,"tag":34,"props":7036,"children":7037},{},[7038],{"type":38,"value":3615},{"type":33,"tag":34,"props":7040,"children":7041},{},[7042],{"type":38,"value":3620},{"type":33,"tag":135,"props":7044,"children":7045},{},[7046,7050,7054,7058,7062],{"type":33,"tag":139,"props":7047,"children":7048},{},[7049],{"type":38,"value":3628},{"type":33,"tag":139,"props":7051,"children":7052},{},[7053],{"type":38,"value":3633},{"type":33,"tag":139,"props":7055,"children":7056},{},[7057],{"type":38,"value":3638},{"type":33,"tag":139,"props":7059,"children":7060},{},[7061],{"type":38,"value":3643},{"type":33,"tag":139,"props":7063,"children":7064},{},[7065],{"type":38,"value":3648},{"type":33,"tag":34,"props":7067,"children":7068},{},[7069],{"type":38,"value":3653},{"type":33,"tag":217,"props":7071,"children":7072},{"id":3656},[7073],{"type":38,"value":3659},{"type":33,"tag":34,"props":7075,"children":7076},{},[7077],{"type":38,"value":3664},{"type":33,"tag":34,"props":7079,"children":7080},{},[7081],{"type":38,"value":3669},{"type":33,"tag":34,"props":7083,"children":7084},{},[7085],{"type":38,"value":3674},{"type":33,"tag":34,"props":7087,"children":7088},{},[7089],{"type":38,"value":3679},{"type":33,"tag":34,"props":7091,"children":7092},{},[7093,7094,7099],{"type":38,"value":3684},{"type":33,"tag":885,"props":7095,"children":7097},{"href":3687,"rel":7096},[889],[7098],{"type":38,"value":3691},{"type":38,"value":3693},{"type":33,"tag":34,"props":7101,"children":7102},{},[7103],{"type":38,"value":3698},{"type":33,"tag":34,"props":7105,"children":7106},{},[7107],{"type":38,"value":3703},{"type":33,"tag":56,"props":7109,"children":7110},{},[],{"type":33,"tag":60,"props":7112,"children":7113},{"id":3709},[7114],{"type":38,"value":3712},{"type":33,"tag":34,"props":7116,"children":7117},{},[7118],{"type":38,"value":3717},{"type":33,"tag":34,"props":7120,"children":7121},{},[7122],{"type":38,"value":3722},{"type":33,"tag":34,"props":7124,"children":7125},{},[7126],{"type":38,"value":3727},{"type":33,"tag":135,"props":7128,"children":7129},{},[7130,7134,7138,7142],{"type":33,"tag":139,"props":7131,"children":7132},{},[7133],{"type":38,"value":3735},{"type":33,"tag":139,"props":7135,"children":7136},{},[7137],{"type":38,"value":3740},{"type":33,"tag":139,"props":7139,"children":7140},{},[7141],{"type":38,"value":3745},{"type":33,"tag":139,"props":7143,"children":7144},{},[7145],{"type":38,"value":3750},{"type":33,"tag":34,"props":7147,"children":7148},{},[7149],{"type":38,"value":3755},{"type":33,"tag":34,"props":7151,"children":7152},{},[7153],{"type":38,"value":3760},{"type":33,"tag":217,"props":7155,"children":7156},{"id":3763},[7157],{"type":38,"value":3766},{"type":33,"tag":34,"props":7159,"children":7160},{},[7161],{"type":38,"value":3771},{"type":33,"tag":34,"props":7163,"children":7164},{},[7165],{"type":38,"value":3776},{"type":33,"tag":135,"props":7167,"children":7168},{},[7169,7173],{"type":33,"tag":139,"props":7170,"children":7171},{},[7172],{"type":38,"value":3784},{"type":33,"tag":139,"props":7174,"children":7175},{},[7176],{"type":38,"value":3789},{"type":33,"tag":34,"props":7178,"children":7179},{},[7180],{"type":38,"value":3794},{"type":33,"tag":135,"props":7182,"children":7183},{},[7184,7188],{"type":33,"tag":139,"props":7185,"children":7186},{},[7187],{"type":38,"value":3802},{"type":33,"tag":139,"props":7189,"children":7190},{},[7191],{"type":38,"value":3807},{"type":33,"tag":217,"props":7193,"children":7194},{"id":3810},[7195],{"type":38,"value":3813},{"type":33,"tag":34,"props":7197,"children":7198},{},[7199],{"type":38,"value":3818},{"type":33,"tag":135,"props":7201,"children":7202},{},[7203,7207,7211,7215,7219],{"type":33,"tag":139,"props":7204,"children":7205},{},[7206],{"type":38,"value":3826},{"type":33,"tag":139,"props":7208,"children":7209},{},[7210],{"type":38,"value":3831},{"type":33,"tag":139,"props":7212,"children":7213},{},[7214],{"type":38,"value":3836},{"type":33,"tag":139,"props":7216,"children":7217},{},[7218],{"type":38,"value":3841},{"type":33,"tag":139,"props":7220,"children":7221},{},[7222],{"type":38,"value":3846},{"type":33,"tag":34,"props":7224,"children":7225},{},[7226],{"type":38,"value":3851},{"type":33,"tag":217,"props":7228,"children":7229},{"id":3854},[7230],{"type":38,"value":3857},{"type":33,"tag":34,"props":7232,"children":7233},{},[7234],{"type":38,"value":3862},{"type":33,"tag":135,"props":7236,"children":7237},{},[7238,7242,7246],{"type":33,"tag":139,"props":7239,"children":7240},{},[7241],{"type":38,"value":3870},{"type":33,"tag":139,"props":7243,"children":7244},{},[7245],{"type":38,"value":3875},{"type":33,"tag":139,"props":7247,"children":7248},{},[7249],{"type":38,"value":3880},{"type":33,"tag":34,"props":7251,"children":7252},{},[7253],{"type":38,"value":3885},{"type":33,"tag":34,"props":7255,"children":7256},{},[7257],{"type":38,"value":3890},{"type":33,"tag":3892,"props":7259,"children":7260},{},[7261],{"type":38,"value":3896},{"title":7,"searchDepth":439,"depth":439,"links":7263},[7264,7265,7266,7269,7277,7283,7284,7289],{"id":62,"depth":439,"text":65},{"id":96,"depth":439,"text":99},{"id":125,"depth":439,"text":128,"children":7267},[7268],{"id":219,"depth":633,"text":222},{"id":362,"depth":439,"text":365,"children":7270},[7271,7272,7273,7274,7275,7276],{"id":383,"depth":633,"text":386},{"id":527,"depth":633,"text":530},{"id":856,"depth":633,"text":859},{"id":1567,"depth":633,"text":1570},{"id":2157,"depth":633,"text":2160},{"id":2339,"depth":633,"text":2342},{"id":2528,"depth":439,"text":2531,"children":7278},[7279,7280,7281,7282],{"id":2564,"depth":633,"text":2567},{"id":2588,"depth":633,"text":2591},{"id":2738,"depth":633,"text":2741},{"id":2762,"depth":633,"text":2765},{"id":2901,"depth":439,"text":2904},{"id":3475,"depth":439,"text":3478,"children":7285},[7286,7287,7288],{"id":3486,"depth":633,"text":3489},{"id":3580,"depth":633,"text":3583},{"id":3656,"depth":633,"text":3659},{"id":3709,"depth":439,"text":3712,"children":7290},[7291,7292,7293],{"id":3763,"depth":633,"text":3766},{"id":3810,"depth":633,"text":3813},{"id":3854,"depth":633,"text":3857},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"coverPosition":11,"date":12,"readingTime":13,"category":14,"tags":7295,"author":7296,"body":7297,"_type":2175,"_id":3929,"_source":3930,"_file":3931,"_stem":3932,"_extension":3933},[16,17,18,19,20,21,22,23,24],{"name":26,"role":27,"image":28},{"type":30,"children":7298,"toc":10622},[7299,7303,7307,7311,7315,7318,7322,7326,7330,7334,7338,7342,7345,7349,7353,7357,7361,7365,7368,7372,7376,7409,7413,7417,7421,7440,7444,7448,7473,7477,7488,7492,7496,7500,7554,7557,7561,7565,7569,7573,7577,7581,7585,7621,7625,7685,7689,7693,7730,7740,7964,7968,7978,7993,7997,8022,8600,8610,8614,8618,8622,9046,9050,9157,9161,9165,9169,9315,9319,9323,9477,9480,9484,9488,9492,9496,9500,9504,9508,9512,9527,9531,9542,9546,9660,9664,9679,9683,9687,9691,9695,9787,9790,9794,9816,9820,9824,9828,9832,9877,10267,10283,10286,10290,10294,10298,10302,10306,10310,10314,10366,10370,10374,10378,10382,10386,10395,10399,10403,10426,10430,10434,10438,10442,10446,10450,10460,10464,10468,10471,10475,10479,10483,10487,10506,10510,10514,10518,10522,10526,10537,10541,10552,10556,10560,10583,10587,10591,10595,10610,10614,10618],{"type":33,"tag":34,"props":7300,"children":7301},{},[7302],{"type":38,"value":39},{"type":33,"tag":34,"props":7304,"children":7305},{},[7306],{"type":38,"value":44},{"type":33,"tag":34,"props":7308,"children":7309},{},[7310],{"type":38,"value":49},{"type":33,"tag":34,"props":7312,"children":7313},{},[7314],{"type":38,"value":54},{"type":33,"tag":56,"props":7316,"children":7317},{},[],{"type":33,"tag":60,"props":7319,"children":7320},{"id":62},[7321],{"type":38,"value":65},{"type":33,"tag":34,"props":7323,"children":7324},{},[7325],{"type":38,"value":70},{"type":33,"tag":34,"props":7327,"children":7328},{},[7329],{"type":38,"value":75},{"type":33,"tag":34,"props":7331,"children":7332},{},[7333],{"type":38,"value":80},{"type":33,"tag":34,"props":7335,"children":7336},{},[7337],{"type":38,"value":85},{"type":33,"tag":34,"props":7339,"children":7340},{},[7341],{"type":38,"value":90},{"type":33,"tag":56,"props":7343,"children":7344},{},[],{"type":33,"tag":60,"props":7346,"children":7347},{"id":96},[7348],{"type":38,"value":99},{"type":33,"tag":34,"props":7350,"children":7351},{},[7352],{"type":38,"value":104},{"type":33,"tag":34,"props":7354,"children":7355},{},[7356],{"type":38,"value":109},{"type":33,"tag":34,"props":7358,"children":7359},{},[7360],{"type":38,"value":114},{"type":33,"tag":34,"props":7362,"children":7363},{},[7364],{"type":38,"value":119},{"type":33,"tag":56,"props":7366,"children":7367},{},[],{"type":33,"tag":60,"props":7369,"children":7370},{"id":125},[7371],{"type":38,"value":128},{"type":33,"tag":34,"props":7373,"children":7374},{},[7375],{"type":38,"value":133},{"type":33,"tag":135,"props":7377,"children":7378},{},[7379,7383,7387,7397,7401,7405],{"type":33,"tag":139,"props":7380,"children":7381},{},[7382],{"type":38,"value":143},{"type":33,"tag":139,"props":7384,"children":7385},{},[7386],{"type":38,"value":148},{"type":33,"tag":139,"props":7388,"children":7389},{},[7390,7391,7396],{"type":38,"value":153},{"type":33,"tag":155,"props":7392,"children":7394},{"className":7393},[],[7395],{"type":38,"value":160},{"type":38,"value":162},{"type":33,"tag":139,"props":7398,"children":7399},{},[7400],{"type":38,"value":167},{"type":33,"tag":139,"props":7402,"children":7403},{},[7404],{"type":38,"value":172},{"type":33,"tag":139,"props":7406,"children":7407},{},[7408],{"type":38,"value":177},{"type":33,"tag":34,"props":7410,"children":7411},{},[7412],{"type":38,"value":182},{"type":33,"tag":34,"props":7414,"children":7415},{},[7416],{"type":38,"value":187},{"type":33,"tag":34,"props":7418,"children":7419},{},[7420],{"type":38,"value":192},{"type":33,"tag":135,"props":7422,"children":7423},{},[7424,7428,7432,7436],{"type":33,"tag":139,"props":7425,"children":7426},{},[7427],{"type":38,"value":200},{"type":33,"tag":139,"props":7429,"children":7430},{},[7431],{"type":38,"value":205},{"type":33,"tag":139,"props":7433,"children":7434},{},[7435],{"type":38,"value":210},{"type":33,"tag":139,"props":7437,"children":7438},{},[7439],{"type":38,"value":215},{"type":33,"tag":217,"props":7441,"children":7442},{"id":219},[7443],{"type":38,"value":222},{"type":33,"tag":34,"props":7445,"children":7446},{},[7447],{"type":38,"value":227},{"type":33,"tag":135,"props":7449,"children":7450},{},[7451,7462],{"type":33,"tag":139,"props":7452,"children":7453},{},[7454,7455],{"type":38,"value":235},{"type":33,"tag":135,"props":7456,"children":7457},{},[7458],{"type":33,"tag":139,"props":7459,"children":7460},{},[7461],{"type":38,"value":243},{"type":33,"tag":139,"props":7463,"children":7464},{},[7465,7466],{"type":38,"value":248},{"type":33,"tag":135,"props":7467,"children":7468},{},[7469],{"type":33,"tag":139,"props":7470,"children":7471},{},[7472],{"type":38,"value":256},{"type":33,"tag":34,"props":7474,"children":7475},{},[7476],{"type":38,"value":261},{"type":33,"tag":135,"props":7478,"children":7479},{},[7480,7484],{"type":33,"tag":139,"props":7481,"children":7482},{},[7483],{"type":38,"value":269},{"type":33,"tag":139,"props":7485,"children":7486},{},[7487],{"type":38,"value":274},{"type":33,"tag":34,"props":7489,"children":7490},{},[7491],{"type":38,"value":279},{"type":33,"tag":34,"props":7493,"children":7494},{},[7495],{"type":38,"value":284},{"type":33,"tag":34,"props":7497,"children":7498},{},[7499],{"type":38,"value":289},{"type":33,"tag":135,"props":7501,"children":7502},{},[7503,7518,7522,7538,7542,7546,7550],{"type":33,"tag":139,"props":7504,"children":7505},{},[7506,7507,7512,7513],{"type":38,"value":297},{"type":33,"tag":155,"props":7508,"children":7510},{"className":7509},[],[7511],{"type":38,"value":303},{"type":38,"value":305},{"type":33,"tag":155,"props":7514,"children":7516},{"className":7515},[],[7517],{"type":38,"value":311},{"type":33,"tag":139,"props":7519,"children":7520},{},[7521],{"type":38,"value":316},{"type":33,"tag":139,"props":7523,"children":7524},{},[7525,7526,7531,7532,7537],{"type":38,"value":321},{"type":33,"tag":155,"props":7527,"children":7529},{"className":7528},[],[7530],{"type":38,"value":311},{"type":38,"value":328},{"type":33,"tag":155,"props":7533,"children":7535},{"className":7534},[],[7536],{"type":38,"value":334},{"type":38,"value":336},{"type":33,"tag":139,"props":7539,"children":7540},{},[7541],{"type":38,"value":341},{"type":33,"tag":139,"props":7543,"children":7544},{},[7545],{"type":38,"value":346},{"type":33,"tag":139,"props":7547,"children":7548},{},[7549],{"type":38,"value":351},{"type":33,"tag":139,"props":7551,"children":7552},{},[7553],{"type":38,"value":356},{"type":33,"tag":56,"props":7555,"children":7556},{},[],{"type":33,"tag":60,"props":7558,"children":7559},{"id":362},[7560],{"type":38,"value":365},{"type":33,"tag":34,"props":7562,"children":7563},{},[7564],{"type":38,"value":370},{"type":33,"tag":34,"props":7566,"children":7567},{},[7568],{"type":38,"value":375},{"type":33,"tag":34,"props":7570,"children":7571},{},[7572],{"type":38,"value":380},{"type":33,"tag":217,"props":7574,"children":7575},{"id":383},[7576],{"type":38,"value":386},{"type":33,"tag":34,"props":7578,"children":7579},{},[7580],{"type":38,"value":391},{"type":33,"tag":393,"props":7582,"children":7583},{"id":395},[7584],{"type":38,"value":398},{"type":33,"tag":400,"props":7586,"children":7587},{"className":402,"code":403,"language":404,"meta":7,"style":7},[7588],{"type":33,"tag":155,"props":7589,"children":7590},{"__ignoreMap":7},[7591,7610],{"type":33,"tag":410,"props":7592,"children":7593},{"class":412,"line":413},[7594,7598,7602,7606],{"type":33,"tag":410,"props":7595,"children":7596},{"style":417},[7597],{"type":38,"value":420},{"type":33,"tag":410,"props":7599,"children":7600},{"style":423},[7601],{"type":38,"value":426},{"type":33,"tag":410,"props":7603,"children":7604},{"style":423},[7605],{"type":38,"value":431},{"type":33,"tag":410,"props":7607,"children":7608},{"style":423},[7609],{"type":38,"value":436},{"type":33,"tag":410,"props":7611,"children":7612},{"class":412,"line":439},[7613,7617],{"type":33,"tag":410,"props":7614,"children":7615},{"style":443},[7616],{"type":38,"value":446},{"type":33,"tag":410,"props":7618,"children":7619},{"style":423},[7620],{"type":38,"value":436},{"type":33,"tag":393,"props":7622,"children":7623},{"id":453},[7624],{"type":38,"value":456},{"type":33,"tag":400,"props":7626,"children":7627},{"className":402,"code":459,"language":404,"meta":7,"style":7},[7628],{"type":33,"tag":155,"props":7629,"children":7630},{"__ignoreMap":7},[7631,7662],{"type":33,"tag":410,"props":7632,"children":7633},{"class":412,"line":413},[7634,7638,7642,7646,7650,7654,7658],{"type":33,"tag":410,"props":7635,"children":7636},{"style":417},[7637],{"type":38,"value":420},{"type":33,"tag":410,"props":7639,"children":7640},{"style":423},[7641],{"type":38,"value":475},{"type":33,"tag":410,"props":7643,"children":7644},{"style":423},[7645],{"type":38,"value":480},{"type":33,"tag":410,"props":7647,"children":7648},{"style":443},[7649],{"type":38,"value":485},{"type":33,"tag":410,"props":7651,"children":7652},{"style":423},[7653],{"type":38,"value":490},{"type":33,"tag":410,"props":7655,"children":7656},{"style":443},[7657],{"type":38,"value":495},{"type":33,"tag":410,"props":7659,"children":7660},{"style":423},[7661],{"type":38,"value":500},{"type":33,"tag":410,"props":7663,"children":7664},{"class":412,"line":439},[7665,7669,7673,7677,7681],{"type":33,"tag":410,"props":7666,"children":7667},{"style":417},[7668],{"type":38,"value":420},{"type":33,"tag":410,"props":7670,"children":7671},{"style":423},[7672],{"type":38,"value":475},{"type":33,"tag":410,"props":7674,"children":7675},{"style":423},[7676],{"type":38,"value":516},{"type":33,"tag":410,"props":7678,"children":7679},{"style":443},[7680],{"type":38,"value":495},{"type":33,"tag":410,"props":7682,"children":7683},{"style":423},[7684],{"type":38,"value":500},{"type":33,"tag":217,"props":7686,"children":7687},{"id":527},[7688],{"type":38,"value":530},{"type":33,"tag":34,"props":7690,"children":7691},{},[7692],{"type":38,"value":535},{"type":33,"tag":400,"props":7694,"children":7695},{"className":402,"code":538,"language":404,"meta":7,"style":7},[7696],{"type":33,"tag":155,"props":7697,"children":7698},{"__ignoreMap":7},[7699],{"type":33,"tag":410,"props":7700,"children":7701},{"class":412,"line":413},[7702,7706,7710,7714,7718,7722,7726],{"type":33,"tag":410,"props":7703,"children":7704},{"style":417},[7705],{"type":38,"value":420},{"type":33,"tag":410,"props":7707,"children":7708},{"style":423},[7709],{"type":38,"value":554},{"type":33,"tag":410,"props":7711,"children":7712},{"style":423},[7713],{"type":38,"value":559},{"type":33,"tag":410,"props":7715,"children":7716},{"style":443},[7717],{"type":38,"value":564},{"type":33,"tag":410,"props":7719,"children":7720},{"style":423},[7721],{"type":38,"value":569},{"type":33,"tag":410,"props":7723,"children":7724},{"style":443},[7725],{"type":38,"value":574},{"type":33,"tag":410,"props":7727,"children":7728},{"style":423},[7729],{"type":38,"value":579},{"type":33,"tag":34,"props":7731,"children":7732},{},[7733,7734,7739],{"type":38,"value":584},{"type":33,"tag":155,"props":7735,"children":7737},{"className":7736},[],[7738],{"type":38,"value":590},{"type":38,"value":592},{"type":33,"tag":400,"props":7741,"children":7742},{"className":595,"code":596,"language":597,"meta":7,"style":7},[7743],{"type":33,"tag":155,"props":7744,"children":7745},{"__ignoreMap":7},[7746,7753,7768,7783,7794,7813,7828,7847,7862,7881,7896,7915,7930,7949],{"type":33,"tag":410,"props":7747,"children":7748},{"class":412,"line":413},[7749],{"type":33,"tag":410,"props":7750,"children":7751},{"style":607},[7752],{"type":38,"value":610},{"type":33,"tag":410,"props":7754,"children":7755},{"class":412,"line":439},[7756,7760,7764],{"type":33,"tag":410,"props":7757,"children":7758},{"style":616},[7759],{"type":38,"value":619},{"type":33,"tag":410,"props":7761,"children":7762},{"style":622},[7763],{"type":38,"value":625},{"type":33,"tag":410,"props":7765,"children":7766},{"style":423},[7767],{"type":38,"value":630},{"type":33,"tag":410,"props":7769,"children":7770},{"class":412,"line":633},[7771,7775,7779],{"type":33,"tag":410,"props":7772,"children":7773},{"style":616},[7774],{"type":38,"value":639},{"type":33,"tag":410,"props":7776,"children":7777},{"style":622},[7778],{"type":38,"value":625},{"type":33,"tag":410,"props":7780,"children":7781},{"style":423},[7782],{"type":38,"value":648},{"type":33,"tag":410,"props":7784,"children":7785},{"class":412,"line":651},[7786,7790],{"type":33,"tag":410,"props":7787,"children":7788},{"style":616},[7789],{"type":38,"value":657},{"type":33,"tag":410,"props":7791,"children":7792},{"style":622},[7793],{"type":38,"value":662},{"type":33,"tag":410,"props":7795,"children":7796},{"class":412,"line":665},[7797,7801,7805,7809],{"type":33,"tag":410,"props":7798,"children":7799},{"style":622},[7800],{"type":38,"value":671},{"type":33,"tag":410,"props":7802,"children":7803},{"style":616},[7804],{"type":38,"value":619},{"type":33,"tag":410,"props":7806,"children":7807},{"style":622},[7808],{"type":38,"value":625},{"type":33,"tag":410,"props":7810,"children":7811},{"style":423},[7812],{"type":38,"value":684},{"type":33,"tag":410,"props":7814,"children":7815},{"class":412,"line":687},[7816,7820,7824],{"type":33,"tag":410,"props":7817,"children":7818},{"style":616},[7819],{"type":38,"value":693},{"type":33,"tag":410,"props":7821,"children":7822},{"style":622},[7823],{"type":38,"value":625},{"type":33,"tag":410,"props":7825,"children":7826},{"style":423},[7827],{"type":38,"value":702},{"type":33,"tag":410,"props":7829,"children":7830},{"class":412,"line":705},[7831,7835,7839,7843],{"type":33,"tag":410,"props":7832,"children":7833},{"style":622},[7834],{"type":38,"value":671},{"type":33,"tag":410,"props":7836,"children":7837},{"style":616},[7838],{"type":38,"value":619},{"type":33,"tag":410,"props":7840,"children":7841},{"style":622},[7842],{"type":38,"value":625},{"type":33,"tag":410,"props":7844,"children":7845},{"style":423},[7846],{"type":38,"value":723},{"type":33,"tag":410,"props":7848,"children":7849},{"class":412,"line":726},[7850,7854,7858],{"type":33,"tag":410,"props":7851,"children":7852},{"style":616},[7853],{"type":38,"value":693},{"type":33,"tag":410,"props":7855,"children":7856},{"style":622},[7857],{"type":38,"value":625},{"type":33,"tag":410,"props":7859,"children":7860},{"style":423},[7861],{"type":38,"value":702},{"type":33,"tag":410,"props":7863,"children":7864},{"class":412,"line":742},[7865,7869,7873,7877],{"type":33,"tag":410,"props":7866,"children":7867},{"style":622},[7868],{"type":38,"value":671},{"type":33,"tag":410,"props":7870,"children":7871},{"style":616},[7872],{"type":38,"value":619},{"type":33,"tag":410,"props":7874,"children":7875},{"style":622},[7876],{"type":38,"value":625},{"type":33,"tag":410,"props":7878,"children":7879},{"style":423},[7880],{"type":38,"value":760},{"type":33,"tag":410,"props":7882,"children":7883},{"class":412,"line":763},[7884,7888,7892],{"type":33,"tag":410,"props":7885,"children":7886},{"style":616},[7887],{"type":38,"value":693},{"type":33,"tag":410,"props":7889,"children":7890},{"style":622},[7891],{"type":38,"value":625},{"type":33,"tag":410,"props":7893,"children":7894},{"style":423},[7895],{"type":38,"value":777},{"type":33,"tag":410,"props":7897,"children":7898},{"class":412,"line":780},[7899,7903,7907,7911],{"type":33,"tag":410,"props":7900,"children":7901},{"style":622},[7902],{"type":38,"value":671},{"type":33,"tag":410,"props":7904,"children":7905},{"style":616},[7906],{"type":38,"value":619},{"type":33,"tag":410,"props":7908,"children":7909},{"style":622},[7910],{"type":38,"value":625},{"type":33,"tag":410,"props":7912,"children":7913},{"style":423},[7914],{"type":38,"value":798},{"type":33,"tag":410,"props":7916,"children":7917},{"class":412,"line":801},[7918,7922,7926],{"type":33,"tag":410,"props":7919,"children":7920},{"style":616},[7921],{"type":38,"value":693},{"type":33,"tag":410,"props":7923,"children":7924},{"style":622},[7925],{"type":38,"value":625},{"type":33,"tag":410,"props":7927,"children":7928},{"style":423},[7929],{"type":38,"value":815},{"type":33,"tag":410,"props":7931,"children":7932},{"class":412,"line":818},[7933,7937,7941,7945],{"type":33,"tag":410,"props":7934,"children":7935},{"style":622},[7936],{"type":38,"value":671},{"type":33,"tag":410,"props":7938,"children":7939},{"style":616},[7940],{"type":38,"value":619},{"type":33,"tag":410,"props":7942,"children":7943},{"style":622},[7944],{"type":38,"value":625},{"type":33,"tag":410,"props":7946,"children":7947},{"style":423},[7948],{"type":38,"value":836},{"type":33,"tag":410,"props":7950,"children":7951},{"class":412,"line":839},[7952,7956,7960],{"type":33,"tag":410,"props":7953,"children":7954},{"style":616},[7955],{"type":38,"value":693},{"type":33,"tag":410,"props":7957,"children":7958},{"style":622},[7959],{"type":38,"value":625},{"type":33,"tag":410,"props":7961,"children":7962},{"style":423},[7963],{"type":38,"value":853},{"type":33,"tag":217,"props":7965,"children":7966},{"id":856},[7967],{"type":38,"value":859},{"type":33,"tag":34,"props":7969,"children":7970},{},[7971,7972,7977],{"type":38,"value":584},{"type":33,"tag":155,"props":7973,"children":7975},{"className":7974},[],[7976],{"type":38,"value":869},{"type":38,"value":871},{"type":33,"tag":34,"props":7979,"children":7980},{},[7981,7982,7987,7988],{"type":38,"value":876},{"type":33,"tag":155,"props":7983,"children":7985},{"className":7984},[],[7986],{"type":38,"value":869},{"type":38,"value":883},{"type":33,"tag":885,"props":7989,"children":7991},{"href":887,"rel":7990},[889],[7992],{"type":38,"value":892},{"type":33,"tag":34,"props":7994,"children":7995},{},[7996],{"type":38,"value":897},{"type":33,"tag":400,"props":7998,"children":7999},{"className":402,"code":900,"language":404,"meta":7,"style":7},[8000],{"type":33,"tag":155,"props":8001,"children":8002},{"__ignoreMap":7},[8003],{"type":33,"tag":410,"props":8004,"children":8005},{"class":412,"line":413},[8006,8010,8014,8018],{"type":33,"tag":410,"props":8007,"children":8008},{"style":417},[8009],{"type":38,"value":420},{"type":33,"tag":410,"props":8011,"children":8012},{"style":423},[8013],{"type":38,"value":916},{"type":33,"tag":410,"props":8015,"children":8016},{"style":423},[8017],{"type":38,"value":921},{"type":33,"tag":410,"props":8019,"children":8020},{"style":423},[8021],{"type":38,"value":436},{"type":33,"tag":400,"props":8023,"children":8024},{"className":595,"code":928,"language":597,"meta":7,"style":7},[8025],{"type":33,"tag":155,"props":8026,"children":8027},{"__ignoreMap":7},[8028,8035,8050,8065,8080,8091,8102,8113,8124,8143,8158,8173,8184,8203,8222,8241,8256,8271,8282,8301,8320,8335,8350,8361,8380,8423,8442,8457,8472,8483,8502,8521,8540,8555,8570,8581],{"type":33,"tag":410,"props":8029,"children":8030},{"class":412,"line":413},[8031],{"type":33,"tag":410,"props":8032,"children":8033},{"style":607},[8034],{"type":38,"value":940},{"type":33,"tag":410,"props":8036,"children":8037},{"class":412,"line":439},[8038,8042,8046],{"type":33,"tag":410,"props":8039,"children":8040},{"style":616},[8041],{"type":38,"value":619},{"type":33,"tag":410,"props":8043,"children":8044},{"style":622},[8045],{"type":38,"value":625},{"type":33,"tag":410,"props":8047,"children":8048},{"style":423},[8049],{"type":38,"value":630},{"type":33,"tag":410,"props":8051,"children":8052},{"class":412,"line":633},[8053,8057,8061],{"type":33,"tag":410,"props":8054,"children":8055},{"style":616},[8056],{"type":38,"value":639},{"type":33,"tag":410,"props":8058,"children":8059},{"style":622},[8060],{"type":38,"value":625},{"type":33,"tag":410,"props":8062,"children":8063},{"style":423},[8064],{"type":38,"value":648},{"type":33,"tag":410,"props":8066,"children":8067},{"class":412,"line":651},[8068,8072,8076],{"type":33,"tag":410,"props":8069,"children":8070},{"style":616},[8071],{"type":38,"value":978},{"type":33,"tag":410,"props":8073,"children":8074},{"style":622},[8075],{"type":38,"value":625},{"type":33,"tag":410,"props":8077,"children":8078},{"style":423},[8079],{"type":38,"value":987},{"type":33,"tag":410,"props":8081,"children":8082},{"class":412,"line":665},[8083,8087],{"type":33,"tag":410,"props":8084,"children":8085},{"style":616},[8086],{"type":38,"value":995},{"type":33,"tag":410,"props":8088,"children":8089},{"style":622},[8090],{"type":38,"value":662},{"type":33,"tag":410,"props":8092,"children":8093},{"class":412,"line":687},[8094,8098],{"type":33,"tag":410,"props":8095,"children":8096},{"style":622},[8097],{"type":38,"value":671},{"type":33,"tag":410,"props":8099,"children":8100},{"style":423},[8101],{"type":38,"value":1011},{"type":33,"tag":410,"props":8103,"children":8104},{"class":412,"line":705},[8105,8109],{"type":33,"tag":410,"props":8106,"children":8107},{"style":622},[8108],{"type":38,"value":671},{"type":33,"tag":410,"props":8110,"children":8111},{"style":423},[8112],{"type":38,"value":1023},{"type":33,"tag":410,"props":8114,"children":8115},{"class":412,"line":726},[8116,8120],{"type":33,"tag":410,"props":8117,"children":8118},{"style":616},[8119],{"type":38,"value":657},{"type":33,"tag":410,"props":8121,"children":8122},{"style":622},[8123],{"type":38,"value":662},{"type":33,"tag":410,"props":8125,"children":8126},{"class":412,"line":742},[8127,8131,8135,8139],{"type":33,"tag":410,"props":8128,"children":8129},{"style":622},[8130],{"type":38,"value":671},{"type":33,"tag":410,"props":8132,"children":8133},{"style":616},[8134],{"type":38,"value":619},{"type":33,"tag":410,"props":8136,"children":8137},{"style":622},[8138],{"type":38,"value":625},{"type":33,"tag":410,"props":8140,"children":8141},{"style":423},[8142],{"type":38,"value":684},{"type":33,"tag":410,"props":8144,"children":8145},{"class":412,"line":763},[8146,8150,8154],{"type":33,"tag":410,"props":8147,"children":8148},{"style":616},[8149],{"type":38,"value":693},{"type":33,"tag":410,"props":8151,"children":8152},{"style":622},[8153],{"type":38,"value":625},{"type":33,"tag":410,"props":8155,"children":8156},{"style":423},[8157],{"type":38,"value":702},{"type":33,"tag":410,"props":8159,"children":8160},{"class":412,"line":780},[8161,8165,8169],{"type":33,"tag":410,"props":8162,"children":8163},{"style":616},[8164],{"type":38,"value":1076},{"type":33,"tag":410,"props":8166,"children":8167},{"style":622},[8168],{"type":38,"value":625},{"type":33,"tag":410,"props":8170,"children":8171},{"style":423},[8172],{"type":38,"value":1085},{"type":33,"tag":410,"props":8174,"children":8175},{"class":412,"line":801},[8176,8180],{"type":33,"tag":410,"props":8177,"children":8178},{"style":616},[8179],{"type":38,"value":1093},{"type":33,"tag":410,"props":8181,"children":8182},{"style":622},[8183],{"type":38,"value":662},{"type":33,"tag":410,"props":8185,"children":8186},{"class":412,"line":818},[8187,8191,8195,8199],{"type":33,"tag":410,"props":8188,"children":8189},{"style":622},[8190],{"type":38,"value":1105},{"type":33,"tag":410,"props":8192,"children":8193},{"style":616},[8194],{"type":38,"value":619},{"type":33,"tag":410,"props":8196,"children":8197},{"style":622},[8198],{"type":38,"value":625},{"type":33,"tag":410,"props":8200,"children":8201},{"style":423},[8202],{"type":38,"value":1118},{"type":33,"tag":410,"props":8204,"children":8205},{"class":412,"line":839},[8206,8210,8214,8218],{"type":33,"tag":410,"props":8207,"children":8208},{"style":622},[8209],{"type":38,"value":1105},{"type":33,"tag":410,"props":8211,"children":8212},{"style":616},[8213],{"type":38,"value":619},{"type":33,"tag":410,"props":8215,"children":8216},{"style":622},[8217],{"type":38,"value":625},{"type":33,"tag":410,"props":8219,"children":8220},{"style":423},[8221],{"type":38,"value":1138},{"type":33,"tag":410,"props":8223,"children":8224},{"class":412,"line":1141},[8225,8229,8233,8237],{"type":33,"tag":410,"props":8226,"children":8227},{"style":622},[8228],{"type":38,"value":671},{"type":33,"tag":410,"props":8230,"children":8231},{"style":616},[8232],{"type":38,"value":619},{"type":33,"tag":410,"props":8234,"children":8235},{"style":622},[8236],{"type":38,"value":625},{"type":33,"tag":410,"props":8238,"children":8239},{"style":423},[8240],{"type":38,"value":723},{"type":33,"tag":410,"props":8242,"children":8243},{"class":412,"line":1161},[8244,8248,8252],{"type":33,"tag":410,"props":8245,"children":8246},{"style":616},[8247],{"type":38,"value":693},{"type":33,"tag":410,"props":8249,"children":8250},{"style":622},[8251],{"type":38,"value":625},{"type":33,"tag":410,"props":8253,"children":8254},{"style":423},[8255],{"type":38,"value":702},{"type":33,"tag":410,"props":8257,"children":8258},{"class":412,"line":1177},[8259,8263,8267],{"type":33,"tag":410,"props":8260,"children":8261},{"style":616},[8262],{"type":38,"value":1076},{"type":33,"tag":410,"props":8264,"children":8265},{"style":622},[8266],{"type":38,"value":625},{"type":33,"tag":410,"props":8268,"children":8269},{"style":423},[8270],{"type":38,"value":1191},{"type":33,"tag":410,"props":8272,"children":8273},{"class":412,"line":1194},[8274,8278],{"type":33,"tag":410,"props":8275,"children":8276},{"style":616},[8277],{"type":38,"value":1093},{"type":33,"tag":410,"props":8279,"children":8280},{"style":622},[8281],{"type":38,"value":662},{"type":33,"tag":410,"props":8283,"children":8284},{"class":412,"line":1206},[8285,8289,8293,8297],{"type":33,"tag":410,"props":8286,"children":8287},{"style":622},[8288],{"type":38,"value":1105},{"type":33,"tag":410,"props":8290,"children":8291},{"style":616},[8292],{"type":38,"value":619},{"type":33,"tag":410,"props":8294,"children":8295},{"style":622},[8296],{"type":38,"value":625},{"type":33,"tag":410,"props":8298,"children":8299},{"style":423},[8300],{"type":38,"value":1118},{"type":33,"tag":410,"props":8302,"children":8303},{"class":412,"line":1226},[8304,8308,8312,8316],{"type":33,"tag":410,"props":8305,"children":8306},{"style":622},[8307],{"type":38,"value":671},{"type":33,"tag":410,"props":8309,"children":8310},{"style":616},[8311],{"type":38,"value":619},{"type":33,"tag":410,"props":8313,"children":8314},{"style":622},[8315],{"type":38,"value":625},{"type":33,"tag":410,"props":8317,"children":8318},{"style":423},[8319],{"type":38,"value":760},{"type":33,"tag":410,"props":8321,"children":8322},{"class":412,"line":1246},[8323,8327,8331],{"type":33,"tag":410,"props":8324,"children":8325},{"style":616},[8326],{"type":38,"value":693},{"type":33,"tag":410,"props":8328,"children":8329},{"style":622},[8330],{"type":38,"value":625},{"type":33,"tag":410,"props":8332,"children":8333},{"style":423},[8334],{"type":38,"value":777},{"type":33,"tag":410,"props":8336,"children":8337},{"class":412,"line":1262},[8338,8342,8346],{"type":33,"tag":410,"props":8339,"children":8340},{"style":616},[8341],{"type":38,"value":1076},{"type":33,"tag":410,"props":8343,"children":8344},{"style":622},[8345],{"type":38,"value":625},{"type":33,"tag":410,"props":8347,"children":8348},{"style":423},[8349],{"type":38,"value":1276},{"type":33,"tag":410,"props":8351,"children":8352},{"class":412,"line":1279},[8353,8357],{"type":33,"tag":410,"props":8354,"children":8355},{"style":616},[8356],{"type":38,"value":1093},{"type":33,"tag":410,"props":8358,"children":8359},{"style":622},[8360],{"type":38,"value":662},{"type":33,"tag":410,"props":8362,"children":8363},{"class":412,"line":1291},[8364,8368,8372,8376],{"type":33,"tag":410,"props":8365,"children":8366},{"style":622},[8367],{"type":38,"value":1105},{"type":33,"tag":410,"props":8369,"children":8370},{"style":616},[8371],{"type":38,"value":619},{"type":33,"tag":410,"props":8373,"children":8374},{"style":622},[8375],{"type":38,"value":625},{"type":33,"tag":410,"props":8377,"children":8378},{"style":423},[8379],{"type":38,"value":1309},{"type":33,"tag":410,"props":8381,"children":8382},{"class":412,"line":13},[8383,8387,8391,8395,8399,8403,8407,8411,8415,8419],{"type":33,"tag":410,"props":8384,"children":8385},{"style":616},[8386],{"type":38,"value":1317},{"type":33,"tag":410,"props":8388,"children":8389},{"style":622},[8390],{"type":38,"value":1322},{"type":33,"tag":410,"props":8392,"children":8393},{"style":423},[8394],{"type":38,"value":1327},{"type":33,"tag":410,"props":8396,"children":8397},{"style":622},[8398],{"type":38,"value":1332},{"type":33,"tag":410,"props":8400,"children":8401},{"style":423},[8402],{"type":38,"value":1337},{"type":33,"tag":410,"props":8404,"children":8405},{"style":622},[8406],{"type":38,"value":1332},{"type":33,"tag":410,"props":8408,"children":8409},{"style":423},[8410],{"type":38,"value":1346},{"type":33,"tag":410,"props":8412,"children":8413},{"style":622},[8414],{"type":38,"value":1332},{"type":33,"tag":410,"props":8416,"children":8417},{"style":423},[8418],{"type":38,"value":1355},{"type":33,"tag":410,"props":8420,"children":8421},{"style":622},[8422],{"type":38,"value":1360},{"type":33,"tag":410,"props":8424,"children":8425},{"class":412,"line":1363},[8426,8430,8434,8438],{"type":33,"tag":410,"props":8427,"children":8428},{"style":622},[8429],{"type":38,"value":671},{"type":33,"tag":410,"props":8431,"children":8432},{"style":616},[8433],{"type":38,"value":619},{"type":33,"tag":410,"props":8435,"children":8436},{"style":622},[8437],{"type":38,"value":625},{"type":33,"tag":410,"props":8439,"children":8440},{"style":423},[8441],{"type":38,"value":798},{"type":33,"tag":410,"props":8443,"children":8444},{"class":412,"line":1383},[8445,8449,8453],{"type":33,"tag":410,"props":8446,"children":8447},{"style":616},[8448],{"type":38,"value":693},{"type":33,"tag":410,"props":8450,"children":8451},{"style":622},[8452],{"type":38,"value":625},{"type":33,"tag":410,"props":8454,"children":8455},{"style":423},[8456],{"type":38,"value":815},{"type":33,"tag":410,"props":8458,"children":8459},{"class":412,"line":1399},[8460,8464,8468],{"type":33,"tag":410,"props":8461,"children":8462},{"style":616},[8463],{"type":38,"value":1076},{"type":33,"tag":410,"props":8465,"children":8466},{"style":622},[8467],{"type":38,"value":625},{"type":33,"tag":410,"props":8469,"children":8470},{"style":423},[8471],{"type":38,"value":1413},{"type":33,"tag":410,"props":8473,"children":8474},{"class":412,"line":1416},[8475,8479],{"type":33,"tag":410,"props":8476,"children":8477},{"style":616},[8478],{"type":38,"value":1093},{"type":33,"tag":410,"props":8480,"children":8481},{"style":622},[8482],{"type":38,"value":662},{"type":33,"tag":410,"props":8484,"children":8485},{"class":412,"line":1428},[8486,8490,8494,8498],{"type":33,"tag":410,"props":8487,"children":8488},{"style":622},[8489],{"type":38,"value":1105},{"type":33,"tag":410,"props":8491,"children":8492},{"style":616},[8493],{"type":38,"value":619},{"type":33,"tag":410,"props":8495,"children":8496},{"style":622},[8497],{"type":38,"value":625},{"type":33,"tag":410,"props":8499,"children":8500},{"style":423},[8501],{"type":38,"value":1118},{"type":33,"tag":410,"props":8503,"children":8504},{"class":412,"line":1448},[8505,8509,8513,8517],{"type":33,"tag":410,"props":8506,"children":8507},{"style":622},[8508],{"type":38,"value":1105},{"type":33,"tag":410,"props":8510,"children":8511},{"style":616},[8512],{"type":38,"value":619},{"type":33,"tag":410,"props":8514,"children":8515},{"style":622},[8516],{"type":38,"value":625},{"type":33,"tag":410,"props":8518,"children":8519},{"style":423},[8520],{"type":38,"value":1466},{"type":33,"tag":410,"props":8522,"children":8523},{"class":412,"line":1469},[8524,8528,8532,8536],{"type":33,"tag":410,"props":8525,"children":8526},{"style":622},[8527],{"type":38,"value":671},{"type":33,"tag":410,"props":8529,"children":8530},{"style":616},[8531],{"type":38,"value":619},{"type":33,"tag":410,"props":8533,"children":8534},{"style":622},[8535],{"type":38,"value":625},{"type":33,"tag":410,"props":8537,"children":8538},{"style":423},[8539],{"type":38,"value":836},{"type":33,"tag":410,"props":8541,"children":8542},{"class":412,"line":1489},[8543,8547,8551],{"type":33,"tag":410,"props":8544,"children":8545},{"style":616},[8546],{"type":38,"value":693},{"type":33,"tag":410,"props":8548,"children":8549},{"style":622},[8550],{"type":38,"value":625},{"type":33,"tag":410,"props":8552,"children":8553},{"style":423},[8554],{"type":38,"value":853},{"type":33,"tag":410,"props":8556,"children":8557},{"class":412,"line":1505},[8558,8562,8566],{"type":33,"tag":410,"props":8559,"children":8560},{"style":616},[8561],{"type":38,"value":1076},{"type":33,"tag":410,"props":8563,"children":8564},{"style":622},[8565],{"type":38,"value":625},{"type":33,"tag":410,"props":8567,"children":8568},{"style":423},[8569],{"type":38,"value":1519},{"type":33,"tag":410,"props":8571,"children":8572},{"class":412,"line":1522},[8573,8577],{"type":33,"tag":410,"props":8574,"children":8575},{"style":616},[8576],{"type":38,"value":1093},{"type":33,"tag":410,"props":8578,"children":8579},{"style":622},[8580],{"type":38,"value":662},{"type":33,"tag":410,"props":8582,"children":8583},{"class":412,"line":1534},[8584,8588,8592,8596],{"type":33,"tag":410,"props":8585,"children":8586},{"style":622},[8587],{"type":38,"value":1105},{"type":33,"tag":410,"props":8589,"children":8590},{"style":616},[8591],{"type":38,"value":619},{"type":33,"tag":410,"props":8593,"children":8594},{"style":622},[8595],{"type":38,"value":625},{"type":33,"tag":410,"props":8597,"children":8598},{"style":423},[8599],{"type":38,"value":1118},{"type":33,"tag":34,"props":8601,"children":8602},{},[8603,8604,8609],{"type":38,"value":1556},{"type":33,"tag":155,"props":8605,"children":8607},{"className":8606},[],[8608],{"type":38,"value":1562},{"type":38,"value":1564},{"type":33,"tag":217,"props":8611,"children":8612},{"id":1567},[8613],{"type":38,"value":1570},{"type":33,"tag":34,"props":8615,"children":8616},{},[8617],{"type":38,"value":1575},{"type":33,"tag":34,"props":8619,"children":8620},{},[8621],{"type":38,"value":1580},{"type":33,"tag":400,"props":8623,"children":8624},{"className":595,"code":1583,"language":597,"meta":7,"style":7},[8625],{"type":33,"tag":155,"props":8626,"children":8627},{"__ignoreMap":7},[8628,8635,8646,8657,8672,8683,8694,8705,8724,8739,8746,8757,8768,8783,8794,8805,8816,8827,8842,8857,8868,8883,8898,8905,8916,8931,8942,8953,8964,8975,8990,9005,9016,9031],{"type":33,"tag":410,"props":8629,"children":8630},{"class":412,"line":413},[8631],{"type":33,"tag":410,"props":8632,"children":8633},{"style":607},[8634],{"type":38,"value":1595},{"type":33,"tag":410,"props":8636,"children":8637},{"class":412,"line":439},[8638,8642],{"type":33,"tag":410,"props":8639,"children":8640},{"style":616},[8641],{"type":38,"value":1603},{"type":33,"tag":410,"props":8643,"children":8644},{"style":622},[8645],{"type":38,"value":662},{"type":33,"tag":410,"props":8647,"children":8648},{"class":412,"line":633},[8649,8653],{"type":33,"tag":410,"props":8650,"children":8651},{"style":616},[8652],{"type":38,"value":1615},{"type":33,"tag":410,"props":8654,"children":8655},{"style":622},[8656],{"type":38,"value":662},{"type":33,"tag":410,"props":8658,"children":8659},{"class":412,"line":651},[8660,8664,8668],{"type":33,"tag":410,"props":8661,"children":8662},{"style":616},[8663],{"type":38,"value":1076},{"type":33,"tag":410,"props":8665,"children":8666},{"style":622},[8667],{"type":38,"value":625},{"type":33,"tag":410,"props":8669,"children":8670},{"style":423},[8671],{"type":38,"value":1635},{"type":33,"tag":410,"props":8673,"children":8674},{"class":412,"line":665},[8675,8679],{"type":33,"tag":410,"props":8676,"children":8677},{"style":616},[8678],{"type":38,"value":1643},{"type":33,"tag":410,"props":8680,"children":8681},{"style":622},[8682],{"type":38,"value":662},{"type":33,"tag":410,"props":8684,"children":8685},{"class":412,"line":687},[8686,8690],{"type":33,"tag":410,"props":8687,"children":8688},{"style":622},[8689],{"type":38,"value":1105},{"type":33,"tag":410,"props":8691,"children":8692},{"style":423},[8693],{"type":38,"value":1659},{"type":33,"tag":410,"props":8695,"children":8696},{"class":412,"line":705},[8697,8701],{"type":33,"tag":410,"props":8698,"children":8699},{"style":616},[8700],{"type":38,"value":1667},{"type":33,"tag":410,"props":8702,"children":8703},{"style":622},[8704],{"type":38,"value":662},{"type":33,"tag":410,"props":8706,"children":8707},{"class":412,"line":726},[8708,8712,8716,8720],{"type":33,"tag":410,"props":8709,"children":8710},{"style":622},[8711],{"type":38,"value":1105},{"type":33,"tag":410,"props":8713,"children":8714},{"style":616},[8715],{"type":38,"value":639},{"type":33,"tag":410,"props":8717,"children":8718},{"style":622},[8719],{"type":38,"value":625},{"type":33,"tag":410,"props":8721,"children":8722},{"style":423},[8723],{"type":38,"value":1691},{"type":33,"tag":410,"props":8725,"children":8726},{"class":412,"line":742},[8727,8731,8735],{"type":33,"tag":410,"props":8728,"children":8729},{"style":616},[8730],{"type":38,"value":1699},{"type":33,"tag":410,"props":8732,"children":8733},{"style":622},[8734],{"type":38,"value":625},{"type":33,"tag":410,"props":8736,"children":8737},{"style":423},[8738],{"type":38,"value":1708},{"type":33,"tag":410,"props":8740,"children":8741},{"class":412,"line":763},[8742],{"type":33,"tag":410,"props":8743,"children":8744},{"emptyLinePlaceholder":1714},[8745],{"type":38,"value":1717},{"type":33,"tag":410,"props":8747,"children":8748},{"class":412,"line":780},[8749,8753],{"type":33,"tag":410,"props":8750,"children":8751},{"style":616},[8752],{"type":38,"value":1725},{"type":33,"tag":410,"props":8754,"children":8755},{"style":622},[8756],{"type":38,"value":662},{"type":33,"tag":410,"props":8758,"children":8759},{"class":412,"line":801},[8760,8764],{"type":33,"tag":410,"props":8761,"children":8762},{"style":616},[8763],{"type":38,"value":1737},{"type":33,"tag":410,"props":8765,"children":8766},{"style":622},[8767],{"type":38,"value":662},{"type":33,"tag":410,"props":8769,"children":8770},{"class":412,"line":818},[8771,8775,8779],{"type":33,"tag":410,"props":8772,"children":8773},{"style":616},[8774],{"type":38,"value":1076},{"type":33,"tag":410,"props":8776,"children":8777},{"style":622},[8778],{"type":38,"value":625},{"type":33,"tag":410,"props":8780,"children":8781},{"style":423},[8782],{"type":38,"value":1757},{"type":33,"tag":410,"props":8784,"children":8785},{"class":412,"line":839},[8786,8790],{"type":33,"tag":410,"props":8787,"children":8788},{"style":616},[8789],{"type":38,"value":1765},{"type":33,"tag":410,"props":8791,"children":8792},{"style":622},[8793],{"type":38,"value":662},{"type":33,"tag":410,"props":8795,"children":8796},{"class":412,"line":1141},[8797,8801],{"type":33,"tag":410,"props":8798,"children":8799},{"style":622},[8800],{"type":38,"value":1105},{"type":33,"tag":410,"props":8802,"children":8803},{"style":423},[8804],{"type":38,"value":1781},{"type":33,"tag":410,"props":8806,"children":8807},{"class":412,"line":1161},[8808,8812],{"type":33,"tag":410,"props":8809,"children":8810},{"style":616},[8811],{"type":38,"value":1789},{"type":33,"tag":410,"props":8813,"children":8814},{"style":622},[8815],{"type":38,"value":662},{"type":33,"tag":410,"props":8817,"children":8818},{"class":412,"line":1177},[8819,8823],{"type":33,"tag":410,"props":8820,"children":8821},{"style":616},[8822],{"type":38,"value":1801},{"type":33,"tag":410,"props":8824,"children":8825},{"style":622},[8826],{"type":38,"value":662},{"type":33,"tag":410,"props":8828,"children":8829},{"class":412,"line":1194},[8830,8834,8838],{"type":33,"tag":410,"props":8831,"children":8832},{"style":616},[8833],{"type":38,"value":1813},{"type":33,"tag":410,"props":8835,"children":8836},{"style":622},[8837],{"type":38,"value":625},{"type":33,"tag":410,"props":8839,"children":8840},{"style":423},[8841],{"type":38,"value":1822},{"type":33,"tag":410,"props":8843,"children":8844},{"class":412,"line":1206},[8845,8849,8853],{"type":33,"tag":410,"props":8846,"children":8847},{"style":616},[8848],{"type":38,"value":1830},{"type":33,"tag":410,"props":8850,"children":8851},{"style":622},[8852],{"type":38,"value":625},{"type":33,"tag":410,"props":8854,"children":8855},{"style":423},[8856],{"type":38,"value":1839},{"type":33,"tag":410,"props":8858,"children":8859},{"class":412,"line":1226},[8860,8864],{"type":33,"tag":410,"props":8861,"children":8862},{"style":616},[8863],{"type":38,"value":1847},{"type":33,"tag":410,"props":8865,"children":8866},{"style":622},[8867],{"type":38,"value":662},{"type":33,"tag":410,"props":8869,"children":8870},{"class":412,"line":1246},[8871,8875,8879],{"type":33,"tag":410,"props":8872,"children":8873},{"style":616},[8874],{"type":38,"value":1813},{"type":33,"tag":410,"props":8876,"children":8877},{"style":622},[8878],{"type":38,"value":625},{"type":33,"tag":410,"props":8880,"children":8881},{"style":423},[8882],{"type":38,"value":1822},{"type":33,"tag":410,"props":8884,"children":8885},{"class":412,"line":1262},[8886,8890,8894],{"type":33,"tag":410,"props":8887,"children":8888},{"style":616},[8889],{"type":38,"value":1830},{"type":33,"tag":410,"props":8891,"children":8892},{"style":622},[8893],{"type":38,"value":625},{"type":33,"tag":410,"props":8895,"children":8896},{"style":423},[8897],{"type":38,"value":1882},{"type":33,"tag":410,"props":8899,"children":8900},{"class":412,"line":1279},[8901],{"type":33,"tag":410,"props":8902,"children":8903},{"emptyLinePlaceholder":1714},[8904],{"type":38,"value":1717},{"type":33,"tag":410,"props":8906,"children":8907},{"class":412,"line":1291},[8908,8912],{"type":33,"tag":410,"props":8909,"children":8910},{"style":616},[8911],{"type":38,"value":1897},{"type":33,"tag":410,"props":8913,"children":8914},{"style":622},[8915],{"type":38,"value":662},{"type":33,"tag":410,"props":8917,"children":8918},{"class":412,"line":13},[8919,8923,8927],{"type":33,"tag":410,"props":8920,"children":8921},{"style":616},[8922],{"type":38,"value":1076},{"type":33,"tag":410,"props":8924,"children":8925},{"style":622},[8926],{"type":38,"value":625},{"type":33,"tag":410,"props":8928,"children":8929},{"style":423},[8930],{"type":38,"value":1917},{"type":33,"tag":410,"props":8932,"children":8933},{"class":412,"line":1363},[8934,8938],{"type":33,"tag":410,"props":8935,"children":8936},{"style":616},[8937],{"type":38,"value":1765},{"type":33,"tag":410,"props":8939,"children":8940},{"style":622},[8941],{"type":38,"value":662},{"type":33,"tag":410,"props":8943,"children":8944},{"class":412,"line":1383},[8945,8949],{"type":33,"tag":410,"props":8946,"children":8947},{"style":622},[8948],{"type":38,"value":1105},{"type":33,"tag":410,"props":8950,"children":8951},{"style":423},[8952],{"type":38,"value":1781},{"type":33,"tag":410,"props":8954,"children":8955},{"class":412,"line":1399},[8956,8960],{"type":33,"tag":410,"props":8957,"children":8958},{"style":616},[8959],{"type":38,"value":1789},{"type":33,"tag":410,"props":8961,"children":8962},{"style":622},[8963],{"type":38,"value":662},{"type":33,"tag":410,"props":8965,"children":8966},{"class":412,"line":1416},[8967,8971],{"type":33,"tag":410,"props":8968,"children":8969},{"style":616},[8970],{"type":38,"value":1958},{"type":33,"tag":410,"props":8972,"children":8973},{"style":622},[8974],{"type":38,"value":662},{"type":33,"tag":410,"props":8976,"children":8977},{"class":412,"line":1428},[8978,8982,8986],{"type":33,"tag":410,"props":8979,"children":8980},{"style":616},[8981],{"type":38,"value":1813},{"type":33,"tag":410,"props":8983,"children":8984},{"style":622},[8985],{"type":38,"value":625},{"type":33,"tag":410,"props":8987,"children":8988},{"style":423},[8989],{"type":38,"value":1978},{"type":33,"tag":410,"props":8991,"children":8992},{"class":412,"line":1448},[8993,8997,9001],{"type":33,"tag":410,"props":8994,"children":8995},{"style":616},[8996],{"type":38,"value":1830},{"type":33,"tag":410,"props":8998,"children":8999},{"style":622},[9000],{"type":38,"value":625},{"type":33,"tag":410,"props":9002,"children":9003},{"style":423},[9004],{"type":38,"value":1994},{"type":33,"tag":410,"props":9006,"children":9007},{"class":412,"line":1469},[9008,9012],{"type":33,"tag":410,"props":9009,"children":9010},{"style":616},[9011],{"type":38,"value":2002},{"type":33,"tag":410,"props":9013,"children":9014},{"style":622},[9015],{"type":38,"value":662},{"type":33,"tag":410,"props":9017,"children":9018},{"class":412,"line":1489},[9019,9023,9027],{"type":33,"tag":410,"props":9020,"children":9021},{"style":616},[9022],{"type":38,"value":1813},{"type":33,"tag":410,"props":9024,"children":9025},{"style":622},[9026],{"type":38,"value":625},{"type":33,"tag":410,"props":9028,"children":9029},{"style":423},[9030],{"type":38,"value":1822},{"type":33,"tag":410,"props":9032,"children":9033},{"class":412,"line":1505},[9034,9038,9042],{"type":33,"tag":410,"props":9035,"children":9036},{"style":616},[9037],{"type":38,"value":1830},{"type":33,"tag":410,"props":9039,"children":9040},{"style":622},[9041],{"type":38,"value":625},{"type":33,"tag":410,"props":9043,"children":9044},{"style":423},[9045],{"type":38,"value":2037},{"type":33,"tag":34,"props":9047,"children":9048},{},[9049],{"type":38,"value":2042},{"type":33,"tag":400,"props":9051,"children":9052},{"className":595,"code":2045,"language":597,"meta":7,"style":7},[9053],{"type":33,"tag":155,"props":9054,"children":9055},{"__ignoreMap":7},[9056,9063,9078,9089,9108,9123,9142],{"type":33,"tag":410,"props":9057,"children":9058},{"class":412,"line":413},[9059],{"type":33,"tag":410,"props":9060,"children":9061},{"style":607},[9062],{"type":38,"value":2057},{"type":33,"tag":410,"props":9064,"children":9065},{"class":412,"line":439},[9066,9070,9074],{"type":33,"tag":410,"props":9067,"children":9068},{"style":616},[9069],{"type":38,"value":619},{"type":33,"tag":410,"props":9071,"children":9072},{"style":622},[9073],{"type":38,"value":625},{"type":33,"tag":410,"props":9075,"children":9076},{"style":423},[9077],{"type":38,"value":630},{"type":33,"tag":410,"props":9079,"children":9080},{"class":412,"line":633},[9081,9085],{"type":33,"tag":410,"props":9082,"children":9083},{"style":616},[9084],{"type":38,"value":657},{"type":33,"tag":410,"props":9086,"children":9087},{"style":622},[9088],{"type":38,"value":662},{"type":33,"tag":410,"props":9090,"children":9091},{"class":412,"line":651},[9092,9096,9100,9104],{"type":33,"tag":410,"props":9093,"children":9094},{"style":622},[9095],{"type":38,"value":671},{"type":33,"tag":410,"props":9097,"children":9098},{"style":616},[9099],{"type":38,"value":619},{"type":33,"tag":410,"props":9101,"children":9102},{"style":622},[9103],{"type":38,"value":625},{"type":33,"tag":410,"props":9105,"children":9106},{"style":423},[9107],{"type":38,"value":723},{"type":33,"tag":410,"props":9109,"children":9110},{"class":412,"line":665},[9111,9115,9119],{"type":33,"tag":410,"props":9112,"children":9113},{"style":616},[9114],{"type":38,"value":2110},{"type":33,"tag":410,"props":9116,"children":9117},{"style":622},[9118],{"type":38,"value":625},{"type":33,"tag":410,"props":9120,"children":9121},{"style":423},[9122],{"type":38,"value":2119},{"type":33,"tag":410,"props":9124,"children":9125},{"class":412,"line":687},[9126,9130,9134,9138],{"type":33,"tag":410,"props":9127,"children":9128},{"style":622},[9129],{"type":38,"value":671},{"type":33,"tag":410,"props":9131,"children":9132},{"style":616},[9133],{"type":38,"value":619},{"type":33,"tag":410,"props":9135,"children":9136},{"style":622},[9137],{"type":38,"value":625},{"type":33,"tag":410,"props":9139,"children":9140},{"style":423},[9141],{"type":38,"value":798},{"type":33,"tag":410,"props":9143,"children":9144},{"class":412,"line":705},[9145,9149,9153],{"type":33,"tag":410,"props":9146,"children":9147},{"style":616},[9148],{"type":38,"value":2110},{"type":33,"tag":410,"props":9150,"children":9151},{"style":622},[9152],{"type":38,"value":625},{"type":33,"tag":410,"props":9154,"children":9155},{"style":423},[9156],{"type":38,"value":2154},{"type":33,"tag":217,"props":9158,"children":9159},{"id":2157},[9160],{"type":38,"value":2160},{"type":33,"tag":34,"props":9162,"children":9163},{},[9164],{"type":38,"value":2165},{"type":33,"tag":34,"props":9166,"children":9167},{},[9168],{"type":38,"value":2170},{"type":33,"tag":400,"props":9170,"children":9171},{"className":2173,"code":2174,"language":2175,"meta":7,"style":7},[9172],{"type":33,"tag":155,"props":9173,"children":9174},{"__ignoreMap":7},[9175,9182,9189,9196,9203,9210,9217,9224,9231,9238,9245,9252,9259,9266,9273,9280,9287,9294,9301,9308],{"type":33,"tag":410,"props":9176,"children":9177},{"class":412,"line":413},[9178],{"type":33,"tag":410,"props":9179,"children":9180},{},[9181],{"type":38,"value":2187},{"type":33,"tag":410,"props":9183,"children":9184},{"class":412,"line":439},[9185],{"type":33,"tag":410,"props":9186,"children":9187},{"emptyLinePlaceholder":1714},[9188],{"type":38,"value":1717},{"type":33,"tag":410,"props":9190,"children":9191},{"class":412,"line":633},[9192],{"type":33,"tag":410,"props":9193,"children":9194},{},[9195],{"type":38,"value":2202},{"type":33,"tag":410,"props":9197,"children":9198},{"class":412,"line":651},[9199],{"type":33,"tag":410,"props":9200,"children":9201},{},[9202],{"type":38,"value":2210},{"type":33,"tag":410,"props":9204,"children":9205},{"class":412,"line":665},[9206],{"type":33,"tag":410,"props":9207,"children":9208},{},[9209],{"type":38,"value":2218},{"type":33,"tag":410,"props":9211,"children":9212},{"class":412,"line":687},[9213],{"type":33,"tag":410,"props":9214,"children":9215},{},[9216],{"type":38,"value":2226},{"type":33,"tag":410,"props":9218,"children":9219},{"class":412,"line":705},[9220],{"type":33,"tag":410,"props":9221,"children":9222},{},[9223],{"type":38,"value":2234},{"type":33,"tag":410,"props":9225,"children":9226},{"class":412,"line":726},[9227],{"type":33,"tag":410,"props":9228,"children":9229},{},[9230],{"type":38,"value":2242},{"type":33,"tag":410,"props":9232,"children":9233},{"class":412,"line":742},[9234],{"type":33,"tag":410,"props":9235,"children":9236},{},[9237],{"type":38,"value":2250},{"type":33,"tag":410,"props":9239,"children":9240},{"class":412,"line":763},[9241],{"type":33,"tag":410,"props":9242,"children":9243},{"emptyLinePlaceholder":1714},[9244],{"type":38,"value":1717},{"type":33,"tag":410,"props":9246,"children":9247},{"class":412,"line":780},[9248],{"type":33,"tag":410,"props":9249,"children":9250},{},[9251],{"type":38,"value":2265},{"type":33,"tag":410,"props":9253,"children":9254},{"class":412,"line":801},[9255],{"type":33,"tag":410,"props":9256,"children":9257},{},[9258],{"type":38,"value":2273},{"type":33,"tag":410,"props":9260,"children":9261},{"class":412,"line":818},[9262],{"type":33,"tag":410,"props":9263,"children":9264},{},[9265],{"type":38,"value":2281},{"type":33,"tag":410,"props":9267,"children":9268},{"class":412,"line":839},[9269],{"type":33,"tag":410,"props":9270,"children":9271},{},[9272],{"type":38,"value":2289},{"type":33,"tag":410,"props":9274,"children":9275},{"class":412,"line":1141},[9276],{"type":33,"tag":410,"props":9277,"children":9278},{},[9279],{"type":38,"value":2297},{"type":33,"tag":410,"props":9281,"children":9282},{"class":412,"line":1161},[9283],{"type":33,"tag":410,"props":9284,"children":9285},{"emptyLinePlaceholder":1714},[9286],{"type":38,"value":1717},{"type":33,"tag":410,"props":9288,"children":9289},{"class":412,"line":1177},[9290],{"type":33,"tag":410,"props":9291,"children":9292},{},[9293],{"type":38,"value":2312},{"type":33,"tag":410,"props":9295,"children":9296},{"class":412,"line":1194},[9297],{"type":33,"tag":410,"props":9298,"children":9299},{},[9300],{"type":38,"value":2320},{"type":33,"tag":410,"props":9302,"children":9303},{"class":412,"line":1206},[9304],{"type":33,"tag":410,"props":9305,"children":9306},{},[9307],{"type":38,"value":2328},{"type":33,"tag":410,"props":9309,"children":9310},{"class":412,"line":1226},[9311],{"type":33,"tag":410,"props":9312,"children":9313},{},[9314],{"type":38,"value":2336},{"type":33,"tag":217,"props":9316,"children":9317},{"id":2339},[9318],{"type":38,"value":2342},{"type":33,"tag":34,"props":9320,"children":9321},{},[9322],{"type":38,"value":2347},{"type":33,"tag":400,"props":9324,"children":9325},{"className":402,"code":2350,"language":404,"meta":7,"style":7},[9326],{"type":33,"tag":155,"props":9327,"children":9328},{"__ignoreMap":7},[9329,9336,9367,9374,9381,9388,9403,9418,9433,9456,9463,9470],{"type":33,"tag":410,"props":9330,"children":9331},{"class":412,"line":413},[9332],{"type":33,"tag":410,"props":9333,"children":9334},{"style":607},[9335],{"type":38,"value":2362},{"type":33,"tag":410,"props":9337,"children":9338},{"class":412,"line":439},[9339,9343,9347,9351,9355,9359,9363],{"type":33,"tag":410,"props":9340,"children":9341},{"style":417},[9342],{"type":38,"value":2370},{"type":33,"tag":410,"props":9344,"children":9345},{"style":423},[9346],{"type":38,"value":2375},{"type":33,"tag":410,"props":9348,"children":9349},{"style":423},[9350],{"type":38,"value":480},{"type":33,"tag":410,"props":9352,"children":9353},{"style":423},[9354],{"type":38,"value":2384},{"type":33,"tag":410,"props":9356,"children":9357},{"style":443},[9358],{"type":38,"value":2389},{"type":33,"tag":410,"props":9360,"children":9361},{"style":423},[9362],{"type":38,"value":2384},{"type":33,"tag":410,"props":9364,"children":9365},{"style":423},[9366],{"type":38,"value":2398},{"type":33,"tag":410,"props":9368,"children":9369},{"class":412,"line":633},[9370],{"type":33,"tag":410,"props":9371,"children":9372},{"emptyLinePlaceholder":1714},[9373],{"type":38,"value":1717},{"type":33,"tag":410,"props":9375,"children":9376},{"class":412,"line":651},[9377],{"type":33,"tag":410,"props":9378,"children":9379},{"style":607},[9380],{"type":38,"value":2413},{"type":33,"tag":410,"props":9382,"children":9383},{"class":412,"line":665},[9384],{"type":33,"tag":410,"props":9385,"children":9386},{"style":622},[9387],{"type":38,"value":2421},{"type":33,"tag":410,"props":9389,"children":9390},{"class":412,"line":687},[9391,9395,9399],{"type":33,"tag":410,"props":9392,"children":9393},{"style":417},[9394],{"type":38,"value":2429},{"type":33,"tag":410,"props":9396,"children":9397},{"style":443},[9398],{"type":38,"value":2434},{"type":33,"tag":410,"props":9400,"children":9401},{"style":423},[9402],{"type":38,"value":2439},{"type":33,"tag":410,"props":9404,"children":9405},{"class":412,"line":705},[9406,9410,9414],{"type":33,"tag":410,"props":9407,"children":9408},{"style":417},[9409],{"type":38,"value":2447},{"type":33,"tag":410,"props":9411,"children":9412},{"style":443},[9413],{"type":38,"value":2434},{"type":33,"tag":410,"props":9415,"children":9416},{"style":423},[9417],{"type":38,"value":2439},{"type":33,"tag":410,"props":9419,"children":9420},{"class":412,"line":726},[9421,9425,9429],{"type":33,"tag":410,"props":9422,"children":9423},{"style":417},[9424],{"type":38,"value":2463},{"type":33,"tag":410,"props":9426,"children":9427},{"style":443},[9428],{"type":38,"value":2434},{"type":33,"tag":410,"props":9430,"children":9431},{"style":423},[9432],{"type":38,"value":2472},{"type":33,"tag":410,"props":9434,"children":9435},{"class":412,"line":742},[9436,9440,9444,9448,9452],{"type":33,"tag":410,"props":9437,"children":9438},{"style":417},[9439],{"type":38,"value":2480},{"type":33,"tag":410,"props":9441,"children":9442},{"style":443},[9443],{"type":38,"value":2434},{"type":33,"tag":410,"props":9445,"children":9446},{"style":622},[9447],{"type":38,"value":2489},{"type":33,"tag":410,"props":9449,"children":9450},{"style":423},[9451],{"type":38,"value":2494},{"type":33,"tag":410,"props":9453,"children":9454},{"style":622},[9455],{"type":38,"value":1360},{"type":33,"tag":410,"props":9457,"children":9458},{"class":412,"line":763},[9459],{"type":33,"tag":410,"props":9460,"children":9461},{"style":622},[9462],{"type":38,"value":2506},{"type":33,"tag":410,"props":9464,"children":9465},{"class":412,"line":780},[9466],{"type":33,"tag":410,"props":9467,"children":9468},{"style":622},[9469],{"type":38,"value":2514},{"type":33,"tag":410,"props":9471,"children":9472},{"class":412,"line":801},[9473],{"type":33,"tag":410,"props":9474,"children":9475},{"style":622},[9476],{"type":38,"value":2522},{"type":33,"tag":56,"props":9478,"children":9479},{},[],{"type":33,"tag":60,"props":9481,"children":9482},{"id":2528},[9483],{"type":38,"value":2531},{"type":33,"tag":34,"props":9485,"children":9486},{},[9487],{"type":38,"value":2536},{"type":33,"tag":34,"props":9489,"children":9490},{},[9491],{"type":38,"value":2541},{"type":33,"tag":34,"props":9493,"children":9494},{},[9495],{"type":38,"value":2546},{"type":33,"tag":34,"props":9497,"children":9498},{},[9499],{"type":38,"value":2551},{"type":33,"tag":34,"props":9501,"children":9502},{},[9503],{"type":38,"value":2556},{"type":33,"tag":34,"props":9505,"children":9506},{},[9507],{"type":38,"value":2561},{"type":33,"tag":217,"props":9509,"children":9510},{"id":2564},[9511],{"type":38,"value":2567},{"type":33,"tag":135,"props":9513,"children":9514},{},[9515,9519,9523],{"type":33,"tag":139,"props":9516,"children":9517},{},[9518],{"type":38,"value":2575},{"type":33,"tag":139,"props":9520,"children":9521},{},[9522],{"type":38,"value":2580},{"type":33,"tag":139,"props":9524,"children":9525},{},[9526],{"type":38,"value":2585},{"type":33,"tag":217,"props":9528,"children":9529},{"id":2588},[9530],{"type":38,"value":2591},{"type":33,"tag":135,"props":9532,"children":9533},{},[9534,9538],{"type":33,"tag":139,"props":9535,"children":9536},{},[9537],{"type":38,"value":2599},{"type":33,"tag":139,"props":9539,"children":9540},{},[9541],{"type":38,"value":2604},{"type":33,"tag":34,"props":9543,"children":9544},{},[9545],{"type":38,"value":2609},{"type":33,"tag":400,"props":9547,"children":9548},{"className":595,"code":2612,"language":597,"meta":7,"style":7},[9549],{"type":33,"tag":155,"props":9550,"children":9551},{"__ignoreMap":7},[9552,9559,9570,9589,9600,9615,9630,9645],{"type":33,"tag":410,"props":9553,"children":9554},{"class":412,"line":413},[9555],{"type":33,"tag":410,"props":9556,"children":9557},{"style":607},[9558],{"type":38,"value":2624},{"type":33,"tag":410,"props":9560,"children":9561},{"class":412,"line":439},[9562,9566],{"type":33,"tag":410,"props":9563,"children":9564},{"style":616},[9565],{"type":38,"value":2632},{"type":33,"tag":410,"props":9567,"children":9568},{"style":622},[9569],{"type":38,"value":662},{"type":33,"tag":410,"props":9571,"children":9572},{"class":412,"line":633},[9573,9577,9581,9585],{"type":33,"tag":410,"props":9574,"children":9575},{"style":622},[9576],{"type":38,"value":671},{"type":33,"tag":410,"props":9578,"children":9579},{"style":616},[9580],{"type":38,"value":619},{"type":33,"tag":410,"props":9582,"children":9583},{"style":622},[9584],{"type":38,"value":625},{"type":33,"tag":410,"props":9586,"children":9587},{"style":423},[9588],{"type":38,"value":2656},{"type":33,"tag":410,"props":9590,"children":9591},{"class":412,"line":651},[9592,9596],{"type":33,"tag":410,"props":9593,"children":9594},{"style":616},[9595],{"type":38,"value":2664},{"type":33,"tag":410,"props":9597,"children":9598},{"style":622},[9599],{"type":38,"value":662},{"type":33,"tag":410,"props":9601,"children":9602},{"class":412,"line":665},[9603,9607,9611],{"type":33,"tag":410,"props":9604,"children":9605},{"style":616},[9606],{"type":38,"value":2676},{"type":33,"tag":410,"props":9608,"children":9609},{"style":622},[9610],{"type":38,"value":625},{"type":33,"tag":410,"props":9612,"children":9613},{"style":423},[9614],{"type":38,"value":836},{"type":33,"tag":410,"props":9616,"children":9617},{"class":412,"line":687},[9618,9622,9626],{"type":33,"tag":410,"props":9619,"children":9620},{"style":616},[9621],{"type":38,"value":2692},{"type":33,"tag":410,"props":9623,"children":9624},{"style":622},[9625],{"type":38,"value":625},{"type":33,"tag":410,"props":9627,"children":9628},{"style":423},[9629],{"type":38,"value":2701},{"type":33,"tag":410,"props":9631,"children":9632},{"class":412,"line":705},[9633,9637,9641],{"type":33,"tag":410,"props":9634,"children":9635},{"style":616},[9636],{"type":38,"value":2709},{"type":33,"tag":410,"props":9638,"children":9639},{"style":622},[9640],{"type":38,"value":625},{"type":33,"tag":410,"props":9642,"children":9643},{"style":423},[9644],{"type":38,"value":2718},{"type":33,"tag":410,"props":9646,"children":9647},{"class":412,"line":726},[9648,9652,9656],{"type":33,"tag":410,"props":9649,"children":9650},{"style":616},[9651],{"type":38,"value":2726},{"type":33,"tag":410,"props":9653,"children":9654},{"style":622},[9655],{"type":38,"value":625},{"type":33,"tag":410,"props":9657,"children":9658},{"style":423},[9659],{"type":38,"value":2735},{"type":33,"tag":217,"props":9661,"children":9662},{"id":2738},[9663],{"type":38,"value":2741},{"type":33,"tag":135,"props":9665,"children":9666},{},[9667,9671,9675],{"type":33,"tag":139,"props":9668,"children":9669},{},[9670],{"type":38,"value":2749},{"type":33,"tag":139,"props":9672,"children":9673},{},[9674],{"type":38,"value":2754},{"type":33,"tag":139,"props":9676,"children":9677},{},[9678],{"type":38,"value":2759},{"type":33,"tag":217,"props":9680,"children":9681},{"id":2762},[9682],{"type":38,"value":2765},{"type":33,"tag":34,"props":9684,"children":9685},{},[9686],{"type":38,"value":2770},{"type":33,"tag":34,"props":9688,"children":9689},{},[9690],{"type":38,"value":2775},{"type":33,"tag":34,"props":9692,"children":9693},{},[9694],{"type":38,"value":2780},{"type":33,"tag":135,"props":9696,"children":9697},{},[9698,9702,9712,9728,9750,9783],{"type":33,"tag":139,"props":9699,"children":9700},{},[9701],{"type":38,"value":2788},{"type":33,"tag":139,"props":9703,"children":9704},{},[9705,9706,9711],{"type":38,"value":2793},{"type":33,"tag":155,"props":9707,"children":9709},{"className":9708},[],[9710],{"type":38,"value":2799},{"type":38,"value":2801},{"type":33,"tag":139,"props":9713,"children":9714},{},[9715,9716,9721,9722,9727],{"type":38,"value":2806},{"type":33,"tag":155,"props":9717,"children":9719},{"className":9718},[],[9720],{"type":38,"value":2812},{"type":38,"value":1332},{"type":33,"tag":155,"props":9723,"children":9725},{"className":9724},[],[9726],{"type":38,"value":2819},{"type":38,"value":2821},{"type":33,"tag":139,"props":9729,"children":9730},{},[9731,9732,9737,9738,9743,9744,9749],{"type":38,"value":2826},{"type":33,"tag":155,"props":9733,"children":9735},{"className":9734},[],[9736],{"type":38,"value":2832},{"type":38,"value":2834},{"type":33,"tag":155,"props":9739,"children":9741},{"className":9740},[],[9742],{"type":38,"value":2840},{"type":38,"value":2842},{"type":33,"tag":155,"props":9745,"children":9747},{"className":9746},[],[9748],{"type":38,"value":2799},{"type":38,"value":2849},{"type":33,"tag":139,"props":9751,"children":9752},{},[9753,9754,9759,9760,9765,9766,9771,9772,9777,9778],{"type":38,"value":2854},{"type":33,"tag":155,"props":9755,"children":9757},{"className":9756},[],[9758],{"type":38,"value":2860},{"type":38,"value":2862},{"type":33,"tag":155,"props":9761,"children":9763},{"className":9762},[],[9764],{"type":38,"value":2832},{"type":38,"value":2869},{"type":33,"tag":155,"props":9767,"children":9769},{"className":9768},[],[9770],{"type":38,"value":2875},{"type":38,"value":2877},{"type":33,"tag":155,"props":9773,"children":9775},{"className":9774},[],[9776],{"type":38,"value":2883},{"type":38,"value":2885},{"type":33,"tag":155,"props":9779,"children":9781},{"className":9780},[],[9782],{"type":38,"value":2799},{"type":33,"tag":139,"props":9784,"children":9785},{},[9786],{"type":38,"value":2895},{"type":33,"tag":56,"props":9788,"children":9789},{},[],{"type":33,"tag":60,"props":9791,"children":9792},{"id":2901},[9793],{"type":38,"value":2904},{"type":33,"tag":34,"props":9795,"children":9796},{},[9797,9798,9803,9804,9809,9810,9815],{"type":38,"value":2909},{"type":33,"tag":155,"props":9799,"children":9801},{"className":9800},[],[9802],{"type":38,"value":2915},{"type":38,"value":2917},{"type":33,"tag":155,"props":9805,"children":9807},{"className":9806},[],[9808],{"type":38,"value":2923},{"type":38,"value":2925},{"type":33,"tag":155,"props":9811,"children":9813},{"className":9812},[],[9814],{"type":38,"value":2931},{"type":38,"value":2933},{"type":33,"tag":34,"props":9817,"children":9818},{},[9819],{"type":38,"value":2938},{"type":33,"tag":34,"props":9821,"children":9822},{},[9823],{"type":38,"value":2943},{"type":33,"tag":34,"props":9825,"children":9826},{},[9827],{"type":38,"value":2948},{"type":33,"tag":34,"props":9829,"children":9830},{},[9831],{"type":38,"value":2953},{"type":33,"tag":135,"props":9833,"children":9834},{},[9835,9857,9867],{"type":33,"tag":139,"props":9836,"children":9837},{},[9838,9839,9844,9845,9850,9851,9856],{"type":38,"value":2961},{"type":33,"tag":155,"props":9840,"children":9842},{"className":9841},[],[9843],{"type":38,"value":334},{"type":38,"value":2968},{"type":33,"tag":155,"props":9846,"children":9848},{"className":9847},[],[9849],{"type":38,"value":2974},{"type":38,"value":2976},{"type":33,"tag":155,"props":9852,"children":9854},{"className":9853},[],[9855],{"type":38,"value":2982},{"type":38,"value":2984},{"type":33,"tag":139,"props":9858,"children":9859},{},[9860,9861,9866],{"type":38,"value":2989},{"type":33,"tag":155,"props":9862,"children":9864},{"className":9863},[],[9865],{"type":38,"value":2995},{"type":38,"value":2997},{"type":33,"tag":139,"props":9868,"children":9869},{},[9870,9871,9876],{"type":38,"value":3002},{"type":33,"tag":155,"props":9872,"children":9874},{"className":9873},[],[9875],{"type":38,"value":3008},{"type":38,"value":3010},{"type":33,"tag":400,"props":9878,"children":9879},{"className":3013,"code":3014,"language":3015,"meta":7,"style":7},[9880],{"type":33,"tag":155,"props":9881,"children":9882},{"__ignoreMap":7},[9883,9890,9921,9936,9951,9958,9965,9976,9983,10002,10021,10040,10059,10078,10093,10116,10171,10198,10233,10260],{"type":33,"tag":410,"props":9884,"children":9885},{"class":412,"line":413},[9886],{"type":33,"tag":410,"props":9887,"children":9888},{"style":607},[9889],{"type":38,"value":3027},{"type":33,"tag":410,"props":9891,"children":9892},{"class":412,"line":439},[9893,9897,9901,9905,9909,9913,9917],{"type":33,"tag":410,"props":9894,"children":9895},{"style":3033},[9896],{"type":38,"value":3036},{"type":33,"tag":410,"props":9898,"children":9899},{"style":3033},[9900],{"type":38,"value":3041},{"type":33,"tag":410,"props":9902,"children":9903},{"style":417},[9904],{"type":38,"value":3046},{"type":33,"tag":410,"props":9906,"children":9907},{"style":443},[9908],{"type":38,"value":3051},{"type":33,"tag":410,"props":9910,"children":9911},{"style":622},[9912],{"type":38,"value":3056},{"type":33,"tag":410,"props":9914,"children":9915},{"style":443},[9916],{"type":38,"value":3061},{"type":33,"tag":410,"props":9918,"children":9919},{"style":622},[9920],{"type":38,"value":3066},{"type":33,"tag":410,"props":9922,"children":9923},{"class":412,"line":633},[9924,9928,9932],{"type":33,"tag":410,"props":9925,"children":9926},{"style":3033},[9927],{"type":38,"value":3074},{"type":33,"tag":410,"props":9929,"children":9930},{"style":3033},[9931],{"type":38,"value":3079},{"type":33,"tag":410,"props":9933,"children":9934},{"style":622},[9935],{"type":38,"value":3084},{"type":33,"tag":410,"props":9937,"children":9938},{"class":412,"line":651},[9939,9943,9947],{"type":33,"tag":410,"props":9940,"children":9941},{"style":622},[9942],{"type":38,"value":3092},{"type":33,"tag":410,"props":9944,"children":9945},{"style":3033},[9946],{"type":38,"value":3097},{"type":33,"tag":410,"props":9948,"children":9949},{"style":622},[9950],{"type":38,"value":3084},{"type":33,"tag":410,"props":9952,"children":9953},{"class":412,"line":665},[9954],{"type":33,"tag":410,"props":9955,"children":9956},{"style":622},[9957],{"type":38,"value":3109},{"type":33,"tag":410,"props":9959,"children":9960},{"class":412,"line":687},[9961],{"type":33,"tag":410,"props":9962,"children":9963},{"style":622},[9964],{"type":38,"value":3117},{"type":33,"tag":410,"props":9966,"children":9967},{"class":412,"line":705},[9968,9972],{"type":33,"tag":410,"props":9969,"children":9970},{"style":3033},[9971],{"type":38,"value":3125},{"type":33,"tag":410,"props":9973,"children":9974},{"style":622},[9975],{"type":38,"value":3130},{"type":33,"tag":410,"props":9977,"children":9978},{"class":412,"line":726},[9979],{"type":33,"tag":410,"props":9980,"children":9981},{"style":3033},[9982],{"type":38,"value":3138},{"type":33,"tag":410,"props":9984,"children":9985},{"class":412,"line":742},[9986,9990,9994,9998],{"type":33,"tag":410,"props":9987,"children":9988},{"style":443},[9989],{"type":38,"value":3146},{"type":33,"tag":410,"props":9991,"children":9992},{"style":622},[9993],{"type":38,"value":3056},{"type":33,"tag":410,"props":9995,"children":9996},{"style":443},[9997],{"type":38,"value":3155},{"type":33,"tag":410,"props":9999,"children":10000},{"style":622},[10001],{"type":38,"value":3084},{"type":33,"tag":410,"props":10003,"children":10004},{"class":412,"line":763},[10005,10009,10013,10017],{"type":33,"tag":410,"props":10006,"children":10007},{"style":443},[10008],{"type":38,"value":3146},{"type":33,"tag":410,"props":10010,"children":10011},{"style":622},[10012],{"type":38,"value":3056},{"type":33,"tag":410,"props":10014,"children":10015},{"style":443},[10016],{"type":38,"value":3175},{"type":33,"tag":410,"props":10018,"children":10019},{"style":622},[10020],{"type":38,"value":3084},{"type":33,"tag":410,"props":10022,"children":10023},{"class":412,"line":780},[10024,10028,10032,10036],{"type":33,"tag":410,"props":10025,"children":10026},{"style":443},[10027],{"type":38,"value":3187},{"type":33,"tag":410,"props":10029,"children":10030},{"style":622},[10031],{"type":38,"value":3056},{"type":33,"tag":410,"props":10033,"children":10034},{"style":443},[10035],{"type":38,"value":3196},{"type":33,"tag":410,"props":10037,"children":10038},{"style":622},[10039],{"type":38,"value":3084},{"type":33,"tag":410,"props":10041,"children":10042},{"class":412,"line":801},[10043,10047,10051,10055],{"type":33,"tag":410,"props":10044,"children":10045},{"style":443},[10046],{"type":38,"value":3146},{"type":33,"tag":410,"props":10048,"children":10049},{"style":622},[10050],{"type":38,"value":3056},{"type":33,"tag":410,"props":10052,"children":10053},{"style":443},[10054],{"type":38,"value":3216},{"type":33,"tag":410,"props":10056,"children":10057},{"style":622},[10058],{"type":38,"value":3084},{"type":33,"tag":410,"props":10060,"children":10061},{"class":412,"line":818},[10062,10066,10070,10074],{"type":33,"tag":410,"props":10063,"children":10064},{"style":443},[10065],{"type":38,"value":3146},{"type":33,"tag":410,"props":10067,"children":10068},{"style":622},[10069],{"type":38,"value":3056},{"type":33,"tag":410,"props":10071,"children":10072},{"style":443},[10073],{"type":38,"value":311},{"type":33,"tag":410,"props":10075,"children":10076},{"style":622},[10077],{"type":38,"value":3084},{"type":33,"tag":410,"props":10079,"children":10080},{"class":412,"line":839},[10081,10085,10089],{"type":33,"tag":410,"props":10082,"children":10083},{"style":443},[10084],{"type":38,"value":3146},{"type":33,"tag":410,"props":10086,"children":10087},{"style":622},[10088],{"type":38,"value":3056},{"type":33,"tag":410,"props":10090,"children":10091},{"style":443},[10092],{"type":38,"value":836},{"type":33,"tag":410,"props":10094,"children":10095},{"class":412,"line":1141},[10096,10100,10104,10108,10112],{"type":33,"tag":410,"props":10097,"children":10098},{"style":3033},[10099],{"type":38,"value":3262},{"type":33,"tag":410,"props":10101,"children":10102},{"style":443},[10103],{"type":38,"value":3051},{"type":33,"tag":410,"props":10105,"children":10106},{"style":622},[10107],{"type":38,"value":3056},{"type":33,"tag":410,"props":10109,"children":10110},{"style":443},[10111],{"type":38,"value":303},{"type":33,"tag":410,"props":10113,"children":10114},{"style":622},[10115],{"type":38,"value":3279},{"type":33,"tag":410,"props":10117,"children":10118},{"class":412,"line":1161},[10119,10123,10127,10131,10135,10139,10143,10147,10151,10155,10159,10163,10167],{"type":33,"tag":410,"props":10120,"children":10121},{"style":3033},[10122],{"type":38,"value":3287},{"type":33,"tag":410,"props":10124,"children":10125},{"style":443},[10126],{"type":38,"value":3051},{"type":33,"tag":410,"props":10128,"children":10129},{"style":622},[10130],{"type":38,"value":3056},{"type":33,"tag":410,"props":10132,"children":10133},{"style":443},[10134],{"type":38,"value":3300},{"type":33,"tag":410,"props":10136,"children":10137},{"style":622},[10138],{"type":38,"value":3305},{"type":33,"tag":410,"props":10140,"children":10141},{"style":3033},[10142],{"type":38,"value":3310},{"type":33,"tag":410,"props":10144,"children":10145},{"style":443},[10146],{"type":38,"value":3315},{"type":33,"tag":410,"props":10148,"children":10149},{"style":622},[10150],{"type":38,"value":3056},{"type":33,"tag":410,"props":10152,"children":10153},{"style":443},[10154],{"type":38,"value":3175},{"type":33,"tag":410,"props":10156,"children":10157},{"style":3033},[10158],{"type":38,"value":3328},{"type":33,"tag":410,"props":10160,"children":10161},{"style":443},[10162],{"type":38,"value":3333},{"type":33,"tag":410,"props":10164,"children":10165},{"style":622},[10166],{"type":38,"value":3056},{"type":33,"tag":410,"props":10168,"children":10169},{"style":443},[10170],{"type":38,"value":723},{"type":33,"tag":410,"props":10172,"children":10173},{"class":412,"line":1177},[10174,10178,10182,10186,10190,10194],{"type":33,"tag":410,"props":10175,"children":10176},{"style":3033},[10177],{"type":38,"value":3349},{"type":33,"tag":410,"props":10179,"children":10180},{"style":443},[10181],{"type":38,"value":3315},{"type":33,"tag":410,"props":10183,"children":10184},{"style":622},[10185],{"type":38,"value":3056},{"type":33,"tag":410,"props":10187,"children":10188},{"style":443},[10189],{"type":38,"value":3362},{"type":33,"tag":410,"props":10191,"children":10192},{"style":3033},[10193],{"type":38,"value":3328},{"type":33,"tag":410,"props":10195,"children":10196},{"style":622},[10197],{"type":38,"value":3371},{"type":33,"tag":410,"props":10199,"children":10200},{"class":412,"line":1194},[10201,10205,10209,10213,10217,10221,10225,10229],{"type":33,"tag":410,"props":10202,"children":10203},{"style":3033},[10204],{"type":38,"value":3379},{"type":33,"tag":410,"props":10206,"children":10207},{"style":443},[10208],{"type":38,"value":3315},{"type":33,"tag":410,"props":10210,"children":10211},{"style":622},[10212],{"type":38,"value":3056},{"type":33,"tag":410,"props":10214,"children":10215},{"style":443},[10216],{"type":38,"value":3392},{"type":33,"tag":410,"props":10218,"children":10219},{"style":3033},[10220],{"type":38,"value":3397},{"type":33,"tag":410,"props":10222,"children":10223},{"style":3033},[10224],{"type":38,"value":3402},{"type":33,"tag":410,"props":10226,"children":10227},{"style":3033},[10228],{"type":38,"value":3407},{"type":33,"tag":410,"props":10230,"children":10231},{"style":622},[10232],{"type":38,"value":3412},{"type":33,"tag":410,"props":10234,"children":10235},{"class":412,"line":1206},[10236,10240,10244,10248,10252,10256],{"type":33,"tag":410,"props":10237,"children":10238},{"style":3033},[10239],{"type":38,"value":3379},{"type":33,"tag":410,"props":10241,"children":10242},{"style":443},[10243],{"type":38,"value":3333},{"type":33,"tag":410,"props":10245,"children":10246},{"style":622},[10247],{"type":38,"value":3056},{"type":33,"tag":410,"props":10249,"children":10250},{"style":443},[10251],{"type":38,"value":3196},{"type":33,"tag":410,"props":10253,"children":10254},{"style":3033},[10255],{"type":38,"value":3328},{"type":33,"tag":410,"props":10257,"children":10258},{"style":622},[10259],{"type":38,"value":3440},{"type":33,"tag":410,"props":10261,"children":10262},{"class":412,"line":1226},[10263],{"type":33,"tag":410,"props":10264,"children":10265},{"style":622},[10266],{"type":38,"value":3448},{"type":33,"tag":34,"props":10268,"children":10269},{},[10270,10271,10276,10277,10282],{"type":38,"value":3453},{"type":33,"tag":155,"props":10272,"children":10274},{"className":10273},[],[10275],{"type":38,"value":3459},{"type":38,"value":3461},{"type":33,"tag":155,"props":10278,"children":10280},{"className":10279},[],[10281],{"type":38,"value":3467},{"type":38,"value":3469},{"type":33,"tag":56,"props":10284,"children":10285},{},[],{"type":33,"tag":60,"props":10287,"children":10288},{"id":3475},[10289],{"type":38,"value":3478},{"type":33,"tag":34,"props":10291,"children":10292},{},[10293],{"type":38,"value":3483},{"type":33,"tag":217,"props":10295,"children":10296},{"id":3486},[10297],{"type":38,"value":3489},{"type":33,"tag":34,"props":10299,"children":10300},{},[10301],{"type":38,"value":3494},{"type":33,"tag":34,"props":10303,"children":10304},{},[10305],{"type":38,"value":3499},{"type":33,"tag":34,"props":10307,"children":10308},{},[10309],{"type":38,"value":3504},{"type":33,"tag":34,"props":10311,"children":10312},{},[10313],{"type":38,"value":3509},{"type":33,"tag":135,"props":10315,"children":10316},{},[10317,10321,10325,10329,10333,10337,10341,10351,10355],{"type":33,"tag":139,"props":10318,"children":10319},{},[10320],{"type":38,"value":3517},{"type":33,"tag":139,"props":10322,"children":10323},{},[10324],{"type":38,"value":3522},{"type":33,"tag":139,"props":10326,"children":10327},{},[10328],{"type":38,"value":3527},{"type":33,"tag":139,"props":10330,"children":10331},{},[10332],{"type":38,"value":3532},{"type":33,"tag":139,"props":10334,"children":10335},{},[10336],{"type":38,"value":3537},{"type":33,"tag":139,"props":10338,"children":10339},{},[10340],{"type":38,"value":3542},{"type":33,"tag":139,"props":10342,"children":10343},{},[10344,10345,10350],{"type":38,"value":3547},{"type":33,"tag":155,"props":10346,"children":10348},{"className":10347},[],[10349],{"type":38,"value":869},{"type":38,"value":3554},{"type":33,"tag":139,"props":10352,"children":10353},{},[10354],{"type":38,"value":3559},{"type":33,"tag":139,"props":10356,"children":10357},{},[10358,10359],{"type":38,"value":3564},{"type":33,"tag":135,"props":10360,"children":10361},{},[10362],{"type":33,"tag":139,"props":10363,"children":10364},{},[10365],{"type":38,"value":3572},{"type":33,"tag":34,"props":10367,"children":10368},{},[10369],{"type":38,"value":3577},{"type":33,"tag":217,"props":10371,"children":10372},{"id":3580},[10373],{"type":38,"value":3583},{"type":33,"tag":34,"props":10375,"children":10376},{},[10377],{"type":38,"value":3588},{"type":33,"tag":34,"props":10379,"children":10380},{},[10381],{"type":38,"value":3593},{"type":33,"tag":34,"props":10383,"children":10384},{},[10385],{"type":38,"value":3598},{"type":33,"tag":34,"props":10387,"children":10388},{},[10389,10390],{"type":38,"value":3603},{"type":33,"tag":885,"props":10391,"children":10393},{"href":3606,"rel":10392},[889],[10394],{"type":38,"value":3610},{"type":33,"tag":34,"props":10396,"children":10397},{},[10398],{"type":38,"value":3615},{"type":33,"tag":34,"props":10400,"children":10401},{},[10402],{"type":38,"value":3620},{"type":33,"tag":135,"props":10404,"children":10405},{},[10406,10410,10414,10418,10422],{"type":33,"tag":139,"props":10407,"children":10408},{},[10409],{"type":38,"value":3628},{"type":33,"tag":139,"props":10411,"children":10412},{},[10413],{"type":38,"value":3633},{"type":33,"tag":139,"props":10415,"children":10416},{},[10417],{"type":38,"value":3638},{"type":33,"tag":139,"props":10419,"children":10420},{},[10421],{"type":38,"value":3643},{"type":33,"tag":139,"props":10423,"children":10424},{},[10425],{"type":38,"value":3648},{"type":33,"tag":34,"props":10427,"children":10428},{},[10429],{"type":38,"value":3653},{"type":33,"tag":217,"props":10431,"children":10432},{"id":3656},[10433],{"type":38,"value":3659},{"type":33,"tag":34,"props":10435,"children":10436},{},[10437],{"type":38,"value":3664},{"type":33,"tag":34,"props":10439,"children":10440},{},[10441],{"type":38,"value":3669},{"type":33,"tag":34,"props":10443,"children":10444},{},[10445],{"type":38,"value":3674},{"type":33,"tag":34,"props":10447,"children":10448},{},[10449],{"type":38,"value":3679},{"type":33,"tag":34,"props":10451,"children":10452},{},[10453,10454,10459],{"type":38,"value":3684},{"type":33,"tag":885,"props":10455,"children":10457},{"href":3687,"rel":10456},[889],[10458],{"type":38,"value":3691},{"type":38,"value":3693},{"type":33,"tag":34,"props":10461,"children":10462},{},[10463],{"type":38,"value":3698},{"type":33,"tag":34,"props":10465,"children":10466},{},[10467],{"type":38,"value":3703},{"type":33,"tag":56,"props":10469,"children":10470},{},[],{"type":33,"tag":60,"props":10472,"children":10473},{"id":3709},[10474],{"type":38,"value":3712},{"type":33,"tag":34,"props":10476,"children":10477},{},[10478],{"type":38,"value":3717},{"type":33,"tag":34,"props":10480,"children":10481},{},[10482],{"type":38,"value":3722},{"type":33,"tag":34,"props":10484,"children":10485},{},[10486],{"type":38,"value":3727},{"type":33,"tag":135,"props":10488,"children":10489},{},[10490,10494,10498,10502],{"type":33,"tag":139,"props":10491,"children":10492},{},[10493],{"type":38,"value":3735},{"type":33,"tag":139,"props":10495,"children":10496},{},[10497],{"type":38,"value":3740},{"type":33,"tag":139,"props":10499,"children":10500},{},[10501],{"type":38,"value":3745},{"type":33,"tag":139,"props":10503,"children":10504},{},[10505],{"type":38,"value":3750},{"type":33,"tag":34,"props":10507,"children":10508},{},[10509],{"type":38,"value":3755},{"type":33,"tag":34,"props":10511,"children":10512},{},[10513],{"type":38,"value":3760},{"type":33,"tag":217,"props":10515,"children":10516},{"id":3763},[10517],{"type":38,"value":3766},{"type":33,"tag":34,"props":10519,"children":10520},{},[10521],{"type":38,"value":3771},{"type":33,"tag":34,"props":10523,"children":10524},{},[10525],{"type":38,"value":3776},{"type":33,"tag":135,"props":10527,"children":10528},{},[10529,10533],{"type":33,"tag":139,"props":10530,"children":10531},{},[10532],{"type":38,"value":3784},{"type":33,"tag":139,"props":10534,"children":10535},{},[10536],{"type":38,"value":3789},{"type":33,"tag":34,"props":10538,"children":10539},{},[10540],{"type":38,"value":3794},{"type":33,"tag":135,"props":10542,"children":10543},{},[10544,10548],{"type":33,"tag":139,"props":10545,"children":10546},{},[10547],{"type":38,"value":3802},{"type":33,"tag":139,"props":10549,"children":10550},{},[10551],{"type":38,"value":3807},{"type":33,"tag":217,"props":10553,"children":10554},{"id":3810},[10555],{"type":38,"value":3813},{"type":33,"tag":34,"props":10557,"children":10558},{},[10559],{"type":38,"value":3818},{"type":33,"tag":135,"props":10561,"children":10562},{},[10563,10567,10571,10575,10579],{"type":33,"tag":139,"props":10564,"children":10565},{},[10566],{"type":38,"value":3826},{"type":33,"tag":139,"props":10568,"children":10569},{},[10570],{"type":38,"value":3831},{"type":33,"tag":139,"props":10572,"children":10573},{},[10574],{"type":38,"value":3836},{"type":33,"tag":139,"props":10576,"children":10577},{},[10578],{"type":38,"value":3841},{"type":33,"tag":139,"props":10580,"children":10581},{},[10582],{"type":38,"value":3846},{"type":33,"tag":34,"props":10584,"children":10585},{},[10586],{"type":38,"value":3851},{"type":33,"tag":217,"props":10588,"children":10589},{"id":3854},[10590],{"type":38,"value":3857},{"type":33,"tag":34,"props":10592,"children":10593},{},[10594],{"type":38,"value":3862},{"type":33,"tag":135,"props":10596,"children":10597},{},[10598,10602,10606],{"type":33,"tag":139,"props":10599,"children":10600},{},[10601],{"type":38,"value":3870},{"type":33,"tag":139,"props":10603,"children":10604},{},[10605],{"type":38,"value":3875},{"type":33,"tag":139,"props":10607,"children":10608},{},[10609],{"type":38,"value":3880},{"type":33,"tag":34,"props":10611,"children":10612},{},[10613],{"type":38,"value":3885},{"type":33,"tag":34,"props":10615,"children":10616},{},[10617],{"type":38,"value":3890},{"type":33,"tag":3892,"props":10619,"children":10620},{},[10621],{"type":38,"value":3896},{"title":7,"searchDepth":439,"depth":439,"links":10623},[10624,10625,10626,10629,10637,10643,10644,10649],{"id":62,"depth":439,"text":65},{"id":96,"depth":439,"text":99},{"id":125,"depth":439,"text":128,"children":10627},[10628],{"id":219,"depth":633,"text":222},{"id":362,"depth":439,"text":365,"children":10630},[10631,10632,10633,10634,10635,10636],{"id":383,"depth":633,"text":386},{"id":527,"depth":633,"text":530},{"id":856,"depth":633,"text":859},{"id":1567,"depth":633,"text":1570},{"id":2157,"depth":633,"text":2160},{"id":2339,"depth":633,"text":2342},{"id":2528,"depth":439,"text":2531,"children":10638},[10639,10640,10641,10642],{"id":2564,"depth":633,"text":2567},{"id":2588,"depth":633,"text":2591},{"id":2738,"depth":633,"text":2741},{"id":2762,"depth":633,"text":2765},{"id":2901,"depth":439,"text":2904},{"id":3475,"depth":439,"text":3478,"children":10645},[10646,10647,10648],{"id":3486,"depth":633,"text":3489},{"id":3580,"depth":633,"text":3583},{"id":3656,"depth":633,"text":3659},{"id":3709,"depth":439,"text":3712,"children":10650},[10651,10652,10653],{"id":3763,"depth":633,"text":3766},{"id":3810,"depth":633,"text":3813},{"id":3854,"depth":633,"text":3857},[10655,11351,12589],{"_path":10656,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":10657,"description":10658,"coverImage":10659,"date":10660,"readingTime":839,"category":10661,"tags":10662,"author":10674,"body":10678,"_type":2175,"_id":11348,"_source":3930,"_file":11349,"_stem":11350,"_extension":3933},"/blog/ai-data-analyst-on-whatsapp","AI Data Analyst on WhatsApp","Most AI data analysts live in Slack or a browser. Bruin runs in WhatsApp too. Here is why field, sales, and ops teams prefer asking their data questions there, what it takes to make it actually work, and how to roll it out safely.","/img/blog/ai-data-analyst-whatsapp/cover.png","2026-04-15","Product Launch",[10663,10664,10665,10666,10667,10668,10669,10670,10671,420,10672,10673],"launch","whatsapp","ai data analyst","mobile","sales","field teams","conversational ai","slack","microsoft teams","business intelligence","governance",{"name":10675,"role":10676,"image":10677},"Kateryna Kozachenko","Marketing & Growth","/img/blog/kate.jpeg",{"type":30,"children":10679,"toc":11310},[10680,10685,10690,10695,10701,10706,10712,10717,10723,10728,10734,10739,10745,10750,10756,10761,10766,10775,10780,10796,10801,10809,10813,10821,10825,10833,10837,10845,10850,10856,10867,10872,10896,10901,10907,10912,10918,10923,10929,10934,10940,10945,10951,10956,10962,10967,10973,10978,11011,11016,11022,11045,11051,11056,11089,11094,11100,11120,11125,11131,11137,11149,11155,11160,11166,11171,11177,11189,11195,11200,11206,11211,11217,11222,11228,11233,11239,11244,11250,11255,11261,11266,11272,11277,11283,11288,11294,11299,11305],{"type":33,"tag":34,"props":10681,"children":10682},{},[10683],{"type":38,"value":10684},"The default assumption when you hear \"AI data analyst\" is a desktop experience. A browser tab open next to Slack, maybe a Slack bot if the vendor is modern. That assumption breaks as soon as you talk to the actual users who make most of the operational decisions in a real company: the field sales rep between customer visits, the live-ops manager on call during an event, the account executive walking into a QBR.",{"type":33,"tag":34,"props":10686,"children":10687},{},[10688],{"type":38,"value":10689},"None of them are at a desk. All of them are on WhatsApp.",{"type":33,"tag":34,"props":10691,"children":10692},{},[10693],{"type":38,"value":10694},"In 2026, WhatsApp is the data interface nobody at the BI vendor booth is showing you. Here is why teams are putting their AI analyst there, what actually has to be true for it to work, and how to pilot it without creating a compliance headache.",{"type":33,"tag":60,"props":10696,"children":10698},{"id":10697},"can-an-ai-data-analyst-actually-work-on-whatsapp",[10699],{"type":38,"value":10700},"Can an AI data analyst actually work on WhatsApp?",{"type":33,"tag":34,"props":10702,"children":10703},{},[10704],{"type":38,"value":10705},"Yes, but it takes more than a generic ChatGPT plugin. The real work is in four places.",{"type":33,"tag":217,"props":10707,"children":10709},{"id":10708},"natural-language-to-sql-that-respects-a-semantic-layer",[10710],{"type":38,"value":10711},"Natural-language to SQL that respects a semantic layer",{"type":33,"tag":34,"props":10713,"children":10714},{},[10715],{"type":38,"value":10716},"If you ask \"what was our revenue last week,\" you should get the same number as the CFO. That only happens if the AI has a governed definition of revenue pointing at the right column in the warehouse. WhatsApp does not change that. It just makes it more obvious when it is wrong, because the answer is in a customer-facing chat.",{"type":33,"tag":217,"props":10718,"children":10720},{"id":10719},"context-across-messages",[10721],{"type":38,"value":10722},"Context across messages",{"type":33,"tag":34,"props":10724,"children":10725},{},[10726],{"type":38,"value":10727},"Conversational data tools live or die on follow-ups. \"What was our MRR last month?\" then \"And by plan?\" then \"Just the Enterprise ones.\" On WhatsApp, each message is short, and the tool has to remember the thread. This is the single biggest quality bar for a mobile-first AI analyst.",{"type":33,"tag":217,"props":10729,"children":10731},{"id":10730},"rich-output-in-a-plain-text-channel",[10732],{"type":38,"value":10733},"Rich output in a plain-text channel",{"type":33,"tag":34,"props":10735,"children":10736},{},[10737],{"type":38,"value":10738},"WhatsApp supports images and PDFs but not rich interactive dashboards. That is actually a feature. It forces the tool to send a tight, quotable answer: a number, a short chart, a takeaway. Instead of dumping a liveboard. The best mobile answers look like this: \"Last week: $412K revenue, up 8% week over week. Mostly driven by the Enterprise plan, up 18%. Chart attached.\"",{"type":33,"tag":217,"props":10740,"children":10742},{"id":10741},"security-and-access-control",[10743],{"type":38,"value":10744},"Security and access control",{"type":33,"tag":34,"props":10746,"children":10747},{},[10748],{"type":38,"value":10749},"This is where most vendors fail. You cannot let your AI analyst leak PII into WhatsApp chats. That means row-level access controls, auditable logs, the ability to revoke a user with a single click, and clear data residency. If the tool does not have this, it is a toy.",{"type":33,"tag":60,"props":10751,"children":10753},{"id":10752},"what-does-a-whatsapp-conversation-with-an-ai-data-analyst-look-like",[10754],{"type":38,"value":10755},"What does a WhatsApp conversation with an AI data analyst look like?",{"type":33,"tag":34,"props":10757,"children":10758},{},[10759],{"type":38,"value":10760},"Here is an actual pattern from a customer, anonymized:",{"type":33,"tag":34,"props":10762,"children":10763},{},[10764],{"type":38,"value":10765},"Regional sales lead, 8:47am Monday, Lisbon:",{"type":33,"tag":10767,"props":10768,"children":10769},"blockquote",{},[10770],{"type":33,"tag":34,"props":10771,"children":10772},{},[10773],{"type":38,"value":10774},"Hi Bruin. How did the EMEA team close Q1 against plan?",{"type":33,"tag":34,"props":10776,"children":10777},{},[10778],{"type":38,"value":10779},"Bruin:",{"type":33,"tag":10767,"props":10781,"children":10782},{},[10783,10788],{"type":33,"tag":34,"props":10784,"children":10785},{},[10786],{"type":38,"value":10787},"EMEA Q1 closed at $2.14M (107% of plan, $2M target). Best rep was Maria Santos, who closed $340K across 11 deals. Biggest miss was Germany at 78% of plan.",{"type":33,"tag":34,"props":10789,"children":10790},{},[10791],{"type":33,"tag":410,"props":10792,"children":10793},{},[10794],{"type":38,"value":10795},"chart attached: bar chart of rep performance",{"type":33,"tag":34,"props":10797,"children":10798},{},[10799],{"type":38,"value":10800},"Regional sales lead:",{"type":33,"tag":10767,"props":10802,"children":10803},{},[10804],{"type":33,"tag":34,"props":10805,"children":10806},{},[10807],{"type":38,"value":10808},"What's my pipeline coverage for Q2?",{"type":33,"tag":34,"props":10810,"children":10811},{},[10812],{"type":38,"value":10779},{"type":33,"tag":10767,"props":10814,"children":10815},{},[10816],{"type":33,"tag":34,"props":10817,"children":10818},{},[10819],{"type":38,"value":10820},"Q2 pipeline coverage for EMEA is 3.2x, against a target of 3x. Stronger in UK (4.1x) and France (3.7x). Germany is under at 2.1x, driven by the three deals that slipped from Q1.",{"type":33,"tag":34,"props":10822,"children":10823},{},[10824],{"type":38,"value":10800},{"type":33,"tag":10767,"props":10826,"children":10827},{},[10828],{"type":33,"tag":34,"props":10829,"children":10830},{},[10831],{"type":38,"value":10832},"Can you pull a list of the German deals that slipped?",{"type":33,"tag":34,"props":10834,"children":10835},{},[10836],{"type":38,"value":10779},{"type":33,"tag":10767,"props":10838,"children":10839},{},[10840],{"type":33,"tag":34,"props":10841,"children":10842},{},[10843],{"type":38,"value":10844},"Three deals slipped from Q1 to Q2 in Germany: Mueller GmbH ($180K, now 60% committed), Siemens DACH unit ($95K, now 40% committed), Frankfurt Logistics AG ($120K, now 80% committed). Total $395K. Risk-weighted: $195K.",{"type":33,"tag":34,"props":10846,"children":10847},{},[10848],{"type":38,"value":10849},"The whole conversation took four minutes. No laptop. No dashboard. No data team.",{"type":33,"tag":60,"props":10851,"children":10853},{"id":10852},"how-bruin-does-it",[10854],{"type":38,"value":10855},"How Bruin does it",{"type":33,"tag":34,"props":10857,"children":10858},{},[10859,10865],{"type":33,"tag":885,"props":10860,"children":10862},{"href":10861},"/ai-data-analyst/whatsapp/",[10863],{"type":38,"value":10864},"Bruin on WhatsApp",{"type":38,"value":10866}," is the same AI data analyst our customers use in Slack and Teams. Same semantic layer, same governance, same connections to Snowflake, BigQuery, Databricks, Redshift, Postgres, Stripe, HubSpot, Salesforce, Mixpanel, and the rest of the stack. The only thing that changes is where the conversation lives.",{"type":33,"tag":34,"props":10868,"children":10869},{},[10870],{"type":38,"value":10871},"In practice:",{"type":33,"tag":10873,"props":10874,"children":10875},"ol",{},[10876,10881,10886,10891],{"type":33,"tag":139,"props":10877,"children":10878},{},[10879],{"type":38,"value":10880},"You add Bruin as a WhatsApp contact.",{"type":33,"tag":139,"props":10882,"children":10883},{},[10884],{"type":38,"value":10885},"You message it like you would message a teammate: \"What's our CAC by channel in Q1?\"",{"type":33,"tag":139,"props":10887,"children":10888},{},[10889],{"type":38,"value":10890},"Bruin pulls from the governed definitions, runs the query, and replies with a concise answer plus a chart image.",{"type":33,"tag":139,"props":10892,"children":10893},{},[10894],{"type":38,"value":10895},"You can follow up in the same thread. Bruin remembers context.",{"type":33,"tag":34,"props":10897,"children":10898},{},[10899],{"type":38,"value":10900},"Access is controlled centrally. Revoking a user (say, a contractor whose project ended) takes one click in the admin panel. Every conversation is logged and auditable.",{"type":33,"tag":60,"props":10902,"children":10904},{"id":10903},"security-deep-dive",[10905],{"type":38,"value":10906},"Security deep dive",{"type":33,"tag":34,"props":10908,"children":10909},{},[10910],{"type":38,"value":10911},"Because this is the category-killer question for most enterprise buyers, here is how Bruin handles it on WhatsApp specifically.",{"type":33,"tag":217,"props":10913,"children":10915},{"id":10914},"identity-and-access-control",[10916],{"type":38,"value":10917},"Identity and access control",{"type":33,"tag":34,"props":10919,"children":10920},{},[10921],{"type":38,"value":10922},"Every WhatsApp user is mapped to an identity in Bruin's admin panel. That identity inherits the same role-based access control as the user's Slack, Teams, or browser session. If Maria can only see EMEA data in the Bruin web app, she can only see EMEA data on WhatsApp. There is no \"WhatsApp is a back door\" risk.",{"type":33,"tag":217,"props":10924,"children":10926},{"id":10925},"data-residency",[10927],{"type":38,"value":10928},"Data residency",{"type":33,"tag":34,"props":10930,"children":10931},{},[10932],{"type":38,"value":10933},"Answers are generated in the same region Bruin runs the rest of your tenant. If your tenant is EU-hosted, the AI query, the SQL execution, and the answer stay in the EU. WhatsApp's own transport is global (that is on Meta), but no customer data is persisted in a different region.",{"type":33,"tag":217,"props":10935,"children":10937},{"id":10936},"audit-logs",[10938],{"type":38,"value":10939},"Audit logs",{"type":33,"tag":34,"props":10941,"children":10942},{},[10943],{"type":38,"value":10944},"Every WhatsApp message sent to Bruin is logged with the user identity, the query asked, the SQL generated, the rows returned, and the response text. Admins can export these logs and feed them into their SIEM or compliance system.",{"type":33,"tag":217,"props":10946,"children":10948},{"id":10947},"revocation",[10949],{"type":38,"value":10950},"Revocation",{"type":33,"tag":34,"props":10952,"children":10953},{},[10954],{"type":38,"value":10955},"Single-click revocation from the admin panel removes a user's access across all surfaces, including WhatsApp. The next message they send returns a \"you no longer have access\" response, not data.",{"type":33,"tag":217,"props":10957,"children":10959},{"id":10958},"pii-handling",[10960],{"type":38,"value":10961},"PII handling",{"type":33,"tag":34,"props":10963,"children":10964},{},[10965],{"type":38,"value":10966},"Bruin can be configured to block specific columns (email addresses, phone numbers, payment details) from appearing in AI responses regardless of the user's underlying table-level permissions. Useful when you want a WhatsApp analyst to give a sales rep aggregate numbers but not individual customer PII that could leak into a client-facing chat.",{"type":33,"tag":60,"props":10968,"children":10970},{"id":10969},"who-this-matters-most-for",[10971],{"type":38,"value":10972},"Who this matters most for",{"type":33,"tag":34,"props":10974,"children":10975},{},[10976],{"type":38,"value":10977},"Mobile-first AI data analysts are not for every team. They are transformative for a few specific categories:",{"type":33,"tag":135,"props":10979,"children":10980},{},[10981,10986,10991,10996,11001,11006],{"type":33,"tag":139,"props":10982,"children":10983},{},[10984],{"type":38,"value":10985},"Field sales teams who need pipeline and account metrics on the go. No more waiting for a Monday sync to see a number.",{"type":33,"tag":139,"props":10987,"children":10988},{},[10989],{"type":38,"value":10990},"Live-ops managers in gaming and commerce who need to monitor events, campaigns, and anomalies without being tied to a dashboard.",{"type":33,"tag":139,"props":10992,"children":10993},{},[10994],{"type":38,"value":10995},"Regional and franchise ops teams where HQ cannot (and should not) provision every location in a full BI tool.",{"type":33,"tag":139,"props":10997,"children":10998},{},[10999],{"type":38,"value":11000},"Founders and execs in frequent travel who want a quick answer without opening a laptop.",{"type":33,"tag":139,"props":11002,"children":11003},{},[11004],{"type":38,"value":11005},"Partner and customer-facing roles where WhatsApp is already the working medium.",{"type":33,"tag":139,"props":11007,"children":11008},{},[11009],{"type":38,"value":11010},"Global support and incident response teams that need 24/7 coverage without on-call rotations watching dashboards.",{"type":33,"tag":34,"props":11012,"children":11013},{},[11014],{"type":38,"value":11015},"If your team lives in Slack and spends the day at a desk, WhatsApp is a nice-to-have. If your team is mobile, partner-heavy, or global south, WhatsApp is where the analyst should live by default.",{"type":33,"tag":60,"props":11017,"children":11019},{"id":11018},"the-honest-caveats",[11020],{"type":38,"value":11021},"The honest caveats",{"type":33,"tag":135,"props":11023,"children":11024},{},[11025,11030,11035,11040],{"type":33,"tag":139,"props":11026,"children":11027},{},[11028],{"type":38,"value":11029},"Rich exploration still belongs on a bigger screen. WhatsApp answers are great for \"what's the number\" and poor for \"let me slice this six ways.\" That is fine. The two modes coexist.",{"type":33,"tag":139,"props":11031,"children":11032},{},[11033],{"type":38,"value":11034},"WhatsApp Business API has rate limits. High-volume teams may want a hybrid deployment (Slack or Teams internally, WhatsApp for specific user groups). Bruin handles this the same way: one analyst, multiple surfaces.",{"type":33,"tag":139,"props":11036,"children":11037},{},[11038],{"type":38,"value":11039},"AI quality still beats channel. A great AI on WhatsApp is amazing. A bad AI on WhatsApp is worse than a dashboard, because the answers are shared in customer-visible chats.",{"type":33,"tag":139,"props":11041,"children":11042},{},[11043],{"type":38,"value":11044},"Not every org culture is ready. Some compliance or legal teams will push back on WhatsApp as a work surface, regardless of the technical controls. That is a conversation to have before piloting.",{"type":33,"tag":60,"props":11046,"children":11048},{"id":11047},"how-to-pilot-it",[11049],{"type":38,"value":11050},"How to pilot it",{"type":33,"tag":34,"props":11052,"children":11053},{},[11054],{"type":38,"value":11055},"A safe pilot looks like this:",{"type":33,"tag":10873,"props":11057,"children":11058},{},[11059,11064,11069,11074,11079,11084],{"type":33,"tag":139,"props":11060,"children":11061},{},[11062],{"type":38,"value":11063},"Pick a single team (often regional sales or ops) with five to fifteen users.",{"type":33,"tag":139,"props":11065,"children":11066},{},[11067],{"type":38,"value":11068},"Define a short list of allowed questions (pipeline, rep performance, campaign metrics, account health). Do not start with everything.",{"type":33,"tag":139,"props":11070,"children":11071},{},[11072],{"type":38,"value":11073},"Deploy Bruin on WhatsApp for that team with explicit column-level restrictions on PII.",{"type":33,"tag":139,"props":11075,"children":11076},{},[11077],{"type":38,"value":11078},"Run for two weeks. Watch the audit logs daily for the first week.",{"type":33,"tag":139,"props":11080,"children":11081},{},[11082],{"type":38,"value":11083},"Review with the team and tune the semantic layer based on the questions that did not land.",{"type":33,"tag":139,"props":11085,"children":11086},{},[11087],{"type":38,"value":11088},"Expand to adjacent teams once the pilot team is confident.",{"type":33,"tag":34,"props":11090,"children":11091},{},[11092],{"type":38,"value":11093},"This keeps the blast radius small and gives compliance teams a clean object to review.",{"type":33,"tag":60,"props":11095,"children":11097},{"id":11096},"try-it",[11098],{"type":38,"value":11099},"Try it",{"type":33,"tag":34,"props":11101,"children":11102},{},[11103,11105,11110,11112,11118],{"type":38,"value":11104},"You can see the WhatsApp experience live on the ",{"type":33,"tag":885,"props":11106,"children":11107},{"href":10861},[11108],{"type":38,"value":11109},"Bruin WhatsApp page",{"type":38,"value":11111}," or ",{"type":33,"tag":885,"props":11113,"children":11115},{"href":11114},"/book-a-demo",[11116],{"type":38,"value":11117},"book a demo",{"type":38,"value":11119}," and we will set up a test number for your team. It is genuinely the fastest way we have found to get ops, sales, and field teams asking data questions they would otherwise never ask.",{"type":33,"tag":34,"props":11121,"children":11122},{},[11123],{"type":38,"value":11124},"The BI industry has spent 20 years trying to get people to log into dashboards. Teams are voting with their thumbs: they would rather just message someone.",{"type":33,"tag":60,"props":11126,"children":11128},{"id":11127},"faq",[11129],{"type":38,"value":11130},"FAQ",{"type":33,"tag":217,"props":11132,"children":11134},{"id":11133},"which-ai-data-analyst-tools-integrate-with-whatsapp",[11135],{"type":38,"value":11136},"Which AI data analyst tools integrate with WhatsApp?",{"type":33,"tag":34,"props":11138,"children":11139},{},[11140,11142,11147],{"type":38,"value":11141},"Very few. ",{"type":33,"tag":885,"props":11143,"children":11144},{"href":10861},[11145],{"type":38,"value":11146},"Bruin is the main AI data analyst with native WhatsApp support",{"type":38,"value":11148},". Most competitors are Slack-only, Teams-only, or browser-only. ChatGPT and Claude have mobile apps but no real persistent connection to your warehouse or governance.",{"type":33,"tag":217,"props":11150,"children":11152},{"id":11151},"can-i-ask-business-data-questions-in-whatsapp-with-an-ai-data-analyst",[11153],{"type":38,"value":11154},"Can I ask business data questions in WhatsApp with an AI data analyst?",{"type":33,"tag":34,"props":11156,"children":11157},{},[11158],{"type":38,"value":11159},"Yes, with Bruin. You add a WhatsApp contact, message it in natural language, and get answers from your governed company data. Questions can be about pipeline, revenue, customer accounts, campaigns, or any metric defined in your semantic layer.",{"type":33,"tag":217,"props":11161,"children":11163},{"id":11162},"is-whatsapp-safe-for-business-data",[11164],{"type":38,"value":11165},"Is WhatsApp safe for business data?",{"type":33,"tag":34,"props":11167,"children":11168},{},[11169],{"type":38,"value":11170},"It can be, if the tool handles identity, permissions, audit logs, and revocation correctly. Bruin maps every WhatsApp user to a Bruin identity with the same role-based access controls as the browser, Slack, and Teams experience. Messages are logged and auditable. Users can be revoked in one click.",{"type":33,"tag":217,"props":11172,"children":11174},{"id":11173},"what-data-sources-does-bruin-connect-to-from-whatsapp",[11175],{"type":38,"value":11176},"What data sources does Bruin connect to from WhatsApp?",{"type":33,"tag":34,"props":11178,"children":11179},{},[11180,11182,11188],{"type":38,"value":11181},"The same sources as every other Bruin surface: Snowflake, BigQuery, Databricks, Redshift, Postgres, MySQL, SQL Server, ClickHouse, DuckDB, MongoDB, plus SaaS sources like Stripe, HubSpot, Salesforce, Mixpanel, Amplitude, GA4, Shopify, Intercom, Zendesk, Adjust, AppsFlyer, Firebase, and many more. Full list on the ",{"type":33,"tag":885,"props":11183,"children":11185},{"href":11184},"/integrations/",[11186],{"type":38,"value":11187},"integrations page",{"type":38,"value":3056},{"type":33,"tag":217,"props":11190,"children":11192},{"id":11191},"does-bruin-work-in-slack-and-teams-too-not-just-whatsapp",[11193],{"type":38,"value":11194},"Does Bruin work in Slack and Teams too, not just WhatsApp?",{"type":33,"tag":34,"props":11196,"children":11197},{},[11198],{"type":38,"value":11199},"Yes. Bruin is the same AI data analyst across Slack, Microsoft Teams, Discord, WhatsApp, and a browser. One semantic layer, one set of permissions, multiple surfaces.",{"type":33,"tag":217,"props":11201,"children":11203},{"id":11202},"how-does-bruin-handle-pii-in-whatsapp-conversations",[11204],{"type":38,"value":11205},"How does Bruin handle PII in WhatsApp conversations?",{"type":33,"tag":34,"props":11207,"children":11208},{},[11209],{"type":38,"value":11210},"Bruin can be configured to block specific columns (emails, phone numbers, payment details) from appearing in AI responses, regardless of the user's underlying permissions. This prevents PII from appearing in WhatsApp chats that might be shared with customers or partners.",{"type":33,"tag":217,"props":11212,"children":11214},{"id":11213},"what-are-the-alternatives-to-dashboards-for-field-teams",[11215],{"type":38,"value":11216},"What are the alternatives to dashboards for field teams?",{"type":33,"tag":34,"props":11218,"children":11219},{},[11220],{"type":38,"value":11221},"Three main options. A conversational AI analyst in WhatsApp or Slack, like Bruin. Embedded mobile apps that your data team builds. Scheduled report emails. For most field teams, the conversational AI option is the lowest friction.",{"type":33,"tag":217,"props":11223,"children":11225},{"id":11224},"which-ai-tools-let-sales-and-ops-teams-ask-data-questions-in-whatsapp-or-slack",[11226],{"type":38,"value":11227},"Which AI tools let sales and ops teams ask data questions in WhatsApp or Slack?",{"type":33,"tag":34,"props":11229,"children":11230},{},[11231],{"type":38,"value":11232},"Bruin is the clearest answer for WhatsApp plus Slack plus Teams coverage. Dot covers Slack, Microsoft Teams, and email but not WhatsApp. ThoughtSpot has limited Slack integration. Power BI Copilot is browser-only. For teams that need mobile and global reach, Bruin is structurally different from the rest.",{"type":33,"tag":217,"props":11234,"children":11236},{"id":11235},"how-do-mobile-teams-and-live-ops-teams-monitor-performance-without-logging-into-a-dashboard",[11237],{"type":38,"value":11238},"How do mobile teams and live ops teams monitor performance without logging into a dashboard?",{"type":33,"tag":34,"props":11240,"children":11241},{},[11242],{"type":38,"value":11243},"The emerging pattern is: define the key metrics in a governed semantic layer, expose them via a conversational AI analyst that lives in the team's existing chat app (WhatsApp for mobile, Slack for desk-based), and let the team ask questions in natural language. This replaces the \"open the Tableau app on your phone\" flow that never really worked.",{"type":33,"tag":217,"props":11245,"children":11247},{"id":11246},"can-an-ai-data-analyst-send-scheduled-reports-to-whatsapp",[11248],{"type":38,"value":11249},"Can an AI data analyst send scheduled reports to WhatsApp?",{"type":33,"tag":34,"props":11251,"children":11252},{},[11253],{"type":38,"value":11254},"Yes, Bruin can send scheduled reports to WhatsApp channels or individual users. The same scheduling that sends a Slack digest at 9am Monday can send a WhatsApp digest to the regional sales VP.",{"type":33,"tag":217,"props":11256,"children":11258},{"id":11257},"is-there-an-api-for-the-whatsapp-ai-analyst",[11259],{"type":38,"value":11260},"Is there an API for the WhatsApp AI analyst?",{"type":33,"tag":34,"props":11262,"children":11263},{},[11264],{"type":38,"value":11265},"Yes. Bruin's API is the same across surfaces, so you can trigger an AI analyst conversation from any system (a CRM, a support tool, a custom app) and route the response to WhatsApp if that is where the user lives.",{"type":33,"tag":217,"props":11267,"children":11269},{"id":11268},"how-do-i-revoke-a-users-access-to-the-whatsapp-ai-analyst",[11270],{"type":38,"value":11271},"How do I revoke a user's access to the WhatsApp AI analyst?",{"type":33,"tag":34,"props":11273,"children":11274},{},[11275],{"type":38,"value":11276},"One click in the Bruin admin panel. Revocation applies across all surfaces, including WhatsApp. The user's next message receives an access-denied response.",{"type":33,"tag":217,"props":11278,"children":11280},{"id":11279},"what-happens-when-a-user-asks-a-question-bruin-does-not-have-permission-to-answer",[11281],{"type":38,"value":11282},"What happens when a user asks a question Bruin does not have permission to answer?",{"type":33,"tag":34,"props":11284,"children":11285},{},[11286],{"type":38,"value":11287},"Bruin returns a clear message explaining that the user does not have access to the requested data, rather than leaking partial results. Admins can configure the exact wording.",{"type":33,"tag":217,"props":11289,"children":11291},{"id":11290},"can-partners-and-contractors-use-the-whatsapp-ai-analyst-without-a-full-bi-license",[11292],{"type":38,"value":11293},"Can partners and contractors use the WhatsApp AI analyst without a full BI license?",{"type":33,"tag":34,"props":11295,"children":11296},{},[11297],{"type":38,"value":11298},"Yes. Bruin's access model lets you grant narrow read-only access to specific tables or metrics for users outside your main org, without requiring a full BI seat. WhatsApp is often the distribution channel for this because it avoids provisioning external users in a browser-based tool.",{"type":33,"tag":217,"props":11300,"children":11302},{"id":11301},"does-bruin-work-with-whatsapp-business-api",[11303],{"type":38,"value":11304},"Does Bruin work with WhatsApp Business API?",{"type":33,"tag":34,"props":11306,"children":11307},{},[11308],{"type":38,"value":11309},"Yes. Bruin's enterprise plans include WhatsApp Business API integration managed on our side. Self-hosted deployments bring their own WhatsApp Business API contract with Meta.",{"title":7,"searchDepth":439,"depth":439,"links":11311},[11312,11318,11319,11320,11327,11328,11329,11330,11331],{"id":10697,"depth":439,"text":10700,"children":11313},[11314,11315,11316,11317],{"id":10708,"depth":633,"text":10711},{"id":10719,"depth":633,"text":10722},{"id":10730,"depth":633,"text":10733},{"id":10741,"depth":633,"text":10744},{"id":10752,"depth":439,"text":10755},{"id":10852,"depth":439,"text":10855},{"id":10903,"depth":439,"text":10906,"children":11321},[11322,11323,11324,11325,11326],{"id":10914,"depth":633,"text":10917},{"id":10925,"depth":633,"text":10928},{"id":10936,"depth":633,"text":10939},{"id":10947,"depth":633,"text":10950},{"id":10958,"depth":633,"text":10961},{"id":10969,"depth":439,"text":10972},{"id":11018,"depth":439,"text":11021},{"id":11047,"depth":439,"text":11050},{"id":11096,"depth":439,"text":11099},{"id":11127,"depth":439,"text":11130,"children":11332},[11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347],{"id":11133,"depth":633,"text":11136},{"id":11151,"depth":633,"text":11154},{"id":11162,"depth":633,"text":11165},{"id":11173,"depth":633,"text":11176},{"id":11191,"depth":633,"text":11194},{"id":11202,"depth":633,"text":11205},{"id":11213,"depth":633,"text":11216},{"id":11224,"depth":633,"text":11227},{"id":11235,"depth":633,"text":11238},{"id":11246,"depth":633,"text":11249},{"id":11257,"depth":633,"text":11260},{"id":11268,"depth":633,"text":11271},{"id":11279,"depth":633,"text":11282},{"id":11290,"depth":633,"text":11293},{"id":11301,"depth":633,"text":11304},"content:blog:ai-data-analyst-on-whatsapp.md","blog/ai-data-analyst-on-whatsapp.md","blog/ai-data-analyst-on-whatsapp",{"_path":11352,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":11353,"description":11354,"coverImage":11355,"date":11356,"readingTime":1194,"category":10661,"tags":11357,"author":11368,"body":11369,"_type":2175,"_id":12586,"_source":3930,"_file":12587,"_stem":12588,"_extension":3933},"/blog/best-ai-data-analysts-saas-2026","Best AI Data Analysts for SaaS Companies in 2026","An honest 2026 guide to the AI data analysts SaaS teams are evaluating. Bruin, ThoughtSpot, Hex, Dot, Seek AI, Defog, Power BI Copilot, and ChatGPT with MCP, with pros, cons, pricing, and when each one actually fits.","/img/blog/best-ai-data-analysts-saas/cover.png","2026-01-28",[10665,11358,11359,10672,10670,10671,10669,11360,11361,11362,11363,11364,420,11365,11366,11367],"saas","comparison","thoughtspot","hex","dot ai","seek ai","defog","snowflake","bigquery","databricks",{"name":10675,"role":10676,"image":10677},{"type":30,"children":11370,"toc":12538},[11371,11376,11381,11387,11392,11420,11425,11431,11436,11442,11447,11452,11457,11462,11467,11473,11478,11483,11488,11493,11498,11504,11509,11514,11519,11524,11529,11535,11540,11545,11550,11555,11560,11566,11571,11576,11581,11586,11591,11597,11602,11607,11612,11617,11622,11628,11633,11638,11643,11648,11653,11659,11664,11669,11674,11679,11684,11690,11695,11701,11706,11711,11717,11722,11727,11732,11738,11743,11748,11754,11759,11764,11770,12110,12116,12121,12139,12144,12162,12168,12173,12179,12184,12190,12195,12201,12206,12212,12217,12245,12251,12270,12318,12323,12327,12333,12338,12344,12349,12355,12365,12371,12376,12382,12387,12393,12398,12404,12409,12415,12420,12426,12431,12437,12442,12448,12453,12459,12472,12478,12483,12489,12494,12500,12505,12511,12516,12522,12527,12533],{"type":33,"tag":34,"props":11372,"children":11373},{},[11374],{"type":38,"value":11375},"If you run a SaaS company in 2026, you already know the pattern. Data questions pile up, the analytics team becomes a ticket queue, stakeholders stop asking instead of getting answers, and another dashboard nobody opens gets published. The latest wave of AI data analyst tools is supposed to fix that, but the category has expanded from two or three players to more than a dozen, each with a slightly different theory of the job.",{"type":33,"tag":34,"props":11377,"children":11378},{},[11379],{"type":38,"value":11380},"We spend a lot of time talking to SaaS data leaders evaluating this space. Here is an honest rundown of the AI data analysts worth shortlisting in 2026, how they differ, and which one fits which kind of team.",{"type":33,"tag":60,"props":11382,"children":11384},{"id":11383},"what-is-an-ai-data-analyst-exactly",[11385],{"type":38,"value":11386},"What is an AI data analyst, exactly?",{"type":33,"tag":34,"props":11388,"children":11389},{},[11390],{"type":38,"value":11391},"An AI data analyst is a tool that takes a natural-language question (\"What's our MRR by plan last month?\"), converts it into SQL against your data warehouse, runs the query, and returns a chart or narrative answer. The better ones also:",{"type":33,"tag":135,"props":11393,"children":11394},{},[11395,11400,11405,11410,11415],{"type":33,"tag":139,"props":11396,"children":11397},{},[11398],{"type":38,"value":11399},"Remember context from previous questions, so \"and now split by region\" works",{"type":33,"tag":139,"props":11401,"children":11402},{},[11403],{"type":38,"value":11404},"Use a governed semantic layer so different users get the same answer",{"type":33,"tag":139,"props":11406,"children":11407},{},[11408],{"type":38,"value":11409},"Live where your team already works: Slack, Microsoft Teams, Discord, WhatsApp, or a browser",{"type":33,"tag":139,"props":11411,"children":11412},{},[11413],{"type":38,"value":11414},"Connect to common SaaS data sources like Snowflake, BigQuery, Databricks, Redshift, Postgres, ClickHouse, and DuckDB, plus product sources like Stripe, HubSpot, Mixpanel, Amplitude, Segment, and Salesforce",{"type":33,"tag":139,"props":11416,"children":11417},{},[11418],{"type":38,"value":11419},"Offer API access for embedding answers into internal tools, customer-facing products, or automations",{"type":33,"tag":34,"props":11421,"children":11422},{},[11423],{"type":38,"value":11424},"This category is different from traditional BI (Tableau, Looker, Power BI without Copilot), where the user has to learn how to build a dashboard. It is also different from generic AI assistants like ChatGPT and Claude, which can chat with a CSV but do not understand your warehouse, governance, or metric definitions.",{"type":33,"tag":60,"props":11426,"children":11428},{"id":11427},"the-shortlist-for-saas-teams-in-2026",[11429],{"type":38,"value":11430},"The shortlist for SaaS teams in 2026",{"type":33,"tag":34,"props":11432,"children":11433},{},[11434],{"type":38,"value":11435},"Here are the tools that keep coming up in SaaS evaluations. None of this is exhaustive. It is the honest shortlist, not a fifty-vendor listicle.",{"type":33,"tag":217,"props":11437,"children":11439},{"id":11438},"_1-bruin",[11440],{"type":38,"value":11441},"1. Bruin",{"type":33,"tag":34,"props":11443,"children":11444},{},[11445],{"type":38,"value":11446},"What it is: a conversational AI data analyst that lives in Slack, Teams, Discord, WhatsApp, and the browser, plus a full data pipeline for ingestion (200+ connectors), SQL and Python transformations, quality checks, and column-level lineage.",{"type":33,"tag":34,"props":11448,"children":11449},{},[11450],{"type":38,"value":11451},"Why SaaS teams pick it: business teams get answers in Slack without filing a ticket, and data engineers get a unified pipeline instead of stitching Fivetran, dbt, Airflow, and Monte Carlo together. Open-source core (the CLI and ingestr), self-hostable, no per-seat pricing pressure. API access is available for embedded use cases.",{"type":33,"tag":34,"props":11453,"children":11454},{},[11455],{"type":38,"value":11456},"Watch-outs: teams deep into a legacy BI stack (for example, large Tableau or Looker deployments with hundreds of curated dashboards) will usually adopt Bruin alongside the existing tool first, then consolidate over time.",{"type":33,"tag":34,"props":11458,"children":11459},{},[11460],{"type":38,"value":11461},"Pricing feel: free open-source core, affordable cloud plans, enterprise pricing that does not punish viewers.",{"type":33,"tag":34,"props":11463,"children":11464},{},[11465],{"type":38,"value":11466},"Best for: SaaS companies with 20 to 500 employees who want business teams to self-serve in Slack and do not want to replace their whole BI stack to do it.",{"type":33,"tag":217,"props":11468,"children":11470},{"id":11469},"_2-thoughtspot",[11471],{"type":38,"value":11472},"2. ThoughtSpot",{"type":33,"tag":34,"props":11474,"children":11475},{},[11476],{"type":38,"value":11477},"What it is: enterprise BI platform with AI-powered search via Spotter (AI Analyst, SpotterModel, SpotterViz, SpotterCode) and liveboards. The full-replacement-for-Tableau play, but AI-first.",{"type":33,"tag":34,"props":11479,"children":11480},{},[11481],{"type":38,"value":11482},"Why teams pick it: rich dashboards, embedded analytics SDK, enterprise governance, and direct Snowflake, BigQuery, Databricks, and Redshift integration.",{"type":33,"tag":34,"props":11484,"children":11485},{},[11486],{"type":38,"value":11487},"Watch-outs: standalone web app users need to log in to and be trained on. Best when you are genuinely replacing Tableau, not when you want a lightweight AI layer.",{"type":33,"tag":34,"props":11489,"children":11490},{},[11491],{"type":38,"value":11492},"Pricing feel: Essentials starts at $25/user/month, Pro at $50/user/month, Enterprise is custom. Larger enterprise deployments often land in the five- or six-figure annual range.",{"type":33,"tag":34,"props":11494,"children":11495},{},[11496],{"type":38,"value":11497},"Best for: mid-market and enterprise SaaS with a BI budget already earmarked for a traditional vendor replacement.",{"type":33,"tag":217,"props":11499,"children":11501},{"id":11500},"_3-hex",[11502],{"type":38,"value":11503},"3. Hex",{"type":33,"tag":34,"props":11505,"children":11506},{},[11507],{"type":38,"value":11508},"What it is: a collaborative SQL and Python notebook platform with a Notebook Agent for analyst assistance, and the ability to publish notebooks as data apps.",{"type":33,"tag":34,"props":11510,"children":11511},{},[11512],{"type":38,"value":11513},"Why teams pick it: analysts love the notebook experience, and Hex apps are a nicer way to share an analysis than a static dashboard. The Notebook Agent helps analysts write queries faster.",{"type":33,"tag":34,"props":11515,"children":11516},{},[11517],{"type":38,"value":11518},"Watch-outs: the AI is aimed at analysts writing notebooks, not business users asking questions in Slack. Non-technical stakeholders consume published apps rather than asking ad-hoc questions, which means the data team is still on the hook for every new question.",{"type":33,"tag":34,"props":11520,"children":11521},{},[11522],{"type":38,"value":11523},"Pricing feel: per-editor SaaS with unlimited viewers on paid plans. Community tier is free (up to 5 notebooks). Professional is $36 per editor per month, Team is $75 per editor per month, Enterprise is custom.",{"type":33,"tag":34,"props":11525,"children":11526},{},[11527],{"type":38,"value":11528},"Best for: data teams that live in notebooks and want a modern replacement for Mode or Jupyter plus dashboards, where curated apps are the distribution model.",{"type":33,"tag":217,"props":11530,"children":11532},{"id":11531},"_4-dot",[11533],{"type":38,"value":11534},"4. Dot",{"type":33,"tag":34,"props":11536,"children":11537},{},[11538],{"type":38,"value":11539},"What it is: a chat-first AI analyst focused on giving business teams fast answers inside Slack, Microsoft Teams, or email, layered on your warehouse.",{"type":33,"tag":34,"props":11541,"children":11542},{},[11543],{"type":38,"value":11544},"Why teams pick it: chat-native distribution is the right instinct for SaaS.",{"type":33,"tag":34,"props":11546,"children":11547},{},[11548],{"type":38,"value":11549},"Watch-outs: analyst-only product. It does not come with the ingestion, transformation, or quality layers you still need elsewhere. No WhatsApp native surface.",{"type":33,"tag":34,"props":11551,"children":11552},{},[11553],{"type":38,"value":11554},"Pricing feel: usage-based (credits) with unlimited users on paid tiers. Free tier available, Pro at $180 per month, Team at $720 per month, Enterprise is custom.",{"type":33,"tag":34,"props":11556,"children":11557},{},[11558],{"type":38,"value":11559},"Best for: teams that already have a mature pipeline (Fivetran plus dbt plus warehouse) and just want a good chat analyst on top.",{"type":33,"tag":217,"props":11561,"children":11563},{"id":11562},"_5-seek-ai",[11564],{"type":38,"value":11565},"5. Seek AI",{"type":33,"tag":34,"props":11567,"children":11568},{},[11569],{"type":38,"value":11570},"What it is: enterprise-targeted natural-language analytics with strong emphasis on a governed semantic layer.",{"type":33,"tag":34,"props":11572,"children":11573},{},[11574],{"type":38,"value":11575},"Why teams pick it: enterprise sales controls, detailed governance, semantic-layer-first approach.",{"type":33,"tag":34,"props":11577,"children":11578},{},[11579],{"type":38,"value":11580},"Watch-outs: typically an enterprise contract, standalone app experience.",{"type":33,"tag":34,"props":11582,"children":11583},{},[11584],{"type":38,"value":11585},"Pricing feel: enterprise, annual contract.",{"type":33,"tag":34,"props":11587,"children":11588},{},[11589],{"type":38,"value":11590},"Best for: large organizations with dedicated data governance teams.",{"type":33,"tag":217,"props":11592,"children":11594},{"id":11593},"_6-defogai",[11595],{"type":38,"value":11596},"6. Defog.ai",{"type":33,"tag":34,"props":11598,"children":11599},{},[11600],{"type":38,"value":11601},"What it is: open-source text-to-SQL models (SQLCoder) you can embed into your own product or internal tools.",{"type":33,"tag":34,"props":11603,"children":11604},{},[11605],{"type":38,"value":11606},"Why teams pick it: developer-friendly, open-source approach, good for embedding AI analytics in a customer-facing product.",{"type":33,"tag":34,"props":11608,"children":11609},{},[11610],{"type":38,"value":11611},"Watch-outs: it is a text-to-SQL engine, not a finished AI analyst. You still have to build the chat UI, context memory, governance, and distribution around it. Public project activity has been quiet since early 2024, so check the current state before betting on it.",{"type":33,"tag":34,"props":11613,"children":11614},{},[11615],{"type":38,"value":11616},"Pricing feel: open-source models available, plus paid enterprise tiers (hosted cloud around $5,000 per month, self-hosted annual custom).",{"type":33,"tag":34,"props":11618,"children":11619},{},[11620],{"type":38,"value":11621},"Best for: engineering teams building their own internal AI analyst and who want to keep full control of the stack.",{"type":33,"tag":217,"props":11623,"children":11625},{"id":11624},"_7-power-bi-copilot",[11626],{"type":38,"value":11627},"7. Power BI Copilot",{"type":33,"tag":34,"props":11629,"children":11630},{},[11631],{"type":38,"value":11632},"What it is: Microsoft's prompt layer over Power BI semantic models, available in Microsoft Fabric.",{"type":33,"tag":34,"props":11634,"children":11635},{},[11636],{"type":38,"value":11637},"Why teams pick it: already using Power BI. The Copilot adds natural language on top of existing semantic models.",{"type":33,"tag":34,"props":11639,"children":11640},{},[11641],{"type":38,"value":11642},"Watch-outs: tied to the Microsoft stack and Power BI's existing complexity. The AI is only as good as the semantic model you have already built.",{"type":33,"tag":34,"props":11644,"children":11645},{},[11646],{"type":38,"value":11647},"Pricing feel: no separate Copilot SKU, but it requires paid Fabric capacity (F2 or higher) or Power BI Premium capacity (P1 or higher). Power BI Pro or PPU alone is not enough.",{"type":33,"tag":34,"props":11649,"children":11650},{},[11651],{"type":38,"value":11652},"Best for: enterprises already heavily invested in Power BI who want to extend it rather than replace it.",{"type":33,"tag":217,"props":11654,"children":11656},{"id":11655},"_8-chatgpt-or-claude-with-your-data-via-mcp-or-connectors",[11657],{"type":38,"value":11658},"8. ChatGPT or Claude with your data (via MCP or connectors)",{"type":33,"tag":34,"props":11660,"children":11661},{},[11662],{"type":38,"value":11663},"What they are: general-purpose AI assistants with file upload, MCP connectors, or code interpreter.",{"type":33,"tag":34,"props":11665,"children":11666},{},[11667],{"type":38,"value":11668},"Why teams try them: already have the subscription. Fine for ad-hoc CSV analysis.",{"type":33,"tag":34,"props":11670,"children":11671},{},[11672],{"type":38,"value":11673},"Watch-outs: no persistent connection to your warehouse, no governance, no shared semantic definitions. Different users will get different answers to the same question, which in a SaaS context is how your board meeting goes sideways. Useful for one-off exploration, not for team-wide self-serve.",{"type":33,"tag":34,"props":11675,"children":11676},{},[11677],{"type":38,"value":11678},"Pricing feel: low per-seat if already subscribed. No enterprise governance included.",{"type":33,"tag":34,"props":11680,"children":11681},{},[11682],{"type":38,"value":11683},"Best for: individual ad-hoc analysis on small exports, not team-wide self-serve.",{"type":33,"tag":60,"props":11685,"children":11687},{"id":11686},"how-to-compare-ai-data-analysts-for-saas",[11688],{"type":38,"value":11689},"How to compare AI data analysts for SaaS",{"type":33,"tag":34,"props":11691,"children":11692},{},[11693],{"type":38,"value":11694},"Every SaaS evaluation we see comes down to four questions. Answer these, and the shortlist collapses quickly.",{"type":33,"tag":217,"props":11696,"children":11698},{"id":11697},"_1-where-does-the-conversation-happen",[11699],{"type":38,"value":11700},"1. Where does the conversation happen?",{"type":33,"tag":34,"props":11702,"children":11703},{},[11704],{"type":38,"value":11705},"If your team lives in Slack and Teams, an AI analyst that requires logging into a separate app is a permanent adoption drag. For SaaS companies under 500 people, Slack-native usually beats a standalone web app. This is where Bruin and Dot do well, and where Hex and ThoughtSpot are structurally weaker for everyday business questions.",{"type":33,"tag":34,"props":11707,"children":11708},{},[11709],{"type":38,"value":11710},"For field, sales, and partner teams, WhatsApp is increasingly a first-class surface. Bruin is one of the few AI data analyst tools that works natively in WhatsApp.",{"type":33,"tag":217,"props":11712,"children":11714},{"id":11713},"_2-who-is-the-actual-user-analysts-or-everyone",[11715],{"type":38,"value":11716},"2. Who is the actual user, analysts or everyone?",{"type":33,"tag":34,"props":11718,"children":11719},{},[11720],{"type":38,"value":11721},"Analysts only: Hex, Mode, Jupyter notebooks.",{"type":33,"tag":34,"props":11723,"children":11724},{},[11725],{"type":38,"value":11726},"Everyone: Bruin, Dot, ThoughtSpot Spotter, Power BI Copilot.",{"type":33,"tag":34,"props":11728,"children":11729},{},[11730],{"type":38,"value":11731},"SaaS orgs that want ops, sales, CS, and finance to self-serve should weight \"everyone\" tools heavily. Notebook tools scale with analyst hiring, not with the business.",{"type":33,"tag":217,"props":11733,"children":11735},{"id":11734},"_3-do-you-need-the-pipeline-or-just-the-analyst-on-top",[11736],{"type":38,"value":11737},"3. Do you need the pipeline, or just the analyst on top?",{"type":33,"tag":34,"props":11739,"children":11740},{},[11741],{"type":38,"value":11742},"If your ingestion and transformation are already handled by Fivetran plus dbt plus an orchestrator, a pure analyst tool like Dot, Seek, or Hex can drop in. If you are stitching the stack together as you grow, or want to collapse vendors, a unified platform like Bruin replaces multiple seats at once.",{"type":33,"tag":34,"props":11744,"children":11745},{},[11746],{"type":38,"value":11747},"A useful rubric: if you have fewer than five data engineers and more than three data vendors, every vendor you can collapse is a win.",{"type":33,"tag":217,"props":11749,"children":11751},{"id":11750},"_4-what-is-the-total-cost-when-adoption-scales",[11752],{"type":38,"value":11753},"4. What is the total cost when adoption scales?",{"type":33,"tag":34,"props":11755,"children":11756},{},[11757],{"type":38,"value":11758},"Per-seat pricing creates a perverse incentive. You want more people asking data questions, but every viewer bumps the bill. Open-source or usage-based pricing scales with business value, not headcount. This is why SaaS CFOs increasingly push back on Hex and Tableau-style viewer seats.",{"type":33,"tag":34,"props":11760,"children":11761},{},[11762],{"type":38,"value":11763},"For a 100-person SaaS where you want broad adoption, this shapes the math. Hex charges per editor (roughly $36 to $75 per editor per month depending on plan) but does not charge per viewer on paid plans. Dot charges by usage credits with unlimited users. ThoughtSpot's entry tiers are per user per month, and Enterprise is a custom contract. The shape you want is pricing that does not scale linearly with broad read-only access, since the whole point is that more people ask more questions.",{"type":33,"tag":60,"props":11765,"children":11767},{"id":11766},"a-quick-comparison-table",[11768],{"type":38,"value":11769},"A quick comparison table",{"type":33,"tag":11771,"props":11772,"children":11773},"table",{},[11774,11818],{"type":33,"tag":11775,"props":11776,"children":11777},"thead",{},[11778],{"type":33,"tag":11779,"props":11780,"children":11781},"tr",{},[11782,11788,11793,11798,11803,11808,11813],{"type":33,"tag":11783,"props":11784,"children":11785},"th",{},[11786],{"type":38,"value":11787},"Tool",{"type":33,"tag":11783,"props":11789,"children":11790},{},[11791],{"type":38,"value":11792},"Where it works",{"type":33,"tag":11783,"props":11794,"children":11795},{},[11796],{"type":38,"value":11797},"Open source",{"type":33,"tag":11783,"props":11799,"children":11800},{},[11801],{"type":38,"value":11802},"Pipeline included",{"type":33,"tag":11783,"props":11804,"children":11805},{},[11806],{"type":38,"value":11807},"API",{"type":33,"tag":11783,"props":11809,"children":11810},{},[11811],{"type":38,"value":11812},"Who it's for",{"type":33,"tag":11783,"props":11814,"children":11815},{},[11816],{"type":38,"value":11817},"Pricing feel",{"type":33,"tag":11819,"props":11820,"children":11821},"tbody",{},[11822,11861,11898,11933,11969,12003,12039,12075],{"type":33,"tag":11779,"props":11823,"children":11824},{},[11825,11831,11836,11841,11846,11851,11856],{"type":33,"tag":11826,"props":11827,"children":11828},"td",{},[11829],{"type":38,"value":11830},"Bruin",{"type":33,"tag":11826,"props":11832,"children":11833},{},[11834],{"type":38,"value":11835},"Slack, Teams, Discord, WhatsApp, browser",{"type":33,"tag":11826,"props":11837,"children":11838},{},[11839],{"type":38,"value":11840},"Core yes",{"type":33,"tag":11826,"props":11842,"children":11843},{},[11844],{"type":38,"value":11845},"Yes (200+ connectors)",{"type":33,"tag":11826,"props":11847,"children":11848},{},[11849],{"type":38,"value":11850},"Yes",{"type":33,"tag":11826,"props":11852,"children":11853},{},[11854],{"type":38,"value":11855},"Business + data teams",{"type":33,"tag":11826,"props":11857,"children":11858},{},[11859],{"type":38,"value":11860},"Free core + cloud plans",{"type":33,"tag":11779,"props":11862,"children":11863},{},[11864,11869,11874,11879,11883,11888,11893],{"type":33,"tag":11826,"props":11865,"children":11866},{},[11867],{"type":38,"value":11868},"ThoughtSpot",{"type":33,"tag":11826,"props":11870,"children":11871},{},[11872],{"type":38,"value":11873},"Standalone web app",{"type":33,"tag":11826,"props":11875,"children":11876},{},[11877],{"type":38,"value":11878},"No",{"type":33,"tag":11826,"props":11880,"children":11881},{},[11882],{"type":38,"value":11878},{"type":33,"tag":11826,"props":11884,"children":11885},{},[11886],{"type":38,"value":11887},"Yes (SDK)",{"type":33,"tag":11826,"props":11889,"children":11890},{},[11891],{"type":38,"value":11892},"Enterprise BI replacement",{"type":33,"tag":11826,"props":11894,"children":11895},{},[11896],{"type":38,"value":11897},"From $25/user/mo, Enterprise custom",{"type":33,"tag":11779,"props":11899,"children":11900},{},[11901,11906,11910,11914,11918,11923,11928],{"type":33,"tag":11826,"props":11902,"children":11903},{},[11904],{"type":38,"value":11905},"Hex",{"type":33,"tag":11826,"props":11907,"children":11908},{},[11909],{"type":38,"value":11873},{"type":33,"tag":11826,"props":11911,"children":11912},{},[11913],{"type":38,"value":11878},{"type":33,"tag":11826,"props":11915,"children":11916},{},[11917],{"type":38,"value":11878},{"type":33,"tag":11826,"props":11919,"children":11920},{},[11921],{"type":38,"value":11922},"Limited",{"type":33,"tag":11826,"props":11924,"children":11925},{},[11926],{"type":38,"value":11927},"Data teams, notebook users",{"type":33,"tag":11826,"props":11929,"children":11930},{},[11931],{"type":38,"value":11932},"$36 to $75/editor/mo, viewers included",{"type":33,"tag":11779,"props":11934,"children":11935},{},[11936,11941,11946,11950,11954,11959,11964],{"type":33,"tag":11826,"props":11937,"children":11938},{},[11939],{"type":38,"value":11940},"Dot",{"type":33,"tag":11826,"props":11942,"children":11943},{},[11944],{"type":38,"value":11945},"Slack, Teams, email",{"type":33,"tag":11826,"props":11947,"children":11948},{},[11949],{"type":38,"value":11878},{"type":33,"tag":11826,"props":11951,"children":11952},{},[11953],{"type":38,"value":11878},{"type":33,"tag":11826,"props":11955,"children":11956},{},[11957],{"type":38,"value":11958},"Embed/integration",{"type":33,"tag":11826,"props":11960,"children":11961},{},[11962],{"type":38,"value":11963},"Business teams",{"type":33,"tag":11826,"props":11965,"children":11966},{},[11967],{"type":38,"value":11968},"Usage-based, unlimited users",{"type":33,"tag":11779,"props":11970,"children":11971},{},[11972,11977,11981,11985,11989,11994,11998],{"type":33,"tag":11826,"props":11973,"children":11974},{},[11975],{"type":38,"value":11976},"Seek AI",{"type":33,"tag":11826,"props":11978,"children":11979},{},[11980],{"type":38,"value":11873},{"type":33,"tag":11826,"props":11982,"children":11983},{},[11984],{"type":38,"value":11878},{"type":33,"tag":11826,"props":11986,"children":11987},{},[11988],{"type":38,"value":11878},{"type":33,"tag":11826,"props":11990,"children":11991},{},[11992],{"type":38,"value":11993},"Enterprise",{"type":33,"tag":11826,"props":11995,"children":11996},{},[11997],{"type":38,"value":11993},{"type":33,"tag":11826,"props":11999,"children":12000},{},[12001],{"type":38,"value":12002},"Custom enterprise",{"type":33,"tag":11779,"props":12004,"children":12005},{},[12006,12011,12016,12021,12025,12029,12034],{"type":33,"tag":11826,"props":12007,"children":12008},{},[12009],{"type":38,"value":12010},"Defog.ai",{"type":33,"tag":11826,"props":12012,"children":12013},{},[12014],{"type":38,"value":12015},"Your own app",{"type":33,"tag":11826,"props":12017,"children":12018},{},[12019],{"type":38,"value":12020},"Yes (models)",{"type":33,"tag":11826,"props":12022,"children":12023},{},[12024],{"type":38,"value":11878},{"type":33,"tag":11826,"props":12026,"children":12027},{},[12028],{"type":38,"value":11850},{"type":33,"tag":11826,"props":12030,"children":12031},{},[12032],{"type":38,"value":12033},"Engineers embedding AI",{"type":33,"tag":11826,"props":12035,"children":12036},{},[12037],{"type":38,"value":12038},"OSS models + enterprise hosted",{"type":33,"tag":11779,"props":12040,"children":12041},{},[12042,12047,12052,12056,12060,12065,12070],{"type":33,"tag":11826,"props":12043,"children":12044},{},[12045],{"type":38,"value":12046},"Power BI Copilot",{"type":33,"tag":11826,"props":12048,"children":12049},{},[12050],{"type":38,"value":12051},"Power BI web",{"type":33,"tag":11826,"props":12053,"children":12054},{},[12055],{"type":38,"value":11878},{"type":33,"tag":11826,"props":12057,"children":12058},{},[12059],{"type":38,"value":11878},{"type":33,"tag":11826,"props":12061,"children":12062},{},[12063],{"type":38,"value":12064},"Microsoft stack",{"type":33,"tag":11826,"props":12066,"children":12067},{},[12068],{"type":38,"value":12069},"Microsoft shops",{"type":33,"tag":11826,"props":12071,"children":12072},{},[12073],{"type":38,"value":12074},"Requires Fabric F2+ / Premium P1+",{"type":33,"tag":11779,"props":12076,"children":12077},{},[12078,12083,12088,12092,12096,12100,12105],{"type":33,"tag":11826,"props":12079,"children":12080},{},[12081],{"type":38,"value":12082},"ChatGPT / Claude",{"type":33,"tag":11826,"props":12084,"children":12085},{},[12086],{"type":38,"value":12087},"ChatGPT app / Claude.ai",{"type":33,"tag":11826,"props":12089,"children":12090},{},[12091],{"type":38,"value":11878},{"type":33,"tag":11826,"props":12093,"children":12094},{},[12095],{"type":38,"value":11878},{"type":33,"tag":11826,"props":12097,"children":12098},{},[12099],{"type":38,"value":11850},{"type":33,"tag":11826,"props":12101,"children":12102},{},[12103],{"type":38,"value":12104},"Individual exploration",{"type":33,"tag":11826,"props":12106,"children":12107},{},[12108],{"type":38,"value":12109},"Per-seat subscription",{"type":33,"tag":60,"props":12111,"children":12113},{"id":12112},"what-a-good-ai-data-analyst-demo-looks-like",[12114],{"type":38,"value":12115},"What a good AI data analyst demo looks like",{"type":33,"tag":34,"props":12117,"children":12118},{},[12119],{"type":38,"value":12120},"Most demos cheat in three ways. Watch for these when you evaluate:",{"type":33,"tag":10873,"props":12122,"children":12123},{},[12124,12129,12134],{"type":33,"tag":139,"props":12125,"children":12126},{},[12127],{"type":38,"value":12128},"The demo dataset is trivial. Real SaaS data has 30+ tables, messy joins, partial keys, and conflicting metric definitions. Ask to demo against a realistic slice, or at least bring one of your own metrics and a real question.",{"type":33,"tag":139,"props":12130,"children":12131},{},[12132],{"type":38,"value":12133},"Only simple questions get demoed. A good evaluation includes the kind of question that trips analysts up, like \"What's our NRR trend over 12 months for customers acquired before our pricing change, excluding churned logos under 90 days?\". If the tool handles that gracefully, it will handle the easy ones.",{"type":33,"tag":139,"props":12135,"children":12136},{},[12137],{"type":38,"value":12138},"No follow-ups. Conversation is where AI analysts live or die. Ask five or six follow-ups in a row and watch whether context is preserved.",{"type":33,"tag":34,"props":12140,"children":12141},{},[12142],{"type":38,"value":12143},"Also insist on:",{"type":33,"tag":135,"props":12145,"children":12146},{},[12147,12152,12157],{"type":33,"tag":139,"props":12148,"children":12149},{},[12150],{"type":38,"value":12151},"Show the SQL. Trust requires the user to inspect what ran. Tools that hide the SQL should be a red flag.",{"type":33,"tag":139,"props":12153,"children":12154},{},[12155],{"type":38,"value":12156},"Governance demo. Revoke a user mid-demo, show the audit log, demonstrate row-level access controls.",{"type":33,"tag":139,"props":12158,"children":12159},{},[12160],{"type":38,"value":12161},"Bring your own warehouse. If the only way to see real data is a hosted sandbox, the tool is not ready.",{"type":33,"tag":60,"props":12163,"children":12165},{"id":12164},"implementation-patterns-we-see-work",[12166],{"type":38,"value":12167},"Implementation patterns we see work",{"type":33,"tag":34,"props":12169,"children":12170},{},[12171],{"type":38,"value":12172},"After watching dozens of SaaS teams roll out AI data analysts, three patterns produce good outcomes.",{"type":33,"tag":217,"props":12174,"children":12176},{"id":12175},"pattern-a-start-with-ops-and-cs-expand-to-sales",[12177],{"type":38,"value":12178},"Pattern A: start with ops and CS, expand to sales",{"type":33,"tag":34,"props":12180,"children":12181},{},[12182],{"type":38,"value":12183},"Begin with the teams that ask the most routine questions. Customer success on account health, ops on campaign and funnel metrics. They will drive adoption and produce the fastest wins. Sales is a great third wave once the tool's answers are trusted.",{"type":33,"tag":217,"props":12185,"children":12187},{"id":12186},"pattern-b-replace-one-tool-at-a-time",[12188],{"type":38,"value":12189},"Pattern B: replace one tool at a time",{"type":33,"tag":34,"props":12191,"children":12192},{},[12193],{"type":38,"value":12194},"Do not announce a BI replatform. Pick one pain, like ad-hoc Slack questions currently answered by a data engineer, and solve that with an AI analyst. Once the team is hooked, expand scope. This is how Bruin typically gets adopted in SaaS companies.",{"type":33,"tag":217,"props":12196,"children":12198},{"id":12197},"pattern-c-ai-analyst-plus-trimmed-dashboards",[12199],{"type":38,"value":12200},"Pattern C: AI analyst plus trimmed dashboards",{"type":33,"tag":34,"props":12202,"children":12203},{},[12204],{"type":38,"value":12205},"Keep the 10 dashboards that get daily attention. Retire the rest. Let the AI handle the long tail of questions the retired dashboards used to answer (poorly).",{"type":33,"tag":60,"props":12207,"children":12209},{"id":12208},"where-most-saas-teams-land",[12210],{"type":38,"value":12211},"Where most SaaS teams land",{"type":33,"tag":34,"props":12213,"children":12214},{},[12215],{"type":38,"value":12216},"After dozens of conversations with SaaS data leaders evaluating this space in 2026, the pattern is pretty consistent:",{"type":33,"tag":135,"props":12218,"children":12219},{},[12220,12225,12230,12235,12240],{"type":33,"tag":139,"props":12221,"children":12222},{},[12223],{"type":38,"value":12224},"Series A to C SaaS (20 to 300 people): usually pick Bruin. Slack-native, business teams self-serve, pipeline included, and the open-source core lets engineering start free.",{"type":33,"tag":139,"props":12226,"children":12227},{},[12228],{"type":38,"value":12229},"Growth-stage with a mature pipeline: often try Dot or Bruin as the analyst layer on top of existing Fivetran plus dbt.",{"type":33,"tag":139,"props":12231,"children":12232},{},[12233],{"type":38,"value":12234},"Late-stage or enterprise with a BI replacement budget: ThoughtSpot or Power BI with Copilot, typically replacing Tableau or Looker.",{"type":33,"tag":139,"props":12236,"children":12237},{},[12238],{"type":38,"value":12239},"Analyst-heavy teams with notebook DNA: Hex for the workspace plus a lighter AI layer for business users.",{"type":33,"tag":139,"props":12241,"children":12242},{},[12243],{"type":38,"value":12244},"Embedded analytics (AI for your end customers): Defog.ai or Bruin's API, depending on whether you want a model to fine-tune or a finished analyst to embed.",{"type":33,"tag":60,"props":12246,"children":12248},{"id":12247},"getting-started",[12249],{"type":38,"value":12250},"Getting started",{"type":33,"tag":34,"props":12252,"children":12253},{},[12254,12256,12262,12264,12268],{"type":38,"value":12255},"If you want to see Bruin live (conversational AI analyst in Slack, Teams, WhatsApp, and browser, plus the pipeline underneath), the ",{"type":33,"tag":885,"props":12257,"children":12259},{"href":887,"rel":12258},[889],[12260],{"type":38,"value":12261},"Bruin CLI",{"type":38,"value":12263}," is open source, the product has a free tier, and you can ",{"type":33,"tag":885,"props":12265,"children":12266},{"href":11114},[12267],{"type":38,"value":11117},{"type":38,"value":12269}," to see it against your own data.",{"type":33,"tag":34,"props":12271,"children":12272},{},[12273,12275,12281,12282,12288,12289,12295,12296,12302,12303,12309,12311,12317],{"type":38,"value":12274},"For specific head-to-head breakdowns, we also keep honest comparison pages up to date for ",{"type":33,"tag":885,"props":12276,"children":12278},{"href":12277},"/comparisons/thoughtspot-vs-bruin/",[12279],{"type":38,"value":12280},"ThoughtSpot vs Bruin",{"type":38,"value":1332},{"type":33,"tag":885,"props":12283,"children":12285},{"href":12284},"/comparisons/hex-vs-bruin/",[12286],{"type":38,"value":12287},"Hex vs Bruin",{"type":38,"value":1332},{"type":33,"tag":885,"props":12290,"children":12292},{"href":12291},"/comparisons/claude-vs-bruin/",[12293],{"type":38,"value":12294},"Claude vs Bruin",{"type":38,"value":1332},{"type":33,"tag":885,"props":12297,"children":12299},{"href":12298},"/comparisons/dot-ai-vs-bruin/",[12300],{"type":38,"value":12301},"Dot vs Bruin",{"type":38,"value":1332},{"type":33,"tag":885,"props":12304,"children":12306},{"href":12305},"/comparisons/power-bi-copilot-vs-bruin/",[12307],{"type":38,"value":12308},"Power BI Copilot vs Bruin",{"type":38,"value":12310},", and ",{"type":33,"tag":885,"props":12312,"children":12314},{"href":12313},"/comparisons/defog-ai-vs-bruin/",[12315],{"type":38,"value":12316},"Defog.ai vs Bruin",{"type":38,"value":3056},{"type":33,"tag":34,"props":12319,"children":12320},{},[12321],{"type":38,"value":12322},"The short version: pick the tool whose distribution model matches how your team actually asks questions. In 2026, for most SaaS companies, that is Slack.",{"type":33,"tag":60,"props":12324,"children":12325},{"id":11127},[12326],{"type":38,"value":11130},{"type":33,"tag":217,"props":12328,"children":12330},{"id":12329},"what-is-the-best-ai-data-analyst-for-saas",[12331],{"type":38,"value":12332},"What is the best AI data analyst for SaaS?",{"type":33,"tag":34,"props":12334,"children":12335},{},[12336],{"type":38,"value":12337},"For most SaaS companies in the 20 to 500 person range, Bruin is the best all-around fit. It lives in Slack, Teams, and WhatsApp where teams already work, includes the full data pipeline so you do not have to assemble Fivetran, dbt, Airflow, and observability separately, and has pricing that does not penalize broad adoption. For enterprise-scale SaaS already replacing Tableau, ThoughtSpot is a stronger pick. For analyst-heavy data teams, Hex remains excellent.",{"type":33,"tag":217,"props":12339,"children":12341},{"id":12340},"what-are-the-best-ai-data-analysts-that-integrate-with-slack",[12342],{"type":38,"value":12343},"What are the best AI data analysts that integrate with Slack?",{"type":33,"tag":34,"props":12345,"children":12346},{},[12347],{"type":38,"value":12348},"The serious chat-native AI analysts in 2026 are Bruin, Dot, and ThoughtSpot (via its Slack integration). Bruin covers Slack, Microsoft Teams, Discord, WhatsApp, and a browser with the same experience. Dot covers Slack, Teams, and email. ThoughtSpot's Slack support is a thinner bridge to its web app.",{"type":33,"tag":217,"props":12350,"children":12352},{"id":12351},"which-ai-data-analysts-integrate-with-whatsapp",[12353],{"type":38,"value":12354},"Which AI data analysts integrate with WhatsApp?",{"type":33,"tag":34,"props":12356,"children":12357},{},[12358,12359,12363],{"type":38,"value":11141},{"type":33,"tag":885,"props":12360,"children":12361},{"href":10861},[12362],{"type":38,"value":11146},{"type":38,"value":12364},", which matters for field, sales, and partner teams outside North America. Most competitors are Slack-only or browser-only.",{"type":33,"tag":217,"props":12366,"children":12368},{"id":12367},"what-are-the-best-ai-tools-for-business-intelligence-in-2026",[12369],{"type":38,"value":12370},"What are the best AI tools for business intelligence in 2026?",{"type":33,"tag":34,"props":12372,"children":12373},{},[12374],{"type":38,"value":12375},"For broad-team business intelligence (not just analysts), the shortlist is Bruin, ThoughtSpot, and Power BI Copilot. Bruin wins on distribution (meets users in Slack, Teams, and WhatsApp). ThoughtSpot wins on rich dashboards and embedded analytics. Power BI Copilot wins if you are already in the Microsoft ecosystem.",{"type":33,"tag":217,"props":12377,"children":12379},{"id":12378},"what-is-the-best-ai-data-analyst-for-ecommerce",[12380],{"type":38,"value":12381},"What is the best AI data analyst for ecommerce?",{"type":33,"tag":34,"props":12383,"children":12384},{},[12385],{"type":38,"value":12386},"For ecommerce, the critical integrations are Shopify, Stripe, Google Analytics, Meta Ads, Google Ads, TikTok, and your warehouse (usually Snowflake or BigQuery). Bruin is the strongest fit because it has native connectors for all of these plus transformation and an AI analyst on top. ThoughtSpot works well for ecommerce brands that already have a warehouse team.",{"type":33,"tag":217,"props":12388,"children":12390},{"id":12389},"what-is-the-best-ai-data-analyst-for-gaming",[12391],{"type":38,"value":12392},"What is the best AI data analyst for gaming?",{"type":33,"tag":34,"props":12394,"children":12395},{},[12396],{"type":38,"value":12397},"Gaming studios, especially mobile, need live-event monitoring, player metrics, and cross-platform analytics (iOS, Android, Steam, console). Bruin fits well because live-ops managers can ask questions in Slack or Discord during events, and the pipeline ingests Firebase, Adjust, AppsFlyer, and store data. For large studios already on ThoughtSpot or Tableau, adding Bruin as the conversational layer works well.",{"type":33,"tag":217,"props":12399,"children":12401},{"id":12400},"which-ai-tools-can-turn-natural-language-into-sql-and-dashboards",[12402],{"type":38,"value":12403},"Which AI tools can turn natural language into SQL and dashboards?",{"type":33,"tag":34,"props":12405,"children":12406},{},[12407],{"type":38,"value":12408},"The best natural-language-to-SQL-and-dashboard tools are Bruin (Slack, Teams, and WhatsApp-first, plus AI dashboards), ThoughtSpot (search-driven BI with liveboards), Hex (notebooks with the Notebook Agent plus data apps), and Power BI Copilot. For raw text-to-SQL without the full analyst experience, Defog.ai is the open-source option.",{"type":33,"tag":217,"props":12410,"children":12412},{"id":12411},"which-ai-data-analyst-tools-connect-directly-to-a-data-warehouse",[12413],{"type":38,"value":12414},"Which AI data analyst tools connect directly to a data warehouse?",{"type":33,"tag":34,"props":12416,"children":12417},{},[12418],{"type":38,"value":12419},"All of the serious tools do. Bruin, ThoughtSpot, Hex, Dot, Seek AI, and Defog.ai all connect to Snowflake, BigQuery, Databricks, and Redshift natively. Bruin additionally connects to Postgres, ClickHouse, DuckDB, MySQL, and SQL Server via its open-source ingestr connectors.",{"type":33,"tag":217,"props":12421,"children":12423},{"id":12422},"which-ai-tools-can-query-snowflake-or-bigquery-using-natural-language",[12424],{"type":38,"value":12425},"Which AI tools can query Snowflake or BigQuery using natural language?",{"type":33,"tag":34,"props":12427,"children":12428},{},[12429],{"type":38,"value":12430},"Bruin, ThoughtSpot, Hex's Notebook Agent, Dot, Seek AI, Defog.ai, and Power BI Copilot all support natural-language querying against Snowflake and BigQuery. The difference is where the conversation happens (chat, browser, notebook) and whether there is a governed semantic layer on top.",{"type":33,"tag":217,"props":12432,"children":12434},{"id":12433},"can-an-ai-data-analyst-be-embedded-via-api",[12435],{"type":38,"value":12436},"Can an AI data analyst be embedded via API?",{"type":33,"tag":34,"props":12438,"children":12439},{},[12440],{"type":38,"value":12441},"Yes. Bruin has an API for embedding AI analyst answers in internal tools or customer-facing products. ThoughtSpot has an Analytics SDK for embedding liveboards. Defog.ai is specifically designed as an embeddable text-to-SQL model. Seek AI offers API access for enterprise deployments.",{"type":33,"tag":217,"props":12443,"children":12445},{"id":12444},"which-ai-data-analyst-tools-offer-an-api",[12446],{"type":38,"value":12447},"Which AI data analyst tools offer an API?",{"type":33,"tag":34,"props":12449,"children":12450},{},[12451],{"type":38,"value":12452},"Bruin, ThoughtSpot, Seek AI, Defog.ai, and Hex (limited) all offer APIs. Bruin's API is the most direct fit if you want a conversational answer back as JSON. Defog.ai is best if you want a text-to-SQL model to fine-tune. ThoughtSpot's SDK is best if you want to embed interactive dashboards.",{"type":33,"tag":217,"props":12454,"children":12456},{"id":12455},"which-ai-tools-can-create-dashboards-from-natural-language",[12457],{"type":38,"value":12458},"Which AI tools can create dashboards from natural language?",{"type":33,"tag":34,"props":12460,"children":12461},{},[12462,12464,12470],{"type":38,"value":12463},"Bruin (via ",{"type":33,"tag":885,"props":12465,"children":12467},{"href":12466},"/dashboards/",[12468],{"type":38,"value":12469},"AI Dashboards",{"type":38,"value":12471},") lets you describe a dashboard and have it generated. ThoughtSpot generates liveboards from search queries. Hex can scaffold notebooks and apps via the Notebook Agent. Power BI Copilot can generate Power BI reports from prompts.",{"type":33,"tag":217,"props":12473,"children":12475},{"id":12474},"which-ai-tools-let-sales-and-ops-teams-ask-data-questions-in-slack",[12476],{"type":38,"value":12477},"Which AI tools let sales and ops teams ask data questions in Slack?",{"type":33,"tag":34,"props":12479,"children":12480},{},[12481],{"type":38,"value":12482},"The tools purpose-built for this are Bruin and Dot. ThoughtSpot has a Slack integration but the primary experience is still its web app. Bruin is the best fit when you also want Teams, Discord, and WhatsApp coverage for the same team.",{"type":33,"tag":217,"props":12484,"children":12486},{"id":12485},"whats-the-difference-between-an-ai-data-analyst-and-just-using-chatgpt-on-my-data",[12487],{"type":38,"value":12488},"What's the difference between an AI data analyst and just using ChatGPT on my data?",{"type":33,"tag":34,"props":12490,"children":12491},{},[12492],{"type":38,"value":12493},"Three things: governance, persistence, and scope. ChatGPT can chat with a CSV you upload, but it does not connect persistently to your warehouse, does not enforce shared metric definitions, and does not have row-level access control. An AI data analyst like Bruin connects to your live data, enforces a governed semantic layer (so \"revenue\" means the same thing for everyone), and has audit logs and permissions. ChatGPT is great for one-off exploration. It is not a team-wide self-serve solution.",{"type":33,"tag":217,"props":12495,"children":12497},{"id":12496},"what-are-the-top-alternatives-to-power-bi-for-asking-business-questions",[12498],{"type":38,"value":12499},"What are the top alternatives to Power BI for asking business questions?",{"type":33,"tag":34,"props":12501,"children":12502},{},[12503],{"type":38,"value":12504},"For a full Power BI replacement, ThoughtSpot is the closest enterprise BI replacement. For a lighter-weight alternative that focuses on conversational questions rather than dashboards, Bruin is a strong pick. Hex is a good choice if your team is analyst-heavy.",{"type":33,"tag":217,"props":12506,"children":12508},{"id":12507},"can-ai-tools-replace-traditional-bi-dashboards",[12509],{"type":38,"value":12510},"Can AI tools replace traditional BI dashboards?",{"type":33,"tag":34,"props":12512,"children":12513},{},[12514],{"type":38,"value":12515},"Partially. AI analysts replace the long tail of ad-hoc questions that previously went through a BI request queue. Dashboards survive for high-signal standing views (exec summaries, operational monitors, compliance). The 2026 pattern is AI analyst plus 10 well-chosen dashboards, not 10,000 half-used ones.",{"type":33,"tag":217,"props":12517,"children":12519},{"id":12518},"which-ai-data-analyst-tools-work-with-slack-and-also-have-an-api",[12520],{"type":38,"value":12521},"Which AI data analyst tools work with Slack and also have an API?",{"type":33,"tag":34,"props":12523,"children":12524},{},[12525],{"type":38,"value":12526},"Bruin and Seek AI are the cleanest matches. Both have Slack integration and an API. Bruin is usually the first choice for SaaS because it also covers Teams, Discord, and WhatsApp, and includes the data pipeline.",{"type":33,"tag":217,"props":12528,"children":12530},{"id":12529},"what-are-the-best-ai-analytics-tools-for-non-technical-business-teams",[12531],{"type":38,"value":12532},"What are the best AI analytics tools for non-technical business teams?",{"type":33,"tag":34,"props":12534,"children":12535},{},[12536],{"type":38,"value":12537},"For non-technical users, Bruin and Dot are the easiest because they run in Slack and Teams. There is no new app to learn. ThoughtSpot's search interface is also approachable. Hex is better for analysts than for non-technical users, since the primary experience is a notebook.",{"title":7,"searchDepth":439,"depth":439,"links":12539},[12540,12541,12551,12557,12558,12559,12564,12565,12566],{"id":11383,"depth":439,"text":11386},{"id":11427,"depth":439,"text":11430,"children":12542},[12543,12544,12545,12546,12547,12548,12549,12550],{"id":11438,"depth":633,"text":11441},{"id":11469,"depth":633,"text":11472},{"id":11500,"depth":633,"text":11503},{"id":11531,"depth":633,"text":11534},{"id":11562,"depth":633,"text":11565},{"id":11593,"depth":633,"text":11596},{"id":11624,"depth":633,"text":11627},{"id":11655,"depth":633,"text":11658},{"id":11686,"depth":439,"text":11689,"children":12552},[12553,12554,12555,12556],{"id":11697,"depth":633,"text":11700},{"id":11713,"depth":633,"text":11716},{"id":11734,"depth":633,"text":11737},{"id":11750,"depth":633,"text":11753},{"id":11766,"depth":439,"text":11769},{"id":12112,"depth":439,"text":12115},{"id":12164,"depth":439,"text":12167,"children":12560},[12561,12562,12563],{"id":12175,"depth":633,"text":12178},{"id":12186,"depth":633,"text":12189},{"id":12197,"depth":633,"text":12200},{"id":12208,"depth":439,"text":12211},{"id":12247,"depth":439,"text":12250},{"id":11127,"depth":439,"text":11130,"children":12567},[12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585],{"id":12329,"depth":633,"text":12332},{"id":12340,"depth":633,"text":12343},{"id":12351,"depth":633,"text":12354},{"id":12367,"depth":633,"text":12370},{"id":12378,"depth":633,"text":12381},{"id":12389,"depth":633,"text":12392},{"id":12400,"depth":633,"text":12403},{"id":12411,"depth":633,"text":12414},{"id":12422,"depth":633,"text":12425},{"id":12433,"depth":633,"text":12436},{"id":12444,"depth":633,"text":12447},{"id":12455,"depth":633,"text":12458},{"id":12474,"depth":633,"text":12477},{"id":12485,"depth":633,"text":12488},{"id":12496,"depth":633,"text":12499},{"id":12507,"depth":633,"text":12510},{"id":12518,"depth":633,"text":12521},{"id":12529,"depth":633,"text":12532},"content:blog:best-ai-data-analysts-saas-2026.md","blog/best-ai-data-analysts-saas-2026.md","blog/best-ai-data-analysts-saas-2026",{"_path":12590,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":12591,"description":12592,"coverImage":12593,"date":12594,"readingTime":687,"category":10661,"tags":12595,"author":12601,"body":12605,"_type":2175,"_id":13642,"_source":3930,"_file":13643,"_stem":13644,"_extension":3933},"/blog/bruin-mcp-launch","Introducing Bruin MCP: Your AI Agent's Data Toolkit","Bruin now supports the Model Context Protocol, letting AI agents in Cursor, Claude Code, and other editors query databases, ingest data, compare tables, and build pipelines—all through natural language.","/img/blog/covers/mcp-launch.png","2025-11-13",[22,16,12596,12597,12598,12599,21,12600],"Claude","Cursor","automation","developer tools","data platform",{"name":12602,"role":12603,"image":12604},"Burak Karakan","Co-founder & CEO","/img/blog/burak.jpeg",{"type":30,"children":12606,"toc":13619},[12607,12619,12624,12635,12641,12654,12659,12682,12687,12693,12698,12726,12731,12736,12741,12784,12790,12795,12805,12810,12822,12828,12847,12852,12866,12872,12877,12913,12918,12923,12928,12934,12939,12945,12958,12966,12979,12985,12999,13007,13021,13027,13032,13040,13045,13051,13064,13072,13077,13083,13088,13096,13101,13107,13112,13120,13125,13131,13136,13147,13152,13187,13201,13207,13213,13251,13257,13269,13338,13344,13356,13389,13395,13400,13431,13436,13454,13468,13474,13479,13530,13536,13548,13596,13610,13615],{"type":33,"tag":34,"props":12608,"children":12609},{},[12610,12612,12617],{"type":38,"value":12611},"We're excited to announce that ",{"type":33,"tag":885,"props":12613,"children":12615},{"href":887,"rel":12614},[889],[12616],{"type":38,"value":12261},{"type":38,"value":12618}," now supports the Model Context Protocol (MCP), bringing the full power of Bruin's data capabilities to your AI editor.",{"type":33,"tag":34,"props":12620,"children":12621},{},[12622],{"type":38,"value":12623},"With Bruin MCP, you can ask your AI agent to query databases, ingest data from dozens of sources, compare tables across environments, build complete pipelines, and more—all without leaving your editor.",{"type":33,"tag":12625,"props":12626,"children":12634},"iframe",{"width":12627,"height":12628,"src":12629,"title":12630,"frameBorder":12631,"allow":12632,"allowFullScreen":1714,"style":12633},"100%",400,"https://www.youtube.com/embed/604wuKeTP6U","Introducing Bruin MCP","0","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share","border-radius: 12px; margin: 1.5rem 0;",[],{"type":33,"tag":60,"props":12636,"children":12638},{"id":12637},"what-is-mcp",[12639],{"type":38,"value":12640},"What is MCP?",{"type":33,"tag":34,"props":12642,"children":12643},{},[12644,12645,12652],{"type":38,"value":584},{"type":33,"tag":885,"props":12646,"children":12649},{"href":12647,"rel":12648},"https://modelcontextprotocol.io/",[889],[12650],{"type":38,"value":12651},"Model Context Protocol",{"type":38,"value":12653}," is an open standard that lets AI agents interact with external tools and data sources. Think of it as a universal adapter that connects AI models to real-world systems.",{"type":33,"tag":34,"props":12655,"children":12656},{},[12657],{"type":38,"value":12658},"Rather than just generating code suggestions, MCP-enabled AI agents can:",{"type":33,"tag":135,"props":12660,"children":12661},{},[12662,12667,12672,12677],{"type":33,"tag":139,"props":12663,"children":12664},{},[12665],{"type":38,"value":12666},"Execute commands and read their output",{"type":33,"tag":139,"props":12668,"children":12669},{},[12670],{"type":38,"value":12671},"Query databases and APIs",{"type":33,"tag":139,"props":12673,"children":12674},{},[12675],{"type":38,"value":12676},"Access documentation and tool capabilities",{"type":33,"tag":139,"props":12678,"children":12679},{},[12680],{"type":38,"value":12681},"Perform multi-step workflows",{"type":33,"tag":34,"props":12683,"children":12684},{},[12685],{"type":38,"value":12686},"In short, MCP transforms AI assistants from code generators into active participants in your workflow.",{"type":33,"tag":60,"props":12688,"children":12690},{"id":12689},"why-we-built-bruin-mcp",[12691],{"type":38,"value":12692},"Why we built Bruin MCP",{"type":33,"tag":34,"props":12694,"children":12695},{},[12696],{"type":38,"value":12697},"Bruin has been built with a few design decisions in mind:",{"type":33,"tag":135,"props":12699,"children":12700},{},[12701,12706,12711,12716,12721],{"type":33,"tag":139,"props":12702,"children":12703},{},[12704],{"type":38,"value":12705},"Bruin supports Eend-to-end data pipelines, from ingestion to transformation to quality checks",{"type":33,"tag":139,"props":12707,"children":12708},{},[12709],{"type":38,"value":12710},"All the steps of the pipeline are stored as text, and can be versioned and managed as code.",{"type":33,"tag":139,"props":12712,"children":12713},{},[12714],{"type":38,"value":12715},"No UI needed, just a simple CLI tool.",{"type":33,"tag":139,"props":12717,"children":12718},{},[12719],{"type":38,"value":12720},"The CLI can run across different query engines, databases, and environments.",{"type":33,"tag":139,"props":12722,"children":12723},{},[12724],{"type":38,"value":12725},"Everything runs locally",{"type":33,"tag":34,"props":12727,"children":12728},{},[12729],{"type":38,"value":12730},"These design decisions were made to make humans productive with data. All of our tooling, product decisions, and engineering efforts are focused on increasing productivity of data teams.",{"type":33,"tag":34,"props":12732,"children":12733},{},[12734],{"type":38,"value":12735},"When the AI agents came into our lives earlier this year, it became apparent to us that the investment we made in making humans productive would also benefit the AI agents. This was a fundamental shift in our thinking. The agents would soon become our partners in productivity, and data teams would need to benefit from this as well.",{"type":33,"tag":34,"props":12737,"children":12738},{},[12739],{"type":38,"value":12740},"The fact that we built everything as code, and as a CLI tool, made it easy to bring AI agents into the game. This is why we built Bruin MCP.",{"type":33,"tag":34,"props":12742,"children":12743},{},[12744,12746,12751,12753,12759,12760,12767,12768,12775,12777,12783],{"type":38,"value":12745},"By bridging ",{"type":33,"tag":885,"props":12747,"children":12749},{"href":887,"rel":12748},[889],[12750],{"type":38,"value":12261},{"type":38,"value":12752}," with MCP-compatible editors like ",{"type":33,"tag":885,"props":12754,"children":12757},{"href":12755,"rel":12756},"https://cursor.sh/",[889],[12758],{"type":38,"value":12597},{"type":38,"value":1332},{"type":33,"tag":885,"props":12761,"children":12764},{"href":12762,"rel":12763},"https://claude.ai/",[889],[12765],{"type":38,"value":12766},"Claude Code",{"type":38,"value":12310},{"type":33,"tag":885,"props":12769,"children":12772},{"href":12770,"rel":12771},"https://codex.ai/",[889],[12773],{"type":38,"value":12774},"Codex",{"type":38,"value":12776},", we're enabling a fundamentally different way to work with data: ",{"type":33,"tag":12778,"props":12779,"children":12780},"strong",{},[12781],{"type":38,"value":12782},"conversational data engineering",{"type":38,"value":3056},{"type":33,"tag":60,"props":12785,"children":12787},{"id":12786},"should-cli-tools-even-use-mcp",[12788],{"type":38,"value":12789},"Should CLI tools even use MCP?",{"type":33,"tag":34,"props":12791,"children":12792},{},[12793],{"type":38,"value":12794},"In its core, MCP is a simple protocol: it exposes tools, and AI agents call these tools. The idea is that external systems would have their own MCP servers, and the AI agents would interact with these systems without having to navigate UI, or learn new commands.",{"type":33,"tag":34,"props":12796,"children":12797},{},[12798,12800],{"type":38,"value":12799},"While this abstraction might work for some, we ran into a fundamental question: ",{"type":33,"tag":12778,"props":12801,"children":12802},{},[12803],{"type":38,"value":12804},"does MCP even make sense for CLI tools?",{"type":33,"tag":34,"props":12806,"children":12807},{},[12808],{"type":38,"value":12809},"Think about it for a minute: CLI tools are designed to be executed in a terminal, and the output is typically text. The AI agents are really good at understanding text, and executing shell commands. Why do we need MCP for CLI tools?",{"type":33,"tag":34,"props":12811,"children":12812},{},[12813,12815,12820],{"type":38,"value":12814},"There's another challenge: ",{"type":33,"tag":885,"props":12816,"children":12818},{"href":887,"rel":12817},[889],[12819],{"type":38,"value":12261},{"type":38,"value":12821}," has quite a lot of functionality, which means that for all of our high-level commands, as well as their subcommands, we would need to implement separate tools. This would be a lot of work, and would also fill the context window of the AI agents quickly.",{"type":33,"tag":60,"props":12823,"children":12825},{"id":12824},"mcp-or-not-mcp",[12826],{"type":38,"value":12827},"MCP-or-not-MCP?",{"type":33,"tag":34,"props":12829,"children":12830},{},[12831,12833,12838,12840,12845],{"type":38,"value":12832},"Our first version of making AI agents use ",{"type":33,"tag":885,"props":12834,"children":12836},{"href":887,"rel":12835},[889],[12837],{"type":38,"value":12261},{"type":38,"value":12839}," was to use the ",{"type":33,"tag":155,"props":12841,"children":12843},{"className":12842},[],[12844],{"type":38,"value":3459},{"type":38,"value":12846}," files. In these files, we would manually describe a few Bruin CLI commands, and how to use them. This was a quick and dirty way to get started, which allowed us to bring AI into Bruin workflows quickly. While this worked nicely, this meant that every command would need to be manually described, and the AI agents would need to learn the syntax of the commands. This was not fit for going to production.",{"type":33,"tag":34,"props":12848,"children":12849},{},[12850],{"type":38,"value":12851},"While playing around with different AI agents, an idea popped into our heads: AI agents are really good at navigating files and directories, and executing commands in a terminal. Why not use this to our advantage?",{"type":33,"tag":34,"props":12853,"children":12854},{},[12855,12857,12864],{"type":38,"value":12856},"We have a ",{"type":33,"tag":885,"props":12858,"children":12861},{"href":12859,"rel":12860},"https://getbruin.com/docs/bruin/",[889],[12862],{"type":38,"value":12863},"decent documentation",{"type":38,"value":12865}," for our CLI, and the documentation is already in markdown format. Why not use this to our advantage? Could we make the MCP server read the documentation, and execute the commands based on the documentation?",{"type":33,"tag":60,"props":12867,"children":12869},{"id":12868},"a-creative-way-to-use-mcp",[12870],{"type":38,"value":12871},"A creative way to use MCP",{"type":33,"tag":34,"props":12873,"children":12874},{},[12875],{"type":38,"value":12876},"This thought process led us to the current design of Bruin MCP, which consists of 3 simple tools:",{"type":33,"tag":135,"props":12878,"children":12879},{},[12880,12891,12902],{"type":33,"tag":139,"props":12881,"children":12882},{},[12883,12889],{"type":33,"tag":155,"props":12884,"children":12886},{"className":12885},[],[12887],{"type":38,"value":12888},"bruin_get_overview",{"type":38,"value":12890},": Tell the agent the basics of Bruin, what it does, and how to use it.",{"type":33,"tag":139,"props":12892,"children":12893},{},[12894,12900],{"type":33,"tag":155,"props":12895,"children":12897},{"className":12896},[],[12898],{"type":38,"value":12899},"bruin_get_docs_tree",{"type":38,"value":12901},": Get the tree of the documentation, and the commands available.",{"type":33,"tag":139,"props":12903,"children":12904},{},[12905,12911],{"type":33,"tag":155,"props":12906,"children":12908},{"className":12907},[],[12909],{"type":38,"value":12910},"bruin_get_doc_content",{"type":38,"value":12912},": Read the content of a specific documentation file.",{"type":33,"tag":34,"props":12914,"children":12915},{},[12916],{"type":38,"value":12917},"This means that the AI agent can navigate the documentation by itself, and execute the CLI commands based on the documentation using the shell.",{"type":33,"tag":34,"props":12919,"children":12920},{},[12921],{"type":38,"value":12922},"The beauty of this approach is that it is incredibly simple, flexible, and very easy to maintain. Every new feature we document is automatically available to the AI agent. Any agent that can call tools can immediately start using Bruin MCP. All without us having to maintain a separate tool for each command.",{"type":33,"tag":34,"props":12924,"children":12925},{},[12926],{"type":38,"value":12927},"This is more of an opinionated approach, and we're open to feedback on this. At this point, it feels like MCP servers does not really make much sense for CLI tools, other than just exposing documentation about the tool itself.",{"type":33,"tag":60,"props":12929,"children":12931},{"id":12930},"what-you-can-do-with-bruin-mcp",[12932],{"type":38,"value":12933},"What you can do with Bruin MCP",{"type":33,"tag":34,"props":12935,"children":12936},{},[12937],{"type":38,"value":12938},"Bruin allows you to build end-to-end pipelines, which means any data engineering task you have can be (partially?) automated with AI agents using Bruin MCP.",{"type":33,"tag":217,"props":12940,"children":12942},{"id":12941},"_1-query-any-database",[12943],{"type":38,"value":12944},"1. Query any database",{"type":33,"tag":34,"props":12946,"children":12947},{},[12948,12950,12957],{"type":38,"value":12949},"Ask your AI agent to run SQL queries across PostgreSQL, BigQuery, Snowflake, DuckDB, and ",{"type":33,"tag":885,"props":12951,"children":12954},{"href":12952,"rel":12953},"https://getbruin.com/docs/bruin/#supported-platforms",[889],[12955],{"type":38,"value":12956},"many more platforms",{"type":38,"value":2434},{"type":33,"tag":10767,"props":12959,"children":12960},{},[12961],{"type":33,"tag":34,"props":12962,"children":12963},{},[12964],{"type":38,"value":12965},"\"What's the total revenue by product category this quarter?\"",{"type":33,"tag":34,"props":12967,"children":12968},{},[12969,12971,12977],{"type":38,"value":12970},"Your AI agent connects to your configured databases, runs the query, and shows you the results—no context switching required. It uses ",{"type":33,"tag":155,"props":12972,"children":12974},{"className":12973},[],[12975],{"type":38,"value":12976},"bruin query",{"type":38,"value":12978}," commands to run queries using the pre-configured connections you have defined.",{"type":33,"tag":217,"props":12980,"children":12982},{"id":12981},"_2-ingest-data-from-anywhere",[12983],{"type":38,"value":12984},"2. Ingest data from anywhere",{"type":33,"tag":34,"props":12986,"children":12987},{},[12988,12990,12997],{"type":38,"value":12989},"Bruin supports ",{"type":33,"tag":885,"props":12991,"children":12994},{"href":12992,"rel":12993},"https://getbruin.com/docs/bruin/ingestion/overview.html",[889],[12995],{"type":38,"value":12996},"60+ data sources",{"type":38,"value":12998}," through our open-source ingestion framework. With MCP, you can trigger ingestion with plain English:",{"type":33,"tag":10767,"props":13000,"children":13001},{},[13002],{"type":33,"tag":34,"props":13003,"children":13004},{},[13005],{"type":38,"value":13006},"\"Bring all my Shopify order data from last week into BigQuery.\"",{"type":33,"tag":34,"props":13008,"children":13009},{},[13010,13012,13019],{"type":38,"value":13011},"The AI agent writes the ingestion config, executes it, and confirms when the data is loaded. What used to take 30 minutes of reading docs and writing config now takes 30 seconds of typing a sentence. It uses ",{"type":33,"tag":885,"props":13013,"children":13016},{"href":13014,"rel":13015},"https://getbruin.com/docs/bruin/assets/ingestr.html#ingestr-assets",[889],[13017],{"type":38,"value":13018},"ingestr assets",{"type":38,"value":13020}," for Shopify, Stripe, Google Sheets, and many more sources.",{"type":33,"tag":217,"props":13022,"children":13024},{"id":13023},"_3-update-your-sql-data-assets",[13025],{"type":38,"value":13026},"3. Update your SQL data assets",{"type":33,"tag":34,"props":13028,"children":13029},{},[13030],{"type":38,"value":13031},"Bruin allows you to define your SQL data assets as code, and version them. With MCP, you can update the SQL data assets with plain English:",{"type":33,"tag":10767,"props":13033,"children":13034},{},[13035],{"type":33,"tag":34,"props":13036,"children":13037},{},[13038],{"type":38,"value":13039},"\"Update the users table to add a new column for the user's phone number, and set it to required.\"",{"type":33,"tag":34,"props":13041,"children":13042},{},[13043],{"type":38,"value":13044},"The AI agent updates the SQL data asset, and confirms when the data is loaded.",{"type":33,"tag":217,"props":13046,"children":13048},{"id":13047},"_4-compare-tables-across-environments",[13049],{"type":38,"value":13050},"4. Compare tables across environments",{"type":33,"tag":34,"props":13052,"children":13053},{},[13054,13056,13062],{"type":38,"value":13055},"One of the hardest parts of data pipeline development is validating that your changes produce the correct output. Bruin's built-in ",{"type":33,"tag":155,"props":13057,"children":13059},{"className":13058},[],[13060],{"type":38,"value":13061},"data-diff",{"type":38,"value":13063}," command makes this easy, and MCP makes it trivial:",{"type":33,"tag":10767,"props":13065,"children":13066},{},[13067],{"type":33,"tag":34,"props":13068,"children":13069},{},[13070],{"type":38,"value":13071},"\"Compare the users table between dev and prod.\"",{"type":33,"tag":34,"props":13073,"children":13074},{},[13075],{"type":38,"value":13076},"The AI agent runs the comparison, highlights differences, and helps you diagnose discrepancies—all in a conversational thread.",{"type":33,"tag":217,"props":13078,"children":13080},{"id":13079},"_5-build-complete-pipelines",[13081],{"type":38,"value":13082},"5. Build complete pipelines",{"type":33,"tag":34,"props":13084,"children":13085},{},[13086],{"type":38,"value":13087},"Bruin MCP has access to up-to-date Bruin documentation, meaning your AI agent can scaffold entire pipelines based on best practices:",{"type":33,"tag":10767,"props":13089,"children":13090},{},[13091],{"type":33,"tag":34,"props":13092,"children":13093},{},[13094],{"type":38,"value":13095},"\"Create a pipeline that ingests Stripe data daily, calculates MRR by plan, and runs freshness checks.\"",{"type":33,"tag":34,"props":13097,"children":13098},{},[13099],{"type":38,"value":13100},"The agent creates the pipeline structure, writes SQL transformations, adds quality checks, and even suggests materialization strategies—then validates the pipeline before you run it.",{"type":33,"tag":217,"props":13102,"children":13104},{"id":13103},"_6-get-instant-documentation-help",[13105],{"type":38,"value":13106},"6. Get instant documentation help",{"type":33,"tag":34,"props":13108,"children":13109},{},[13110],{"type":38,"value":13111},"No more switching to a browser to search docs:",{"type":33,"tag":10767,"props":13113,"children":13114},{},[13115],{"type":33,"tag":34,"props":13116,"children":13117},{},[13118],{"type":38,"value":13119},"\"How do I set up a Snowflake connection in Bruin?\"",{"type":33,"tag":34,"props":13121,"children":13122},{},[13123],{"type":38,"value":13124},"The AI agent fetches the relevant documentation, shows you the configuration format, and can even add the connection for you if you provide credentials.",{"type":33,"tag":60,"props":13126,"children":13128},{"id":13127},"how-to-get-started",[13129],{"type":38,"value":13130},"How to get started",{"type":33,"tag":34,"props":13132,"children":13133},{},[13134],{"type":38,"value":13135},"Setting up Bruin MCP takes less than a minute.",{"type":33,"tag":217,"props":13137,"children":13139},{"id":13138},"step-1-install-bruin-cli",[13140,13142],{"type":38,"value":13141},"Step 1: Install ",{"type":33,"tag":885,"props":13143,"children":13145},{"href":887,"rel":13144},[889],[13146],{"type":38,"value":12261},{"type":33,"tag":34,"props":13148,"children":13149},{},[13150],{"type":38,"value":13151},"If you haven't already:",{"type":33,"tag":400,"props":13153,"children":13155},{"className":402,"code":13154,"language":404,"meta":7,"style":7},"curl -LsSf https://getbruin.com/install/cli | sh\n",[13156],{"type":33,"tag":155,"props":13157,"children":13158},{"__ignoreMap":7},[13159],{"type":33,"tag":410,"props":13160,"children":13161},{"class":412,"line":413},[13162,13167,13172,13177,13182],{"type":33,"tag":410,"props":13163,"children":13164},{"style":417},[13165],{"type":38,"value":13166},"curl",{"type":33,"tag":410,"props":13168,"children":13169},{"style":443},[13170],{"type":38,"value":13171}," -LsSf",{"type":33,"tag":410,"props":13173,"children":13174},{"style":423},[13175],{"type":38,"value":13176}," https://getbruin.com/install/cli",{"type":33,"tag":410,"props":13178,"children":13179},{"style":3033},[13180],{"type":38,"value":13181}," |",{"type":33,"tag":410,"props":13183,"children":13184},{"style":417},[13185],{"type":38,"value":13186}," sh\n",{"type":33,"tag":34,"props":13188,"children":13189},{},[13190,13192,13199],{"type":38,"value":13191},"Or follow the ",{"type":33,"tag":885,"props":13193,"children":13196},{"href":13194,"rel":13195},"https://getbruin.com/docs/bruin/getting-started/introduction/installation.html",[889],[13197],{"type":38,"value":13198},"installation guide",{"type":38,"value":13200}," for other platforms.",{"type":33,"tag":217,"props":13202,"children":13204},{"id":13203},"step-2-configure-your-editor",[13205],{"type":38,"value":13206},"Step 2: Configure Your Editor",{"type":33,"tag":393,"props":13208,"children":13210},{"id":13209},"for-claude-code",[13211],{"type":38,"value":13212},"For Claude Code:",{"type":33,"tag":400,"props":13214,"children":13216},{"className":402,"code":13215,"language":404,"meta":7,"style":7},"claude mcp add bruin -- bruin mcp\n",[13217],{"type":33,"tag":155,"props":13218,"children":13219},{"__ignoreMap":7},[13220],{"type":33,"tag":410,"props":13221,"children":13222},{"class":412,"line":413},[13223,13227,13231,13235,13239,13243,13247],{"type":33,"tag":410,"props":13224,"children":13225},{"style":417},[13226],{"type":38,"value":2370},{"type":33,"tag":410,"props":13228,"children":13229},{"style":423},[13230],{"type":38,"value":2375},{"type":33,"tag":410,"props":13232,"children":13233},{"style":423},[13234],{"type":38,"value":480},{"type":33,"tag":410,"props":13236,"children":13237},{"style":423},[13238],{"type":38,"value":2384},{"type":33,"tag":410,"props":13240,"children":13241},{"style":443},[13242],{"type":38,"value":2389},{"type":33,"tag":410,"props":13244,"children":13245},{"style":423},[13246],{"type":38,"value":2384},{"type":33,"tag":410,"props":13248,"children":13249},{"style":423},[13250],{"type":38,"value":2398},{"type":33,"tag":393,"props":13252,"children":13254},{"id":13253},"for-cursor-ide",[13255],{"type":38,"value":13256},"For Cursor IDE:",{"type":33,"tag":34,"props":13258,"children":13259},{},[13260,13262,13267],{"type":38,"value":13261},"Go to ",{"type":33,"tag":12778,"props":13263,"children":13264},{},[13265],{"type":38,"value":13266},"Settings → MCP & Integrations → Add Custom MCP",{"type":38,"value":13268}," and add:",{"type":33,"tag":400,"props":13270,"children":13274},{"className":13271,"code":13272,"language":13273,"meta":7,"style":7},"language-json shiki shiki-themes github-dark","{\n  \"mcpServers\": {\n    \"bruin\": {\n      \"command\": \"bruin\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n","json",[13275],{"type":33,"tag":155,"props":13276,"children":13277},{"__ignoreMap":7},[13278,13285,13293,13301,13309,13317,13324,13331],{"type":33,"tag":410,"props":13279,"children":13280},{"class":412,"line":413},[13281],{"type":33,"tag":410,"props":13282,"children":13283},{},[13284],{"type":38,"value":2421},{"type":33,"tag":410,"props":13286,"children":13287},{"class":412,"line":439},[13288],{"type":33,"tag":410,"props":13289,"children":13290},{},[13291],{"type":38,"value":13292},"  \"mcpServers\": {\n",{"type":33,"tag":410,"props":13294,"children":13295},{"class":412,"line":633},[13296],{"type":33,"tag":410,"props":13297,"children":13298},{},[13299],{"type":38,"value":13300},"    \"bruin\": {\n",{"type":33,"tag":410,"props":13302,"children":13303},{"class":412,"line":651},[13304],{"type":33,"tag":410,"props":13305,"children":13306},{},[13307],{"type":38,"value":13308},"      \"command\": \"bruin\",\n",{"type":33,"tag":410,"props":13310,"children":13311},{"class":412,"line":665},[13312],{"type":33,"tag":410,"props":13313,"children":13314},{},[13315],{"type":38,"value":13316},"      \"args\": [\"mcp\"]\n",{"type":33,"tag":410,"props":13318,"children":13319},{"class":412,"line":687},[13320],{"type":33,"tag":410,"props":13321,"children":13322},{},[13323],{"type":38,"value":2506},{"type":33,"tag":410,"props":13325,"children":13326},{"class":412,"line":705},[13327],{"type":33,"tag":410,"props":13328,"children":13329},{},[13330],{"type":38,"value":2514},{"type":33,"tag":410,"props":13332,"children":13333},{"class":412,"line":726},[13334],{"type":33,"tag":410,"props":13335,"children":13336},{},[13337],{"type":38,"value":2522},{"type":33,"tag":393,"props":13339,"children":13341},{"id":13340},"for-codex-cli",[13342],{"type":38,"value":13343},"For Codex CLI:",{"type":33,"tag":34,"props":13345,"children":13346},{},[13347,13349,13355],{"type":38,"value":13348},"Add to ",{"type":33,"tag":155,"props":13350,"children":13352},{"className":13351},[],[13353],{"type":38,"value":13354},"~/.codex/config.toml",{"type":38,"value":2434},{"type":33,"tag":400,"props":13357,"children":13361},{"className":13358,"code":13359,"language":13360,"meta":7,"style":7},"language-toml shiki shiki-themes github-dark","[mcp_servers.bruin]\ncommand = \"bruin\"\nargs = [\"mcp\"]\n","toml",[13362],{"type":33,"tag":155,"props":13363,"children":13364},{"__ignoreMap":7},[13365,13373,13381],{"type":33,"tag":410,"props":13366,"children":13367},{"class":412,"line":413},[13368],{"type":33,"tag":410,"props":13369,"children":13370},{},[13371],{"type":38,"value":13372},"[mcp_servers.bruin]\n",{"type":33,"tag":410,"props":13374,"children":13375},{"class":412,"line":439},[13376],{"type":33,"tag":410,"props":13377,"children":13378},{},[13379],{"type":38,"value":13380},"command = \"bruin\"\n",{"type":33,"tag":410,"props":13382,"children":13383},{"class":412,"line":633},[13384],{"type":33,"tag":410,"props":13385,"children":13386},{},[13387],{"type":38,"value":13388},"args = [\"mcp\"]\n",{"type":33,"tag":217,"props":13390,"children":13392},{"id":13391},"step-3-start-building",[13393],{"type":38,"value":13394},"Step 3: Start Building",{"type":33,"tag":34,"props":13396,"children":13397},{},[13398],{"type":38,"value":13399},"Initialize a Bruin project (or use an existing one):",{"type":33,"tag":400,"props":13401,"children":13403},{"className":402,"code":13402,"language":404,"meta":7,"style":7},"bruin init\ncd my-project\n",[13404],{"type":33,"tag":155,"props":13405,"children":13406},{"__ignoreMap":7},[13407,13419],{"type":33,"tag":410,"props":13408,"children":13409},{"class":412,"line":413},[13410,13414],{"type":33,"tag":410,"props":13411,"children":13412},{"style":417},[13413],{"type":38,"value":420},{"type":33,"tag":410,"props":13415,"children":13416},{"style":423},[13417],{"type":38,"value":13418}," init\n",{"type":33,"tag":410,"props":13420,"children":13421},{"class":412,"line":439},[13422,13426],{"type":33,"tag":410,"props":13423,"children":13424},{"style":443},[13425],{"type":38,"value":446},{"type":33,"tag":410,"props":13427,"children":13428},{"style":423},[13429],{"type":38,"value":13430}," my-project\n",{"type":33,"tag":34,"props":13432,"children":13433},{},[13434],{"type":38,"value":13435},"Now you can ask your AI agent anything:",{"type":33,"tag":135,"props":13437,"children":13438},{},[13439,13444,13449],{"type":33,"tag":139,"props":13440,"children":13441},{},[13442],{"type":38,"value":13443},"\"Connect to my Postgres database and show me the schema.\"",{"type":33,"tag":139,"props":13445,"children":13446},{},[13447],{"type":38,"value":13448},"\"Ingest Firebase events into DuckDB.\"",{"type":33,"tag":139,"props":13450,"children":13451},{},[13452],{"type":38,"value":13453},"\"Build a pipeline that transforms this raw data into a clean users table.\"",{"type":33,"tag":34,"props":13455,"children":13456},{},[13457,13459,13466],{"type":38,"value":13458},"Check out the ",{"type":33,"tag":885,"props":13460,"children":13463},{"href":13461,"rel":13462},"https://getbruin.com/docs/bruin/getting-started/bruin-mcp.html",[889],[13464],{"type":38,"value":13465},"full documentation",{"type":38,"value":13467}," for more examples and setup details.",{"type":33,"tag":60,"props":13469,"children":13471},{"id":13470},"whats-next",[13472],{"type":38,"value":13473},"What's Next",{"type":33,"tag":34,"props":13475,"children":13476},{},[13477],{"type":38,"value":13478},"Bruin MCP is just the beginning. We're exploring:",{"type":33,"tag":135,"props":13480,"children":13481},{},[13482,13492,13520],{"type":33,"tag":139,"props":13483,"children":13484},{},[13485,13490],{"type":33,"tag":12778,"props":13486,"children":13487},{},[13488],{"type":38,"value":13489},"Background agents",{"type":38,"value":13491},": Agents that run in the background, and can be triggered by events, such as Slack messages.",{"type":33,"tag":139,"props":13493,"children":13494},{},[13495,13500,13502,13507,13508,13513,13514,13519],{"type":33,"tag":12778,"props":13496,"children":13497},{},[13498],{"type":38,"value":13499},"Better integration with AI agents",{"type":38,"value":13501},": We're working on better integration with AI agents, such as ",{"type":33,"tag":885,"props":13503,"children":13505},{"href":12755,"rel":13504},[889],[13506],{"type":38,"value":12597},{"type":38,"value":1332},{"type":33,"tag":885,"props":13509,"children":13511},{"href":12762,"rel":13510},[889],[13512],{"type":38,"value":12766},{"type":38,"value":12310},{"type":33,"tag":885,"props":13515,"children":13517},{"href":12770,"rel":13516},[889],[13518],{"type":38,"value":12774},{"type":38,"value":3056},{"type":33,"tag":139,"props":13521,"children":13522},{},[13523,13528],{"type":33,"tag":12778,"props":13524,"children":13525},{},[13526],{"type":38,"value":13527},"Isolated development environments",{"type":38,"value":13529},": We're working on isolated development environments on your database that can be used to test and validate data pipelines in isolation. This way, you can run your AI agents in a safe environment, and not worry about breaking your production database.",{"type":33,"tag":60,"props":13531,"children":13533},{"id":13532},"try-it-today",[13534],{"type":38,"value":13535},"Try It Today",{"type":33,"tag":34,"props":13537,"children":13538},{},[13539,13541,13546],{"type":38,"value":13540},"Bruin MCP is available now, completely free and open source. Install ",{"type":33,"tag":885,"props":13542,"children":13544},{"href":887,"rel":13543},[889],[13545],{"type":38,"value":12261},{"type":38,"value":13547},", configure your editor, and start building data workflows through conversation.",{"type":33,"tag":135,"props":13549,"children":13550},{},[13551,13566,13580],{"type":33,"tag":139,"props":13552,"children":13553},{},[13554,13559,13560],{"type":33,"tag":12778,"props":13555,"children":13556},{},[13557],{"type":38,"value":13558},"Documentation",{"type":38,"value":625},{"type":33,"tag":885,"props":13561,"children":13563},{"href":13461,"rel":13562},[889],[13564],{"type":38,"value":13565},"getbruin.com/docs/bruin/getting-started/bruin-mcp.html",{"type":33,"tag":139,"props":13567,"children":13568},{},[13569,13574,13575],{"type":33,"tag":12778,"props":13570,"children":13571},{},[13572],{"type":38,"value":13573},"GitHub",{"type":38,"value":625},{"type":33,"tag":885,"props":13576,"children":13578},{"href":887,"rel":13577},[889],[13579],{"type":38,"value":892},{"type":33,"tag":139,"props":13581,"children":13582},{},[13583,13588,13589],{"type":33,"tag":12778,"props":13584,"children":13585},{},[13586],{"type":38,"value":13587},"Community",{"type":38,"value":625},{"type":33,"tag":885,"props":13590,"children":13593},{"href":13591,"rel":13592},"https://join.slack.com/t/bruindatacommunity/shared_invite/zt-2dl2i8foy-bVsuMUauHeN9M2laVm3ZVg",[889],[13594],{"type":38,"value":13595},"Join our Slack",{"type":33,"tag":34,"props":13597,"children":13598},{},[13599,13601,13608],{"type":38,"value":13600},"We'd love to hear your feedback. What workflows do you want to automate? What could your AI agent do better? Let us know by ",{"type":33,"tag":885,"props":13602,"children":13605},{"href":13603,"rel":13604},"https://github.com/bruin-data/bruin/issues/new",[889],[13606],{"type":38,"value":13607},"opening an issue",{"type":38,"value":13609}," or joining the conversation in Slack.",{"type":33,"tag":34,"props":13611,"children":13612},{},[13613],{"type":38,"value":13614},"Happy building!",{"type":33,"tag":3892,"props":13616,"children":13617},{},[13618],{"type":38,"value":3896},{"title":7,"searchDepth":439,"depth":439,"links":13620},[13621,13622,13623,13624,13625,13626,13634,13640,13641],{"id":12637,"depth":439,"text":12640},{"id":12689,"depth":439,"text":12692},{"id":12786,"depth":439,"text":12789},{"id":12824,"depth":439,"text":12827},{"id":12868,"depth":439,"text":12871},{"id":12930,"depth":439,"text":12933,"children":13627},[13628,13629,13630,13631,13632,13633],{"id":12941,"depth":633,"text":12944},{"id":12981,"depth":633,"text":12984},{"id":13023,"depth":633,"text":13026},{"id":13047,"depth":633,"text":13050},{"id":13079,"depth":633,"text":13082},{"id":13103,"depth":633,"text":13106},{"id":13127,"depth":439,"text":13130,"children":13635},[13636,13638,13639],{"id":13138,"depth":633,"text":13637},"Step 1: Install Bruin CLI",{"id":13203,"depth":633,"text":13206},{"id":13391,"depth":633,"text":13394},{"id":13470,"depth":439,"text":13473},{"id":13532,"depth":439,"text":13535},"content:blog:bruin-mcp-launch.md","blog/bruin-mcp-launch.md","blog/bruin-mcp-launch",1776781623493]