recce-nightly 0.62.0.20250417__py3-none-any.whl → 1.30.0.20251221__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of recce-nightly might be problematic. Click here for more details.
- recce/VERSION +1 -1
- recce/__init__.py +27 -22
- recce/adapter/base.py +11 -14
- recce/adapter/dbt_adapter/__init__.py +845 -461
- recce/adapter/dbt_adapter/dbt_version.py +3 -0
- recce/adapter/sqlmesh_adapter.py +24 -35
- recce/apis/check_api.py +59 -42
- recce/apis/check_events_api.py +353 -0
- recce/apis/check_func.py +41 -35
- recce/apis/run_api.py +25 -19
- recce/apis/run_func.py +64 -25
- recce/artifact.py +119 -51
- recce/cli.py +1301 -324
- recce/config.py +43 -34
- recce/connect_to_cloud.py +138 -0
- recce/core.py +55 -47
- recce/data/404/index.html +2 -0
- recce/data/404.html +2 -1
- recce/data/__next.@lineage.!KHNsb3Qp.__PAGE__.txt +7 -0
- recce/data/__next.@lineage.!KHNsb3Qp.txt +4 -0
- recce/data/__next.__PAGE__.txt +6 -0
- recce/data/__next._full.txt +32 -0
- recce/data/__next._head.txt +8 -0
- recce/data/__next._index.txt +14 -0
- recce/data/__next._tree.txt +8 -0
- recce/data/_next/static/chunks/025a7e3e3f9f40ae.js +1 -0
- recce/data/_next/static/chunks/0ce56d67ef5779ca.js +4 -0
- recce/data/_next/static/chunks/1a6a78780155dac7.js +48 -0
- recce/data/_next/static/chunks/1de8485918b9182a.css +2 -0
- recce/data/_next/static/chunks/1e4b1b50d1e34993.js +1 -0
- recce/data/_next/static/chunks/206d5d181e4c738e.js +1 -0
- recce/data/_next/static/chunks/2c357efc34c5b859.js +25 -0
- recce/data/_next/static/chunks/2e9d95d2d48c479c.js +1 -0
- recce/data/_next/static/chunks/2f016dc4a3edad2e.js +2 -0
- recce/data/_next/static/chunks/313251962d698f7c.js +1 -0
- recce/data/_next/static/chunks/3a9f021f38eb5574.css +1 -0
- recce/data/_next/static/chunks/40079da8d2b8f651.js +1 -0
- recce/data/_next/static/chunks/4599182bffb64661.js +38 -0
- recce/data/_next/static/chunks/4e62f6e184173580.js +1 -0
- recce/data/_next/static/chunks/5c4dfb0d09eaa401.js +1 -0
- recce/data/_next/static/chunks/69e4f06ccfdfc3ac.js +1 -0
- recce/data/_next/static/chunks/6b206cb4707d6bee.js +1 -0
- recce/data/_next/static/chunks/6d8557f062aa4386.css +1 -0
- recce/data/_next/static/chunks/7fbe3650bd83b6b5.js +1 -0
- recce/data/_next/static/chunks/83fa823a825674f6.js +1 -0
- recce/data/_next/static/chunks/848a6c9b5f55f7ed.js +1 -0
- recce/data/_next/static/chunks/859462b0858aef88.css +2 -0
- recce/data/_next/static/chunks/923964f18c87d0f1.css +1 -0
- recce/data/_next/static/chunks/939390f911895d7c.js +48 -0
- recce/data/_next/static/chunks/99a9817237a07f43.js +1 -0
- recce/data/_next/static/chunks/9fed8b4b2b924054.js +5 -0
- recce/data/_next/static/chunks/b6949f6c5892110c.js +1 -0
- recce/data/_next/static/chunks/b851a1d3f8149828.js +1 -0
- recce/data/_next/static/chunks/c734f9ad957de0b4.js +1 -0
- recce/data/_next/static/chunks/cdde321b0ec75717.js +2 -0
- recce/data/_next/static/chunks/d0f91117d77ff844.css +1 -0
- recce/data/_next/static/chunks/d6c8667911c2500f.js +1 -0
- recce/data/_next/static/chunks/da8dab68c02752cf.js +74 -0
- recce/data/_next/static/chunks/dc074049c9d12d97.js +109 -0
- recce/data/_next/static/chunks/ee7f1a8227342421.js +1 -0
- recce/data/_next/static/chunks/fa2f4e56c2fccc73.js +1 -0
- recce/data/_next/static/chunks/turbopack-1fad664f62979b93.js +3 -0
- recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff +0 -0
- recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff +0 -0
- recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff +0 -0
- recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff +0 -0
- recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
- recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_buildManifest.js +11 -0
- recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_clientMiddlewareManifest.json +1 -0
- recce/data/_not-found/__next._full.txt +24 -0
- recce/data/_not-found/__next._head.txt +8 -0
- recce/data/_not-found/__next._index.txt +13 -0
- recce/data/_not-found/__next._not-found.__PAGE__.txt +5 -0
- recce/data/_not-found/__next._not-found.txt +4 -0
- recce/data/_not-found/__next._tree.txt +6 -0
- recce/data/_not-found/index.html +2 -0
- recce/data/_not-found/index.txt +24 -0
- recce/data/auth_callback.html +68 -0
- recce/data/checks/__next.@lineage.__DEFAULT__.txt +7 -0
- recce/data/checks/__next._full.txt +39 -0
- recce/data/checks/__next._head.txt +8 -0
- recce/data/checks/__next._index.txt +14 -0
- recce/data/checks/__next._tree.txt +8 -0
- recce/data/checks/__next.checks.__PAGE__.txt +10 -0
- recce/data/checks/__next.checks.txt +4 -0
- recce/data/checks/index.html +2 -0
- recce/data/checks/index.txt +39 -0
- recce/data/imgs/reload-image.svg +4 -0
- recce/data/index.html +2 -27
- recce/data/index.txt +32 -7
- recce/data/lineage/__next.@lineage.__DEFAULT__.txt +7 -0
- recce/data/lineage/__next._full.txt +39 -0
- recce/data/lineage/__next._head.txt +8 -0
- recce/data/lineage/__next._index.txt +14 -0
- recce/data/lineage/__next._tree.txt +8 -0
- recce/data/lineage/__next.lineage.__PAGE__.txt +10 -0
- recce/data/lineage/__next.lineage.txt +4 -0
- recce/data/lineage/index.html +2 -0
- recce/data/lineage/index.txt +39 -0
- recce/data/query/__next.@lineage.__DEFAULT__.txt +7 -0
- recce/data/query/__next._full.txt +37 -0
- recce/data/query/__next._head.txt +8 -0
- recce/data/query/__next._index.txt +14 -0
- recce/data/query/__next._tree.txt +8 -0
- recce/data/query/__next.query.__PAGE__.txt +9 -0
- recce/data/query/__next.query.txt +4 -0
- recce/data/query/index.html +2 -0
- recce/data/query/index.txt +37 -0
- recce/diff.py +6 -12
- recce/event/CONFIG.bak +1 -0
- recce/event/__init__.py +86 -74
- recce/event/collector.py +33 -22
- recce/event/track.py +49 -27
- recce/exceptions.py +1 -1
- recce/git.py +7 -7
- recce/github.py +57 -53
- recce/mcp_server.py +725 -0
- recce/models/__init__.py +4 -1
- recce/models/check.py +438 -21
- recce/models/run.py +1 -0
- recce/models/types.py +134 -28
- recce/pull_request.py +27 -25
- recce/run.py +179 -122
- recce/server.py +394 -104
- recce/state/__init__.py +31 -0
- recce/state/cloud.py +644 -0
- recce/state/const.py +26 -0
- recce/state/local.py +56 -0
- recce/state/state.py +119 -0
- recce/state/state_loader.py +174 -0
- recce/summary.py +196 -149
- recce/tasks/__init__.py +19 -3
- recce/tasks/core.py +11 -13
- recce/tasks/dataframe.py +82 -18
- recce/tasks/histogram.py +69 -34
- recce/tasks/lineage.py +2 -2
- recce/tasks/profile.py +152 -86
- recce/tasks/query.py +180 -89
- recce/tasks/rowcount.py +37 -31
- recce/tasks/schema.py +18 -15
- recce/tasks/top_k.py +35 -35
- recce/tasks/utils.py +147 -0
- recce/tasks/valuediff.py +247 -155
- recce/util/__init__.py +3 -0
- recce/util/api_token.py +80 -0
- recce/util/breaking.py +105 -100
- recce/util/cll.py +274 -219
- recce/util/cloud/__init__.py +15 -0
- recce/util/cloud/base.py +115 -0
- recce/util/cloud/check_events.py +190 -0
- recce/util/cloud/checks.py +242 -0
- recce/util/io.py +22 -17
- recce/util/lineage.py +65 -16
- recce/util/logger.py +1 -1
- recce/util/onboarding_state.py +45 -0
- recce/util/perf_tracking.py +85 -0
- recce/util/recce_cloud.py +347 -72
- recce/util/singleton.py +4 -4
- recce/util/startup_perf.py +121 -0
- recce/yaml/__init__.py +7 -10
- recce_nightly-1.30.0.20251221.dist-info/METADATA +195 -0
- recce_nightly-1.30.0.20251221.dist-info/RECORD +183 -0
- {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/WHEEL +1 -2
- recce/data/_next/static/chunks/1f229bf6-d9fe92e56db8d93b.js +0 -1
- recce/data/_next/static/chunks/29e3cc0d-8c150e37dff9631b.js +0 -1
- recce/data/_next/static/chunks/36e1c10d-bb0210cbd6573a8d.js +0 -1
- recce/data/_next/static/chunks/3998a672-eaad84bdd88cc73e.js +0 -1
- recce/data/_next/static/chunks/450c323b-1bb5db526e54435a.js +0 -1
- recce/data/_next/static/chunks/47d8844f-79a1b53c66a7d7ec.js +0 -1
- recce/data/_next/static/chunks/500-e51c92a025a51234.js +0 -65
- recce/data/_next/static/chunks/6dc81886-c94b9b91bc2c3caf.js +0 -1
- recce/data/_next/static/chunks/700-3b65fc3666820d00.js +0 -2
- recce/data/_next/static/chunks/7a8a3e83-d7fa409d97b38b2b.js +0 -1
- recce/data/_next/static/chunks/7f27ae6c-413f6b869a04183a.js +0 -1
- recce/data/_next/static/chunks/9746af58-d74bef4d03eea6ab.js +0 -1
- recce/data/_next/static/chunks/a30376cd-7d806e1602f2dc3a.js +0 -1
- recce/data/_next/static/chunks/app/_not-found/page-8a886fa0855c3105.js +0 -1
- recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +0 -1
- recce/data/_next/static/chunks/app/page-9adc25782272ed2e.js +0 -1
- recce/data/_next/static/chunks/b63b1b3f-7395c74e11a14e95.js +0 -1
- recce/data/_next/static/chunks/c132bf7d-8102037f9ccf372a.js +0 -1
- recce/data/_next/static/chunks/c1ceaa8b-a1e442154d23515e.js +0 -1
- recce/data/_next/static/chunks/cd9f8d63-cf0d5a7b0f7a92e8.js +0 -54
- recce/data/_next/static/chunks/ce84277d-f42c2c58049cea2d.js +0 -1
- recce/data/_next/static/chunks/e24bf851-0f8cbc99656833e7.js +0 -1
- recce/data/_next/static/chunks/fee69bc6-f17d36c080742e74.js +0 -1
- recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -1
- recce/data/_next/static/chunks/main-a0859f1f36d0aa6c.js +0 -1
- recce/data/_next/static/chunks/main-app-0225a2255968e566.js +0 -1
- recce/data/_next/static/chunks/pages/_app-d5672bf3d8b6371b.js +0 -1
- recce/data/_next/static/chunks/pages/_error-ed75be3f25588548.js +0 -1
- recce/data/_next/static/chunks/webpack-567d72f0bc0820d5.js +0 -1
- recce/data/_next/static/css/c9ecb46a4b21c126.css +0 -14
- recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-800-normal.31d693bb.woff +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.7e2c1e62.woff +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-800-normal.97e20d5e.woff +0 -0
- recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-ext-800-normal.aff52ab0.woff +0 -0
- recce/data/_next/static/media/montserrat-vietnamese-800-normal.5f21869b.woff +0 -0
- recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
- recce/data/_next/static/qiyFlux77VkhxiceAJe_F/_buildManifest.js +0 -1
- recce/state.py +0 -753
- recce_nightly-0.62.0.20250417.dist-info/METADATA +0 -311
- recce_nightly-0.62.0.20250417.dist-info/RECORD +0 -139
- recce_nightly-0.62.0.20250417.dist-info/top_level.txt +0 -2
- tests/__init__.py +0 -0
- tests/adapter/__init__.py +0 -0
- tests/adapter/dbt_adapter/__init__.py +0 -0
- tests/adapter/dbt_adapter/conftest.py +0 -13
- tests/adapter/dbt_adapter/dbt_test_helper.py +0 -283
- tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -40
- tests/adapter/dbt_adapter/test_dbt_cll.py +0 -102
- tests/adapter/dbt_adapter/test_selector.py +0 -177
- tests/tasks/__init__.py +0 -0
- tests/tasks/conftest.py +0 -4
- tests/tasks/test_histogram.py +0 -137
- tests/tasks/test_lineage.py +0 -42
- tests/tasks/test_preset_checks.py +0 -50
- tests/tasks/test_profile.py +0 -73
- tests/tasks/test_query.py +0 -151
- tests/tasks/test_row_count.py +0 -116
- tests/tasks/test_schema.py +0 -99
- tests/tasks/test_top_k.py +0 -73
- tests/tasks/test_valuediff.py +0 -74
- tests/test_cli.py +0 -122
- tests/test_config.py +0 -45
- tests/test_core.py +0 -27
- tests/test_dbt.py +0 -36
- tests/test_pull_request.py +0 -130
- tests/test_server.py +0 -98
- tests/test_state.py +0 -123
- tests/test_summary.py +0 -57
- /recce/data/_next/static/chunks/{polyfills-42372ed130431b0a.js → a6dad97d9634a72d.js} +0 -0
- /recce/data/_next/static/{qiyFlux77VkhxiceAJe_F → nX-Uz0AH6Tc6hIQUFGqaB}/_ssgManifest.js +0 -0
- {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/entry_points.txt +0 -0
- {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!DOCTYPE html><!--nX_Uz0AH6Tc6hIQUFGqaB--><html lang="en"><head><meta charSet="utf-8"/><link rel="preconnect" href="/" crossorigin=""/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/logo/recce-logo-white.png"/><link rel="stylesheet" href="/_next/static/chunks/3a9f021f38eb5574.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/859462b0858aef88.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/6d8557f062aa4386.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/d0f91117d77ff844.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/923964f18c87d0f1.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/1de8485918b9182a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/69e4f06ccfdfc3ac.js"/><script src="/_next/static/chunks/0ce56d67ef5779ca.js" async=""></script><script src="/_next/static/chunks/d6c8667911c2500f.js" async=""></script><script src="/_next/static/chunks/2f016dc4a3edad2e.js" async=""></script><script src="/_next/static/chunks/turbopack-1fad664f62979b93.js" async=""></script><script src="/_next/static/chunks/c734f9ad957de0b4.js" async=""></script><script src="/_next/static/chunks/2e9d95d2d48c479c.js" async=""></script><script src="/_next/static/chunks/7fbe3650bd83b6b5.js" async=""></script><script src="/_next/static/chunks/4599182bffb64661.js" async=""></script><script src="/_next/static/chunks/83fa823a825674f6.js" async=""></script><script src="/_next/static/chunks/9fed8b4b2b924054.js" async=""></script><script src="/_next/static/chunks/2c357efc34c5b859.js" async=""></script><script src="/_next/static/chunks/dc074049c9d12d97.js" async=""></script><script src="/_next/static/chunks/40079da8d2b8f651.js" async=""></script><script src="/_next/static/chunks/848a6c9b5f55f7ed.js" async=""></script><script src="/_next/static/chunks/cdde321b0ec75717.js" async=""></script><script src="/_next/static/chunks/99a9817237a07f43.js" async=""></script><script src="/_next/static/chunks/b6949f6c5892110c.js" async=""></script><script src="/_next/static/chunks/6b206cb4707d6bee.js" async=""></script><script src="/_next/static/chunks/4e62f6e184173580.js" async=""></script><script src="/_next/static/chunks/1a6a78780155dac7.js" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtm.js?id=GTM-M2HVJQFD" as="script"/><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><link rel="icon" href="/favicon.ico?favicon.a8d38d84.ico" sizes="32x32" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><style data-emotion="css-global 1sm4dhk">html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:700;}body{margin:0;color:#171717;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;background-color:#FFFFFF;}@media print{body{background-color:#fff;}}body::backdrop{background-color:#FFFFFF;}</style><style data-emotion="css lb61rc">.css-lb61rc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100vh;overflow:hidden;}</style><div class="MuiBox-root css-lb61rc"><style data-emotion="css 19a3m4u">.css-19a3m4u{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:10px;min-height:40px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:rgb(255, 110, 66);}</style><div class="MuiBox-root css-19a3m4u"><style data-emotion="css 1cto74x">.css-1cto74x{-webkit-text-decoration:none;text-decoration:none;color:#2A6CA7;text-decoration-color:#79B0E2;}.css-1cto74x:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1cto74x:hover{color:#225581;}.css-1cto74x:hover{-webkit-text-decoration:none;text-decoration:none;}</style><style data-emotion="css oqdijk">.css-oqdijk{margin:0;font:inherit;line-height:inherit;letter-spacing:inherit;color:#3182CE;font-weight:500;-webkit-text-decoration:none;text-decoration:none;color:#2A6CA7;text-decoration-color:#79B0E2;}.css-oqdijk:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-oqdijk:hover{color:#225581;}.css-oqdijk:hover{-webkit-text-decoration:none;text-decoration:none;}</style><a class="MuiTypography-root MuiTypography-inherit MuiLink-root MuiLink-underlineHover css-oqdijk" href="https://reccehq.com/" target="_blank"><style data-emotion="css 15zum9u">.css-15zum9u{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:10px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="MuiBox-root css-15zum9u"><style data-emotion="css u2at6n">.css-u2at6n{width:20px;height:20px;margin-left:18px;}</style><img class="MuiBox-root css-u2at6n" src="/logo/recce-logo-white.png" alt="recce-logo-white"/><style data-emotion="css 1f16f3g">.css-1f16f3g{margin:0;font-weight:600;font-size:1.25rem;line-height:1.4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";color:white;font-family:"Montserrat",sans-serif;font-size:1.25rem;}</style><h4 class="MuiTypography-root MuiTypography-h4 css-1f16f3g">RECCE</h4></div></a><style data-emotion="css 1jcz15f">.css-1jcz15f{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;color:rgba(255,255,255,0.8);font-size:sm;text-transform:uppercase;border-width:1px;padding-left:4px;padding-right:4px;border-radius:4.5px;}</style><span class="MuiTypography-root MuiTypography-body1 css-1jcz15f"></span><style data-emotion="css 1rr4qq7">.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}</style><div class="MuiBox-root css-1rr4qq7"></div><style data-emotion="css 1824a4q">.css-1824a4q{color:white;font-size:0.875rem;font-weight:600;background-color:brand.700;border-radius:6px;padding-left:12px;padding-right:12px;padding-top:4px;padding-bottom:4px;margin-right:8px;cursor:pointer;border:none;}</style><button class="MuiBox-root css-1824a4q">Connect to Cloud</button></div><style data-emotion="css 1dhtcsx">.css-1dhtcsx{border-bottom:1px solid lightgray;padding-left:12px;padding-right:12px;}</style><div class="MuiBox-root css-1dhtcsx"><style data-emotion="css kkbn2n">.css-kkbn2n{display:grid;grid-template-columns:1fr auto 1fr;width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="MuiBox-root css-kkbn2n"><style data-emotion="css 1qlx8uq">.css-1qlx8uq{overflow:hidden;min-height:48px;-webkit-overflow-scrolling:touch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:none;min-height:auto;}@media (max-width:599.95px){.css-1qlx8uq .MuiTabs-scrollButtons{display:none;}}</style><div class="MuiTabs-root css-1qlx8uq"><style data-emotion="css 2xu61f">.css-2xu61f{position:relative;display:inline-block;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;white-space:nowrap;overflow-x:hidden;width:100%;}</style><div style="overflow:hidden;margin-bottom:0" class="MuiTabs-scroller MuiTabs-fixed css-2xu61f"><style data-emotion="css 17do188">.css-17do188{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><div role="tablist" class="MuiTabs-list MuiTabs-flexContainer css-17do188"><style data-emotion="css 1n2jfwv">.css-1n2jfwv{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.25;max-width:360px;min-width:90px;position:relative;min-height:48px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:12px 16px;overflow:hidden;white-space:normal;text-align:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#525252;text-transform:none;font-weight:500;min-height:48px;padding:0px;}.css-1n2jfwv.Mui-selected{color:#3182CE;}.css-1n2jfwv.Mui-disabled{color:rgba(0, 0, 0, 0.38);}</style><style data-emotion="css 1ameuk9">.css-1ameuk9{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.25;max-width:360px;min-width:90px;position:relative;min-height:48px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:12px 16px;overflow:hidden;white-space:normal;text-align:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#525252;text-transform:none;font-weight:500;min-height:48px;padding:0px;}.css-1ameuk9::-moz-focus-inner{border-style:none;}.css-1ameuk9.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1ameuk9{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1ameuk9.Mui-selected{color:#3182CE;}.css-1ameuk9.Mui-disabled{color:rgba(0, 0, 0, 0.38);}</style><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="false"><style data-emotion="css 171onha">.css-171onha{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;}</style><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem" href="/lineage/">Lineage</a></div></button><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-selected Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="true"><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem" href="/query/">Query</a></div><style data-emotion="css l6r5ej">.css-l6r5ej{position:absolute;height:2px;bottom:0;width:100%;-webkit-transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;background-color:#3182CE;height:2px;}</style><span class="MuiTabs-indicator css-l6r5ej"></span></button><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="false"><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem;display:flex;gap:3px;align-items:center" href="/checks/">Checklist<!-- --> </a></div></button></div></div></div><style data-emotion="css vx1bta">.css-vx1bta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}</style><div class="MuiBox-root css-vx1bta"></div></div></div><div style="display:flex;flex-direction:row;height:100%"><div class="MuiBox-root css-0" style="contain:size"></div><div style="display:flex;flex-direction:column;flex:1;contain:size"><!--$?--><template id="B:0"></template><style data-emotion="css 11iw7t1">.css-11iw7t1{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;contain:size;}</style><div class="MuiBox-root css-11iw7t1"><style data-emotion="css tkevr6">.css-tkevr6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;height:100%;}</style><div class="MuiBox-root css-tkevr6"><style data-emotion="css 18h6s44 animation-61bdi0">.css-18h6s44{display:inline-block;-webkit-animation:animation-61bdi0 1.4s linear infinite;animation:animation-61bdi0 1.4s linear infinite;color:#3182CE;}@-webkit-keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}</style><span class="MuiCircularProgress-root MuiCircularProgress-indeterminate MuiCircularProgress-colorPrimary css-18h6s44" style="width:48px;height:48px" role="progressbar"><style data-emotion="css 4ejps8">.css-4ejps8{display:block;}</style><svg class="MuiCircularProgress-svg css-4ejps8" viewBox="22 22 44 44"><style data-emotion="css 13odlrs animation-1o38n3e">.css-13odlrs{stroke:currentColor;stroke-dasharray:80px,200px;stroke-dashoffset:0;-webkit-animation:animation-1o38n3e 1.4s ease-in-out infinite;animation:animation-1o38n3e 1.4s ease-in-out infinite;}@-webkit-keyframes animation-1o38n3e{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:1px,200px;stroke-dashoffset:-126px;}}@keyframes animation-1o38n3e{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:1px,200px;stroke-dashoffset:-126px;}}</style><circle class="MuiCircularProgress-circle MuiCircularProgress-circleIndeterminate css-13odlrs" cx="44" cy="44" r="20.2" fill="none" stroke-width="3.6"></circle></svg></span></div></div><!--/$--><style data-emotion="css 10klw3m">.css-10klw3m{height:100%;}</style><div class="MuiBox-root css-10klw3m"></div></div></div></div><style data-emotion="css depviu">@media print{.css-depviu{position:absolute!important;}}</style><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src="/_next/static/chunks/69e4f06ccfdfc3ac.js" id="_R_" async=""></script><div hidden id="S:0"><style data-emotion="css 1arxj4v">.css-1arxj4v{padding:0px;contain:content;}</style><div class="MuiBox-root css-1arxj4v"><style data-emotion="css r2yx1p">.css-r2yx1p{display:none;height:100%;position:absolute;inset:0;}</style><div class="MuiBox-root css-r2yx1p"><style data-emotion="css l1tuuh">.css-l1tuuh{width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}</style><div class="MuiBox-root css-l1tuuh"><span class="MuiCircularProgress-root MuiCircularProgress-indeterminate MuiCircularProgress-colorPrimary css-18h6s44" style="width:48px;height:48px" role="progressbar"><svg class="MuiCircularProgress-svg css-4ejps8" viewBox="22 22 44 44"><circle class="MuiCircularProgress-circle MuiCircularProgress-circleIndeterminate css-13odlrs" cx="44" cy="44" r="20.2" fill="none" stroke-width="3.6"></circle></svg></span></div></div><style data-emotion="css 1g4yje1">.css-1g4yje1{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;}</style><div class="MuiBox-root css-1g4yje1"><style data-emotion="css 1aqmeaq">.css-1aqmeaq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:right;-ms-flex-pack:right;-webkit-justify-content:right;justify-content:right;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;padding:4pt 8pt;gap:5px;height:54px;border-bottom:1px solid lightgray;-webkit-flex:0 0 54px;-ms-flex:0 0 54px;flex:0 0 54px;}</style><div class="MuiBox-root css-1aqmeaq"><div class="MuiBox-root css-0"><style data-emotion="css 1l201on">.css-1l201on{font-size:8pt;}</style><div class="MuiBox-root css-1l201on">History</div><style data-emotion="css 2tw0t7">.css-2tw0t7{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0 0.5rem;font-size:0.75rem;font-weight:500;border-radius:4px;min-height:unset;line-height:1.5;}.css-2tw0t7:hover{-webkit-text-decoration:none;text-decoration:none;}.css-2tw0t7.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-2tw0t7.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-2tw0t7:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-2tw0t7:hover{box-shadow:none;}.css-2tw0t7.Mui-focusVisible{box-shadow:none;}.css-2tw0t7:active{box-shadow:none;}.css-2tw0t7.Mui-disabled{box-shadow:none;}.css-2tw0t7.MuiButton-loading{color:transparent;}.css-2tw0t7:hover{border-width:1px;}</style><style data-emotion="css 16izesw">.css-16izesw{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0 0.5rem;font-size:0.75rem;font-weight:500;border-radius:4px;min-height:unset;line-height:1.5;}.css-16izesw::-moz-focus-inner{border-style:none;}.css-16izesw.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-16izesw{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-16izesw:hover{-webkit-text-decoration:none;text-decoration:none;}.css-16izesw.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-16izesw.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-16izesw:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-16izesw:hover{box-shadow:none;}.css-16izesw.Mui-focusVisible{box-shadow:none;}.css-16izesw:active{box-shadow:none;}.css-16izesw.Mui-disabled{box-shadow:none;}.css-16izesw.MuiButton-loading{color:transparent;}.css-16izesw:hover{border-width:1px;}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeXsmall MuiButton-outlinedSizeXsmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeXsmall MuiButton-outlinedSizeXsmall MuiButton-colorPrimary MuiButton-disableElevation css-16izesw" tabindex="0" type="button"><style data-emotion="css 1s1s15d">.css-1s1s15d{display:inherit;margin-right:8px;margin-left:-4px;}</style><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeXsmall css-1s1s15d"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M13.507 12.324a7 7 0 0 0 .065-8.56A7 7 0 0 0 2 4.393V2H1v3.5l.5.5H5V5H2.811a6.008 6.008 0 1 1-.135 5.77l-.887.462a7 7 0 0 0 11.718 1.092zm-3.361-.97l.708-.707L8 7.792V4H7v4l.146.354 3 3z"></path></svg></span>Show</button></div><div class="MuiBox-root css-0"><style data-emotion="css 19np553">.css-19np553{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:0.75rem;}.css-19np553>:not(style):not(style){margin:0;}.css-19np553>:not(style)~:not(style){margin-left:2px;}</style><div class="MuiStack-root css-19np553"><style data-emotion="css 6x80av">.css-6x80av{margin:0;font-size:0.75rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;font-size:0.75rem;}</style><p class="MuiTypography-root MuiTypography-body2 css-6x80av">Custom Queries</p><style data-emotion="css p5a8cd">.css-p5a8cd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;color:#525252;}</style><span class="MuiBox-root css-p5a8cd" aria-label="Custom queries allow you to use two SQL queries to compare results between current and base environments."><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" font-size="1rem" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"></path></svg></span><style data-emotion="css 87glm6">.css-87glm6{z-index:1500;pointer-events:none;pointer-events:auto;pointer-events:none;}</style><style data-emotion="css levejw">.css-levejw{z-index:1500;pointer-events:none;pointer-events:auto;pointer-events:none;}</style></div><style data-emotion="css 1pwinck">.css-1pwinck{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;width:58px;height:38px;overflow:hidden;padding:12px;box-sizing:border-box;position:relative;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;z-index:0;vertical-align:middle;width:40px;height:24px;padding:7px;}@media print{.css-1pwinck{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1pwinck .MuiSwitch-thumb{width:16px;height:16px;}.css-1pwinck .MuiSwitch-switchBase{padding:4px;}.css-1pwinck .MuiSwitch-switchBase.Mui-checked{-webkit-transform:translateX(16px);-moz-transform:translateX(16px);-ms-transform:translateX(16px);transform:translateX(16px);}</style><span class="MuiSwitch-root MuiSwitch-sizeSmall css-1pwinck"><style data-emotion="css dttd05">.css-dttd05{position:absolute;top:0;left:0;z-index:1;color:#fff;-webkit-transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,-webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-dttd05.Mui-checked{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px);}.css-dttd05.Mui-disabled{color:#F5F5F5;}.css-dttd05.Mui-checked+.MuiSwitch-track{opacity:0.5;}.css-dttd05.Mui-disabled+.MuiSwitch-track{opacity:0.12;}.css-dttd05 .MuiSwitch-input{left:-100%;width:300%;}.css-dttd05:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.css-dttd05:hover{background-color:transparent;}}.css-dttd05.Mui-checked{color:#3182CE;}.css-dttd05.Mui-checked:hover{background-color:rgba(49, 130, 206, 0.04);}@media (hover: none){.css-dttd05.Mui-checked:hover{background-color:transparent;}}.css-dttd05.Mui-checked.Mui-disabled{color:rgb(176, 207, 236);}.css-dttd05.Mui-checked+.MuiSwitch-track{background-color:#3182CE;}</style><style data-emotion="css 1li6zzw">.css-1li6zzw{padding:9px;border-radius:50%;position:absolute;top:0;left:0;z-index:1;color:#fff;-webkit-transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,-webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1li6zzw.Mui-checked{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px);}.css-1li6zzw.Mui-disabled{color:#F5F5F5;}.css-1li6zzw.Mui-checked+.MuiSwitch-track{opacity:0.5;}.css-1li6zzw.Mui-disabled+.MuiSwitch-track{opacity:0.12;}.css-1li6zzw .MuiSwitch-input{left:-100%;width:300%;}.css-1li6zzw:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.css-1li6zzw:hover{background-color:transparent;}}.css-1li6zzw.Mui-checked{color:#3182CE;}.css-1li6zzw.Mui-checked:hover{background-color:rgba(49, 130, 206, 0.04);}@media (hover: none){.css-1li6zzw.Mui-checked:hover{background-color:transparent;}}.css-1li6zzw.Mui-checked.Mui-disabled{color:rgb(176, 207, 236);}.css-1li6zzw.Mui-checked+.MuiSwitch-track{background-color:#3182CE;}</style><style data-emotion="css 1yjdgai">.css-1yjdgai{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;padding:9px;border-radius:50%;position:absolute;top:0;left:0;z-index:1;color:#fff;-webkit-transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,-webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.css-1yjdgai::-moz-focus-inner{border-style:none;}.css-1yjdgai.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1yjdgai{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1yjdgai.Mui-checked{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px);}.css-1yjdgai.Mui-disabled{color:#F5F5F5;}.css-1yjdgai.Mui-checked+.MuiSwitch-track{opacity:0.5;}.css-1yjdgai.Mui-disabled+.MuiSwitch-track{opacity:0.12;}.css-1yjdgai .MuiSwitch-input{left:-100%;width:300%;}.css-1yjdgai:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.css-1yjdgai:hover{background-color:transparent;}}.css-1yjdgai.Mui-checked{color:#3182CE;}.css-1yjdgai.Mui-checked:hover{background-color:rgba(49, 130, 206, 0.04);}@media (hover: none){.css-1yjdgai.Mui-checked:hover{background-color:transparent;}}.css-1yjdgai.Mui-checked.Mui-disabled{color:rgb(176, 207, 236);}.css-1yjdgai.Mui-checked+.MuiSwitch-track{background-color:#3182CE;}</style><span class="MuiButtonBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary PrivateSwitchBase-root MuiSwitch-switchBase MuiSwitch-colorPrimary css-1yjdgai"><style data-emotion="css j8yymo">.css-j8yymo{cursor:inherit;position:absolute;opacity:0;width:100%;height:100%;top:0;left:0;margin:0;padding:0;z-index:1;}</style><input type="checkbox" role="switch" class="PrivateSwitchBase-input MuiSwitch-input css-j8yymo"/><style data-emotion="css pcrmjj">.css-pcrmjj{box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12);background-color:currentColor;width:20px;height:20px;border-radius:50%;}</style><span class="MuiSwitch-thumb css-pcrmjj"></span></span><style data-emotion="css 1khxa25">.css-1khxa25{height:100%;width:100%;border-radius:7px;z-index:-1;-webkit-transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;background-color:#000;opacity:0.38;}</style><span class="MuiSwitch-track css-1khxa25"></span></span></div><style data-emotion="css i9gxme">.css-i9gxme{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}</style><div class="MuiBox-root css-i9gxme"></div><style data-emotion="css k008qs">.css-k008qs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><div class="MuiBox-root css-k008qs"><style data-emotion="css 1c8x0al">.css-1c8x0al{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:0 0.5rem;}</style><div class="MuiStack-root css-1c8x0al"><style data-emotion="css flsuge">.css-flsuge{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-flsuge>:not(style):not(style){margin:0;}.css-flsuge>:not(style)~:not(style){margin-left:2px;}</style><div class="MuiStack-root css-flsuge"><style data-emotion="css om753j">.css-om753j{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;color:#525252;font-size:0.625rem;}</style><label class="MuiTypography-root MuiTypography-body1 css-om753j">Diff with Primary Key(s) (suggested)</label><style data-emotion="css 1j6yt1r">.css-1j6yt1r{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;color:#525252;cursor:help;}</style><span class="MuiBox-root css-1j6yt1r" aria-label="Provide a primary key to perform query diff in data warehouse and only return changed rows."><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" font-size="0.75rem" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"></path></svg></span></div><style data-emotion="css qw5n18">.css-qw5n18{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:240px;}</style><div class="no-track-pii-safe MuiBox-root css-qw5n18"><style data-emotion="css 1786q8c">.css-1786q8c{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#737373;--variant-outlinedColor:#737373;--variant-outlinedBorder:rgba(115, 115, 115, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#737373;padding:3px 9px;font-size:0.8125rem;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0.25rem 0.75rem;font-size:0.875rem;border-color:#D4D4D4;color:#171717;width:100%;height:24px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;text-transform:none;font-size:0.625rem;font-weight:normal;padding-left:4px;padding-right:4px;}.css-1786q8c:hover{-webkit-text-decoration:none;text-decoration:none;}.css-1786q8c.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-1786q8c.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-1786q8c:hover{--variant-containedBg:#525252;--variant-textBg:rgba(115, 115, 115, 0.04);--variant-outlinedBorder:#737373;--variant-outlinedBg:rgba(115, 115, 115, 0.04);}}.css-1786q8c:hover{box-shadow:none;}.css-1786q8c.Mui-focusVisible{box-shadow:none;}.css-1786q8c:active{box-shadow:none;}.css-1786q8c.Mui-disabled{box-shadow:none;}.css-1786q8c.MuiButton-loading{color:transparent;}.css-1786q8c:hover{border-width:1px;}.css-1786q8c:hover{border-color:#A3A3A3;background-color:#F5F5F5;}</style><style data-emotion="css sbnkax">.css-sbnkax{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#737373;--variant-outlinedColor:#737373;--variant-outlinedBorder:rgba(115, 115, 115, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#737373;padding:3px 9px;font-size:0.8125rem;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0.25rem 0.75rem;font-size:0.875rem;border-color:#D4D4D4;color:#171717;width:100%;height:24px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;text-transform:none;font-size:0.625rem;font-weight:normal;padding-left:4px;padding-right:4px;}.css-sbnkax::-moz-focus-inner{border-style:none;}.css-sbnkax.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-sbnkax{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-sbnkax:hover{-webkit-text-decoration:none;text-decoration:none;}.css-sbnkax.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-sbnkax.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-sbnkax:hover{--variant-containedBg:#525252;--variant-textBg:rgba(115, 115, 115, 0.04);--variant-outlinedBorder:#737373;--variant-outlinedBg:rgba(115, 115, 115, 0.04);}}.css-sbnkax:hover{box-shadow:none;}.css-sbnkax.Mui-focusVisible{box-shadow:none;}.css-sbnkax:active{box-shadow:none;}.css-sbnkax.Mui-disabled{box-shadow:none;}.css-sbnkax.MuiButton-loading{color:transparent;}.css-sbnkax:hover{border-width:1px;}.css-sbnkax:hover{border-color:#A3A3A3;background-color:#F5F5F5;}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedNeutral MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorNeutral MuiButton-disableElevation MuiButton-root MuiButton-outlined MuiButton-outlinedNeutral MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorNeutral MuiButton-disableElevation css-sbnkax" tabindex="0" type="button"><style data-emotion="css 1hf3ko">.css-1hf3ko{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;color:#525252;font-size:0.625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}</style><span class="MuiTypography-root MuiTypography-body1 css-1hf3ko">Select or type to add keys</span></button></div></div></div><style data-emotion="css 1w708gf">.css-1w708gf{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;color:var(--variant-containedColor);background-color:var(--variant-containedBg);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;padding:4px 10px;font-size:0.8125rem;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;padding:0.25rem 0.75rem;font-size:0.875rem;}.css-1w708gf:hover{-webkit-text-decoration:none;text-decoration:none;}.css-1w708gf.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-1w708gf:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);}@media (hover: none){.css-1w708gf:hover{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);}}.css-1w708gf:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12);}.css-1w708gf.Mui-focusVisible{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12);}.css-1w708gf.Mui-disabled{color:rgba(0, 0, 0, 0.26);box-shadow:none;background-color:rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-1w708gf:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-1w708gf:hover{box-shadow:none;}.css-1w708gf.Mui-focusVisible{box-shadow:none;}.css-1w708gf:active{box-shadow:none;}.css-1w708gf.Mui-disabled{box-shadow:none;}.css-1w708gf.MuiButton-loading{color:transparent;}.css-1w708gf:hover{box-shadow:none;}</style><style data-emotion="css ud44du">.css-ud44du{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;color:var(--variant-containedColor);background-color:var(--variant-containedBg);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;padding:4px 10px;font-size:0.8125rem;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;padding:0.25rem 0.75rem;font-size:0.875rem;}.css-ud44du::-moz-focus-inner{border-style:none;}.css-ud44du.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-ud44du{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-ud44du:hover{-webkit-text-decoration:none;text-decoration:none;}.css-ud44du.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-ud44du:hover{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);}@media (hover: none){.css-ud44du:hover{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);}}.css-ud44du:active{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12);}.css-ud44du.Mui-focusVisible{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12);}.css-ud44du.Mui-disabled{color:rgba(0, 0, 0, 0.26);box-shadow:none;background-color:rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-ud44du:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-ud44du:hover{box-shadow:none;}.css-ud44du.Mui-focusVisible{box-shadow:none;}.css-ud44du:active{box-shadow:none;}.css-ud44du.Mui-disabled{box-shadow:none;}.css-ud44du.MuiButton-loading{color:transparent;}.css-ud44du:hover{box-shadow:none;}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-ud44du" tabindex="0" type="button">Run Diff</button></div><style data-emotion="css a8gnbf">.css-a8gnbf{width:100%;-webkit-flex:1;-ms-flex:1;flex:1;}</style><div class="MuiBox-root css-a8gnbf"><style data-emotion="css 1fbu2fh">.css-1fbu2fh{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;background-color:#EDF2F880;height:40px;min-height:40px;font-size:14px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0px;padding:0px 16px;-webkit-flex:0 0 40px;-ms-flex:0 0 40px;flex:0 0 40px;}</style><div class="MuiStack-root css-1fbu2fh"><style data-emotion="css nwvf79">.css-nwvf79{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;font-weight:700;}</style><strong class="MuiTypography-root MuiTypography-body1 no-track-pii-safe css-nwvf79"></strong><div class="MuiBox-root css-i9gxme"></div><style data-emotion="css 1ml32ah">.css-1ml32ah{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0 0.5rem;font-size:0.75rem;font-weight:500;border-radius:4px;min-height:unset;line-height:1.5;background-color:white;padding:6px 12px;}.css-1ml32ah:hover{-webkit-text-decoration:none;text-decoration:none;}.css-1ml32ah.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-1ml32ah.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-1ml32ah:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-1ml32ah:hover{box-shadow:none;}.css-1ml32ah.Mui-focusVisible{box-shadow:none;}.css-1ml32ah:active{box-shadow:none;}.css-1ml32ah.Mui-disabled{box-shadow:none;}.css-1ml32ah.MuiButton-loading{color:transparent;}.css-1ml32ah:hover{border-width:1px;}</style><style data-emotion="css 1d22ayb">.css-1d22ayb{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.75;min-width:64px;padding:6px 16px;border:0;border-radius:6px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:5px 15px;border:1px solid currentColor;border-color:var(--variant-outlinedBorder, currentColor);background-color:var(--variant-outlinedBg);color:var(--variant-outlinedColor);--variant-textColor:#3182CE;--variant-outlinedColor:#3182CE;--variant-outlinedBorder:rgba(49, 130, 206, 0.5);--variant-containedColor:#FFFFFF;--variant-containedBg:#3182CE;box-shadow:none;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;text-transform:none;font-weight:500;border-radius:6px;border-width:1px;padding:0 0.5rem;font-size:0.75rem;font-weight:500;border-radius:4px;min-height:unset;line-height:1.5;background-color:white;padding:6px 12px;}.css-1d22ayb::-moz-focus-inner{border-style:none;}.css-1d22ayb.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1d22ayb{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1d22ayb:hover{-webkit-text-decoration:none;text-decoration:none;}.css-1d22ayb.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.css-1d22ayb.Mui-disabled{border:1px solid rgba(0, 0, 0, 0.12);}@media (hover: hover){.css-1d22ayb:hover{--variant-containedBg:#2A6CA7;--variant-textBg:rgba(49, 130, 206, 0.04);--variant-outlinedBorder:#3182CE;--variant-outlinedBg:rgba(49, 130, 206, 0.04);}}.css-1d22ayb:hover{box-shadow:none;}.css-1d22ayb.Mui-focusVisible{box-shadow:none;}.css-1d22ayb:active{box-shadow:none;}.css-1d22ayb.Mui-disabled{box-shadow:none;}.css-1d22ayb.MuiButton-loading{color:transparent;}.css-1d22ayb:hover{border-width:1px;}</style><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeXsmall MuiButton-outlinedSizeXsmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeXsmall MuiButton-outlinedSizeXsmall MuiButton-colorPrimary MuiButton-disableElevation css-1d22ayb" tabindex="0" type="button"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeXsmall css-1s1s15d"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 384 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80L0 432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"></path></svg></span>Run Query</button></div><div class="cm-theme no-track-pii-safe max-h-dvh h-full no-track-pii-safe"></div></div></div><!--$--><!--/$--></div></div><script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$~"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
|
|
2
|
+
$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$~",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")</script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:I[660181,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"HTTPAccessFallbackBoundary\"]\n2:I[634135,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\"],\"GoogleTagManager\"]\n3:I[485153,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\"],\"\"]\n4:I[84654,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\"],\"default\"]\n5:I[302240,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"default\"]\n6:I[408821,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\",\"/_next/static/chunks/848a6c9b5f55f7ed.js\"],\"default\"]\n7:I[354876,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"default\"]\n8:\"$Sreact.fragment\"\n9:I[288014,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"ClientPageRoot\"]\na:I[884916,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\",\"/_next/static/chunks/cdde321b0ec75717.js\",\"/_next/static/chunks/99a9817237a07f43.js\"],\"default\"]\n12:I[253348,[\"/_next/static/chunks/b6949f6c5892110c.js\",\"/_next/static/chunks/40079da8d2b8f651.js\"],\"default\"]\n:HL[\"/_next/static/chunks/3a9f021f38eb5574.css\",\"style\"]\n:HL[\"/_next/static/chunks/859462b0858aef88.css\",\"style\"]\n:HL[\"/_next/static/chunks/6d8557f062aa4386.css\",\"style\"]\n:HL[\"/_next/static/chunks/d0f91117d77ff844.css\",\"style\"]\n:HL[\"/_next/static/chunks/923964f18c87d0f1.css\",\"style\"]\n:HL[\"/_next/static/chunks/1de8485918b9182a.css\",\"style\"]\n:HC[\"/\",\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"nX-Uz0AH6Tc6hIQUFGqaB\",\"c\":[\"\",\"query\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"query\",{\"children\":[\"__PAGE__\",{}]}],\"lineage\":[\"__DEFAULT__\",{}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$L1\",\"c\",{\"notFound\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3a9f021f38eb5574.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/859462b0858aef88.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/6d8557f062aa4386.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/d0f91117d77ff844.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/923964f18c87d0f1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/4599182bffb64661.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/83fa823a825674f6.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/9fed8b4b2b924054.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/_next/static/chunks/2c357efc34c5b859.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-5\",{\"src\":\"/_next/static/chunks/dc074049c9d12d97.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-6\",{\"src\":\"/_next/static/chunks/40079da8d2b8f651.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"$L2\",null,{\"gtmId\":\"GTM-M2HVJQFD\"}],[\"$\",\"$L3\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n const hash = window.location.hash;\\n if (hash.startsWith('#!')) {\\n const newLocation = window.location.origin + window.location.pathname;\\n window.location.assign(newLocation);\\n }\\n })();\\n \"}}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L4\",null,{\"lineage\":\"$undefined\",\"children\":[[],[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"$0:f:0:1:0:props:notFound:1:props:children:2:props:children:props:children:0\"]]}]}]]}]],\"children\":[\"$0:f:0:1:0:props:notFound:0\",[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"$L2\",null,{\"gtmId\":\"GTM-M2HVJQFD\"}],[\"$\",\"$L3\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n const hash = window.location.hash;\\n if (hash.startsWith('#!')) {\\n const newLocation = window.location.origin + window.location.pathname;\\n window.location.assign(newLocation);\\n }\\n })();\\n \"}}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L4\",null,{\"lineage\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"lineage\",\"error\":\"$6\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/848a6c9b5f55f7ed.js\",\"async\":true}]],\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$6\",\"errorStyles\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:lineage:props:errorStyles\",\"errorScripts\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:lineage:props:errorScripts\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$0:f:0:1:0:props:notFound:1:props:children:2:props:children:props:children:1\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$8\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$8\",\"c\",{\"children\":[[\"$\",\"$L9\",null,{\"Component\":\"$a\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@b\",\"$@c\"]}}],[\"$Ld\",\"$Le\"],\"$Lf\"]}],{},null,false,false]},null,false,false],\"lineage\":[\"$L10\",{},null,false,false]},null,false,false],\"$L11\",false]],\"m\":\"$undefined\",\"G\":[\"$12\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"13:I[893065,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"OutletBoundary\"]\n14:\"$Sreact.suspense\"\n16:I[670337,[\"/_next/static/chunks/7fbe3650bd83b6b5.js\",\"/_next/static/chunks/4599182bffb64661.js\",\"/_next/static/chunks/83fa823a825674f6.js\",\"/_next/static/chunks/9fed8b4b2b924054.js\",\"/_next/static/chunks/2c357efc34c5b859.js\",\"/_next/static/chunks/dc074049c9d12d97.js\",\"/_next/static/chunks/40079da8d2b8f651.js\",\"/_next/static/chunks/6b206cb4707d6bee.js\",\"/_next/static/chunks/4e62f6e184173580.js\",\"/_next/static/chunks/1a6a78780155dac7.js\"],\"default\"]\n19:I[893065,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"ViewportBoundary\"]\n1b:I[893065,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"MetadataBoundary\"]\nd:[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/cdde321b0ec75717.js\",\"async\":true,\"nonce\":\"$undefined\"}]\ne:[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/99a9817237a07f43.js\",\"async\":true,\"nonce\":\"$undefined\"}]\nf:[\"$\",\"$L13\",null,{\"children\":[\"$\",\"$14\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@15\"}]}]\n10:[\"$\",\"$8\",\"c\",{\"children\":[[\"$\",\"$L9\",null,{\"Component\":\"$16\",\"serverProvidedParams\":{\"searchParams\":\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:searchParams\",\"params\":\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\",\"promises\":[\"$@17\",\"$@18\"]}}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1de8485918b9182a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/6b206cb4707d6bee.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/4e62f6e184173580.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/1a6a78780155dac7.js\",\"async\":true,\"nonce\":\"$undefined\"}]],null]}]\n11:[\"$\",\"$8\",\"h\",{\"children\":[null,[\"$\",\"$L19\",null,{\"children\":\"$@1a\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L1b\",null,{\"children\":[\"$\",\"$14\",null,{\"name\":\"Next.Metadata\",\"children\":\"$@1c\"}]}]}],null]}]\nb:{}\nc:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"17:{}\n18:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"1a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"1d:I[666314,[\"/_next/static/chunks/c734f9ad957de0b4.js\",\"/_next/static/chunks/2e9d95d2d48c479c.js\"],\"IconMark\"]\n1c:[[\"$\",\"title\",\"0\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.a8d38d84.ico\",\"sizes\":\"32x32\",\"type\":\"image/x-icon\"}],[\"$\",\"$L1d\",\"3\",{}]]\n15:null\n"])</script></body></html>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
1:I[660181,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"HTTPAccessFallbackBoundary"]
|
|
2
|
+
2:I[634135,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js"],"GoogleTagManager"]
|
|
3
|
+
3:I[485153,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js"],""]
|
|
4
|
+
4:I[84654,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js"],"default"]
|
|
5
|
+
5:I[302240,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"default"]
|
|
6
|
+
6:I[408821,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js","/_next/static/chunks/848a6c9b5f55f7ed.js"],"default"]
|
|
7
|
+
7:I[354876,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"default"]
|
|
8
|
+
8:"$Sreact.fragment"
|
|
9
|
+
9:I[288014,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"ClientPageRoot"]
|
|
10
|
+
a:I[884916,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js","/_next/static/chunks/cdde321b0ec75717.js","/_next/static/chunks/99a9817237a07f43.js"],"default"]
|
|
11
|
+
12:I[253348,["/_next/static/chunks/b6949f6c5892110c.js","/_next/static/chunks/40079da8d2b8f651.js"],"default"]
|
|
12
|
+
:HL["/_next/static/chunks/3a9f021f38eb5574.css","style"]
|
|
13
|
+
:HL["/_next/static/chunks/859462b0858aef88.css","style"]
|
|
14
|
+
:HL["/_next/static/chunks/6d8557f062aa4386.css","style"]
|
|
15
|
+
:HL["/_next/static/chunks/d0f91117d77ff844.css","style"]
|
|
16
|
+
:HL["/_next/static/chunks/923964f18c87d0f1.css","style"]
|
|
17
|
+
:HL["/_next/static/chunks/1de8485918b9182a.css","style"]
|
|
18
|
+
:HC["/",""]
|
|
19
|
+
0:{"P":null,"b":"nX-Uz0AH6Tc6hIQUFGqaB","c":["","query",""],"q":"","i":false,"f":[[["",{"children":["query",{"children":["__PAGE__",{}]}],"lineage":["__DEFAULT__",{}]},"$undefined","$undefined",true],[["$","$L1","c",{"notFound":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/3a9f021f38eb5574.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/859462b0858aef88.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","2",{"rel":"stylesheet","href":"/_next/static/chunks/6d8557f062aa4386.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","3",{"rel":"stylesheet","href":"/_next/static/chunks/d0f91117d77ff844.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","4",{"rel":"stylesheet","href":"/_next/static/chunks/923964f18c87d0f1.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/7fbe3650bd83b6b5.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/4599182bffb64661.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/83fa823a825674f6.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/_next/static/chunks/9fed8b4b2b924054.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/_next/static/chunks/2c357efc34c5b859.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/_next/static/chunks/dc074049c9d12d97.js","async":true,"nonce":"$undefined"}],["$","script","script-6",{"src":"/_next/static/chunks/40079da8d2b8f651.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","$L2",null,{"gtmId":"GTM-M2HVJQFD"}],["$","$L3",null,{"dangerouslySetInnerHTML":{"__html":"\n (function() {\n const hash = window.location.hash;\n if (hash.startsWith('#!')) {\n const newLocation = window.location.origin + window.location.pathname;\n window.location.assign(newLocation);\n }\n })();\n "}}],["$","body",null,{"children":["$","$L4",null,{"lineage":"$undefined","children":[[],[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"$0:f:0:1:0:props:notFound:1:props:children:2:props:children:props:children:0"]]}]}]]}]],"children":["$0:f:0:1:0:props:notFound:0",["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","$L2",null,{"gtmId":"GTM-M2HVJQFD"}],["$","$L3",null,{"dangerouslySetInnerHTML":{"__html":"\n (function() {\n const hash = window.location.hash;\n if (hash.startsWith('#!')) {\n const newLocation = window.location.origin + window.location.pathname;\n window.location.assign(newLocation);\n }\n })();\n "}}],["$","body",null,{"children":["$","$L4",null,{"lineage":["$","$L5",null,{"parallelRouterKey":"lineage","error":"$6","errorStyles":[],"errorScripts":[["$","script","script-0",{"src":"/_next/static/chunks/848a6c9b5f55f7ed.js","async":true}]],"template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}],"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$6","errorStyles":"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:lineage:props:errorStyles","errorScripts":"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:lineage:props:errorScripts","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$0:f:0:1:0:props:notFound:1:props:children:2:props:children:props:children:1","forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}]]}],{"children":[["$","$8","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$8","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],["$Ld","$Le"],"$Lf"]}],{},null,false,false]},null,false,false],"lineage":["$L10",{},null,false,false]},null,false,false],"$L11",false]],"m":"$undefined","G":["$12",[]],"S":true}
|
|
20
|
+
13:I[893065,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"OutletBoundary"]
|
|
21
|
+
14:"$Sreact.suspense"
|
|
22
|
+
16:I[670337,["/_next/static/chunks/7fbe3650bd83b6b5.js","/_next/static/chunks/4599182bffb64661.js","/_next/static/chunks/83fa823a825674f6.js","/_next/static/chunks/9fed8b4b2b924054.js","/_next/static/chunks/2c357efc34c5b859.js","/_next/static/chunks/dc074049c9d12d97.js","/_next/static/chunks/40079da8d2b8f651.js","/_next/static/chunks/6b206cb4707d6bee.js","/_next/static/chunks/4e62f6e184173580.js","/_next/static/chunks/1a6a78780155dac7.js"],"default"]
|
|
23
|
+
19:I[893065,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"ViewportBoundary"]
|
|
24
|
+
1b:I[893065,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"MetadataBoundary"]
|
|
25
|
+
d:["$","script","script-0",{"src":"/_next/static/chunks/cdde321b0ec75717.js","async":true,"nonce":"$undefined"}]
|
|
26
|
+
e:["$","script","script-1",{"src":"/_next/static/chunks/99a9817237a07f43.js","async":true,"nonce":"$undefined"}]
|
|
27
|
+
f:["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]
|
|
28
|
+
10:["$","$8","c",{"children":[["$","$L9",null,{"Component":"$16","serverProvidedParams":{"searchParams":"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:searchParams","params":"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params","promises":["$@17","$@18"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/1de8485918b9182a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/6b206cb4707d6bee.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/4e62f6e184173580.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/1a6a78780155dac7.js","async":true,"nonce":"$undefined"}]],null]}]
|
|
29
|
+
11:["$","$8","h",{"children":[null,["$","$L19",null,{"children":"$@1a"}],["$","div",null,{"hidden":true,"children":["$","$L1b",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":"$@1c"}]}]}],null]}]
|
|
30
|
+
b:{}
|
|
31
|
+
c:"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params"
|
|
32
|
+
17:{}
|
|
33
|
+
18:"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params"
|
|
34
|
+
1a:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
35
|
+
1d:I[666314,["/_next/static/chunks/c734f9ad957de0b4.js","/_next/static/chunks/2e9d95d2d48c479c.js"],"IconMark"]
|
|
36
|
+
1c:[["$","title","0",{"children":"recce"}],["$","meta","1",{"name":"description","content":"Recce: Data validation toolkit for comprehensive PR review"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.a8d38d84.ico","sizes":"32x32","type":"image/x-icon"}],["$","$L1d","3",{}]]
|
|
37
|
+
15:null
|
recce/diff.py
CHANGED
|
@@ -5,28 +5,22 @@ import pandas as pd
|
|
|
5
5
|
|
|
6
6
|
def diff_text(before: str, after: str):
|
|
7
7
|
if before is None and after is None:
|
|
8
|
-
print(
|
|
8
|
+
print("not found in both states")
|
|
9
9
|
return
|
|
10
10
|
elif before == after:
|
|
11
|
-
print(
|
|
11
|
+
print("no changes")
|
|
12
12
|
return
|
|
13
13
|
|
|
14
|
-
diff_output = difflib.unified_diff(
|
|
15
|
-
before.splitlines(),
|
|
16
|
-
after.splitlines(),
|
|
17
|
-
"base",
|
|
18
|
-
"current",
|
|
19
|
-
lineterm=""
|
|
20
|
-
)
|
|
14
|
+
diff_output = difflib.unified_diff(before.splitlines(), after.splitlines(), "base", "current", lineterm="")
|
|
21
15
|
for line in diff_output:
|
|
22
16
|
print(line)
|
|
23
17
|
|
|
24
18
|
|
|
25
19
|
def diff_dataframe(before: pd.DataFrame, after: pd.DataFrame):
|
|
26
20
|
if before is None and after is None:
|
|
27
|
-
print(
|
|
21
|
+
print("not found in both states")
|
|
28
22
|
return
|
|
29
23
|
|
|
30
24
|
before_aligned, after_aligned = before.align(after)
|
|
31
|
-
diff = before_aligned.compare(after_aligned, result_names=(
|
|
32
|
-
print(diff.to_string(na_rep=
|
|
25
|
+
diff = before_aligned.compare(after_aligned, result_names=("base", "current"))
|
|
26
|
+
print(diff.to_string(na_rep="-"))
|
recce/event/CONFIG.bak
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
event_api_key: <API_KEY>
|
recce/event/__init__.py
CHANGED
|
@@ -10,17 +10,21 @@ from typing import Dict
|
|
|
10
10
|
|
|
11
11
|
import sentry_sdk
|
|
12
12
|
|
|
13
|
-
from recce import
|
|
13
|
+
from recce import get_runner, get_version, is_ci_env, is_recce_cloud_instance
|
|
14
14
|
from recce import yaml as pyml
|
|
15
15
|
from recce.event.collector import Collector
|
|
16
16
|
from recce.git import current_branch, hosting_repo
|
|
17
|
-
from recce.github import
|
|
18
|
-
get_github_codespace_available_at
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
from recce.github import (
|
|
18
|
+
get_github_codespace_available_at,
|
|
19
|
+
get_github_codespace_info,
|
|
20
|
+
get_github_codespace_name,
|
|
21
|
+
is_github_codespace,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
USER_HOME = os.path.expanduser("~")
|
|
25
|
+
RECCE_USER_HOME = os.path.join(USER_HOME, ".recce")
|
|
26
|
+
RECCE_USER_PROFILE = os.path.join(RECCE_USER_HOME, "profile.yml")
|
|
27
|
+
RECCE_USER_EVENT_PATH = os.path.join(RECCE_USER_HOME, ".unsend_events.json")
|
|
24
28
|
|
|
25
29
|
__version__ = get_version()
|
|
26
30
|
_collector = Collector()
|
|
@@ -33,13 +37,13 @@ def init():
|
|
|
33
37
|
|
|
34
38
|
# Amplitude init
|
|
35
39
|
_collector.set_api_key(api_key)
|
|
36
|
-
_collector.set_user_id(user_profile.get(
|
|
40
|
+
_collector.set_user_id(user_profile.get("user_id"))
|
|
37
41
|
_collector.set_unsend_events_file(RECCE_USER_EVENT_PATH)
|
|
38
42
|
|
|
39
43
|
# Sentry init
|
|
40
44
|
sentry_env = _get_sentry_env()
|
|
41
45
|
sentry_dns = _get_sentry_dns()
|
|
42
|
-
release_version = __version__ if sentry_env !=
|
|
46
|
+
release_version = __version__ if sentry_env != "development" else None
|
|
43
47
|
sentry_sdk.init(
|
|
44
48
|
dsn=sentry_dns,
|
|
45
49
|
environment=sentry_env,
|
|
@@ -47,58 +51,63 @@ def init():
|
|
|
47
51
|
# Set traces_sample_rate to 1.0 to capture 100%
|
|
48
52
|
# of transactions for performance monitoring.
|
|
49
53
|
# We recommend adjusting this value in production.
|
|
50
|
-
traces_sample_rate=1.0
|
|
54
|
+
traces_sample_rate=1.0,
|
|
51
55
|
)
|
|
52
|
-
sentry_sdk.set_tag(
|
|
53
|
-
sentry_sdk.set_tag(
|
|
54
|
-
sentry_sdk.set_tag(
|
|
55
|
-
sentry_sdk.set_tag(
|
|
56
|
-
sentry_sdk.set_tag(
|
|
56
|
+
sentry_sdk.set_tag("recce.version", __version__)
|
|
57
|
+
sentry_sdk.set_tag("platform", sys.platform)
|
|
58
|
+
sentry_sdk.set_tag("is_ci_env", is_ci_env())
|
|
59
|
+
sentry_sdk.set_tag("is_github_codespace", is_github_codespace())
|
|
60
|
+
sentry_sdk.set_tag("is_recce_cloud_instance", is_recce_cloud_instance())
|
|
61
|
+
sentry_sdk.set_tag("system_timezone", get_system_timezone())
|
|
57
62
|
|
|
58
63
|
|
|
59
64
|
def get_user_id():
|
|
60
|
-
return load_user_profile().get(
|
|
65
|
+
return load_user_profile().get("user_id")
|
|
61
66
|
|
|
62
67
|
|
|
63
68
|
def get_recce_api_token():
|
|
64
|
-
return load_user_profile().get(
|
|
69
|
+
return load_user_profile().get("api_token")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def update_recce_api_token(token):
|
|
73
|
+
return update_user_profile({"api_token": token})
|
|
65
74
|
|
|
66
75
|
|
|
67
76
|
def is_anonymous_tracking():
|
|
68
|
-
return load_user_profile().get(
|
|
77
|
+
return load_user_profile().get("anonymous_tracking", False)
|
|
69
78
|
|
|
70
79
|
|
|
71
80
|
def _get_sentry_dns():
|
|
72
|
-
dns_file = os.path.normpath(os.path.join(os.path.dirname(__file__),
|
|
73
|
-
with open(dns_file) as f:
|
|
81
|
+
dns_file = os.path.normpath(os.path.join(os.path.dirname(__file__), "SENTRY_DNS"))
|
|
82
|
+
with open(dns_file, encoding="utf-8") as f:
|
|
74
83
|
dns = f.read().strip()
|
|
75
84
|
return dns
|
|
76
85
|
|
|
77
86
|
|
|
78
87
|
def _get_sentry_env():
|
|
79
|
-
if
|
|
80
|
-
return
|
|
81
|
-
elif re.match(r
|
|
82
|
-
return
|
|
83
|
-
elif
|
|
84
|
-
return
|
|
85
|
-
elif
|
|
86
|
-
return
|
|
87
|
-
elif
|
|
88
|
-
return
|
|
89
|
-
return
|
|
88
|
+
if ".dev" in __version__:
|
|
89
|
+
return "development"
|
|
90
|
+
elif re.match(r"^\d+\.\d+\.\d+\.\d{8}[a|b|rc]?.*$", __version__):
|
|
91
|
+
return "nightly"
|
|
92
|
+
elif "a" in __version__:
|
|
93
|
+
return "alpha"
|
|
94
|
+
elif "b" in __version__:
|
|
95
|
+
return "beta"
|
|
96
|
+
elif "rc" in __version__:
|
|
97
|
+
return "release-candidate"
|
|
98
|
+
return "production"
|
|
90
99
|
|
|
91
100
|
|
|
92
101
|
def _get_api_key():
|
|
93
|
-
if os.getenv(
|
|
102
|
+
if os.getenv("RECCE_EVENT_API_KEY"):
|
|
94
103
|
# For local testing purpose
|
|
95
|
-
return os.getenv(
|
|
104
|
+
return os.getenv("RECCE_EVENT_API_KEY")
|
|
96
105
|
|
|
97
|
-
config_file = os.path.abspath(os.path.join(os.path.dirname(__file__),
|
|
106
|
+
config_file = os.path.abspath(os.path.join(os.path.dirname(__file__), "CONFIG"))
|
|
98
107
|
try:
|
|
99
|
-
with open(config_file) as fh:
|
|
108
|
+
with open(config_file, encoding="utf-8") as fh:
|
|
100
109
|
config = pyml.load(fh)
|
|
101
|
-
return config.get(
|
|
110
|
+
return config.get("event_api_key")
|
|
102
111
|
except Exception:
|
|
103
112
|
return None
|
|
104
113
|
|
|
@@ -108,15 +117,15 @@ def _generate_user_profile():
|
|
|
108
117
|
os.makedirs(RECCE_USER_HOME, exist_ok=True)
|
|
109
118
|
except Exception:
|
|
110
119
|
# TODO: should show warning message but not raise exception
|
|
111
|
-
print(
|
|
120
|
+
print("Please disable command tracking to continue.")
|
|
112
121
|
exit(1)
|
|
113
122
|
if is_github_codespace() is True:
|
|
114
|
-
salted_name = f
|
|
123
|
+
salted_name = f"codespace-{get_github_codespace_name()}"
|
|
115
124
|
user_id = hashlib.sha256(salted_name.encode()).hexdigest()
|
|
116
125
|
else:
|
|
117
126
|
user_id = uuid.uuid4().hex
|
|
118
|
-
with open(RECCE_USER_PROFILE,
|
|
119
|
-
pyml.dump({
|
|
127
|
+
with open(RECCE_USER_PROFILE, "w+", encoding="utf-8") as f:
|
|
128
|
+
pyml.dump({"user_id": user_id, "anonymous_tracking": True}, f)
|
|
120
129
|
return dict(user_id=user_id, anonymous_tracking=True)
|
|
121
130
|
|
|
122
131
|
|
|
@@ -125,9 +134,9 @@ def load_user_profile():
|
|
|
125
134
|
if not os.path.exists(RECCE_USER_PROFILE):
|
|
126
135
|
user_profile = _generate_user_profile()
|
|
127
136
|
else:
|
|
128
|
-
with open(RECCE_USER_PROFILE,
|
|
137
|
+
with open(RECCE_USER_PROFILE, "r", encoding="utf-8") as f:
|
|
129
138
|
user_profile = pyml.load(f)
|
|
130
|
-
if user_profile.get(
|
|
139
|
+
if user_profile is None or user_profile.get("user_id") is None:
|
|
131
140
|
user_profile = _generate_user_profile()
|
|
132
141
|
|
|
133
142
|
return user_profile
|
|
@@ -136,7 +145,7 @@ def load_user_profile():
|
|
|
136
145
|
def update_user_profile(update_values):
|
|
137
146
|
original = load_user_profile()
|
|
138
147
|
original.update(update_values)
|
|
139
|
-
with open(RECCE_USER_PROFILE,
|
|
148
|
+
with open(RECCE_USER_PROFILE, "w+", encoding="utf-8") as f:
|
|
140
149
|
pyml.dump(original, f)
|
|
141
150
|
return original
|
|
142
151
|
|
|
@@ -146,10 +155,10 @@ def flush_events(command=None):
|
|
|
146
155
|
|
|
147
156
|
|
|
148
157
|
def should_log_event():
|
|
149
|
-
with open(RECCE_USER_PROFILE,
|
|
158
|
+
with open(RECCE_USER_PROFILE, "r", encoding="utf-8") as f:
|
|
150
159
|
user_profile = pyml.load(f)
|
|
151
160
|
# TODO: default anonymous_tracking to false if field is not present
|
|
152
|
-
tracking = user_profile.get(
|
|
161
|
+
tracking = user_profile.get("anonymous_tracking", False)
|
|
153
162
|
tracking = tracking and isinstance(tracking, bool)
|
|
154
163
|
if not tracking:
|
|
155
164
|
return False
|
|
@@ -166,18 +175,18 @@ def log_event(prop, event_type, **kwargs):
|
|
|
166
175
|
|
|
167
176
|
repo = hosting_repo()
|
|
168
177
|
if repo is not None:
|
|
169
|
-
prop[
|
|
178
|
+
prop["repository"] = sha256(repo.encode()).hexdigest()
|
|
170
179
|
|
|
171
180
|
branch = current_branch()
|
|
172
181
|
if branch is not None:
|
|
173
|
-
prop[
|
|
182
|
+
prop["branch"] = sha256(branch.encode()).hexdigest()
|
|
174
183
|
|
|
175
184
|
runner = get_runner()
|
|
176
185
|
if runner is not None:
|
|
177
|
-
prop[
|
|
186
|
+
prop["runner_type"] = runner
|
|
178
187
|
|
|
179
|
-
if runner ==
|
|
180
|
-
prop[
|
|
188
|
+
if runner == "github codespaces":
|
|
189
|
+
prop["codespaces_name"] = get_github_codespace_name()
|
|
181
190
|
|
|
182
191
|
payload = dict(
|
|
183
192
|
**prop,
|
|
@@ -191,11 +200,11 @@ def log_api_event(endpoint_name, prop):
|
|
|
191
200
|
**prop,
|
|
192
201
|
endpoint_name=endpoint_name,
|
|
193
202
|
)
|
|
194
|
-
log_event(prop,
|
|
203
|
+
log_event(prop, "api_event")
|
|
195
204
|
_collector.schedule_flush()
|
|
196
205
|
|
|
197
206
|
|
|
198
|
-
def log_load_state(command=
|
|
207
|
+
def log_load_state(command="server", single_env=False):
|
|
199
208
|
from recce.models import CheckDAO
|
|
200
209
|
|
|
201
210
|
checks = 0
|
|
@@ -213,10 +222,10 @@ def log_load_state(command='server', single_env=False):
|
|
|
213
222
|
)
|
|
214
223
|
|
|
215
224
|
if command == "server":
|
|
216
|
-
prop[
|
|
225
|
+
prop["single_env"] = single_env
|
|
217
226
|
|
|
218
|
-
log_event(prop,
|
|
219
|
-
if command ==
|
|
227
|
+
log_event(prop, "load_state")
|
|
228
|
+
if command == "server":
|
|
220
229
|
_collector.schedule_flush()
|
|
221
230
|
|
|
222
231
|
|
|
@@ -227,31 +236,29 @@ def log_codespaces_events(command):
|
|
|
227
236
|
return
|
|
228
237
|
|
|
229
238
|
user_prop = dict(
|
|
230
|
-
location=codespace.get(
|
|
231
|
-
is_prebuild=codespace.get(
|
|
239
|
+
location=codespace.get("location"),
|
|
240
|
+
is_prebuild=codespace.get("prebuild", False),
|
|
232
241
|
)
|
|
233
242
|
|
|
234
243
|
prop = dict(
|
|
235
|
-
machine=codespace.get(
|
|
244
|
+
machine=codespace.get("machine", {}).get("display_name"),
|
|
236
245
|
codespaces_name=get_github_codespace_name(),
|
|
237
246
|
)
|
|
238
247
|
|
|
239
248
|
# Codespace created event, send once
|
|
240
|
-
codespace_created_at = load_user_profile().get(
|
|
249
|
+
codespace_created_at = load_user_profile().get("codespace_created_at")
|
|
241
250
|
if codespace_created_at is None:
|
|
242
|
-
created_at = datetime.fromisoformat(codespace.get(
|
|
243
|
-
prop[
|
|
244
|
-
_collector.log_event(prop,
|
|
245
|
-
|
|
246
|
-
update_user_profile({'codespace_created_at': codespace.get('created_at')})
|
|
251
|
+
created_at = datetime.fromisoformat(codespace.get("created_at"))
|
|
252
|
+
prop["state"] = "created"
|
|
253
|
+
_collector.log_event(prop, "codespace_instance", event_triggered_at=created_at, user_properties=user_prop)
|
|
254
|
+
update_user_profile({"codespace_created_at": codespace.get("created_at")})
|
|
247
255
|
|
|
248
256
|
# Codespace available event, send multiple times as start/stop it
|
|
249
257
|
available_at = get_github_codespace_available_at(codespace)
|
|
250
|
-
if available_at and available_at.isoformat() != load_user_profile().get(
|
|
251
|
-
prop[
|
|
252
|
-
_collector.log_event(prop,
|
|
253
|
-
|
|
254
|
-
update_user_profile({'codespace_available_at': available_at.isoformat()})
|
|
258
|
+
if available_at and available_at.isoformat() != load_user_profile().get("codespace_available_at"):
|
|
259
|
+
prop["state"] = "available"
|
|
260
|
+
_collector.log_event(prop, "codespace_instance", event_triggered_at=available_at, user_properties=user_prop)
|
|
261
|
+
update_user_profile({"codespace_available_at": available_at.isoformat()})
|
|
255
262
|
|
|
256
263
|
# Codespace instance event should be flushed immediately
|
|
257
264
|
_collector.send_events()
|
|
@@ -259,20 +266,25 @@ def log_codespaces_events(command):
|
|
|
259
266
|
|
|
260
267
|
def log_single_env_event():
|
|
261
268
|
prop = dict(
|
|
262
|
-
action=
|
|
269
|
+
action="launch_server",
|
|
263
270
|
)
|
|
264
|
-
log_event(prop,
|
|
271
|
+
log_event(prop, "[Experiment] single_environment")
|
|
265
272
|
_collector.schedule_flush()
|
|
266
273
|
|
|
267
274
|
|
|
268
275
|
def log_performance(feature_name: str, metrics: Dict):
|
|
269
276
|
prop = metrics
|
|
270
|
-
log_event(prop, f
|
|
277
|
+
log_event(prop, f"[Performance] {feature_name}")
|
|
278
|
+
_collector.schedule_flush()
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def log_connected_to_cloud():
|
|
282
|
+
log_event({"action": "connected_to_cloud"}, "Connect OSS to Cloud")
|
|
271
283
|
_collector.schedule_flush()
|
|
272
284
|
|
|
273
285
|
|
|
274
286
|
def capture_exception(e):
|
|
275
|
-
user_id = load_user_profile().get(
|
|
287
|
+
user_id = load_user_profile().get("user_id")
|
|
276
288
|
if is_ci_env() is True:
|
|
277
289
|
user_id = f"{user_id}_CI"
|
|
278
290
|
|