{"id":35,"date":"2025-06-20T08:49:14","date_gmt":"2025-06-20T08:49:14","guid":{"rendered":"https:\/\/dataopsschool.com\/blog\/?p=35"},"modified":"2025-06-20T09:29:20","modified_gmt":"2025-06-20T09:29:20","slug":"data-observability-in-devsecops","status":"publish","type":"post","link":"https:\/\/dataopsschool.com\/blog\/data-observability-in-devsecops\/","title":{"rendered":"Data Observability in DevSecOps"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><strong>1. Introduction &amp; Overview<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">What is Data Observability?<\/h3>\n\n\n\n<p><strong>Data Observability<\/strong> is the ability to fully understand the health, lineage, and performance of data across your infrastructure. In a DevSecOps context, it ensures that data pipelines are trustworthy, auditable, and compliant\u2014especially critical when automating deployments, ensuring security, and meeting regulatory requirements.<\/p>\n\n\n\n<p>Data observability incorporates:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Monitoring<\/strong><\/li>\n\n\n\n<li><strong>Alerting<\/strong><\/li>\n\n\n\n<li><strong>Logging<\/strong><\/li>\n\n\n\n<li><strong>Tracing<\/strong><\/li>\n\n\n\n<li><strong>Data lineage &amp; quality checks<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1358\/1*ULM9y7urLpmuEAqGFupZNg.png\" alt=\"\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">History or Background<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Origin<\/strong>: Coined around 2020, evolving from the need to apply software observability concepts (logs, metrics, traces) to <strong>data pipelines and data assets<\/strong>.<\/li>\n\n\n\n<li><strong>Drivers<\/strong>: Rise in data-driven decision-making, GDPR\/CCPA regulations, ML\/AI use-cases, and cloud-native architectures.<\/li>\n\n\n\n<li><strong>Tools that popularized it<\/strong>: Monte Carlo, Databand (IBM), Acceldata, OpenLineage, and Apache Airflow.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Why is it Relevant in DevSecOps?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Security<\/strong>: Detect unauthorized data access or anomalies in real-time.<\/li>\n\n\n\n<li><strong>Compliance<\/strong>: Ensure traceability and audit trails for regulations (e.g., HIPAA, SOC 2).<\/li>\n\n\n\n<li><strong>Automation<\/strong>: Prevent deployment of broken data pipelines in CI\/CD workflows.<\/li>\n\n\n\n<li><strong>Reliability<\/strong>: Early detection of broken jobs, schema changes, and failed ETLs.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Core Concepts &amp; Terminology<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Key Terms<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Definition<\/th><\/tr><\/thead><tbody><tr><td><strong>Data Lineage<\/strong><\/td><td>The path that data follows as it moves through the system.<\/td><\/tr><tr><td><strong>Data Quality<\/strong><\/td><td>Accuracy, completeness, consistency, and validity of data.<\/td><\/tr><tr><td><strong>Data Freshness<\/strong><\/td><td>Timeliness of data availability.<\/td><\/tr><tr><td><strong>Anomaly Detection<\/strong><\/td><td>Identifying unusual patterns or outliers in datasets.<\/td><\/tr><tr><td><strong>Schema Drift<\/strong><\/td><td>Changes in structure of the data that can break pipelines.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">How It Fits into the DevSecOps Lifecycle<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>DevSecOps Phase<\/th><th>Data Observability Role<\/th><\/tr><\/thead><tbody><tr><td><strong>Plan<\/strong><\/td><td>Identify data dependencies and governance risks.<\/td><\/tr><tr><td><strong>Develop<\/strong><\/td><td>Monitor dataset versions and changes during development.<\/td><\/tr><tr><td><strong>Build<\/strong><\/td><td>Integrate checks into CI\/CD pipelines (e.g., failing builds with broken data).<\/td><\/tr><tr><td><strong>Test<\/strong><\/td><td>Run automated data validation tests.<\/td><\/tr><tr><td><strong>Release<\/strong><\/td><td>Tag datasets with metadata before promotion.<\/td><\/tr><tr><td><strong>Operate<\/strong><\/td><td>Continuously monitor pipelines for freshness, lineage, and anomalies.<\/td><\/tr><tr><td><strong>Monitor<\/strong><\/td><td>Real-time alerting and dashboards for SLA\/SLO compliance.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Architecture &amp; How It Works<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Components<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Data Collectors<\/strong> \u2013 Agents that track metadata, logs, and metrics from pipelines (e.g., Airflow, Spark).<\/li>\n\n\n\n<li><strong>Metadata Store<\/strong> \u2013 Stores information like schema, freshness, and lineage.<\/li>\n\n\n\n<li><strong>Monitoring Engine<\/strong> \u2013 Detects anomalies, schema changes, and freshness issues.<\/li>\n\n\n\n<li><strong>Alerting &amp; Dashboard Layer<\/strong> \u2013 Notifies users through Slack, PagerDuty, etc.<\/li>\n\n\n\n<li><strong>APIs \/ CI Integrations<\/strong> \u2013 Hooks for GitHub Actions, GitLab CI, Jenkins, etc.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/icedq.com\/wp-content\/uploads\/2024\/08\/Data-Observability-Explained-iceDQ.png\" alt=\"\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Internal Workflow<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Ingest Metadata<\/strong>: Collect data pipeline logs, schema snapshots, and job runtimes.<\/li>\n\n\n\n<li><strong>Analyze<\/strong>: Apply statistical models to determine data health.<\/li>\n\n\n\n<li><strong>Visualize<\/strong>: Show DAGs, lineage graphs, and health indicators.<\/li>\n\n\n\n<li><strong>Alert<\/strong>: Raise notifications for data downtime or corruption.<\/li>\n\n\n\n<li><strong>Remediate<\/strong>: Trigger rollbacks or hold CI\/CD releases.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Architecture Diagram (Descriptive)<\/h3>\n\n\n\n<p>Imagine a layered architecture:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n          \u2502     CI\/CD Pipeline       \u2502\n          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                   \u2502\n          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n          \u2502 Data Observability API \u2502\n          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                   \u2502    \u2502\n        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n        \u25bc                           \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Metadata DB\u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 Data Collectors \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518             \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n        \u2502                           \u25b2\n        \u25bc                           \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Monitoring \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502 Airflow\/Spark Logs \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518             \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n        \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Alerting UI\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Integration Points with CI\/CD or Cloud Tools<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CI\/CD Integration<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Jenkins: Fail builds if pipeline health checks fail.<\/li>\n\n\n\n<li>GitHub Actions: Pre-deployment checks for schema drift.<\/li>\n\n\n\n<li>GitLab CI: Use custom scripts to validate datasets.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Cloud Platforms<\/strong>:\n<ul class=\"wp-block-list\">\n<li>AWS Glue, S3, Redshift<\/li>\n\n\n\n<li>GCP BigQuery, Cloud Composer<\/li>\n\n\n\n<li>Azure Data Factory, Synapse<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. Installation &amp; Getting Started<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Basic Setup or Prerequisites<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Python 3.8+<\/li>\n\n\n\n<li>Apache Airflow or Spark (optional)<\/li>\n\n\n\n<li>Postgres\/MySQL for metadata store<\/li>\n\n\n\n<li>Cloud storage or warehouse (S3, BigQuery, etc.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hands-On: Step-by-Step Setup (Using Open Source Tools)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1: Install Great Expectations<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install great_expectations\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2: Initialize a Project<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>great_expectations init\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Step 3: Create Expectations<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>great_expectations suite new\n<\/code><\/pre>\n\n\n\n<p>Follow the CLI to define:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Null checks<\/li>\n\n\n\n<li>Range checks<\/li>\n\n\n\n<li>Uniqueness constraints<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Step 4: Integrate with CI (GitHub Actions)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># .github\/workflows\/data-quality.yml\nname: Data Quality\n\non: &#091;push]\n\njobs:\n  validate:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v2\n    - name: Setup Python\n      uses: actions\/setup-python@v2\n    - name: Install Dependencies\n      run: pip install great_expectations\n    - name: Run Data Quality Checks\n      run: great_expectations checkpoint run my_checkpoint\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5. Real-World Use Cases<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Use Case 1: Preventing Deployment of Broken Pipelines<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tool: Monte Carlo + GitLab CI<\/li>\n\n\n\n<li>Result: Blocked release when schema mismatch detected between staging and prod<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Use Case 2: Compliance Reporting in Financial Sector<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tool: Acceldata<\/li>\n\n\n\n<li>Use: Track lineage for audit logs<\/li>\n\n\n\n<li>Compliance: SOX, GDPR<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Use Case 3: Monitoring Machine Learning Feature Stores<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tool: WhyLabs<\/li>\n\n\n\n<li>Detects drift in real-time ML input features<\/li>\n\n\n\n<li>Ensures reliability of production ML models<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Use Case 4: Healthcare Data Accuracy<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tool: Great Expectations<\/li>\n\n\n\n<li>Use: Validate EHR datasets against compliance rules<\/li>\n\n\n\n<li>Industry: Healthcare (HIPAA-bound)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>6. Benefits &amp; Limitations<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Benefits<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Early detection of data issues<\/li>\n\n\n\n<li>Improved trust in data-driven decisions<\/li>\n\n\n\n<li>Compliance-ready audit trails<\/li>\n\n\n\n<li>Facilitates DevSecOps automation<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Limitations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>False positives in anomaly detection<\/li>\n\n\n\n<li>Overhead in maintaining expectations<\/li>\n\n\n\n<li>Requires domain knowledge for meaningful alerts<\/li>\n\n\n\n<li>Tooling maturity still evolving in open-source space<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7. Best Practices &amp; Recommendations<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Security Tips<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Secure metadata stores with RBAC<\/li>\n\n\n\n<li>Encrypt logs and lineage information<\/li>\n\n\n\n<li>Audit access to observability dashboards<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance &amp; Maintenance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use sampling for large datasets<\/li>\n\n\n\n<li>Automate expectation updates with version control<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Compliance Alignment<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Store historical lineage for traceability<\/li>\n\n\n\n<li>Automate compliance checks during deployment<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Automation Ideas<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Auto-trigger schema validation on PRs<\/li>\n\n\n\n<li>Use observability gates in CD workflows<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>8. Comparison with Alternatives<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool \/ Approach<\/th><th>Data Observability<\/th><th>Data Catalogs<\/th><th>Data Quality Frameworks<\/th><\/tr><\/thead><tbody><tr><td><strong>Primary Focus<\/strong><\/td><td>Health &amp; anomalies<\/td><td>Metadata<\/td><td>Rule-based validation<\/td><\/tr><tr><td><strong>Examples<\/strong><\/td><td>Monte Carlo, Acceldata<\/td><td>Collibra, Alation<\/td><td>Great Expectations<\/td><\/tr><tr><td><strong>DevSecOps Role<\/strong><\/td><td>CI\/CD blocker, alerting<\/td><td>Planning stage<\/td><td>Pre-deployment checks<\/td><\/tr><tr><td><strong>Best Use<\/strong><\/td><td>Real-time, scalable<\/td><td>Governance<\/td><td>Test-based validation<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Choose Data Observability when<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You need real-time detection<\/li>\n\n\n\n<li>Your data pipelines are complex or mission-critical<\/li>\n\n\n\n<li>You are running regulated or audited workloads<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>9. Conclusion<\/strong><\/h2>\n\n\n\n<p>Data Observability is a cornerstone of modern <strong>DevSecOps practices<\/strong> where data reliability, integrity, and security must be integrated into every stage of the lifecycle. By embedding observability into pipelines, teams can proactively manage risks, ensure compliance, and prevent silent data failures from impacting production systems.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Future Trends<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AI-powered anomaly detection<\/li>\n\n\n\n<li>Deeper CI\/CD integration<\/li>\n\n\n\n<li>Standardization via OpenLineage and DataOps standards<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Helpful Links<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.greatexpectations.io\/\">Great Expectations Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.montecarlodata.com\/\">Monte Carlo Data<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/openlineage.io\/\">OpenLineage<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/whylabs.ai\/\">WhyLabs<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction &amp; Overview What is Data Observability? Data Observability is the ability to fully understand the health, lineage, and performance of data across your infrastructure. In&#8230; <\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-35","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/35","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=35"}],"version-history":[{"count":2,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/35\/revisions"}],"predecessor-version":[{"id":45,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/35\/revisions\/45"}],"wp:attachment":[{"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=35"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=35"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dataopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=35"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}