From 16a45ba121e52b4420a1e6f50b980f044cd551ca Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 13:04:21 +0900
Subject: [PATCH 01/25] fix directory structure

---
 Pipfile.lock                                  | 1131 ++++++++++-------
 .../{schema.yml => src_seed/_models.yml}      |    7 +
 .../models/staging/src_seed/stg_customers.sql |    3 +
 .../stg_customers_pii.sql}                    |    0
 .../staging/{ => src_seed}/stg_orders.sql     |    0
 .../staging/{ => src_seed}/stg_payments.sql   |    0
 .../models/{docs.md => warehouse/_docs.md}    |    0
 .../{schema.yml => warehouse/_models.yml}     |    4 +-
 .../wh_customers.sql}                         |    0
 .../{orders.sql => warehouse/wh_orders.sql}   |    0
 pyproject.toml                                |    2 +
 11 files changed, 693 insertions(+), 454 deletions(-)
 rename jaffle_shop/models/staging/{schema.yml => src_seed/_models.yml} (84%)
 create mode 100644 jaffle_shop/models/staging/src_seed/stg_customers.sql
 rename jaffle_shop/models/staging/{stg_customers.sql => src_seed/stg_customers_pii.sql} (100%)
 rename jaffle_shop/models/staging/{ => src_seed}/stg_orders.sql (100%)
 rename jaffle_shop/models/staging/{ => src_seed}/stg_payments.sql (100%)
 rename jaffle_shop/models/{docs.md => warehouse/_docs.md} (100%)
 rename jaffle_shop/models/{schema.yml => warehouse/_models.yml} (98%)
 rename jaffle_shop/models/{customers.sql => warehouse/wh_customers.sql} (100%)
 rename jaffle_shop/models/{orders.sql => warehouse/wh_orders.sql} (100%)
 create mode 100644 pyproject.toml

diff --git a/Pipfile.lock b/Pipfile.lock
index f8d9c41d4..b9d6f8480 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -25,112 +25,219 @@
         },
         "attrs": {
             "hashes": [
-                "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6",
-                "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"
+                "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346",
+                "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"
             ],
-            "markers": "python_version >= '3.5'",
-            "version": "==22.1.0"
+            "markers": "python_version >= '3.7'",
+            "version": "==24.2.0"
         },
         "babel": {
             "hashes": [
-                "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe",
-                "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"
+                "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b",
+                "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"
             ],
-            "markers": "python_version >= '3.6'",
-            "version": "==2.11.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==2.16.0"
         },
         "certifi": {
             "hashes": [
-                "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14",
-                "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"
+                "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8",
+                "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"
             ],
             "markers": "python_version >= '3.6'",
-            "version": "==2022.9.24"
+            "version": "==2024.8.30"
         },
         "cffi": {
             "hashes": [
-                "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5",
-                "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef",
-                "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104",
-                "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426",
-                "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405",
-                "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375",
-                "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a",
-                "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e",
-                "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc",
-                "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf",
-                "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185",
-                "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497",
-                "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3",
-                "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35",
-                "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c",
-                "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83",
-                "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21",
-                "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca",
-                "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984",
-                "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac",
-                "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd",
-                "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee",
-                "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a",
-                "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2",
-                "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192",
-                "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7",
-                "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585",
-                "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f",
-                "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e",
-                "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27",
-                "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b",
-                "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e",
-                "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e",
-                "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d",
-                "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c",
-                "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415",
-                "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82",
-                "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02",
-                "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314",
-                "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325",
-                "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c",
-                "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3",
-                "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914",
-                "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045",
-                "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d",
-                "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9",
-                "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5",
-                "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2",
-                "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c",
-                "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3",
-                "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2",
-                "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8",
-                "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d",
-                "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d",
-                "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9",
-                "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162",
-                "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76",
-                "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4",
-                "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e",
-                "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9",
-                "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6",
-                "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b",
-                "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01",
-                "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"
-            ],
-            "version": "==1.15.1"
+                "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8",
+                "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2",
+                "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1",
+                "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15",
+                "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36",
+                "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824",
+                "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8",
+                "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36",
+                "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17",
+                "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf",
+                "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc",
+                "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3",
+                "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed",
+                "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702",
+                "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1",
+                "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8",
+                "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903",
+                "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6",
+                "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d",
+                "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b",
+                "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e",
+                "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be",
+                "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c",
+                "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683",
+                "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9",
+                "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c",
+                "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8",
+                "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1",
+                "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4",
+                "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655",
+                "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67",
+                "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595",
+                "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0",
+                "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65",
+                "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41",
+                "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6",
+                "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401",
+                "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6",
+                "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3",
+                "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16",
+                "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93",
+                "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e",
+                "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4",
+                "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964",
+                "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c",
+                "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576",
+                "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0",
+                "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3",
+                "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662",
+                "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3",
+                "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff",
+                "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5",
+                "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd",
+                "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f",
+                "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5",
+                "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14",
+                "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d",
+                "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9",
+                "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7",
+                "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382",
+                "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a",
+                "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e",
+                "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a",
+                "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4",
+                "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99",
+                "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
+                "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.17.1"
         },
         "charset-normalizer": {
             "hashes": [
-                "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845",
-                "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"
-            ],
-            "markers": "python_version >= '3.6'",
-            "version": "==2.1.1"
+                "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621",
+                "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6",
+                "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8",
+                "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912",
+                "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c",
+                "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b",
+                "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d",
+                "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d",
+                "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95",
+                "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e",
+                "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565",
+                "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64",
+                "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab",
+                "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be",
+                "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e",
+                "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907",
+                "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0",
+                "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2",
+                "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62",
+                "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62",
+                "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23",
+                "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc",
+                "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284",
+                "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca",
+                "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455",
+                "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858",
+                "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b",
+                "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594",
+                "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc",
+                "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db",
+                "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b",
+                "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea",
+                "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6",
+                "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920",
+                "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749",
+                "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7",
+                "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd",
+                "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99",
+                "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242",
+                "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee",
+                "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129",
+                "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2",
+                "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51",
+                "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee",
+                "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8",
+                "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b",
+                "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613",
+                "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742",
+                "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe",
+                "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3",
+                "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5",
+                "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631",
+                "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7",
+                "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15",
+                "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c",
+                "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea",
+                "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417",
+                "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250",
+                "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88",
+                "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca",
+                "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa",
+                "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99",
+                "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149",
+                "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41",
+                "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574",
+                "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0",
+                "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f",
+                "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d",
+                "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654",
+                "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3",
+                "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19",
+                "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90",
+                "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578",
+                "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9",
+                "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1",
+                "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51",
+                "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719",
+                "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236",
+                "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a",
+                "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c",
+                "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade",
+                "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944",
+                "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc",
+                "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6",
+                "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6",
+                "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27",
+                "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6",
+                "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2",
+                "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12",
+                "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf",
+                "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114",
+                "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7",
+                "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf",
+                "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d",
+                "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b",
+                "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed",
+                "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03",
+                "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4",
+                "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67",
+                "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365",
+                "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a",
+                "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748",
+                "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b",
+                "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079",
+                "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"
+            ],
+            "markers": "python_full_version >= '3.7.0'",
+            "version": "==3.4.0"
         },
         "click": {
             "hashes": [
-                "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e",
-                "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"
+                "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
+                "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"
             ],
             "markers": "python_version >= '3.7'",
-            "version": "==8.1.3"
+            "version": "==8.1.7"
         },
         "colorama": {
             "hashes": [
@@ -142,11 +249,11 @@
         },
         "databricks-sql-connector": {
             "hashes": [
-                "sha256:181007919044c8c21b63232fa8b3d3054a65343f4f37eb40fef93b7fee3ddc19",
-                "sha256:b936adc8755902347faafab40dea7b3e63b6f2da87a55cfda770e0fb792613f4"
+                "sha256:126b1b0ec8403c2ca7d84f1c617ef482f4288f428608b51122186dabc69bbd0f",
+                "sha256:4302828afa17b9f993dc63143aa35c76e30d2b46bdb4bcc47452d4c44bb412d8"
             ],
-            "markers": "python_full_version >= '3.7.1' and python_full_version < '4.0.0'",
-            "version": "==2.1.0"
+            "markers": "python_full_version >= '3.8.0' and python_full_version < '4.0.0'",
+            "version": "==3.6.0"
         },
         "dbt-core": {
             "hashes": [
@@ -154,6 +261,7 @@
                 "sha256:63f2f691af87790a4315e15267b863ecdd67828da5c76367c2c2f1cad08c6822"
             ],
             "index": "pypi",
+            "markers": "python_full_version >= '3.7.2'",
             "version": "==1.3.0"
         },
         "dbt-databricks": {
@@ -164,7 +272,7 @@
                 "sha256:0b0956a597befb574971e45341ca6c37de42cbfa2db61a7aab55bd5236a57206",
                 "sha256:9debf9280e3a791bc104bd089aa82ff1adfb7f2cddfe1ccd41b99bdf12619258"
             ],
-            "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==1.3.2"
         },
         "dbt-extractor": {
@@ -191,26 +299,35 @@
         },
         "dbt-spark": {
             "hashes": [
-                "sha256:52362eacf814e0bd5964ec0f67eb818fd596df0328be07a2ce0b9b9d40d072da",
-                "sha256:99f6dbeec2d135f7a1c91b75abb2ff13aee9fa5285e53a19200ed0ec03f13a9d"
+                "sha256:97646503d921ce8b43896bfb9ed55a0f63fdcb2f989d955c2505cb60bf709adf",
+                "sha256:9bccd36f3e3a5a7b2b38381be9038107e34096c207312077460f04805c63864d"
             ],
             "markers": "python_version >= '3.7'",
-            "version": "==1.3.0"
+            "version": "==1.3.3"
+        },
+        "et-xmlfile": {
+            "hashes": [
+                "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa",
+                "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.0.0"
         },
         "exceptiongroup": {
             "hashes": [
-                "sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695",
-                "sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27"
+                "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b",
+                "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
             ],
             "markers": "python_version < '3.11'",
-            "version": "==1.0.2"
+            "version": "==1.2.2"
         },
         "future": {
             "hashes": [
-                "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
+                "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216",
+                "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"
             ],
-            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==0.18.2"
+            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
+            "version": "==1.0.0"
         },
         "glob2": {
             "hashes": [
@@ -228,18 +345,19 @@
         },
         "idna": {
             "hashes": [
-                "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
-                "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"
+                "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
+                "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
             ],
-            "markers": "python_version >= '3.5'",
-            "version": "==3.4"
+            "markers": "python_version >= '3.6'",
+            "version": "==3.10"
         },
         "iniconfig": {
             "hashes": [
-                "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3",
-                "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"
+                "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
+                "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
             ],
-            "version": "==1.1.1"
+            "markers": "python_version >= '3.7'",
+            "version": "==2.0.0"
         },
         "isodate": {
             "hashes": [
@@ -265,10 +383,10 @@
         },
         "leather": {
             "hashes": [
-                "sha256:5e741daee96e9f1e9e06081b8c8a10c4ac199301a0564cdd99b09df15b4603d2",
-                "sha256:b43e21c8fa46b2679de8449f4d953c06418666dc058ce41055ee8a8d3bb40918"
+                "sha256:18290bc93749ae39039af5e31e871fcfad74d26c4c3ea28ea4f681f4571b3a2b",
+                "sha256:f964bec2086f3153a6c16e707f20cb718f811f57af116075f4c0f4805c608b95"
             ],
-            "version": "==0.3.4"
+            "version": "==0.4.0"
         },
         "logbook": {
             "hashes": [
@@ -284,51 +402,113 @@
             ],
             "version": "==1.5.3"
         },
+        "lz4": {
+            "hashes": [
+                "sha256:01fe674ef2889dbb9899d8a67361e0c4a2c833af5aeb37dd505727cf5d2a131e",
+                "sha256:054b4631a355606e99a42396f5db4d22046a3397ffc3269a348ec41eaebd69d2",
+                "sha256:0a136e44a16fc98b1abc404fbabf7f1fada2bdab6a7e970974fb81cf55b636d0",
+                "sha256:0e9c410b11a31dbdc94c05ac3c480cb4b222460faf9231f12538d0074e56c563",
+                "sha256:222a7e35137d7539c9c33bb53fcbb26510c5748779364014235afc62b0ec797f",
+                "sha256:24b3206de56b7a537eda3a8123c644a2b7bf111f0af53bc14bed90ce5562d1aa",
+                "sha256:2b901c7784caac9a1ded4555258207d9e9697e746cc8532129f150ffe1f6ba0d",
+                "sha256:2f7b1839f795315e480fb87d9bc60b186a98e3e5d17203c6e757611ef7dcef61",
+                "sha256:30e8c20b8857adef7be045c65f47ab1e2c4fabba86a9fa9a997d7674a31ea6b6",
+                "sha256:31ea4be9d0059c00b2572d700bf2c1bc82f241f2c3282034a759c9a4d6ca4dc2",
+                "sha256:337cb94488a1b060ef1685187d6ad4ba8bc61d26d631d7ba909ee984ea736be1",
+                "sha256:33c9a6fd20767ccaf70649982f8f3eeb0884035c150c0b818ea660152cf3c809",
+                "sha256:363ab65bf31338eb364062a15f302fc0fab0a49426051429866d71c793c23394",
+                "sha256:43cf03059c0f941b772c8aeb42a0813d68d7081c009542301637e5782f8a33e2",
+                "sha256:56f4fe9c6327adb97406f27a66420b22ce02d71a5c365c48d6b656b4aaeb7775",
+                "sha256:5d35533bf2cee56f38ced91f766cd0038b6abf46f438a80d50c52750088be93f",
+                "sha256:6756212507405f270b66b3ff7f564618de0606395c0fe10a7ae2ffcbbe0b1fba",
+                "sha256:6cdc60e21ec70266947a48839b437d46025076eb4b12c76bd47f8e5eb8a75dcc",
+                "sha256:abc197e4aca8b63f5ae200af03eb95fb4b5055a8f990079b5bdf042f568469dd",
+                "sha256:b14d948e6dce389f9a7afc666d60dd1e35fa2138a8ec5306d30cd2e30d36b40c",
+                "sha256:b47839b53956e2737229d70714f1d75f33e8ac26e52c267f0197b3189ca6de24",
+                "sha256:b6d9ec061b9eca86e4dcc003d93334b95d53909afd5a32c6e4f222157b50c071",
+                "sha256:b891880c187e96339474af2a3b2bfb11a8e4732ff5034be919aa9029484cd201",
+                "sha256:bca8fccc15e3add173da91be8f34121578dc777711ffd98d399be35487c934bf",
+                "sha256:c81703b12475da73a5d66618856d04b1307e43428a7e59d98cfe5a5d608a74c6",
+                "sha256:d2507ee9c99dbddd191c86f0e0c8b724c76d26b0602db9ea23232304382e1f21",
+                "sha256:e36cd7b9d4d920d3bfc2369840da506fa68258f7bb176b8743189793c055e43d",
+                "sha256:e7d84b479ddf39fe3ea05387f10b779155fc0990125f4fb35d636114e1c63a2e",
+                "sha256:eac9af361e0d98335a02ff12fb56caeb7ea1196cf1a49dbf6f17828a131da807",
+                "sha256:edfd858985c23523f4e5a7526ca6ee65ff930207a7ec8a8f57a01eae506aaee7",
+                "sha256:ee9ff50557a942d187ec85462bb0960207e7ec5b19b3b48949263993771c6205",
+                "sha256:f0e822cd7644995d9ba248cb4b67859701748a93e2ab7fc9bc18c599a52e4604",
+                "sha256:f180904f33bdd1e92967923a43c22899e303906d19b2cf8bb547db6653ea6e7d",
+                "sha256:f1d18718f9d78182c6b60f568c9a9cec8a7204d7cb6fad4e511a2ef279e4cb05",
+                "sha256:f4c7bf687303ca47d69f9f0133274958fd672efaa33fb5bcde467862d6c621f0",
+                "sha256:f76176492ff082657ada0d0f10c794b6da5800249ef1692b35cf49b1e93e8ef7"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==4.3.3"
+        },
         "markupsafe": {
             "hashes": [
-                "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003",
-                "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88",
-                "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5",
-                "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7",
-                "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a",
-                "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603",
-                "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1",
-                "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135",
-                "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247",
-                "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6",
-                "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601",
-                "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77",
-                "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02",
-                "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e",
-                "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63",
-                "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f",
-                "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980",
-                "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b",
-                "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812",
-                "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff",
-                "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96",
-                "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1",
-                "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925",
-                "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a",
-                "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6",
-                "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e",
-                "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f",
-                "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4",
-                "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f",
-                "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3",
-                "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c",
-                "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a",
-                "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417",
-                "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a",
-                "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a",
-                "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37",
-                "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452",
-                "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933",
-                "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a",
-                "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"
+                "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf",
+                "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff",
+                "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f",
+                "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3",
+                "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532",
+                "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f",
+                "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617",
+                "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df",
+                "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4",
+                "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906",
+                "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f",
+                "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4",
+                "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8",
+                "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371",
+                "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2",
+                "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465",
+                "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52",
+                "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6",
+                "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169",
+                "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad",
+                "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2",
+                "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0",
+                "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029",
+                "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f",
+                "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a",
+                "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced",
+                "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5",
+                "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c",
+                "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf",
+                "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9",
+                "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb",
+                "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad",
+                "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3",
+                "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1",
+                "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46",
+                "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc",
+                "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a",
+                "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee",
+                "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900",
+                "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5",
+                "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea",
+                "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f",
+                "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5",
+                "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e",
+                "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a",
+                "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f",
+                "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50",
+                "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a",
+                "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b",
+                "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4",
+                "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff",
+                "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2",
+                "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46",
+                "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b",
+                "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf",
+                "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5",
+                "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5",
+                "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab",
+                "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd",
+                "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"
             ],
             "markers": "python_version >= '3.7'",
-            "version": "==2.1.1"
+            "version": "==2.1.5"
         },
         "mashumaro": {
             "extras": [
@@ -349,60 +529,72 @@
         },
         "msgpack": {
             "hashes": [
-                "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467",
-                "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae",
-                "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92",
-                "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef",
-                "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624",
-                "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227",
-                "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88",
-                "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9",
-                "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8",
-                "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd",
-                "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6",
-                "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55",
-                "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e",
-                "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2",
-                "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44",
-                "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6",
-                "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9",
-                "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab",
-                "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae",
-                "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa",
-                "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9",
-                "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e",
-                "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250",
-                "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce",
-                "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075",
-                "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236",
-                "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae",
-                "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e",
-                "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f",
-                "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08",
-                "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6",
-                "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d",
-                "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43",
-                "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1",
-                "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6",
-                "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0",
-                "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c",
-                "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff",
-                "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db",
-                "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243",
-                "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661",
-                "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba",
-                "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e",
-                "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb",
-                "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52",
-                "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6",
-                "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1",
-                "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f",
-                "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da",
-                "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f",
-                "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c",
-                "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"
-            ],
-            "version": "==1.0.4"
+                "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b",
+                "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf",
+                "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca",
+                "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330",
+                "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f",
+                "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f",
+                "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39",
+                "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247",
+                "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b",
+                "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c",
+                "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7",
+                "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044",
+                "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6",
+                "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b",
+                "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0",
+                "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2",
+                "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468",
+                "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7",
+                "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734",
+                "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434",
+                "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325",
+                "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1",
+                "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846",
+                "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88",
+                "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420",
+                "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e",
+                "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2",
+                "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59",
+                "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb",
+                "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68",
+                "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915",
+                "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f",
+                "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701",
+                "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b",
+                "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d",
+                "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa",
+                "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d",
+                "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd",
+                "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc",
+                "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48",
+                "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb",
+                "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74",
+                "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b",
+                "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346",
+                "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e",
+                "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6",
+                "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5",
+                "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f",
+                "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5",
+                "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b",
+                "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c",
+                "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f",
+                "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec",
+                "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8",
+                "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5",
+                "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d",
+                "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e",
+                "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e",
+                "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870",
+                "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f",
+                "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96",
+                "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c",
+                "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd",
+                "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"
+            ],
+            "version": "==1.1.0"
         },
         "networkx": {
             "hashes": [
@@ -414,37 +606,37 @@
         },
         "numpy": {
             "hashes": [
-                "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8",
-                "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735",
-                "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd",
-                "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810",
-                "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db",
-                "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962",
-                "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79",
-                "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911",
-                "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d",
-                "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488",
-                "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5",
-                "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0",
-                "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f",
-                "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f",
-                "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2",
-                "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0",
-                "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68",
-                "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3",
-                "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6",
-                "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71",
-                "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894",
-                "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f",
-                "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329",
-                "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba",
-                "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c",
-                "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e",
-                "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef",
-                "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"
-            ],
-            "markers": "python_version < '3.10'",
-            "version": "==1.23.4"
+                "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f",
+                "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61",
+                "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7",
+                "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400",
+                "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef",
+                "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2",
+                "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d",
+                "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc",
+                "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835",
+                "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706",
+                "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5",
+                "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4",
+                "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6",
+                "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463",
+                "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a",
+                "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f",
+                "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e",
+                "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e",
+                "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694",
+                "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8",
+                "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64",
+                "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d",
+                "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc",
+                "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254",
+                "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2",
+                "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1",
+                "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810",
+                "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"
+            ],
+            "markers": "python_version >= '3.7' and python_version < '3.11'",
+            "version": "==1.24.4"
         },
         "oauthlib": {
             "hashes": [
@@ -454,6 +646,14 @@
             "markers": "python_version >= '3.6'",
             "version": "==3.2.2"
         },
+        "openpyxl": {
+            "hashes": [
+                "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2",
+                "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==3.1.5"
+        },
         "packaging": {
             "hashes": [
                 "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
@@ -464,36 +664,34 @@
         },
         "pandas": {
             "hashes": [
-                "sha256:04e51b01d5192499390c0015630975f57836cc95c7411415b499b599b05c0c96",
-                "sha256:05c527c64ee02a47a24031c880ee0ded05af0623163494173204c5b72ddce658",
-                "sha256:0a78e05ec09731c5b3bd7a9805927ea631fe6f6cb06f0e7c63191a9a778d52b4",
-                "sha256:17da7035d9e6f9ea9cdc3a513161f8739b8f8489d31dc932bc5a29a27243f93d",
-                "sha256:249cec5f2a5b22096440bd85c33106b6102e0672204abd2d5c014106459804ee",
-                "sha256:2c25e5c16ee5c0feb6cf9d982b869eec94a22ddfda9aa2fbed00842cbb697624",
-                "sha256:32e3d9f65606b3f6e76555bfd1d0b68d94aff0929d82010b791b6254bf5a4b96",
-                "sha256:36aa1f8f680d7584e9b572c3203b20d22d697c31b71189322f16811d4ecfecd3",
-                "sha256:5b0c970e2215572197b42f1cff58a908d734503ea54b326412c70d4692256391",
-                "sha256:5cee0c74e93ed4f9d39007e439debcaadc519d7ea5c0afc3d590a3a7b2edf060",
-                "sha256:669c8605dba6c798c1863157aefde959c1796671ffb342b80fcb80a4c0bc4c26",
-                "sha256:66a1ad667b56e679e06ba73bb88c7309b3f48a4c279bd3afea29f65a766e9036",
-                "sha256:683779e5728ac9138406c59a11e09cd98c7d2c12f0a5fc2b9c5eecdbb4a00075",
-                "sha256:6bb391659a747cf4f181a227c3e64b6d197100d53da98dcd766cc158bdd9ec68",
-                "sha256:81f0674fa50b38b6793cd84fae5d67f58f74c2d974d2cb4e476d26eee33343d0",
-                "sha256:927e59c694e039c75d7023465d311277a1fc29ed7236b5746e9dddf180393113",
-                "sha256:932d2d7d3cab44cfa275601c982f30c2d874722ef6396bb539e41e4dc4618ed4",
-                "sha256:a52419d9ba5906db516109660b114faf791136c94c1a636ed6b29cbfff9187ee",
-                "sha256:b156a971bc451c68c9e1f97567c94fd44155f073e3bceb1b0d195fd98ed12048",
-                "sha256:bcf1a82b770b8f8c1e495b19a20d8296f875a796c4fe6e91da5ef107f18c5ecb",
-                "sha256:cb2a9cf1150302d69bb99861c5cddc9c25aceacb0a4ef5299785d0f5389a3209",
-                "sha256:d8c709f4700573deb2036d240d140934df7e852520f4a584b2a8d5443b71f54d",
-                "sha256:db45b94885000981522fb92349e6b76f5aee0924cc5315881239c7859883117d",
-                "sha256:ddf46b940ef815af4e542697eaf071f0531449407a7607dd731bf23d156e20a7",
-                "sha256:e675f8fe9aa6c418dc8d3aac0087b5294c1a4527f1eacf9fe5ea671685285454",
-                "sha256:eb7e8cf2cf11a2580088009b43de84cabbf6f5dae94ceb489f28dba01a17cb77",
-                "sha256:f340331a3f411910adfb4bbe46c2ed5872d9e473a783d7f14ecf49bc0869c594"
+                "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682",
+                "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc",
+                "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b",
+                "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089",
+                "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5",
+                "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26",
+                "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210",
+                "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b",
+                "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641",
+                "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd",
+                "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78",
+                "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b",
+                "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e",
+                "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061",
+                "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0",
+                "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e",
+                "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8",
+                "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d",
+                "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0",
+                "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c",
+                "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183",
+                "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df",
+                "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8",
+                "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f",
+                "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==1.5.1"
+            "version": "==2.0.3"
         },
         "parsedatetime": {
             "hashes": [
@@ -507,123 +705,144 @@
                 "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a",
                 "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"
             ],
-            "markers": "python_version >= '3.7'",
             "version": "==0.9.0"
         },
         "pluggy": {
             "hashes": [
-                "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159",
-                "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"
+                "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
+                "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
             ],
-            "markers": "python_version >= '3.6'",
-            "version": "==1.0.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==1.5.0"
         },
         "pyarrow": {
             "hashes": [
-                "sha256:0238998dc692efcb4e41ae74738d7c1234723271ccf520bd8312dca07d49ef8d",
-                "sha256:02b820ecd1da02012092c180447de449fc688d0c3f9ff8526ca301cdd60dacd0",
-                "sha256:1c5a073a930c632058461547e0bc572da1e724b17b6b9eb31a97da13f50cb6e0",
-                "sha256:29eb3e086e2b26202f3a4678316b93cfb15d0e2ba20f3ec12db8fd9cc07cde63",
-                "sha256:2c715eca2092273dcccf6f08437371e04d112f9354245ba2fbe6c801879450b7",
-                "sha256:2e753f8fcf07d8e3a0efa0c8bd51fef5c90281ffd4c5637c08ce42cd0ac297de",
-                "sha256:3eef8a981f45d89de403e81fb83b8119c20824caddf1404274e41a5d66c73806",
-                "sha256:4eebdab05afa23d5d5274b24c1cbeb1ba017d67c280f7d39fd8a8f18cbad2ec9",
-                "sha256:5526a3bfb404ff6d31d62ea582cf2466c7378a474a99ee04d1a9b05de5264541",
-                "sha256:55328348b9139c2b47450d512d716c2248fd58e2f04e2fc23a65e18726666d42",
-                "sha256:767cafb14278165ad539a2918c14c1b73cf20689747c21375c38e3fe62884902",
-                "sha256:7fa56cbd415cef912677270b8e41baad70cde04c6d8a8336eeb2aba85aa93706",
-                "sha256:7fb02bebc13ab55573d1ae9bb5002a6d20ba767bf8569b52fce5301d42495ab7",
-                "sha256:81a60bb291a964f63b2717fb1b28f6615ffab7e8585322bfb8a6738e6b321282",
-                "sha256:8ad430cee28ebc4d6661fc7315747c7a18ae2a74e67498dcb039e1c762a2fb67",
-                "sha256:92f3977e901db1ef5cba30d6cc1d7942b8d94b910c60f89013e8f7bb86a86eef",
-                "sha256:9cef618159567d5f62040f2b79b1c7b38e3885f4ffad0ec97cd2d86f88b67cef",
-                "sha256:a5b390bdcfb8c5b900ef543f911cdfec63e88524fafbcc15f83767202a4a2491",
-                "sha256:d9eb04db626fa24fdfb83c00f76679ca0d98728cdbaa0481b6402bf793a290c0",
-                "sha256:da3e0f319509a5881867effd7024099fb06950a0768dad0d6873668bb88cfaba",
-                "sha256:f11a645a41ee531c3a5edda45dea07c42267f52571f818d388971d33fc7e2d4a",
-                "sha256:f241bd488c2705df930eedfe304ada71191dcf67d6b98ceda0cc934fd2a8388e",
-                "sha256:f59bcd5217a3ae1e17870792f82b2ff92df9f3862996e2c78e156c13e56ff62e",
-                "sha256:f8c46bde1030d704e2796182286d1c56846552c50a39ad5bf5a20c0d8159fc35",
-                "sha256:fc856628acd8d281652c15b6268ec7f27ebcb015abbe99d9baad17f02adc51f1",
-                "sha256:fe2ce795fa1d95e4e940fe5661c3c58aee7181c730f65ac5dd8794a77228de59"
+                "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a",
+                "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2",
+                "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f",
+                "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2",
+                "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315",
+                "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9",
+                "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b",
+                "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55",
+                "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15",
+                "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e",
+                "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f",
+                "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c",
+                "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a",
+                "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa",
+                "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a",
+                "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd",
+                "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628",
+                "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef",
+                "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e",
+                "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff",
+                "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b",
+                "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c",
+                "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c",
+                "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f",
+                "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3",
+                "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6",
+                "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c",
+                "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147",
+                "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5",
+                "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7",
+                "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710",
+                "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4",
+                "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed",
+                "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848",
+                "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83",
+                "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==9.0.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==16.1.0"
         },
         "pycparser": {
             "hashes": [
-                "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9",
-                "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"
+                "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
+                "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
             ],
-            "version": "==2.21"
+            "markers": "python_version >= '3.8'",
+            "version": "==2.22"
         },
         "pyparsing": {
             "hashes": [
-                "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
-                "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
+                "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c",
+                "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"
             ],
             "markers": "python_full_version >= '3.6.8'",
-            "version": "==3.0.9"
+            "version": "==3.1.4"
         },
         "pyrsistent": {
             "hashes": [
-                "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed",
-                "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb",
-                "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a",
-                "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95",
-                "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712",
-                "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73",
-                "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41",
-                "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b",
-                "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78",
-                "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab",
-                "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308",
-                "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425",
-                "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2",
-                "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e",
-                "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6",
-                "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2",
-                "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a",
-                "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291",
-                "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584",
-                "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a",
-                "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0",
-                "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770"
+                "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f",
+                "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e",
+                "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958",
+                "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34",
+                "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca",
+                "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d",
+                "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d",
+                "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4",
+                "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714",
+                "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf",
+                "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee",
+                "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8",
+                "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224",
+                "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d",
+                "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054",
+                "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656",
+                "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7",
+                "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423",
+                "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce",
+                "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e",
+                "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3",
+                "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0",
+                "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f",
+                "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b",
+                "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce",
+                "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a",
+                "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174",
+                "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86",
+                "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f",
+                "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b",
+                "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98",
+                "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==0.19.2"
+            "markers": "python_version >= '3.8'",
+            "version": "==0.20.0"
         },
         "pytest": {
             "hashes": [
-                "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71",
-                "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"
+                "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181",
+                "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==7.2.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==8.3.3"
         },
         "pytest-mock": {
             "hashes": [
-                "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b",
-                "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"
+                "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f",
+                "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"
             ],
             "index": "pypi",
-            "version": "==3.10.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==3.14.0"
         },
         "python-dateutil": {
             "hashes": [
                 "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
                 "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==2.8.2"
         },
         "python-slugify": {
             "hashes": [
-                "sha256:272d106cb31ab99b3496ba085e3fea0e9e76dcde967b5e9992500d1f785ce4e1",
-                "sha256:7b2c274c308b62f4269a9ba701aa69a797e9bca41aeee5b3a9e79e36b6656927"
+                "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8",
+                "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
-            "version": "==6.1.2"
+            "markers": "python_version >= '3.7'",
+            "version": "==8.0.4"
         },
         "pytimeparse": {
             "hashes": [
@@ -634,96 +853,110 @@
         },
         "pytz": {
             "hashes": [
-                "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427",
-                "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"
+                "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a",
+                "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"
             ],
-            "version": "==2022.6"
+            "markers": "python_version < '3.9'",
+            "version": "==2024.2"
         },
         "pyyaml": {
             "hashes": [
-                "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf",
-                "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293",
-                "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b",
-                "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57",
-                "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b",
-                "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4",
-                "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07",
-                "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba",
-                "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9",
-                "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287",
-                "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513",
-                "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0",
-                "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782",
-                "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0",
-                "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92",
-                "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f",
-                "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2",
-                "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc",
-                "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1",
-                "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c",
-                "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86",
-                "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4",
-                "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c",
-                "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34",
-                "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b",
-                "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d",
-                "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c",
-                "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb",
-                "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7",
-                "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737",
-                "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3",
-                "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d",
-                "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358",
-                "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53",
-                "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78",
-                "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803",
-                "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a",
-                "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f",
-                "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174",
-                "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
+                "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
+                "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
+                "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
+                "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
+                "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
+                "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
+                "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
+                "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
+                "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
+                "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
+                "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
+                "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
+                "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
+                "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
+                "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
+                "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
+                "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
+                "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
+                "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
+                "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
+                "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
+                "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
+                "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
+                "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
+                "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
+                "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
+                "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
+                "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
+                "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
+                "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
+                "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
+                "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
+                "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
+                "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
+                "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
+                "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
+                "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
+                "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
+                "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
+                "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
+                "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
+                "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
+                "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
+                "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
+                "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
+                "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
+                "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
+                "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
+                "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
+                "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
+                "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
+                "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
+                "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
             ],
-            "markers": "python_version >= '3.6'",
-            "version": "==6.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==6.0.2"
         },
         "requests": {
             "hashes": [
-                "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983",
-                "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"
+                "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
+                "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
             ],
-            "markers": "python_version >= '3.7' and python_full_version < '4.0.0'",
-            "version": "==2.28.1"
+            "markers": "python_version >= '3.8'",
+            "version": "==2.32.3"
         },
         "setuptools": {
             "hashes": [
-                "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31",
-                "sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f"
+                "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd",
+                "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==65.5.1"
+            "markers": "python_version >= '3.8'",
+            "version": "==75.3.0"
         },
         "six": {
             "hashes": [
                 "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
                 "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.16.0"
         },
         "sqlparams": {
             "hashes": [
-                "sha256:79e4136cf4333ccbcd559793058740479df2386fbaedb0d03ff2b3c0e1c53b1a",
-                "sha256:bab69f000493013a1d563ffff2a22e2b18a69cf72fc1036431c2e59db3d4d9fb"
+                "sha256:454beae170183836429013dfdfcca6eb168ec06168f332c8658cccaf6452de15",
+                "sha256:a74d4d60f07a0bd06a6f4251db07ece512af512b363f718b72bfbd4883499a29"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==5.0.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==6.1.0"
         },
         "sqlparse": {
             "hashes": [
-                "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34",
-                "sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268"
+                "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3",
+                "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"
             ],
             "markers": "python_version >= '3.5'",
-            "version": "==0.4.3"
+            "version": "==0.4.4"
         },
         "text-unidecode": {
             "hashes": [
@@ -734,66 +967,67 @@
         },
         "thrift": {
             "hashes": [
-                "sha256:9af1c86bf73433afc6010ed376a6c6aca2b54099cc0d61895f640870a9ae7d89"
+                "sha256:4dd662eadf6b8aebe8a41729527bd69adf6ceaa2a8681cbef64d1273b3e8feba"
             ],
-            "version": "==0.13.0"
+            "version": "==0.20.0"
         },
         "tomli": {
             "hashes": [
-                "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
-                "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
+                "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38",
+                "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"
             ],
             "markers": "python_version < '3.11'",
-            "version": "==2.0.1"
+            "version": "==2.0.2"
         },
         "typing-extensions": {
             "hashes": [
-                "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa",
-                "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"
+                "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
+                "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==4.4.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==4.12.2"
+        },
+        "tzdata": {
+            "hashes": [
+                "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc",
+                "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"
+            ],
+            "markers": "python_version >= '2'",
+            "version": "==2024.2"
         },
         "urllib3": {
             "hashes": [
-                "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e",
-                "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"
+                "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac",
+                "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_full_version < '4.0.0'",
-            "version": "==1.26.12"
+            "markers": "python_version >= '3.8'",
+            "version": "==2.2.3"
         },
         "werkzeug": {
             "hashes": [
-                "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f",
-                "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5"
+                "sha256:554b257c74bbeb7a0d254160a4f8ffe185243f52a52035060b761ca62d977f03",
+                "sha256:bba1f19f8ec89d4d607a3bd62f1904bd2e609472d93cd85e9d4e178f472c3748"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==2.2.2"
+            "markers": "python_version >= '3.8'",
+            "version": "==2.3.8"
         }
     },
     "develop": {
-        "attrs": {
-            "hashes": [
-                "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6",
-                "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==22.1.0"
-        },
         "exceptiongroup": {
             "hashes": [
-                "sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695",
-                "sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27"
+                "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b",
+                "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
             ],
             "markers": "python_version < '3.11'",
-            "version": "==1.0.2"
+            "version": "==1.2.2"
         },
         "iniconfig": {
             "hashes": [
-                "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3",
-                "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"
+                "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
+                "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
             ],
-            "version": "==1.1.1"
+            "markers": "python_version >= '3.7'",
+            "version": "==2.0.0"
         },
         "packaging": {
             "hashes": [
@@ -805,43 +1039,36 @@
         },
         "pluggy": {
             "hashes": [
-                "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159",
-                "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"
+                "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
+                "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
             ],
-            "markers": "python_version >= '3.6'",
-            "version": "==1.0.0"
-        },
-        "pyparsing": {
-            "hashes": [
-                "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
-                "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
-            ],
-            "markers": "python_full_version >= '3.6.8'",
-            "version": "==3.0.9"
+            "markers": "python_version >= '3.8'",
+            "version": "==1.5.0"
         },
         "pytest": {
             "hashes": [
-                "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71",
-                "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"
+                "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181",
+                "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==7.2.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==8.3.3"
         },
         "pytest-mock": {
             "hashes": [
-                "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b",
-                "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"
+                "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f",
+                "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"
             ],
             "index": "pypi",
-            "version": "==3.10.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==3.14.0"
         },
         "tomli": {
             "hashes": [
-                "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
-                "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
+                "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38",
+                "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"
             ],
             "markers": "python_version < '3.11'",
-            "version": "==2.0.1"
+            "version": "==2.0.2"
         }
     }
 }
diff --git a/jaffle_shop/models/staging/schema.yml b/jaffle_shop/models/staging/src_seed/_models.yml
similarity index 84%
rename from jaffle_shop/models/staging/schema.yml
rename to jaffle_shop/models/staging/src_seed/_models.yml
index c207e4cf5..92136a644 100644
--- a/jaffle_shop/models/staging/schema.yml
+++ b/jaffle_shop/models/staging/src_seed/_models.yml
@@ -1,6 +1,13 @@
 version: 2
 
 models:
+  - name: stg_customers_pii
+    columns:
+      - name: customer_id
+        tests:
+          - unique
+          - not_null
+
   - name: stg_customers
     columns:
       - name: customer_id
diff --git a/jaffle_shop/models/staging/src_seed/stg_customers.sql b/jaffle_shop/models/staging/src_seed/stg_customers.sql
new file mode 100644
index 000000000..a88e326f6
--- /dev/null
+++ b/jaffle_shop/models/staging/src_seed/stg_customers.sql
@@ -0,0 +1,3 @@
+select
+  {{ hash_sensitive_columns('stg_customers_pii') }}
+from {{ ref('stg_customers_pii') }}
diff --git a/jaffle_shop/models/staging/stg_customers.sql b/jaffle_shop/models/staging/src_seed/stg_customers_pii.sql
similarity index 100%
rename from jaffle_shop/models/staging/stg_customers.sql
rename to jaffle_shop/models/staging/src_seed/stg_customers_pii.sql
diff --git a/jaffle_shop/models/staging/stg_orders.sql b/jaffle_shop/models/staging/src_seed/stg_orders.sql
similarity index 100%
rename from jaffle_shop/models/staging/stg_orders.sql
rename to jaffle_shop/models/staging/src_seed/stg_orders.sql
diff --git a/jaffle_shop/models/staging/stg_payments.sql b/jaffle_shop/models/staging/src_seed/stg_payments.sql
similarity index 100%
rename from jaffle_shop/models/staging/stg_payments.sql
rename to jaffle_shop/models/staging/src_seed/stg_payments.sql
diff --git a/jaffle_shop/models/docs.md b/jaffle_shop/models/warehouse/_docs.md
similarity index 100%
rename from jaffle_shop/models/docs.md
rename to jaffle_shop/models/warehouse/_docs.md
diff --git a/jaffle_shop/models/schema.yml b/jaffle_shop/models/warehouse/_models.yml
similarity index 98%
rename from jaffle_shop/models/schema.yml
rename to jaffle_shop/models/warehouse/_models.yml
index 381349cfd..5139030c2 100644
--- a/jaffle_shop/models/schema.yml
+++ b/jaffle_shop/models/warehouse/_models.yml
@@ -1,7 +1,7 @@
 version: 2
 
 models:
-  - name: customers
+  - name: wh_customers
     description: This table has basic information about a customer, as well as some derived facts based on a customer's orders
 
     columns:
@@ -29,7 +29,7 @@ models:
       - name: total_order_amount
         description: Total value (AUD) of a customer's orders
 
-  - name: orders
+  - name: wh_orders
     description: This table has basic information about orders, as well as some derived facts based on payments
 
     columns:
diff --git a/jaffle_shop/models/customers.sql b/jaffle_shop/models/warehouse/wh_customers.sql
similarity index 100%
rename from jaffle_shop/models/customers.sql
rename to jaffle_shop/models/warehouse/wh_customers.sql
diff --git a/jaffle_shop/models/orders.sql b/jaffle_shop/models/warehouse/wh_orders.sql
similarity index 100%
rename from jaffle_shop/models/orders.sql
rename to jaffle_shop/models/warehouse/wh_orders.sql
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 000000000..7f15492a5
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,2 @@
+[tool.pytest.ini_options]
+addopts = "--ignore=dbt_packages"

From 10d8688ec7f54639f4c49b448782800e520f6bfa Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 13:14:50 +0900
Subject: [PATCH 02/25] update staging schemas and descriptions

---
 .../models/staging/src_seed/_models.yml       | 32 +++++++++++++++++++
 .../models/staging/src_seed/stg_payments.sql  |  2 +-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/jaffle_shop/models/staging/src_seed/_models.yml b/jaffle_shop/models/staging/src_seed/_models.yml
index 92136a644..5beae6090 100644
--- a/jaffle_shop/models/staging/src_seed/_models.yml
+++ b/jaffle_shop/models/staging/src_seed/_models.yml
@@ -2,26 +2,53 @@ version: 2
 
 models:
   - name: stg_customers_pii
+    meta:
+      owner: 'nathan.lugg@kraken.tech'
+      sensitive: true
+    description: |
+      A table with a row per customer which simply contains their first_name, last_name,
+      and customer ID
     columns:
       - name: customer_id
+        description: Primary key
         tests:
           - unique
           - not_null
+      - name: first_name
+        meta:
+          sensitive: true
+      - name: last_name
+        meta:
+          sensitive: true
 
   - name: stg_customers
+    meta:
+      owner: 'nathan.lugg@kraken.tech'
+    description: |
+      A non-sensitive version of `stg_customers_pii` where the first_name and last_name
+      have been replaced with hashes
     columns:
       - name: customer_id
+        description: Primary key
         tests:
           - unique
           - not_null
+      - name: first_name_hash
+      - name: last_name_hash
 
   - name: stg_orders
     columns:
       - name: order_id
+        description: Primary key
         tests:
           - unique
           - not_null
+      - name: customer_id
+        description: Foreign key referring to customer_id in `stg_customers_pii`/`stg_customers`
+      - name: order_date
+        description: The date the order was placed
       - name: status
+        description: Current status of the order
         tests:
           - accepted_values:
               values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
@@ -29,10 +56,15 @@ models:
   - name: stg_payments
     columns:
       - name: payment_id
+        description: Primary key
         tests:
           - unique
           - not_null
+      - name: order_id
+        description: Foreign key referring to order_id in `stg_orders`
       - name: payment_method
         tests:
           - accepted_values:
               values: ['credit_card', 'coupon', 'bank_transfer', 'gift_card']
+      - name: amount_dollars
+        description: The amount, in dollars, of the order
diff --git a/jaffle_shop/models/staging/src_seed/stg_payments.sql b/jaffle_shop/models/staging/src_seed/stg_payments.sql
index 700cf7f4f..502a3ecdc 100644
--- a/jaffle_shop/models/staging/src_seed/stg_payments.sql
+++ b/jaffle_shop/models/staging/src_seed/stg_payments.sql
@@ -16,7 +16,7 @@ renamed as (
         payment_method,
 
         -- `amount` is currently stored in cents, so we convert it to dollars
-        amount / 100 as amount
+        amount / 100 as amount_dollars
 
     from source
 

From f0d4da7863f91a5a3402702d76d7c10fb5620163 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 13:18:09 +0900
Subject: [PATCH 03/25] remove PII from wh_customers

---
 jaffle_shop/models/warehouse/_models.yml      | 6 ------
 jaffle_shop/models/warehouse/wh_customers.sql | 2 --
 2 files changed, 8 deletions(-)

diff --git a/jaffle_shop/models/warehouse/_models.yml b/jaffle_shop/models/warehouse/_models.yml
index 5139030c2..f259a72e1 100644
--- a/jaffle_shop/models/warehouse/_models.yml
+++ b/jaffle_shop/models/warehouse/_models.yml
@@ -11,12 +11,6 @@ models:
           - unique
           - not_null
 
-      - name: first_name
-        description: Customer's first name. PII.
-
-      - name: last_name
-        description: Customer's last name. PII.
-
       - name: first_order
         description: Date (UTC) of a customer's first order
 
diff --git a/jaffle_shop/models/warehouse/wh_customers.sql b/jaffle_shop/models/warehouse/wh_customers.sql
index 016a004fe..c4f2b604f 100644
--- a/jaffle_shop/models/warehouse/wh_customers.sql
+++ b/jaffle_shop/models/warehouse/wh_customers.sql
@@ -49,8 +49,6 @@ final as (
 
     select
         customers.customer_id,
-        customers.first_name,
-        customers.last_name,
         customer_orders.first_order,
         customer_orders.most_recent_order,
         customer_orders.number_of_orders,

From 3c5eabd917720cb3bcc61c32d9ab598bfda66091 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 16:09:21 +0900
Subject: [PATCH 04/25] rename macros meta

---
 jaffle_shop/macros/sensitive/{macros.md => _macros.md}   | 0
 jaffle_shop/macros/sensitive/{macros.yml => _macros.yml} | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 rename jaffle_shop/macros/sensitive/{macros.md => _macros.md} (100%)
 rename jaffle_shop/macros/sensitive/{macros.yml => _macros.yml} (100%)

diff --git a/jaffle_shop/macros/sensitive/macros.md b/jaffle_shop/macros/sensitive/_macros.md
similarity index 100%
rename from jaffle_shop/macros/sensitive/macros.md
rename to jaffle_shop/macros/sensitive/_macros.md
diff --git a/jaffle_shop/macros/sensitive/macros.yml b/jaffle_shop/macros/sensitive/_macros.yml
similarity index 100%
rename from jaffle_shop/macros/sensitive/macros.yml
rename to jaffle_shop/macros/sensitive/_macros.yml

From 2f70e489b164cd2abd8f8fd1c512d4a5354cdf1c Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 16:09:40 +0900
Subject: [PATCH 05/25] format models

---
 .../models/staging/src_seed/_models.yml       |   2 +-
 .../models/staging/src_seed/stg_customers.sql |   7 +-
 .../staging/src_seed/stg_customers_pii.sql    |  32 +++---
 .../models/staging/src_seed/stg_orders.sql    |  34 +++---
 .../models/staging/src_seed/stg_payments.sql  |  37 +++---
 jaffle_shop/models/warehouse/_models.yml      |  14 +--
 jaffle_shop/models/warehouse/wh_customers.sql | 105 ++++++++----------
 jaffle_shop/models/warehouse/wh_orders.sql    |  89 +++++++--------
 8 files changed, 139 insertions(+), 181 deletions(-)

diff --git a/jaffle_shop/models/staging/src_seed/_models.yml b/jaffle_shop/models/staging/src_seed/_models.yml
index 5beae6090..2645c83a9 100644
--- a/jaffle_shop/models/staging/src_seed/_models.yml
+++ b/jaffle_shop/models/staging/src_seed/_models.yml
@@ -66,5 +66,5 @@ models:
         tests:
           - accepted_values:
               values: ['credit_card', 'coupon', 'bank_transfer', 'gift_card']
-      - name: amount_dollars
+      - name: amount_aud
         description: The amount, in dollars, of the order
diff --git a/jaffle_shop/models/staging/src_seed/stg_customers.sql b/jaffle_shop/models/staging/src_seed/stg_customers.sql
index a88e326f6..b3c9ede1c 100644
--- a/jaffle_shop/models/staging/src_seed/stg_customers.sql
+++ b/jaffle_shop/models/staging/src_seed/stg_customers.sql
@@ -1,3 +1,4 @@
-select
-  {{ hash_sensitive_columns('stg_customers_pii') }}
-from {{ ref('stg_customers_pii') }}
+SELECT
+  -- {{ hash_sensitive_columns('stg_customers_pii') }}
+  *
+FROM {{ ref('stg_customers_pii') }}
diff --git a/jaffle_shop/models/staging/src_seed/stg_customers_pii.sql b/jaffle_shop/models/staging/src_seed/stg_customers_pii.sql
index cad047269..890acaaee 100644
--- a/jaffle_shop/models/staging/src_seed/stg_customers_pii.sql
+++ b/jaffle_shop/models/staging/src_seed/stg_customers_pii.sql
@@ -1,22 +1,16 @@
-with source as (
-
-    {#-
-    Normally we would select from the table here, but we are using seeds to load
-    our data in this project
-    #}
-    select * from {{ ref('raw_customers') }}
-
-),
-
-renamed as (
-
-    select
-        id as customer_id,
-        first_name,
-        last_name
-
-    from source
+WITH source_ AS (
+  SELECT *
+  FROM {{ ref('raw_customers') }}
+)
 
+, renamed_ AS (
+  SELECT
+    id AS customer_id
+    , first_name
+    , last_name
+  FROM source_
 )
 
-select * from renamed
+
+SELECT *
+FROM renamed_
diff --git a/jaffle_shop/models/staging/src_seed/stg_orders.sql b/jaffle_shop/models/staging/src_seed/stg_orders.sql
index a654dcb94..86488458a 100644
--- a/jaffle_shop/models/staging/src_seed/stg_orders.sql
+++ b/jaffle_shop/models/staging/src_seed/stg_orders.sql
@@ -1,23 +1,17 @@
-with source as (
-
-    {#-
-    Normally we would select from the table here, but we are using seeds to load
-    our data in this project
-    #}
-    select * from {{ ref('raw_orders') }}
-
-),
-
-renamed as (
-
-    select
-        id as order_id,
-        user_id as customer_id,
-        order_date,
-        status
-
-    from source
+WITH source_ AS (
+  SELECT *
+  FROM {{ ref('raw_orders') }}
+)
 
+, renamed_ AS (
+  SELECT
+    id AS order_id,
+    user_id AS customer_id,
+    order_date,
+    status
+  FROM source_
 )
 
-select * from renamed
+
+SELECT *
+FROM renamed_
diff --git a/jaffle_shop/models/staging/src_seed/stg_payments.sql b/jaffle_shop/models/staging/src_seed/stg_payments.sql
index 502a3ecdc..8fd0b6cc8 100644
--- a/jaffle_shop/models/staging/src_seed/stg_payments.sql
+++ b/jaffle_shop/models/staging/src_seed/stg_payments.sql
@@ -1,25 +1,18 @@
-with source as (
-    
-    {#-
-    Normally we would select from the table here, but we are using seeds to load
-    our data in this project
-    #}
-    select * from {{ ref('raw_payments') }}
-
-),
-
-renamed as (
-
-    select
-        id as payment_id,
-        order_id,
-        payment_method,
-
-        -- `amount` is currently stored in cents, so we convert it to dollars
-        amount / 100 as amount_dollars
-
-    from source
+WITH source_ AS (
+  SELECT *
+  FROM {{ ref('raw_payments') }}
+)
 
+, renamed_ AS (
+  select
+      id AS payment_id
+      , order_id
+      , payment_method
+      -- `amount` is currently stored in cents, so we convert it to dollars
+      , amount / 100 AS amount_aud
+  FROM source_
 )
 
-select * from renamed
+
+SELECT *
+FROM renamed_
diff --git a/jaffle_shop/models/warehouse/_models.yml b/jaffle_shop/models/warehouse/_models.yml
index f259a72e1..0ae49d2a0 100644
--- a/jaffle_shop/models/warehouse/_models.yml
+++ b/jaffle_shop/models/warehouse/_models.yml
@@ -20,7 +20,7 @@ models:
       - name: number_of_orders
         description: Count of the number of orders a customer has placed
 
-      - name: total_order_amount
+      - name: total_order_amount_aud
         description: Total value (AUD) of a customer's orders
 
   - name: wh_orders
@@ -38,7 +38,7 @@ models:
         tests:
           - not_null
           - relationships:
-              to: ref('customers')
+              to: ref('wh_customers')
               field: customer_id
 
       - name: order_date
@@ -50,27 +50,27 @@ models:
           - accepted_values:
               values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
 
-      - name: amount
+      - name: total_amount_aud
         description: Total amount (AUD) of the order
         tests:
           - not_null
 
-      - name: credit_card_amount
+      - name: credit_card_amount_aud
         description: Amount of the order (AUD) paid for by credit card
         tests:
           - not_null
 
-      - name: coupon_amount
+      - name: coupon_amount_aud
         description: Amount of the order (AUD) paid for by coupon
         tests:
           - not_null
 
-      - name: bank_transfer_amount
+      - name: bank_transfer_amount_aud
         description: Amount of the order (AUD) paid for by bank transfer
         tests:
           - not_null
 
-      - name: gift_card_amount
+      - name: gift_card_amount_aud
         description: Amount of the order (AUD) paid for by gift card
         tests:
           - not_null
diff --git a/jaffle_shop/models/warehouse/wh_customers.sql b/jaffle_shop/models/warehouse/wh_customers.sql
index c4f2b604f..704cea360 100644
--- a/jaffle_shop/models/warehouse/wh_customers.sql
+++ b/jaffle_shop/models/warehouse/wh_customers.sql
@@ -1,67 +1,52 @@
-with customers as (
-
-    select * from {{ ref('stg_customers') }}
-
-),
-
-orders as (
-
-    select * from {{ ref('stg_orders') }}
-
-),
-
-payments as (
-
-    select * from {{ ref('stg_payments') }}
-
-),
-
-customer_orders as (
-
-        select
-        customer_id,
-
-        min(order_date) as first_order,
-        max(order_date) as most_recent_order,
-        count(order_id) as number_of_orders
-    from orders
-
-    group by customer_id
-
-),
-
-customer_payments as (
-
-    select
-        orders.customer_id,
-        sum(amount) as total_amount
-
-    from payments
-
-    left join orders on
-         payments.order_id = orders.order_id
-
-    group by orders.customer_id
-
-),
-
-final as (
+WITH customers_ AS (
+  SELECT *
+  FROM {{ ref('stg_customers') }}
+)
 
-    select
-        customers.customer_id,
-        customer_orders.first_order,
-        customer_orders.most_recent_order,
-        customer_orders.number_of_orders,
-        customer_payments.total_amount as customer_lifetime_value
+, orders_ AS (
+  SELECT *
+  FROM {{ ref('stg_orders') }}
+)
 
-    from customers
+, payments_ AS (
+  SELECT *
+  FROM {{ ref('stg_payments') }}
+)
 
-    left join customer_orders
-        on customers.customer_id = customer_orders.customer_id
+, customer_orders_ AS (
+    SELECT
+      customer_id
+      , min(order_date) AS first_order
+      , max(order_date) AS most_recent_order
+      , count(order_id) AS number_of_orders
+    FROM orders_
+    GROUP BY customer_id
+)
 
-    left join customer_payments
-        on  customers.customer_id = customer_payments.customer_id
+, customer_payments_ AS (
+  SELECT
+    orders_.customer_id
+    , SUM(payments_.amount_aud) AS total_amount_aud
+  FROM payments_
+  LEFT JOIN orders_
+    ON payments_.order_id = orders_.order_id
+  GROUP BY orders_.customer_id
+)
 
+, final_ AS (
+  SELECT
+    customers_.customer_id
+    , customer_orders_.first_order
+    , customer_orders_.most_recent_order
+    , customer_orders_.number_of_orders
+    , customer_payments_.total_amount_aud AS total_order_amount_aud
+  FROM customers_
+  LEFT JOIN customer_orders_
+    ON customers_.customer_id = customer_orders_.customer_id
+  LEFT JOIN customer_payments_
+    ON customers_.customer_id = customer_payments_.customer_id
 )
 
-select * from final
+
+SELECT *
+FROM final_
diff --git a/jaffle_shop/models/warehouse/wh_orders.sql b/jaffle_shop/models/warehouse/wh_orders.sql
index cbb293491..4a43a58ad 100644
--- a/jaffle_shop/models/warehouse/wh_orders.sql
+++ b/jaffle_shop/models/warehouse/wh_orders.sql
@@ -1,56 +1,47 @@
 {% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
 
-with orders as (
-
-    select * from {{ ref('stg_orders') }}
-
-),
-
-payments as (
-
-    select * from {{ ref('stg_payments') }}
-
-),
-
-order_payments as (
-
-    select
-        order_id,
-
-        {% for payment_method in payment_methods -%}
-        sum(case when payment_method = '{{ payment_method }}' then amount else 0 end) as {{ payment_method }}_amount,
-        {% endfor -%}
-
-        sum(amount) as total_amount
-
-    from payments
-
-    group by order_id
-
-),
-
-final as (
-
-    select
-        orders.order_id,
-        orders.customer_id,
-        orders.order_date,
-        orders.status,
-
-        {% for payment_method in payment_methods -%}
-
-        order_payments.{{ payment_method }}_amount,
-
-        {% endfor -%}
-
-        order_payments.total_amount as amount
-
-    from orders
+WITH orders_ AS (
+  SELECT *
+  FROM {{ ref('stg_orders') }}
+)
 
+, payments_ AS (
+  SELECT *
+  FROM {{ ref('stg_payments') }}
+)
 
-    left join order_payments
-        on orders.order_id = order_payments.order_id
+, order_payments_ AS (
+  SELECT
+    order_id
+    {% for payment_method in payment_methods -%}
+    , SUM(
+      CASE
+        WHEN when payment_method = '{{ payment_method }}'
+          THEN amount
+        ELSE 0
+      END
+    ) AS {{ payment_method }}_amount_aud
+    {% endfor -%}
+    , SUM(amount_aud) AS total_amount_aud
+  FROM payments_
+  GROUP BY order_id
+)
 
+, final_ AS (
+  select
+    orders_.order_id
+    , orders_.customer_id
+    , orders_.order_date
+    , orders_.status
+    {% for payment_method in payment_methods -%}
+    , order_payments_.{{ payment_method }}_amount_aud,
+    {% endfor -%}
+    , order_payments_.total_amount_aud
+  FROM orders_
+  LEFT JOIN order_payments_
+    ON orders_.order_id = order_payments_.order_id
 )
 
-select * from final
+
+SELECT *
+FROM final_

From d0b44b5adfb35e8b67091eeb6d92f16f9019cc91 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 16:09:59 +0900
Subject: [PATCH 06/25] add evaluator exceptions seed

---
 jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv

diff --git a/jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv b/jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv
new file mode 100644
index 000000000..fa604d678
--- /dev/null
+++ b/jaffle_shop/seeds/dbt_project_evaluator_exceptions.csv
@@ -0,0 +1,2 @@
+fct_name,column_name,id_to_exclude,comment
+fct_staging_dependent_on_staging,parent,stg_customers_pii,Scrubbing pii permitted in staging layer.

From 47dae08af3c1572db0612dd2d45717dfa9bb9de2 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 16:10:16 +0900
Subject: [PATCH 07/25] add seeds meta

---
 jaffle_shop/seeds/_seeds.yml | 6 ++++++
 1 file changed, 6 insertions(+)
 create mode 100644 jaffle_shop/seeds/_seeds.yml

diff --git a/jaffle_shop/seeds/_seeds.yml b/jaffle_shop/seeds/_seeds.yml
new file mode 100644
index 000000000..1b228de69
--- /dev/null
+++ b/jaffle_shop/seeds/_seeds.yml
@@ -0,0 +1,6 @@
+version: 2
+
+seeds:
+  - name: raw_customers
+  - name: raw_orders
+  - name: raw_payments
\ No newline at end of file

From 49141e93ee7f64debe359e27ff0d6a5ec891dded Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 16:21:56 +0900
Subject: [PATCH 08/25] add empty wh_finance and wh_sales models

---
 jaffle_shop/models/warehouse/wh_finance.sql | 0
 jaffle_shop/models/warehouse/wh_sales.sql   | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 jaffle_shop/models/warehouse/wh_finance.sql
 create mode 100644 jaffle_shop/models/warehouse/wh_sales.sql

diff --git a/jaffle_shop/models/warehouse/wh_finance.sql b/jaffle_shop/models/warehouse/wh_finance.sql
new file mode 100644
index 000000000..e69de29bb
diff --git a/jaffle_shop/models/warehouse/wh_sales.sql b/jaffle_shop/models/warehouse/wh_sales.sql
new file mode 100644
index 000000000..e69de29bb

From dc7d0270c127a5a6e44789ca5db34548869b121b Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 16:24:43 +0900
Subject: [PATCH 09/25] update to python 3.10

---
 .circleci/config.yml |   2 +-
 Pipfile              |   2 +-
 Pipfile.lock         | 279 +++++++++++++++++++++++--------------------
 3 files changed, 154 insertions(+), 129 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index c7ee0722c..436c7f3c6 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -3,7 +3,7 @@ version: 2.1
 executors:
   standard:
     docker:
-      - image: circleci/python:3.8
+      - image: circleci/python:3.10
     working_directory: "~/lib"
 
 # -----------------
diff --git a/Pipfile b/Pipfile
index 836ef1397..dcdd21db8 100644
--- a/Pipfile
+++ b/Pipfile
@@ -14,4 +14,4 @@ pytest = "*"
 pytest-mock = "*"
 
 [requires]
-python_version = "3.8"
+python_version = "3.10"
diff --git a/Pipfile.lock b/Pipfile.lock
index b9d6f8480..4df5a8e22 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,11 +1,11 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "fdc73e9c032079052e940c732affb9526bddab92ec30d99cc8faaf98c9b67d72"
+            "sha256": "9468c72b603d3ab16304e244727c96241ffa8ddf1cd3e2cced9959a4c08e19e0"
         },
         "pipfile-spec": 6,
         "requires": {
-            "python_version": "3.8"
+            "python_version": "3.10"
         },
         "sources": [
             {
@@ -446,69 +446,70 @@
         },
         "markupsafe": {
             "hashes": [
-                "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf",
-                "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff",
-                "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f",
-                "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3",
-                "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532",
-                "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f",
-                "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617",
-                "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df",
-                "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4",
-                "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906",
-                "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f",
-                "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4",
-                "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8",
-                "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371",
-                "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2",
-                "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465",
-                "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52",
-                "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6",
-                "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169",
-                "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad",
-                "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2",
-                "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0",
-                "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029",
-                "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f",
-                "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a",
-                "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced",
-                "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5",
-                "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c",
-                "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf",
-                "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9",
-                "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb",
-                "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad",
-                "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3",
-                "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1",
-                "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46",
-                "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc",
-                "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a",
-                "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee",
-                "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900",
-                "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5",
-                "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea",
-                "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f",
-                "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5",
-                "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e",
-                "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a",
-                "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f",
-                "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50",
-                "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a",
-                "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b",
-                "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4",
-                "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff",
-                "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2",
-                "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46",
-                "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b",
-                "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf",
-                "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5",
-                "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5",
-                "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab",
-                "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd",
-                "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==2.1.5"
+                "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
+                "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
+                "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
+                "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
+                "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
+                "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
+                "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
+                "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
+                "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
+                "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
+                "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
+                "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
+                "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
+                "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
+                "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
+                "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
+                "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
+                "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
+                "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
+                "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
+                "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
+                "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
+                "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
+                "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
+                "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
+                "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
+                "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
+                "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
+                "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
+                "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
+                "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
+                "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
+                "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
+                "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
+                "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
+                "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
+                "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
+                "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
+                "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
+                "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
+                "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
+                "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
+                "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
+                "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
+                "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
+                "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
+                "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
+                "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
+                "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
+                "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
+                "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
+                "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
+                "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
+                "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
+                "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
+                "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
+                "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
+                "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
+                "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
+                "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
+                "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==3.0.2"
         },
         "mashumaro": {
             "extras": [
@@ -606,37 +607,45 @@
         },
         "numpy": {
             "hashes": [
-                "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f",
-                "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61",
-                "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7",
-                "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400",
-                "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef",
-                "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2",
-                "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d",
-                "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc",
-                "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835",
-                "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706",
-                "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5",
-                "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4",
-                "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6",
-                "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463",
-                "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a",
-                "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f",
-                "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e",
-                "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e",
-                "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694",
-                "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8",
-                "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64",
-                "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d",
-                "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc",
-                "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254",
-                "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2",
-                "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1",
-                "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810",
-                "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"
-            ],
-            "markers": "python_version >= '3.7' and python_version < '3.11'",
-            "version": "==1.24.4"
+                "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b",
+                "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818",
+                "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20",
+                "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0",
+                "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010",
+                "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a",
+                "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea",
+                "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c",
+                "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71",
+                "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110",
+                "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be",
+                "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a",
+                "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a",
+                "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5",
+                "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed",
+                "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd",
+                "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c",
+                "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e",
+                "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0",
+                "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c",
+                "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a",
+                "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b",
+                "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0",
+                "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6",
+                "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2",
+                "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a",
+                "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30",
+                "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218",
+                "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5",
+                "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07",
+                "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2",
+                "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4",
+                "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764",
+                "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef",
+                "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3",
+                "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"
+            ],
+            "markers": "python_version >= '3.8' and python_version < '3.11'",
+            "version": "==1.26.4"
         },
         "oauthlib": {
             "hashes": [
@@ -664,34 +673,51 @@
         },
         "pandas": {
             "hashes": [
-                "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682",
-                "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc",
-                "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b",
-                "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089",
-                "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5",
-                "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26",
-                "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210",
-                "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b",
-                "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641",
-                "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd",
-                "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78",
-                "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b",
-                "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e",
-                "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061",
-                "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0",
-                "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e",
-                "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8",
-                "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d",
-                "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0",
-                "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c",
-                "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183",
-                "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df",
-                "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8",
-                "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f",
-                "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"
+                "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a",
+                "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d",
+                "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5",
+                "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4",
+                "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0",
+                "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32",
+                "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea",
+                "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28",
+                "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f",
+                "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348",
+                "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18",
+                "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468",
+                "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5",
+                "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e",
+                "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667",
+                "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645",
+                "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13",
+                "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30",
+                "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3",
+                "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d",
+                "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb",
+                "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3",
+                "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039",
+                "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8",
+                "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd",
+                "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761",
+                "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659",
+                "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57",
+                "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c",
+                "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c",
+                "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4",
+                "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a",
+                "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9",
+                "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42",
+                "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2",
+                "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39",
+                "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc",
+                "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698",
+                "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed",
+                "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015",
+                "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24",
+                "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==2.0.3"
+            "version": "==2.2.3"
         },
         "parsedatetime": {
             "hashes": [
@@ -767,11 +793,11 @@
         },
         "pyparsing": {
             "hashes": [
-                "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c",
-                "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"
+                "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84",
+                "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"
             ],
-            "markers": "python_full_version >= '3.6.8'",
-            "version": "==3.1.4"
+            "markers": "python_version >= '3.9'",
+            "version": "==3.2.0"
         },
         "pyrsistent": {
             "hashes": [
@@ -856,7 +882,6 @@
                 "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a",
                 "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"
             ],
-            "markers": "python_version < '3.9'",
             "version": "==2024.2"
         },
         "pyyaml": {

From d2d7bb1ee7f6c8b480b920278429a4eec4f372b8 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Mon, 11 Nov 2024 16:26:26 +0900
Subject: [PATCH 10/25] update make init

---
 .circleci/config.yml | 2 +-
 Makefile             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 436c7f3c6..5fa30a144 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -33,7 +33,7 @@ commands:
             - virtualenv-{{ .Environment.CACHE_VERSION }}-
       - run:
           name: Install Python packages
-          command: pipenv install --dev --system
+          command: pipenv sync --dev --system
       - save_cache:
           key: virtualenv-{{ .Environment.CACHE_VERSION }}-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
           paths:
diff --git a/Makefile b/Makefile
index 341d45c56..16b4dea87 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 init:
-	pipenv update
+	pipenv sync --dev
 	pipenv run dbt deps
 
 clean-env:

From add1e0caef29e2b6f304ae86a2101cc9bc049bcb Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 10:26:01 +0900
Subject: [PATCH 11/25] update to dbt 1.7 and refactor to work with that
 because 1.3 does not seem to work... also fix some bugs

---
 Makefile                                      |  21 +-
 Pipfile                                       |   2 +-
 Pipfile.lock                                  | 806 +++++++++++++-----
 dbt_project.yml                               |  29 -
 jaffle_shop/dbt_project.yml                   |  47 +
 .../macros/sensitive/hash_of_column.sql       |   2 +-
 .../models/staging/src_seed/stg_customers.sql |   3 +-
 jaffle_shop/models/warehouse/wh_finance.sql   |   0
 jaffle_shop/models/warehouse/wh_orders.sql    |   6 +-
 jaffle_shop/models/warehouse/wh_sales.sql     |   0
 jaffle_shop/package-lock.yml                  |  10 +
 packages.yml => jaffle_shop/packages.yml      |   8 +-
 selectors.yml => jaffle_shop/selectors.yml    |   0
 {testing => jaffle_shop/testing}/__init__.py  |   0
 {testing => jaffle_shop/testing}/profiles.yml |   0
 {testing => jaffle_shop/testing}/structure.py |   0
 .../testing}/test_structure.py                |   0
 package_projects/dbt_project_evaluator.yml    |  87 --
 18 files changed, 648 insertions(+), 373 deletions(-)
 delete mode 100644 dbt_project.yml
 create mode 100644 jaffle_shop/dbt_project.yml
 delete mode 100644 jaffle_shop/models/warehouse/wh_finance.sql
 delete mode 100644 jaffle_shop/models/warehouse/wh_sales.sql
 create mode 100644 jaffle_shop/package-lock.yml
 rename packages.yml => jaffle_shop/packages.yml (62%)
 rename selectors.yml => jaffle_shop/selectors.yml (100%)
 rename {testing => jaffle_shop/testing}/__init__.py (100%)
 rename {testing => jaffle_shop/testing}/profiles.yml (100%)
 rename {testing => jaffle_shop/testing}/structure.py (100%)
 rename {testing => jaffle_shop/testing}/test_structure.py (100%)
 delete mode 100644 package_projects/dbt_project_evaluator.yml

diff --git a/Makefile b/Makefile
index 16b4dea87..a5eed96f4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 init:
-	pipenv sync --dev
-	pipenv run dbt deps
+	pipenv install
+	pipenv run dbt deps --project-dir jaffle_shop
 
 clean-env:
 	:> .env
@@ -11,21 +11,16 @@ env-development-salt:
 env-target:
 	echo DATABRICKS_TARGET=$$(git symbolic-ref --short HEAD | tr /- _) >> .env
 
-package-project:
-	for PACKAGE in dbt_project_evaluator ; do \
-		cp package_projects/$$PACKAGE.yml dbt_packages/$$PACKAGE/dbt_project.yml ; \
-	done
-
-build-env: clean-env env-development-salt env-target package-project
+build-env: clean-env env-development-salt env-target
 
 dbt-deps:
-	pipenv run dbt deps
+	pipenv run dbt deps --project-dir jaffle_shop
 
 dbt-build: build-env
-	pipenv run dbt build --selector jaffle_shop
+	pipenv run dbt build --selector jaffle_shop --project-dir jaffle_shop
 
 run-dbt-project-evaluator: dbt-deps build-env
-	pipenv run dbt --warn-error build --select package:dbt_project_evaluator dbt_project_evaluator_exceptions
+	pipenv run dbt --warn-error build --select package:dbt_project_evaluator dbt_project_evaluator_exceptions --project-dir jaffle_shop
 
 lint: build-env
 	pipenv run sqlfluff lint
@@ -34,7 +29,7 @@ format: build-env
 	pipenv run sqlfluff fix
 
 run-python-tests:
-	pipenv run pytest --quiet --show-capture=no --tb=no
+	pipenv run pytest jaffle_shop/testing --quiet --show-capture=no --tb=no
 
 run-python-tests-detailed:
-	pipenv run pytest
\ No newline at end of file
+	pipenv run pytest jaffle_shop/testing
\ No newline at end of file
diff --git a/Pipfile b/Pipfile
index dcdd21db8..3624922aa 100644
--- a/Pipfile
+++ b/Pipfile
@@ -4,7 +4,7 @@ verify_ssl = true
 name = "pypi"
 
 [packages]
-dbt-core = "==1.3.0"
+dbt-core = "==1.7.17"
 dbt-databricks = {extras = ["odbc"]}
 pytest-mock = "*"
 glob2 = "*"
diff --git a/Pipfile.lock b/Pipfile.lock
index 4df5a8e22..ded30cb13 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "9468c72b603d3ab16304e244727c96241ffa8ddf1cd3e2cced9959a4c08e19e0"
+            "sha256": "f6f9913542164e4b070e08a1c794f31733cd627f8a29a4b2e0e0a24d473868d1"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -18,10 +18,26 @@
     "default": {
         "agate": {
             "hashes": [
-                "sha256:2d568fd68a8eb8b56c805a1299ba4bc30ca0434563be1bea309c9d1c1c8401f4",
-                "sha256:e0f2f813f7e12311a4cdccc97d6ba0a6781e9c1aa8eca0ab00d5931c0113a308"
+                "sha256:23f9f412f74f97b72f82b1525ab235cc816bc8c8525d968a091576a0dbc54a5f",
+                "sha256:eadf46d980168b8922d5d396d6258eecd5e7dbef7e6f0c0b71e968545ea96389"
             ],
-            "version": "==1.6.3"
+            "version": "==1.7.1"
+        },
+        "alembic": {
+            "hashes": [
+                "sha256:99bd884ca390466db5e27ffccff1d179ec5c05c965cfefc0607e69f9e411cb25",
+                "sha256:b00892b53b3642d0b8dbedba234dbf1924b69be83a9a769d5a624b01094e304b"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.14.0"
+        },
+        "annotated-types": {
+            "hashes": [
+                "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
+                "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.7.0"
         },
         "attrs": {
             "hashes": [
@@ -39,6 +55,22 @@
             "markers": "python_version >= '3.8'",
             "version": "==2.16.0"
         },
+        "backports.tarfile": {
+            "hashes": [
+                "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34",
+                "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"
+            ],
+            "markers": "python_version < '3.12'",
+            "version": "==1.2.0"
+        },
+        "cachetools": {
+            "hashes": [
+                "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292",
+                "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==5.5.0"
+        },
         "certifi": {
             "hashes": [
                 "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8",
@@ -241,69 +273,85 @@
         },
         "colorama": {
             "hashes": [
-                "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da",
-                "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"
+                "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
+                "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==0.4.5"
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
+            "version": "==0.4.6"
+        },
+        "databricks-sdk": {
+            "hashes": [
+                "sha256:0a1baa6783aba9b034b9a017da8d0cf839ec61ae8318792b78bfb3db0374dd9c",
+                "sha256:ad90e01c7b1a9d60a3de6a35606c79ac982e8972d3ad3ff89c251c24439c8bb9"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==0.17.0"
         },
         "databricks-sql-connector": {
             "hashes": [
-                "sha256:126b1b0ec8403c2ca7d84f1c617ef482f4288f428608b51122186dabc69bbd0f",
-                "sha256:4302828afa17b9f993dc63143aa35c76e30d2b46bdb4bcc47452d4c44bb412d8"
+                "sha256:d830abf86e71d2eb83c6a7b7264d6c03926a8a83cec58541ddd6b83d693bde8f",
+                "sha256:e55f5b8ede8ae6c6f31416a4cf6352f0ac019bf6875896c668c7574ceaf6e813"
             ],
-            "markers": "python_full_version >= '3.8.0' and python_full_version < '4.0.0'",
-            "version": "==3.6.0"
+            "markers": "python_full_version >= '3.7.1' and python_full_version < '4.0.0'",
+            "version": "==2.9.6"
         },
         "dbt-core": {
             "hashes": [
-                "sha256:20d23cf7c20ed16f6d82804d6cf67dafca8ac3c9f2557e5aeaa8c6af9d39c384",
-                "sha256:63f2f691af87790a4315e15267b863ecdd67828da5c76367c2c2f1cad08c6822"
+                "sha256:91cd0ceca29d77377988bca94db02c9d6f3debdd604edbde702008380b87fc4e",
+                "sha256:efd341e83252c35d9dbe0d2d0bfd874125c093c125250bebc7ca741a9145db80"
             ],
             "index": "pypi",
-            "markers": "python_full_version >= '3.7.2'",
-            "version": "==1.3.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==1.7.17"
         },
         "dbt-databricks": {
             "extras": [
                 "odbc"
             ],
             "hashes": [
-                "sha256:0b0956a597befb574971e45341ca6c37de42cbfa2db61a7aab55bd5236a57206",
-                "sha256:9debf9280e3a791bc104bd089aa82ff1adfb7f2cddfe1ccd41b99bdf12619258"
+                "sha256:b52decb556a94f567bfa07a45067074c25582220f29e39b3ed687aeb6de0dd7d",
+                "sha256:e051c3b568f1838458dac61fa7caa99694a00a0d9f46ec632b1f7f523fba9b7c"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==1.3.2"
+            "markers": "python_version >= '3.8'",
+            "version": "==1.7.17"
         },
         "dbt-extractor": {
             "hashes": [
-                "sha256:037907a7c7ae0391045d81338ca77ddaef899a91d80f09958f09fe374594e19b",
-                "sha256:34783d788b133f223844e280e37b3f5244f2fb60acc457aa75c2667e418d5442",
-                "sha256:35265a0ae0a250623b0c2e3308b2738dc8212e40e0aa88407849e9ea090bb312",
-                "sha256:3fe8d8e28a7bd3e0884896147269ca0202ca432d8733113386bdc84c824561bf",
-                "sha256:4dc715bd740e418d8dc1dd418fea508e79208a24cf5ab110b0092a3cbe96bf71",
-                "sha256:554d27741a54599c39e5c0b7dbcab77400d83f908caba284a3e960db812e5814",
-                "sha256:75b1c665699ec0f1ffce1ba3d776f7dfce802156f22e70a7b9c8f0b4d7e80f42",
-                "sha256:76872cdee659075d6ce2df92dc62e59a74ba571be62acab2e297ca478b49d766",
-                "sha256:7c291f9f483eae4f60dd5859097d7ba51d5cb6c4725f08973ebd18cdea89d758",
-                "sha256:7d7c47774dc051b8c18690281a55e2e3d3320e823b17e04b06bc3ff81b1874ba",
-                "sha256:81435841610be1b07806d72cd89b1956c6e2a84c360b9ceb3f949c62a546d569",
-                "sha256:822b1e911db230e1b9701c99896578e711232001027b518c44c32f79a46fa3f9",
-                "sha256:9da211869a1220ea55c5552c1567a3ea5233a6c52fa89ca87a22465481c37bc9",
-                "sha256:a805d51a25317f53cbff951c79b9cf75421cf48e4b3e1dfb3e9e8de6d824b76c",
-                "sha256:bc9e0050e3a2f4ea9fe58e8794bc808e6709a0c688ed710fc7c5b6ef3e5623ec",
-                "sha256:cad90ddc708cb4182dc16fe2c87b1f088a1679877b93e641af068eb68a25d582"
+                "sha256:100453ba06e169cbdb118234ab3f06f6722a2e0e316089b81c88dea701212abc",
+                "sha256:1b25fa7a276ab26aa2d70ff6e0cf4cfb1490d7831fb57ee1337c24d2b0333b84",
+                "sha256:3614ce9f83ae4cd0dc95f77730034a793a1c090a52dcf698ba1c94050afe3a8b",
+                "sha256:3b91e6106b967d908b34f83929d3f50ee2b498876a1be9c055fe060ed728c556",
+                "sha256:475e2c05b17eb4976eff6c8f7635be42bec33f15a74ceb87a40242c94a99cebf",
+                "sha256:62e4f040fd338b652683421ce48e903812e27fd6e7af58b1b70a4e1f9f2c79e3",
+                "sha256:6916aae085fd5f2af069fd6947933e78b742c9e3d2165e1740c2e28ae543309a",
+                "sha256:91e25ad78f1f4feadd27587ebbcc46ad909cfad843118908f30336d08d8400ca",
+                "sha256:c0ce901d4ebf0664977e4e1cbf596d4afc6c1339fcc7d2cf67ce3481566a626f",
+                "sha256:c5651e458be910ff567c0da3ea2eb084fd01884cc88888ac2cf1e240dcddacc2",
+                "sha256:cbe338b76e9ffaa18275456e041af56c21bb517f6fbda7a58308138703da0996",
+                "sha256:cd5d95576a8dea4190240aaf9936a37fd74b4b7913ca69a3c368fc4472bb7e13",
+                "sha256:cdf9938b36cd098bcdd80f43dc03864da3f69f57d903a9160a32236540d4ddcd",
+                "sha256:d3b9bf50eb062b4344d9546fe42038996c6e7e7daa10724aa955d64717260e5d",
+                "sha256:ea4edf33035d0a060b1e01c42fb2d99316457d44c954d6ed4eed9f1948664d87",
+                "sha256:eecc08f3743e802a8ede60c89f7b2bce872acc86120cbc0ae7df229bb8a95083"
             ],
             "markers": "python_full_version >= '3.6.1'",
-            "version": "==0.4.1"
+            "version": "==0.5.1"
+        },
+        "dbt-semantic-interfaces": {
+            "hashes": [
+                "sha256:0149a4fd7fd4f25309edf5f856410536eaf2019f29dad58967dcf6d0625e6914",
+                "sha256:3b8126deb964c03d14e8af1cb4bdfb9f20c53dfcef28fa3a0bc158a8312e4070"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.4.4"
         },
         "dbt-spark": {
             "hashes": [
-                "sha256:97646503d921ce8b43896bfb9ed55a0f63fdcb2f989d955c2505cb60bf709adf",
-                "sha256:9bccd36f3e3a5a7b2b38381be9038107e34096c207312077460f04805c63864d"
+                "sha256:99b5002edcdb82058a3b0ad33eb18b91a4bdde887d94855e8bd6f633d78837dc",
+                "sha256:a10e5d1bfdb2ca98e7ae2badd06150e2695d9d4fa18ae2354ed5bd093d77f947"
             ],
-            "markers": "python_version >= '3.7'",
-            "version": "==1.3.3"
+            "markers": "python_version >= '3.8'",
+            "version": "==1.7.1"
         },
         "et-xmlfile": {
             "hashes": [
@@ -321,14 +369,6 @@
             "markers": "python_version < '3.11'",
             "version": "==1.2.2"
         },
-        "future": {
-            "hashes": [
-                "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216",
-                "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"
-            ],
-            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
-            "version": "==1.0.0"
-        },
         "glob2": {
             "hashes": [
                 "sha256:85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c"
@@ -336,12 +376,13 @@
             "index": "pypi",
             "version": "==0.7"
         },
-        "hologram": {
+        "google-auth": {
             "hashes": [
-                "sha256:48ca81ed47da1c604b2d3b951424b600eb8a5785b00513e3b8e3ae8101f90145",
-                "sha256:79b3d04df84d5a9d09c2e669ec5bcc50b1713ec79f4683cfdea85583b41e46f0"
+                "sha256:51a15d47028b66fd36e5c64a82d2d57480075bccc7da37cde257fc94177a61fb",
+                "sha256:545e9618f2df0bcbb7dcbc45a546485b1212624716975a1ea5ae8149ce769ab1"
             ],
-            "version": "==0.0.15"
+            "markers": "python_version >= '3.7'",
+            "version": "==2.36.0"
         },
         "idna": {
             "hashes": [
@@ -351,6 +392,14 @@
             "markers": "python_version >= '3.6'",
             "version": "==3.10"
         },
+        "importlib-metadata": {
+            "hashes": [
+                "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443",
+                "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==6.11.0"
+        },
         "iniconfig": {
             "hashes": [
                 "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
@@ -366,20 +415,61 @@
             ],
             "version": "==0.6.1"
         },
+        "jaraco.classes": {
+            "hashes": [
+                "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd",
+                "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==3.4.0"
+        },
+        "jaraco.context": {
+            "hashes": [
+                "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3",
+                "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==6.0.1"
+        },
+        "jaraco.functools": {
+            "hashes": [
+                "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d",
+                "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==4.1.0"
+        },
         "jinja2": {
             "hashes": [
-                "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852",
-                "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"
+                "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369",
+                "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"
             ],
             "markers": "python_version >= '3.7'",
-            "version": "==3.1.2"
+            "version": "==3.1.4"
         },
         "jsonschema": {
             "hashes": [
-                "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163",
-                "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"
+                "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4",
+                "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==4.23.0"
+        },
+        "jsonschema-specifications": {
+            "hashes": [
+                "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272",
+                "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"
             ],
-            "version": "==3.2.0"
+            "markers": "python_version >= '3.9'",
+            "version": "==2024.10.1"
+        },
+        "keyring": {
+            "hashes": [
+                "sha256:4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6",
+                "sha256:e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==25.5.0"
         },
         "leather": {
             "hashes": [
@@ -444,6 +534,14 @@
             "markers": "python_version >= '3.8'",
             "version": "==4.3.3"
         },
+        "mako": {
+            "hashes": [
+                "sha256:9ec3a1583713479fae654f83ed9fa8c9a4c16b7bb0daba0e6bbebff50c0d983d",
+                "sha256:a91198468092a2f1a0de86ca92690fb0cfc43ca90ee17e15d93662b4c04b241a"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.3.6"
+        },
         "markupsafe": {
             "hashes": [
                 "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
@@ -516,11 +614,11 @@
                 "msgpack"
             ],
             "hashes": [
-                "sha256:6d221e09df2d884afda19325d5412dc9b1274be9ba1c3e57c12a8977320c7e07",
-                "sha256:72b97b7660b7a4de1df2466a52543e6439f968cd081ce55aae899bc375b1f53d"
+                "sha256:5ef6f2b963892cbe9a4ceb3441dfbea37f8c3412523f25d42e9b3a7186555f1d",
+                "sha256:c12a649599a8f7b1a0b35d18f12e678423c3066189f7bc7bd8dd431c5c8132c3"
             ],
-            "markers": "python_version >= '3.6'",
-            "version": "==3.0.4"
+            "markers": "python_version >= '3.8'",
+            "version": "==3.14"
         },
         "minimal-snowplow-tracker": {
             "hashes": [
@@ -528,6 +626,14 @@
             ],
             "version": "==0.0.2"
         },
+        "more-itertools": {
+            "hashes": [
+                "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef",
+                "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==10.5.0"
+        },
         "msgpack": {
             "hashes": [
                 "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b",
@@ -599,11 +705,11 @@
         },
         "networkx": {
             "hashes": [
-                "sha256:230d388117af870fce5647a3c52401fcf753e94720e6ea6b4197a5355648885e",
-                "sha256:e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524"
+                "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1",
+                "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"
             ],
-            "markers": "python_version >= '3.8'",
-            "version": "==2.8.8"
+            "markers": "python_version >= '3.10'",
+            "version": "==3.4.2"
         },
         "numpy": {
             "hashes": [
@@ -644,7 +750,7 @@
                 "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3",
                 "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"
             ],
-            "markers": "python_version >= '3.8' and python_version < '3.11'",
+            "markers": "python_version >= '3.7' and python_version < '3.11'",
             "version": "==1.26.4"
         },
         "oauthlib": {
@@ -665,73 +771,57 @@
         },
         "packaging": {
             "hashes": [
-                "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
-                "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
+                "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
+                "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
             ],
-            "markers": "python_version >= '3.6'",
-            "version": "==21.3"
+            "markers": "python_version >= '3.8'",
+            "version": "==24.2"
         },
         "pandas": {
             "hashes": [
-                "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a",
-                "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d",
-                "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5",
-                "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4",
-                "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0",
-                "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32",
-                "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea",
-                "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28",
-                "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f",
-                "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348",
-                "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18",
-                "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468",
-                "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5",
-                "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e",
-                "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667",
-                "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645",
-                "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13",
-                "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30",
-                "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3",
-                "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d",
-                "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb",
-                "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3",
-                "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039",
-                "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8",
-                "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd",
-                "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761",
-                "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659",
-                "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57",
-                "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c",
-                "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c",
-                "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4",
-                "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a",
-                "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9",
-                "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42",
-                "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2",
-                "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39",
-                "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc",
-                "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698",
-                "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed",
-                "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015",
-                "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24",
-                "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"
+                "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9",
+                "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d",
+                "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8",
+                "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034",
+                "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34",
+                "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139",
+                "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1",
+                "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6",
+                "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d",
+                "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b",
+                "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860",
+                "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a",
+                "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540",
+                "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092",
+                "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821",
+                "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9",
+                "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623",
+                "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984",
+                "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171",
+                "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e",
+                "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead",
+                "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732",
+                "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46",
+                "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf",
+                "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"
             ],
-            "markers": "python_version >= '3.8'",
-            "version": "==2.2.3"
+            "markers": "python_version >= '3.9'",
+            "version": "==2.1.4"
         },
         "parsedatetime": {
             "hashes": [
-                "sha256:3d817c58fb9570d1eec1dd46fa9448cd644eeed4fb612684b02dfda3a79cb84b",
-                "sha256:9ee3529454bf35c40a77115f5a596771e59e1aee8c53306f346c461b8e913094"
+                "sha256:4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455",
+                "sha256:cb96edd7016872f58479e35879294258c71437195760746faffedb692aef000b"
             ],
-            "version": "==2.4"
+            "version": "==2.6"
         },
         "pathspec": {
             "hashes": [
-                "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a",
-                "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"
+                "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20",
+                "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"
             ],
-            "version": "==0.9.0"
+            "markers": "python_version >= '3.7'",
+            "version": "==0.11.2"
         },
         "pluggy": {
             "hashes": [
@@ -741,47 +831,86 @@
             "markers": "python_version >= '3.8'",
             "version": "==1.5.0"
         },
+        "protobuf": {
+            "hashes": [
+                "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41",
+                "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea",
+                "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8",
+                "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45",
+                "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584",
+                "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d",
+                "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1",
+                "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f",
+                "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a",
+                "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173",
+                "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==4.25.5"
+        },
         "pyarrow": {
             "hashes": [
-                "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a",
-                "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2",
-                "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f",
-                "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2",
-                "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315",
-                "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9",
-                "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b",
-                "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55",
-                "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15",
-                "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e",
-                "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f",
-                "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c",
-                "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a",
-                "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa",
-                "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a",
-                "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd",
-                "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628",
-                "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef",
-                "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e",
-                "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff",
-                "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b",
-                "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c",
-                "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c",
-                "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f",
-                "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3",
-                "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6",
-                "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c",
-                "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147",
-                "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5",
-                "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7",
-                "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710",
-                "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4",
-                "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed",
-                "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848",
-                "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83",
-                "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444"
+                "sha256:00178509f379415a3fcf855af020e3340254f990a8534294ec3cf674d6e255fd",
+                "sha256:03f40b65a43be159d2f97fd64dc998f769d0995a50c00f07aab58b0b3da87e1f",
+                "sha256:082ba62bdcb939824ba1ce10b8acef5ab621da1f4c4805e07bfd153617ac19d4",
+                "sha256:09f30690b99ce34e0da64d20dab372ee54431745e4efb78ac938234a282d15f9",
+                "sha256:2333f93260674e185cfbf208d2da3007132572e56871f451ba1a556b45dae6e2",
+                "sha256:28f9c39a56d2c78bf6b87dcc699d520ab850919d4a8c7418cd20eda49874a2ea",
+                "sha256:2c664ab88b9766413197733c1720d3dcd4190e8fa3bbdc3710384630a0a7207b",
+                "sha256:2c992716cffb1088414f2b478f7af0175fd0a76fea80841b1706baa8fb0ebaad",
+                "sha256:2e549a748fa8b8715e734919923f69318c953e077e9c02140ada13e59d043310",
+                "sha256:320ae9bd45ad7ecc12ec858b3e8e462578de060832b98fc4d671dee9f10d9954",
+                "sha256:336addb8b6f5208be1b2398442c703a710b6b937b1a046065ee4db65e782ff5a",
+                "sha256:3ac24b2be732e78a5a3ac0b3aa870d73766dd00beba6e015ea2ea7394f8b4e55",
+                "sha256:45476490dd4adec5472c92b4d253e245258745d0ccaabe706f8d03288ed60a79",
+                "sha256:4c381857754da44326f3a49b8b199f7f87a51c2faacd5114352fc78de30d3aba",
+                "sha256:4d5ca5d707e158540312e09fd907f9f49bacbe779ab5236d9699ced14d2293b8",
+                "sha256:58a62549a3e0bc9e03df32f350e10e1efb94ec6cf63e3920c3385b26663948ce",
+                "sha256:5f0510608ccd6e7f02ca8596962afb8c6cc84c453e7be0da4d85f5f4f7b0328a",
+                "sha256:603cd8ad4976568954598ef0a6d4ed3dfb78aff3d57fa8d6271f470f0ce7d34f",
+                "sha256:606e9a3dcb0f52307c5040698ea962685fb1c852d72379ee9412be7de9c5f9e2",
+                "sha256:616ea2826c03c16e87f517c46296621a7c51e30400f6d0a61be645f203aa2b93",
+                "sha256:66dcc216ebae2eb4c37b223feaf82f15b69d502821dde2da138ec5a3716e7463",
+                "sha256:6dd1b52d0d58dd8f685ced9971eb49f697d753aa7912f0a8f50833c7a7426319",
+                "sha256:871b292d4b696b09120ed5bde894f79ee2a5f109cb84470546471df264cae136",
+                "sha256:8c70c1965cde991b711a98448ccda3486f2a336457cf4ec4dca257a926e149c9",
+                "sha256:8f40ec677e942374e3d7f2fad6a67a4c2811a8b975e8703c6fd26d3b168a90e2",
+                "sha256:907ee0aa8ca576f5e0cdc20b5aeb2ad4d3953a3b4769fc4b499e00ef0266f02f",
+                "sha256:a1824f5b029ddd289919f354bc285992cb4e32da518758c136271cf66046ef22",
+                "sha256:a6aa027b1a9d2970cf328ccd6dbe4a996bc13c39fd427f502782f5bdb9ca20f5",
+                "sha256:a71ab0589a63a3e987beb2bc172e05f000a5c5be2636b4b263c44034e215b5d7",
+                "sha256:b30a927c6dff89ee702686596f27c25160dd6c99be5bcc1513a763ae5b1bfc03",
+                "sha256:b46591222c864e7da7faa3b19455196416cd8355ff6c2cc2e65726a760a3c420",
+                "sha256:b5bd7fd32e3ace012d43925ea4fc8bd1b02cc6cc1e9813b518302950e89b5a22",
+                "sha256:bc1daf7c425f58527900876354390ee41b0ae962a73ad0959b9d829def583bb1",
+                "sha256:bc97316840a349485fbb137eb8d0f4d7057e1b2c1272b1a20eebbbe1848f5122",
+                "sha256:be08af84808dff63a76860847c48ec0416928a7b3a17c2f49a072cac7c45efbd",
+                "sha256:d5795e37c0a33baa618c5e054cd61f586cf76850a251e2b21355e4085def6280",
+                "sha256:d6331f280c6e4521c69b201a42dd978f60f7e129511a55da9e0bfe426b4ebb8d",
+                "sha256:dc892be34dbd058e8d189b47db1e33a227d965ea8805a235c8a7286f7fd17d3a",
+                "sha256:e7ab04f272f98ebffd2a0661e4e126036f6936391ba2889ed2d44c5006237802",
+                "sha256:eb7e3abcda7e1e6b83c2dc2909c8d045881017270a119cc6ee7fdcfe71d02df8",
+                "sha256:f1a198a50c409ab2d009fbf20956ace84567d67f2c5701511d4dd561fae6f32e",
+                "sha256:fe92efcdbfa0bcf2fa602e466d7f2905500f33f09eb90bf0bcf2e6ca41b574c8"
+            ],
+            "markers": "python_version >= '3.7' and python_version < '3.11'",
+            "version": "==18.0.0"
+        },
+        "pyasn1": {
+            "hashes": [
+                "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629",
+                "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==16.1.0"
+            "version": "==0.6.1"
+        },
+        "pyasn1-modules": {
+            "hashes": [
+                "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd",
+                "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.4.1"
         },
         "pycparser": {
             "hashes": [
@@ -791,51 +920,108 @@
             "markers": "python_version >= '3.8'",
             "version": "==2.22"
         },
-        "pyparsing": {
+        "pydantic": {
             "hashes": [
-                "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84",
-                "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"
+                "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f",
+                "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"
             ],
-            "markers": "python_version >= '3.9'",
-            "version": "==3.2.0"
-        },
-        "pyrsistent": {
-            "hashes": [
-                "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f",
-                "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e",
-                "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958",
-                "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34",
-                "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca",
-                "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d",
-                "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d",
-                "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4",
-                "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714",
-                "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf",
-                "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee",
-                "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8",
-                "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224",
-                "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d",
-                "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054",
-                "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656",
-                "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7",
-                "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423",
-                "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce",
-                "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e",
-                "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3",
-                "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0",
-                "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f",
-                "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b",
-                "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce",
-                "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a",
-                "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174",
-                "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86",
-                "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f",
-                "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b",
-                "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98",
-                "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"
+            "markers": "python_version >= '3.8'",
+            "version": "==2.9.2"
+        },
+        "pydantic-core": {
+            "hashes": [
+                "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36",
+                "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05",
+                "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071",
+                "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327",
+                "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c",
+                "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36",
+                "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29",
+                "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744",
+                "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d",
+                "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec",
+                "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e",
+                "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e",
+                "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577",
+                "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232",
+                "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863",
+                "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6",
+                "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368",
+                "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480",
+                "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2",
+                "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2",
+                "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6",
+                "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769",
+                "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d",
+                "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2",
+                "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84",
+                "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166",
+                "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271",
+                "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5",
+                "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb",
+                "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13",
+                "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323",
+                "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556",
+                "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665",
+                "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef",
+                "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb",
+                "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119",
+                "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126",
+                "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510",
+                "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b",
+                "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87",
+                "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f",
+                "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc",
+                "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8",
+                "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21",
+                "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f",
+                "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6",
+                "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658",
+                "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b",
+                "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3",
+                "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb",
+                "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59",
+                "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24",
+                "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9",
+                "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3",
+                "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd",
+                "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753",
+                "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55",
+                "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad",
+                "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a",
+                "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605",
+                "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e",
+                "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b",
+                "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433",
+                "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8",
+                "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07",
+                "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728",
+                "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0",
+                "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327",
+                "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555",
+                "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64",
+                "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6",
+                "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea",
+                "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b",
+                "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df",
+                "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e",
+                "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd",
+                "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068",
+                "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3",
+                "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040",
+                "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12",
+                "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916",
+                "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f",
+                "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f",
+                "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801",
+                "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231",
+                "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5",
+                "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8",
+                "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee",
+                "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==0.20.0"
+            "version": "==2.23.4"
         },
         "pytest": {
             "hashes": [
@@ -856,11 +1042,11 @@
         },
         "python-dateutil": {
             "hashes": [
-                "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
-                "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
+                "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
+                "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
-            "version": "==2.8.2"
+            "version": "==2.9.0.post0"
         },
         "python-slugify": {
             "hashes": [
@@ -943,6 +1129,14 @@
             "markers": "python_version >= '3.8'",
             "version": "==6.0.2"
         },
+        "referencing": {
+            "hashes": [
+                "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c",
+                "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.35.1"
+        },
         "requests": {
             "hashes": [
                 "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
@@ -951,13 +1145,109 @@
             "markers": "python_version >= '3.8'",
             "version": "==2.32.3"
         },
-        "setuptools": {
+        "rpds-py": {
+            "hashes": [
+                "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba",
+                "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d",
+                "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e",
+                "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a",
+                "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202",
+                "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271",
+                "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250",
+                "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d",
+                "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928",
+                "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0",
+                "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d",
+                "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333",
+                "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e",
+                "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a",
+                "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18",
+                "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044",
+                "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677",
+                "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664",
+                "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75",
+                "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89",
+                "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027",
+                "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9",
+                "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e",
+                "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8",
+                "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44",
+                "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3",
+                "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95",
+                "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd",
+                "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab",
+                "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a",
+                "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560",
+                "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035",
+                "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919",
+                "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c",
+                "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266",
+                "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e",
+                "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592",
+                "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9",
+                "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3",
+                "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624",
+                "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9",
+                "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b",
+                "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f",
+                "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca",
+                "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1",
+                "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8",
+                "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590",
+                "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed",
+                "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952",
+                "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11",
+                "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061",
+                "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c",
+                "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74",
+                "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c",
+                "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94",
+                "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c",
+                "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8",
+                "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf",
+                "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a",
+                "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5",
+                "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6",
+                "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5",
+                "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3",
+                "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed",
+                "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87",
+                "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b",
+                "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72",
+                "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05",
+                "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed",
+                "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f",
+                "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c",
+                "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153",
+                "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b",
+                "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0",
+                "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d",
+                "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d",
+                "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e",
+                "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e",
+                "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd",
+                "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682",
+                "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4",
+                "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db",
+                "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976",
+                "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937",
+                "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1",
+                "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb",
+                "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a",
+                "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7",
+                "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356",
+                "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==0.21.0"
+        },
+        "rsa": {
             "hashes": [
-                "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd",
-                "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"
+                "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7",
+                "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"
             ],
-            "markers": "python_version >= '3.8'",
-            "version": "==75.3.0"
+            "markers": "python_version >= '3.6' and python_version < '4'",
+            "version": "==4.9"
         },
         "six": {
             "hashes": [
@@ -967,6 +1257,56 @@
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.16.0"
         },
+        "sqlalchemy": {
+            "hashes": [
+                "sha256:02d2ecb9508f16ab9c5af466dfe5a88e26adf2e1a8d1c56eb616396ccae2c186",
+                "sha256:0b76bbb1cbae618d10679be8966f6d66c94f301cfc15cb49e2f2382563fb6efb",
+                "sha256:0de620f978ca273ce027769dc8db7e6ee72631796187adc8471b3c76091b809e",
+                "sha256:1183599e25fa38a1a322294b949da02b4f0da13dbc2688ef9dbe746df573f8a6",
+                "sha256:12bc0141b245918b80d9d17eca94663dbd3f5266ac77a0be60750f36102bbb0f",
+                "sha256:1390ca2d301a2708fd4425c6d75528d22f26b8f5cbc9faba1ddca136671432bc",
+                "sha256:13e91d6892b5fcb94a36ba061fb7a1f03d0185ed9d8a77c84ba389e5bb05e936",
+                "sha256:14b3f4783275339170984cadda66e3ec011cce87b405968dc8d51cf0f9997b0d",
+                "sha256:1576fba3616f79496e2f067262200dbf4aab1bb727cd7e4e006076686413c80c",
+                "sha256:1990d5a6a5dc358a0894c8ca02043fb9a5ad9538422001fb2826e91c50f1d539",
+                "sha256:1d83cd1cc03c22d922ec94d0d5f7b7c96b1332f5e122e81b1a61fb22da77879a",
+                "sha256:1e8c1b9ecaf9f2590337d5622189aeb2f0dbc54ba0232fa0856cf390957584a9",
+                "sha256:26e78444bc77d089e62874dc74df05a5c71f01ac598010a327881a48408d0064",
+                "sha256:2b37931eac4b837c45e2522066bda221ac6d80e78922fb77c75eb12e4dbcdee5",
+                "sha256:3112de9e11ff1957148c6de1df2bc5cc1440ee36783412e5eedc6f53638a577d",
+                "sha256:394b0135900b62dbf63e4809cdc8ac923182af2816d06ea61cd6763943c2cc05",
+                "sha256:3f01c2629a7d6b30d8afe0326b8c649b74825a0e1ebdcb01e8ffd1c920deb07d",
+                "sha256:41cffc63c7c83dfc30c4cab5b4308ba74440a9633c4509c51a0c52431fb0f8ab",
+                "sha256:4470fbed088c35dc20b78a39aaf4ae54fe81790c783b3264872a0224f437c31a",
+                "sha256:5ed3576675c187e3baa80b02c4c9d0edfab78eff4e89dd9da736b921333a2432",
+                "sha256:6b24364150738ce488333b3fb48bfa14c189a66de41cd632796fbcacb26b4585",
+                "sha256:6da60fb24577f989535b8fc8b2ddc4212204aaf02e53c4c7ac94ac364150ed08",
+                "sha256:76c2ba7b5a09863d0a8166fbc753af96d561818c572dbaf697c52095938e7be4",
+                "sha256:954816850777ac234a4e32b8c88ac1f7847088a6e90cfb8f0e127a1bf3feddff",
+                "sha256:9c24dd161c06992ed16c5e528a75878edbaeced5660c3db88c820f1f0d3fe1f4",
+                "sha256:a01bc25eb7a5688656c8770f931d5cb4a44c7de1b3cec69b84cc9745d1e4cc10",
+                "sha256:a19f816f4702d7b1951d7576026c7124b9bfb64a9543e571774cf517b7a50b29",
+                "sha256:a41611835010ed4ea4c7aed1da5b58aac78ee7e70932a91ed2705a7b38e40f52",
+                "sha256:a49730afb716f3f675755afec109895cab95bc9875db7ffe2e42c1b1c6279482",
+                "sha256:a86b0e4be775902a5496af4fb1b60d8a2a457d78f531458d294360b8637bb014",
+                "sha256:a8a72259a1652f192c68377be7011eac3c463e9892ef2948828c7d58e4829988",
+                "sha256:af00236fe21c4d4f4c227b6ccc19b44c594160cc3ff28d104cdce85855369277",
+                "sha256:b05e0626ec1c391432eabb47a8abd3bf199fb74bfde7cc44a26d2b1b352c2c6e",
+                "sha256:b5933c45d11cbd9694b1540aa9076816cc7406964c7b16a380fd84d3a5fe3241",
+                "sha256:b5e0d47d619c739bdc636bbe007da4519fc953393304a5943e0b5aec96c9877c",
+                "sha256:b67589f7955924865344e6eacfdcf70675e64f36800a576aa5e961f0008cde2a",
+                "sha256:c5a2530400a6e7e68fd1552a55515de6a4559122e495f73554a51cedafc11669",
+                "sha256:cafe0ba3a96d0845121433cffa2b9232844a2609fce694fcc02f3f31214ece28",
+                "sha256:cdb2886c0be2c6c54d0651d5a61c29ef347e8eec81fd83afebbf7b59b80b7393",
+                "sha256:d0cf7076c8578b3de4e43a046cc7a1af8466e1c3f5e64167189fe8958a4f9c02",
+                "sha256:f1e1b92ee4ee9ffc68624ace218b89ca5ca667607ccee4541a90cc44999b9aea",
+                "sha256:f941aaf15f47f316123e1933f9ea91a6efda73a161a6ab6046d1cde37be62c88",
+                "sha256:fb59a11689ff3c58e7652260127f9e34f7f45478a2f3ef831ab6db7bcd72108f",
+                "sha256:fc9ffd9a38e21fad3e8c5a88926d57f94a32546e937e0be46142b2702003eba7"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
+            "version": "==1.4.54"
+        },
         "sqlparams": {
             "hashes": [
                 "sha256:454beae170183836429013dfdfcca6eb168ec06168f332c8658cccaf6452de15",
@@ -977,11 +1317,11 @@
         },
         "sqlparse": {
             "hashes": [
-                "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3",
-                "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"
+                "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4",
+                "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"
             ],
-            "markers": "python_version >= '3.5'",
-            "version": "==0.4.4"
+            "markers": "python_version >= '3.8'",
+            "version": "==0.5.1"
         },
         "text-unidecode": {
             "hashes": [
@@ -992,17 +1332,17 @@
         },
         "thrift": {
             "hashes": [
-                "sha256:4dd662eadf6b8aebe8a41729527bd69adf6ceaa2a8681cbef64d1273b3e8feba"
+                "sha256:2b5b6488fcded21f9d312aa23c9ff6a0195d0f6ae26ddbd5ad9e3e25dfc14408"
             ],
-            "version": "==0.20.0"
+            "version": "==0.16.0"
         },
         "tomli": {
             "hashes": [
-                "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38",
-                "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"
+                "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8",
+                "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"
             ],
             "markers": "python_version < '3.11'",
-            "version": "==2.0.2"
+            "version": "==2.1.0"
         },
         "typing-extensions": {
             "hashes": [
@@ -1022,19 +1362,19 @@
         },
         "urllib3": {
             "hashes": [
-                "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac",
-                "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"
+                "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e",
+                "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"
             ],
-            "markers": "python_version >= '3.8'",
-            "version": "==2.2.3"
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
+            "version": "==1.26.20"
         },
-        "werkzeug": {
+        "zipp": {
             "hashes": [
-                "sha256:554b257c74bbeb7a0d254160a4f8ffe185243f52a52035060b761ca62d977f03",
-                "sha256:bba1f19f8ec89d4d607a3bd62f1904bd2e609472d93cd85e9d4e178f472c3748"
+                "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4",
+                "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"
             ],
-            "markers": "python_version >= '3.8'",
-            "version": "==2.3.8"
+            "markers": "python_version >= '3.9'",
+            "version": "==3.21.0"
         }
     },
     "develop": {
@@ -1056,11 +1396,11 @@
         },
         "packaging": {
             "hashes": [
-                "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
-                "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
+                "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
+                "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
             ],
-            "markers": "python_version >= '3.6'",
-            "version": "==21.3"
+            "markers": "python_version >= '3.8'",
+            "version": "==24.2"
         },
         "pluggy": {
             "hashes": [
@@ -1089,11 +1429,11 @@
         },
         "tomli": {
             "hashes": [
-                "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38",
-                "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"
+                "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8",
+                "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"
             ],
             "markers": "python_version < '3.11'",
-            "version": "==2.0.2"
+            "version": "==2.1.0"
         }
     }
 }
diff --git a/dbt_project.yml b/dbt_project.yml
deleted file mode 100644
index 1fb8ada90..000000000
--- a/dbt_project.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: 'jaffle_shop'
-
-config-version: 2
-version: '0.1'
-
-profile: 'jaffle_shop'
-
-macro-paths: ["jaffle_shop/macros"]
-model-paths: ["jaffle_shop/models"]
-seed-paths: ["jaffle_shop/seeds"]
-snapshot-paths: ["jaffle_shop/snapshots"]
-
-target-path: "target"
-clean-targets:
-    - "target"
-    - "dbt_modules"
-    - "logs"
-
-require-dbt-version: [">=1.0.0", "<2.0.0"]
-
-dispatch:
-  - macro_namespace: dbt_utils
-    search_order: ['dbt_project_evaluator', 'spark_utils', 'dbt_utils']
-
-models:
-  jaffle_shop:
-      materialized: table
-      staging:
-        materialized: view
diff --git a/jaffle_shop/dbt_project.yml b/jaffle_shop/dbt_project.yml
new file mode 100644
index 000000000..52f2d4fda
--- /dev/null
+++ b/jaffle_shop/dbt_project.yml
@@ -0,0 +1,47 @@
+name: 'jaffle_shop'
+
+config-version: 2
+version: '0.1'
+
+profile: 'jaffle_shop'
+
+macro-paths: ["macros"]
+model-paths: ["models"]
+seed-paths: ["seeds"]
+snapshot-paths: ["snapshots"]
+
+target-path: "target"
+clean-targets:
+    - "target"
+    - "dbt_modules"
+    - "logs"
+
+require-dbt-version: [">=1.0.0", "<2.0.0"]
+
+dispatch:
+  # - macro_namespace: dbt_utils
+  #   search_order: ['dbt_project_evaluator', 'spark_utils', 'dbt_utils']
+  - macro_namespace: dbt
+    search_order: ['dbt_project_evaluator', 'dbt']
+
+models:
+  +file_format: delta
+
+  jaffle_shop:
+    +pk_required: true
+    +desc_required: true
+    +no_hardcoded_dbs: true
+
+    staging:
+      +materialized: view
+
+      src_seed:
+        +materialized: view
+
+    warehouse:
+      +materialized: table
+
+seeds:
+  dbt_project_evaluator:
+    dbt_project_evaluator_exceptions:
+      +enabled: false
diff --git a/jaffle_shop/macros/sensitive/hash_of_column.sql b/jaffle_shop/macros/sensitive/hash_of_column.sql
index af53dc504..d282fb9e3 100644
--- a/jaffle_shop/macros/sensitive/hash_of_column.sql
+++ b/jaffle_shop/macros/sensitive/hash_of_column.sql
@@ -3,7 +3,7 @@
     SHA2(
         TRIM(
             LOWER(
-                CAST({{ column|lower }} AS {{ dbt_utils.type_string() }})
+                CAST({{ column|lower }} AS {{ dbt.type_string() }})
                 || '{{ jaffle_shop.get_salt(column|lower) }}'
             )
         ),
diff --git a/jaffle_shop/models/staging/src_seed/stg_customers.sql b/jaffle_shop/models/staging/src_seed/stg_customers.sql
index b3c9ede1c..4538cbb8e 100644
--- a/jaffle_shop/models/staging/src_seed/stg_customers.sql
+++ b/jaffle_shop/models/staging/src_seed/stg_customers.sql
@@ -1,4 +1,3 @@
 SELECT
-  -- {{ hash_sensitive_columns('stg_customers_pii') }}
-  *
+  {{ hash_sensitive_columns('stg_customers_pii') }}
 FROM {{ ref('stg_customers_pii') }}
diff --git a/jaffle_shop/models/warehouse/wh_finance.sql b/jaffle_shop/models/warehouse/wh_finance.sql
deleted file mode 100644
index e69de29bb..000000000
diff --git a/jaffle_shop/models/warehouse/wh_orders.sql b/jaffle_shop/models/warehouse/wh_orders.sql
index 4a43a58ad..5bfe656d4 100644
--- a/jaffle_shop/models/warehouse/wh_orders.sql
+++ b/jaffle_shop/models/warehouse/wh_orders.sql
@@ -16,8 +16,8 @@ WITH orders_ AS (
     {% for payment_method in payment_methods -%}
     , SUM(
       CASE
-        WHEN when payment_method = '{{ payment_method }}'
-          THEN amount
+        WHEN payment_method = '{{ payment_method }}'
+          THEN amount_aud
         ELSE 0
       END
     ) AS {{ payment_method }}_amount_aud
@@ -34,7 +34,7 @@ WITH orders_ AS (
     , orders_.order_date
     , orders_.status
     {% for payment_method in payment_methods -%}
-    , order_payments_.{{ payment_method }}_amount_aud,
+    , order_payments_.{{ payment_method }}_amount_aud
     {% endfor -%}
     , order_payments_.total_amount_aud
   FROM orders_
diff --git a/jaffle_shop/models/warehouse/wh_sales.sql b/jaffle_shop/models/warehouse/wh_sales.sql
deleted file mode 100644
index e69de29bb..000000000
diff --git a/jaffle_shop/package-lock.yml b/jaffle_shop/package-lock.yml
new file mode 100644
index 000000000..01c2e19ec
--- /dev/null
+++ b/jaffle_shop/package-lock.yml
@@ -0,0 +1,10 @@
+packages:
+- package: dbt-labs/dbt_utils
+  version: 1.3.0
+- package: dbt-labs/spark_utils
+  version: 0.3.0
+- package: dbt-labs/codegen
+  version: 0.12.1
+- package: dbt-labs/dbt_project_evaluator
+  version: 0.14.3
+sha1_hash: 59adf0a667e307048209cbea5ef70e871d6ec49a
diff --git a/packages.yml b/jaffle_shop/packages.yml
similarity index 62%
rename from packages.yml
rename to jaffle_shop/packages.yml
index 81ec273e5..60d125387 100644
--- a/packages.yml
+++ b/jaffle_shop/packages.yml
@@ -1,9 +1,9 @@
 packages:
   - package: dbt-labs/dbt_utils
-    version: 0.8.6
+    version: '>=0.8.6'
   - package: dbt-labs/spark_utils
-    version: 0.3.0
+    version: '>=0.3.0'
   - package: dbt-labs/codegen
-    version: 0.7.0
+    version: '>=0.7.0'
   - package: dbt-labs/dbt_project_evaluator
-    version: 0.1.3
\ No newline at end of file
+    version: '>=0.1.3'
\ No newline at end of file
diff --git a/selectors.yml b/jaffle_shop/selectors.yml
similarity index 100%
rename from selectors.yml
rename to jaffle_shop/selectors.yml
diff --git a/testing/__init__.py b/jaffle_shop/testing/__init__.py
similarity index 100%
rename from testing/__init__.py
rename to jaffle_shop/testing/__init__.py
diff --git a/testing/profiles.yml b/jaffle_shop/testing/profiles.yml
similarity index 100%
rename from testing/profiles.yml
rename to jaffle_shop/testing/profiles.yml
diff --git a/testing/structure.py b/jaffle_shop/testing/structure.py
similarity index 100%
rename from testing/structure.py
rename to jaffle_shop/testing/structure.py
diff --git a/testing/test_structure.py b/jaffle_shop/testing/test_structure.py
similarity index 100%
rename from testing/test_structure.py
rename to jaffle_shop/testing/test_structure.py
diff --git a/package_projects/dbt_project_evaluator.yml b/package_projects/dbt_project_evaluator.yml
deleted file mode 100644
index 12e86f3e4..000000000
--- a/package_projects/dbt_project_evaluator.yml
+++ /dev/null
@@ -1,87 +0,0 @@
-name: 'dbt_project_evaluator'
-version: '1.0.0'
-config-version: 2
-
-require-dbt-version: [">=1.1.0", "<2.0.0"]
-
-model-paths: ["models"]
-analysis-paths: ["analysis"]
-test-paths: ["tests"]
-seed-paths: ["seeds"]
-macro-paths: ["macros"]
-snapshot-paths: ["snapshots"]
-
-target-path: "target"  # directory which will store compiled SQL files
-clean-targets:         # directories to be removed by `dbt clean`
-  - "target"
-  - "dbt_packages"
-
-dispatch:
-  - macro_namespace: dbt_utils
-    search_order: ['dbt_project_evaluator', 'spark_utils', 'dbt_utils']
-
-models:
-  dbt_project_evaluator:
-    marts:
-      core:
-        int_all_graph_resources:
-          +materialized: table
-        int_direct_relationships:
-          # required for BigQuery and Redshift for performance/memory reasons
-          +materialized: "{{ 'table' if target.type in ['bigquery', 'redshift', 'databricks'] else 'view' }}"
-        int_all_dag_relationships:
-          # required for BigQuery, Redshift, and Databricks for performance/memory reasons
-          +materialized: "{{ 'table' if target.type in ['bigquery', 'redshift', 'databricks'] else 'view' }}"
-      dag:
-        +materialized: table
-    staging:
-      graph:
-        stg_nodes:
-          +materialized: table
-        stg_node_relationships:
-          +materialized: table
-      variables:
-        stg_naming_convention_folders:
-          # required for Redshift because listagg runs only on tables
-          +materialized: "{{ 'table' if target.type == 'redshift' else 'view' }}"
-        stg_naming_convention_prefixes:
-          # required for Redshift because listagg runs only on tables
-          +materialized: "{{ 'table' if target.type == 'redshift' else 'view' }}"
-
-
-vars:
-
-  # -- Tests and docs coverage variables --
-  documentation_coverage_target: 100
-  test_coverage_target: 100
-
-  # -- DAG variables --
-  models_fanout_threshold: 3
-
-  # -- Naming conventions variables --
-  # to add a new "layer", update the variable list_layers
-  # and create new variables with the names <layer>_folder_name and/or <layer>_prefixes
-  model_types: ['staging', 'intermediate', 'warehouse', 'final', 'tests']
-
-  staging_folder_name: 'staging'
-  intermediate_folder_name: 'intermediate'
-  warehouse_folder_name: 'warehouse'
-  final_folder_name: 'final'
-  tests_folder_name: 'tests'
-
-  staging_prefixes: ['stg_']
-  intermediate_prefixes: ['inter_']
-  warehouse_prefixes: ['wh_']
-  final_prefixes: ['fnl_']
-  tests_prefixes: ['test_']
-
-  # -- Performance variables --
-  chained_views_threshold: 5
-
-  # -- Warehouse specific variables --
-  max_depth_dag: 9
-
-seeds:
-  dbt_project_evaluator:
-    dbt_project_evaluator_exceptions:
-      +enabled: false
\ No newline at end of file

From 5976dddcdc75fa89dc9ef80dd576e833fbd13937 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 10:46:18 +0900
Subject: [PATCH 12/25] add naming convention rules

---
 jaffle_shop/dbt_project.yml | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/jaffle_shop/dbt_project.yml b/jaffle_shop/dbt_project.yml
index 52f2d4fda..3fb17bf6e 100644
--- a/jaffle_shop/dbt_project.yml
+++ b/jaffle_shop/dbt_project.yml
@@ -19,10 +19,10 @@ clean-targets:
 require-dbt-version: [">=1.0.0", "<2.0.0"]
 
 dispatch:
-  # - macro_namespace: dbt_utils
-  #   search_order: ['dbt_project_evaluator', 'spark_utils', 'dbt_utils']
-  - macro_namespace: dbt
-    search_order: ['dbt_project_evaluator', 'dbt']
+  - macro_namespace: dbt_utils
+    search_order: ['dbt_project_evaluator', 'spark_utils', 'dbt_utils']
+  # - macro_namespace: dbt
+  #   search_order: ['dbt_project_evaluator', 'dbt']
 
 models:
   +file_format: delta
@@ -45,3 +45,15 @@ seeds:
   dbt_project_evaluator:
     dbt_project_evaluator_exceptions:
       +enabled: false
+
+vars:
+  dbt_project_evaluator:
+    model_types: ['staging', 'intermediate', 'warehouse', 'final', 'metrics']
+    staging_folder_name: 'staging'
+    staging_prefixes: ['stg_']
+    intermediate_folder_name: 'intermediate'
+    intermediate_prefixes: ['int_', 'inter_']
+    warehouse_folder_name: 'warehouse'
+    warehouse_prefixes: ['wh_']
+    final_folder_name: 'final'
+    final_prefixes: ['fnl_']

From 68f15be58867c21a5fa3cdfd16351b0bfd1aeda8 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 10:46:33 +0900
Subject: [PATCH 13/25] add model documentation

---
 jaffle_shop/models/staging/src_seed/_models.yml | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/jaffle_shop/models/staging/src_seed/_models.yml b/jaffle_shop/models/staging/src_seed/_models.yml
index 2645c83a9..55045221e 100644
--- a/jaffle_shop/models/staging/src_seed/_models.yml
+++ b/jaffle_shop/models/staging/src_seed/_models.yml
@@ -37,6 +37,11 @@ models:
       - name: last_name_hash
 
   - name: stg_orders
+    description: |
+      A row per order, where an order consists of:
+        - customer_id
+        - order_date
+        - status
     columns:
       - name: order_id
         description: Primary key
@@ -54,6 +59,11 @@ models:
               values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
 
   - name: stg_payments
+    description: |
+      A row per payment, where a payment consists of:
+        - order_id
+        - payment_menthod
+        - amount_aud
     columns:
       - name: payment_id
         description: Primary key

From 9a3b8a5181bc228e99027c12888644bf45d6e4f2 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 10:58:25 +0900
Subject: [PATCH 14/25] move testing back to base dir

---
 Makefile                                           | 4 ++--
 {jaffle_shop/testing => testing}/__init__.py       | 0
 {jaffle_shop/testing => testing}/profiles.yml      | 0
 {jaffle_shop/testing => testing}/structure.py      | 0
 {jaffle_shop/testing => testing}/test_structure.py | 0
 5 files changed, 2 insertions(+), 2 deletions(-)
 rename {jaffle_shop/testing => testing}/__init__.py (100%)
 rename {jaffle_shop/testing => testing}/profiles.yml (100%)
 rename {jaffle_shop/testing => testing}/structure.py (100%)
 rename {jaffle_shop/testing => testing}/test_structure.py (100%)

diff --git a/Makefile b/Makefile
index a5eed96f4..47ead95a7 100644
--- a/Makefile
+++ b/Makefile
@@ -29,7 +29,7 @@ format: build-env
 	pipenv run sqlfluff fix
 
 run-python-tests:
-	pipenv run pytest jaffle_shop/testing --quiet --show-capture=no --tb=no
+	pipenv run pytest testing --quiet --show-capture=no --tb=no
 
 run-python-tests-detailed:
-	pipenv run pytest jaffle_shop/testing
\ No newline at end of file
+	pipenv run pytest testing
\ No newline at end of file
diff --git a/jaffle_shop/testing/__init__.py b/testing/__init__.py
similarity index 100%
rename from jaffle_shop/testing/__init__.py
rename to testing/__init__.py
diff --git a/jaffle_shop/testing/profiles.yml b/testing/profiles.yml
similarity index 100%
rename from jaffle_shop/testing/profiles.yml
rename to testing/profiles.yml
diff --git a/jaffle_shop/testing/structure.py b/testing/structure.py
similarity index 100%
rename from jaffle_shop/testing/structure.py
rename to testing/structure.py
diff --git a/jaffle_shop/testing/test_structure.py b/testing/test_structure.py
similarity index 100%
rename from jaffle_shop/testing/test_structure.py
rename to testing/test_structure.py

From 36dc97ad681302d8959e5ba3921274d2525c9a72 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 11:03:55 +0900
Subject: [PATCH 15/25] update DBT_PROFILES_DIR

---
 .circleci/config.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 5fa30a144..4eb9db081 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -64,7 +64,7 @@ jobs:
     executor: standard
     environment:
       SALT: himalayan
-      DBT_PROFILES_DIR: ~/lib/testing/
+      DBT_PROFILES_DIR: testing
       TESTING_PROFILE_NAME: jaffle_shop
     steps:
       - checkout

From 012fc2125ad3cbe9183e54b22d1f246d8fff39f2 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 11:14:56 +0900
Subject: [PATCH 16/25] use duckdb adaptor (so tests can run in CI)

---
 Pipfile              |   3 +-
 Pipfile.lock         | 448 ++++++-------------------------------------
 testing/profiles.yml |   7 +-
 3 files changed, 67 insertions(+), 391 deletions(-)

diff --git a/Pipfile b/Pipfile
index 3624922aa..f5e1e12d9 100644
--- a/Pipfile
+++ b/Pipfile
@@ -4,8 +4,9 @@ verify_ssl = true
 name = "pypi"
 
 [packages]
+duckdb = "*"
 dbt-core = "==1.7.17"
-dbt-databricks = {extras = ["odbc"]}
+dbt-duckdb = "*"
 pytest-mock = "*"
 glob2 = "*"
 
diff --git a/Pipfile.lock b/Pipfile.lock
index ded30cb13..6053bb601 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "f6f9913542164e4b070e08a1c794f31733cd627f8a29a4b2e0e0a24d473868d1"
+            "sha256": "eaabf0a27708063860caa61b6960b07532666fd0cc67e3285b1b8acf497e056e"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -23,14 +23,6 @@
             ],
             "version": "==1.7.1"
         },
-        "alembic": {
-            "hashes": [
-                "sha256:99bd884ca390466db5e27ffccff1d179ec5c05c965cfefc0607e69f9e411cb25",
-                "sha256:b00892b53b3642d0b8dbedba234dbf1924b69be83a9a769d5a624b01094e304b"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==1.14.0"
-        },
         "annotated-types": {
             "hashes": [
                 "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
@@ -55,22 +47,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==2.16.0"
         },
-        "backports.tarfile": {
-            "hashes": [
-                "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34",
-                "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"
-            ],
-            "markers": "python_version < '3.12'",
-            "version": "==1.2.0"
-        },
-        "cachetools": {
-            "hashes": [
-                "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292",
-                "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==5.5.0"
-        },
         "certifi": {
             "hashes": [
                 "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8",
@@ -279,22 +255,6 @@
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
             "version": "==0.4.6"
         },
-        "databricks-sdk": {
-            "hashes": [
-                "sha256:0a1baa6783aba9b034b9a017da8d0cf839ec61ae8318792b78bfb3db0374dd9c",
-                "sha256:ad90e01c7b1a9d60a3de6a35606c79ac982e8972d3ad3ff89c251c24439c8bb9"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==0.17.0"
-        },
-        "databricks-sql-connector": {
-            "hashes": [
-                "sha256:d830abf86e71d2eb83c6a7b7264d6c03926a8a83cec58541ddd6b83d693bde8f",
-                "sha256:e55f5b8ede8ae6c6f31416a4cf6352f0ac019bf6875896c668c7574ceaf6e813"
-            ],
-            "markers": "python_full_version >= '3.7.1' and python_full_version < '4.0.0'",
-            "version": "==2.9.6"
-        },
         "dbt-core": {
             "hashes": [
                 "sha256:91cd0ceca29d77377988bca94db02c9d6f3debdd604edbde702008380b87fc4e",
@@ -304,16 +264,14 @@
             "markers": "python_version >= '3.8'",
             "version": "==1.7.17"
         },
-        "dbt-databricks": {
-            "extras": [
-                "odbc"
-            ],
+        "dbt-duckdb": {
             "hashes": [
-                "sha256:b52decb556a94f567bfa07a45067074c25582220f29e39b3ed687aeb6de0dd7d",
-                "sha256:e051c3b568f1838458dac61fa7caa99694a00a0d9f46ec632b1f7f523fba9b7c"
+                "sha256:7ff2fc21a656f61c30b30ff44865f02de6818d950fe99a475245546d63d22b98",
+                "sha256:a2eeb10e83058ff55738228da953538c5f2eddff3be3c8defcee1f300611f9d3"
             ],
+            "index": "pypi",
             "markers": "python_version >= '3.8'",
-            "version": "==1.7.17"
+            "version": "==1.7.5"
         },
         "dbt-extractor": {
             "hashes": [
@@ -345,21 +303,64 @@
             "markers": "python_version >= '3.8'",
             "version": "==0.4.4"
         },
-        "dbt-spark": {
-            "hashes": [
-                "sha256:99b5002edcdb82058a3b0ad33eb18b91a4bdde887d94855e8bd6f633d78837dc",
-                "sha256:a10e5d1bfdb2ca98e7ae2badd06150e2695d9d4fa18ae2354ed5bd093d77f947"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==1.7.1"
-        },
-        "et-xmlfile": {
-            "hashes": [
-                "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa",
-                "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"
+        "duckdb": {
+            "hashes": [
+                "sha256:00cca22df96aa3473fe4584f84888e2cf1c516e8c2dd837210daec44eadba586",
+                "sha256:08935700e49c187fe0e9b2b86b5aad8a2ccd661069053e38bfaed3b9ff795efd",
+                "sha256:0897f83c09356206ce462f62157ce064961a5348e31ccb2a557a7531d814e70e",
+                "sha256:09c68522c30fc38fc972b8a75e9201616b96ae6da3444585f14cf0d116008c95",
+                "sha256:0a55169d2d2e2e88077d91d4875104b58de45eff6a17a59c7dc41562c73df4be",
+                "sha256:0ba6baa0af33ded836b388b09433a69b8bec00263247f6bf0a05c65c897108d3",
+                "sha256:183ac743f21c6a4d6adfd02b69013d5fd78e5e2cd2b4db023bc8a95457d4bc5d",
+                "sha256:1aa3abec8e8995a03ff1a904b0e66282d19919f562dd0a1de02f23169eeec461",
+                "sha256:1c0226dc43e2ee4cc3a5a4672fddb2d76fd2cf2694443f395c02dd1bea0b7fce",
+                "sha256:1d9ab6143e73bcf17d62566e368c23f28aa544feddfd2d8eb50ef21034286f24",
+                "sha256:2141c6b28162199999075d6031b5d63efeb97c1e68fb3d797279d31c65676269",
+                "sha256:252d9b17d354beb9057098d4e5d5698e091a4f4a0d38157daeea5fc0ec161670",
+                "sha256:25fb02629418c0d4d94a2bc1776edaa33f6f6ccaa00bd84eb96ecb97ae4b50e9",
+                "sha256:2f073d15d11a328f2e6d5964a704517e818e930800b7f3fa83adea47f23720d3",
+                "sha256:35c420f58abc79a68a286a20fd6265636175fadeca1ce964fc8ef159f3acc289",
+                "sha256:4ebf5f60ddbd65c13e77cddb85fe4af671d31b851f125a4d002a313696af43f1",
+                "sha256:4f0e2e5a6f5a53b79aee20856c027046fba1d73ada6178ed8467f53c3877d5e0",
+                "sha256:51c6d79e05b4a0933672b1cacd6338f882158f45ef9903aef350c4427d9fc898",
+                "sha256:51e7dbd968b393343b226ab3f3a7b5a68dee6d3fe59be9d802383bf916775cb8",
+                "sha256:5ace6e4b1873afdd38bd6cc8fcf90310fb2d454f29c39a61d0c0cf1a24ad6c8d",
+                "sha256:5d57776539211e79b11e94f2f6d63de77885f23f14982e0fac066f2885fcf3ff",
+                "sha256:6411e21a2128d478efbd023f2bdff12464d146f92bc3e9c49247240448ace5a6",
+                "sha256:647f17bd126170d96a38a9a6f25fca47ebb0261e5e44881e3782989033c94686",
+                "sha256:68c3a46ab08836fe041d15dcbf838f74a990d551db47cb24ab1c4576fc19351c",
+                "sha256:77f26884c7b807c7edd07f95cf0b00e6d47f0de4a534ac1706a58f8bc70d0d31",
+                "sha256:7c71169fa804c0b65e49afe423ddc2dc83e198640e3b041028da8110f7cd16f7",
+                "sha256:80158f4c7c7ada46245837d5b6869a336bbaa28436fbb0537663fa324a2750cd",
+                "sha256:872d38b65b66e3219d2400c732585c5b4d11b13d7a36cd97908d7981526e9898",
+                "sha256:8ee97ec337794c162c0638dda3b4a30a483d0587deda22d45e1909036ff0b739",
+                "sha256:911d58c22645bfca4a5a049ff53a0afd1537bc18fedb13bc440b2e5af3c46148",
+                "sha256:9c619e4849837c8c83666f2cd5c6c031300cd2601e9564b47aa5de458ff6e69d",
+                "sha256:9d0767ada9f06faa5afcf63eb7ba1befaccfbcfdac5ff86f0168c673dd1f47aa",
+                "sha256:9e3f5cd604e7c39527e6060f430769b72234345baaa0987f9500988b2814f5e4",
+                "sha256:a1f83c7217c188b7ab42e6a0963f42070d9aed114f6200e3c923c8899c090f16",
+                "sha256:a1fa0c502f257fa9caca60b8b1478ec0f3295f34bb2efdc10776fc731b8a6c5f",
+                "sha256:a30dd599b8090ea6eafdfb5a9f1b872d78bac318b6914ada2d35c7974d643640",
+                "sha256:a433ae9e72c5f397c44abdaa3c781d94f94f4065bcbf99ecd39433058c64cb38",
+                "sha256:a4748635875fc3c19a7320a6ae7410f9295557450c0ebab6d6712de12640929a",
+                "sha256:b74e121ab65dbec5290f33ca92301e3a4e81797966c8d9feef6efdf05fc6dafd",
+                "sha256:c443d3d502335e69fc1e35295fcfd1108f72cb984af54c536adfd7875e79cee5",
+                "sha256:c5336939d83837af52731e02b6a78a446794078590aa71fd400eb17f083dda3e",
+                "sha256:cddc6c1a3b91dcc5f32493231b3ba98f51e6d3a44fe02839556db2b928087378",
+                "sha256:d08308e0a46c748d9c30f1d67ee1143e9c5ea3fbcccc27a47e115b19e7e78aa9",
+                "sha256:d5724fd8a49e24d730be34846b814b98ba7c304ca904fbdc98b47fa95c0b0cee",
+                "sha256:e4ef7ba97a65bd39d66f2a7080e6fb60e7c3e41d4c1e19245f90f53b98e3ac32",
+                "sha256:e59087dbbb63705f2483544e01cccf07d5b35afa58be8931b224f3221361d537",
+                "sha256:e86006958e84c5c02f08f9b96f4bc26990514eab329b1b4f71049b3727ce5989",
+                "sha256:ecb1dc9062c1cc4d2d88a5e5cd8cc72af7818ab5a3c0f796ef0ffd60cfd3efb4",
+                "sha256:eeacb598120040e9591f5a4edecad7080853aa8ac27e62d280f151f8c862afa3",
+                "sha256:f549af9f7416573ee48db1cf8c9d27aeed245cb015f4b4f975289418c6cf7320",
+                "sha256:f58db1b65593ff796c8ea6e63e2e144c944dd3d51c8d8e40dffa7f41693d35d3",
+                "sha256:f9b47036945e1db32d70e414a10b1593aec641bd4c5e2056873d971cc21e978b"
             ],
-            "markers": "python_version >= '3.8'",
-            "version": "==2.0.0"
+            "index": "pypi",
+            "markers": "python_full_version >= '3.7.0'",
+            "version": "==1.1.3"
         },
         "exceptiongroup": {
             "hashes": [
@@ -376,14 +377,6 @@
             "index": "pypi",
             "version": "==0.7"
         },
-        "google-auth": {
-            "hashes": [
-                "sha256:51a15d47028b66fd36e5c64a82d2d57480075bccc7da37cde257fc94177a61fb",
-                "sha256:545e9618f2df0bcbb7dcbc45a546485b1212624716975a1ea5ae8149ce769ab1"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==2.36.0"
-        },
         "idna": {
             "hashes": [
                 "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
@@ -415,30 +408,6 @@
             ],
             "version": "==0.6.1"
         },
-        "jaraco.classes": {
-            "hashes": [
-                "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd",
-                "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==3.4.0"
-        },
-        "jaraco.context": {
-            "hashes": [
-                "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3",
-                "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==6.0.1"
-        },
-        "jaraco.functools": {
-            "hashes": [
-                "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d",
-                "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==4.1.0"
-        },
         "jinja2": {
             "hashes": [
                 "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369",
@@ -463,14 +432,6 @@
             "markers": "python_version >= '3.9'",
             "version": "==2024.10.1"
         },
-        "keyring": {
-            "hashes": [
-                "sha256:4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6",
-                "sha256:e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==25.5.0"
-        },
         "leather": {
             "hashes": [
                 "sha256:18290bc93749ae39039af5e31e871fcfad74d26c4c3ea28ea4f681f4571b3a2b",
@@ -492,56 +453,6 @@
             ],
             "version": "==1.5.3"
         },
-        "lz4": {
-            "hashes": [
-                "sha256:01fe674ef2889dbb9899d8a67361e0c4a2c833af5aeb37dd505727cf5d2a131e",
-                "sha256:054b4631a355606e99a42396f5db4d22046a3397ffc3269a348ec41eaebd69d2",
-                "sha256:0a136e44a16fc98b1abc404fbabf7f1fada2bdab6a7e970974fb81cf55b636d0",
-                "sha256:0e9c410b11a31dbdc94c05ac3c480cb4b222460faf9231f12538d0074e56c563",
-                "sha256:222a7e35137d7539c9c33bb53fcbb26510c5748779364014235afc62b0ec797f",
-                "sha256:24b3206de56b7a537eda3a8123c644a2b7bf111f0af53bc14bed90ce5562d1aa",
-                "sha256:2b901c7784caac9a1ded4555258207d9e9697e746cc8532129f150ffe1f6ba0d",
-                "sha256:2f7b1839f795315e480fb87d9bc60b186a98e3e5d17203c6e757611ef7dcef61",
-                "sha256:30e8c20b8857adef7be045c65f47ab1e2c4fabba86a9fa9a997d7674a31ea6b6",
-                "sha256:31ea4be9d0059c00b2572d700bf2c1bc82f241f2c3282034a759c9a4d6ca4dc2",
-                "sha256:337cb94488a1b060ef1685187d6ad4ba8bc61d26d631d7ba909ee984ea736be1",
-                "sha256:33c9a6fd20767ccaf70649982f8f3eeb0884035c150c0b818ea660152cf3c809",
-                "sha256:363ab65bf31338eb364062a15f302fc0fab0a49426051429866d71c793c23394",
-                "sha256:43cf03059c0f941b772c8aeb42a0813d68d7081c009542301637e5782f8a33e2",
-                "sha256:56f4fe9c6327adb97406f27a66420b22ce02d71a5c365c48d6b656b4aaeb7775",
-                "sha256:5d35533bf2cee56f38ced91f766cd0038b6abf46f438a80d50c52750088be93f",
-                "sha256:6756212507405f270b66b3ff7f564618de0606395c0fe10a7ae2ffcbbe0b1fba",
-                "sha256:6cdc60e21ec70266947a48839b437d46025076eb4b12c76bd47f8e5eb8a75dcc",
-                "sha256:abc197e4aca8b63f5ae200af03eb95fb4b5055a8f990079b5bdf042f568469dd",
-                "sha256:b14d948e6dce389f9a7afc666d60dd1e35fa2138a8ec5306d30cd2e30d36b40c",
-                "sha256:b47839b53956e2737229d70714f1d75f33e8ac26e52c267f0197b3189ca6de24",
-                "sha256:b6d9ec061b9eca86e4dcc003d93334b95d53909afd5a32c6e4f222157b50c071",
-                "sha256:b891880c187e96339474af2a3b2bfb11a8e4732ff5034be919aa9029484cd201",
-                "sha256:bca8fccc15e3add173da91be8f34121578dc777711ffd98d399be35487c934bf",
-                "sha256:c81703b12475da73a5d66618856d04b1307e43428a7e59d98cfe5a5d608a74c6",
-                "sha256:d2507ee9c99dbddd191c86f0e0c8b724c76d26b0602db9ea23232304382e1f21",
-                "sha256:e36cd7b9d4d920d3bfc2369840da506fa68258f7bb176b8743189793c055e43d",
-                "sha256:e7d84b479ddf39fe3ea05387f10b779155fc0990125f4fb35d636114e1c63a2e",
-                "sha256:eac9af361e0d98335a02ff12fb56caeb7ea1196cf1a49dbf6f17828a131da807",
-                "sha256:edfd858985c23523f4e5a7526ca6ee65ff930207a7ec8a8f57a01eae506aaee7",
-                "sha256:ee9ff50557a942d187ec85462bb0960207e7ec5b19b3b48949263993771c6205",
-                "sha256:f0e822cd7644995d9ba248cb4b67859701748a93e2ab7fc9bc18c599a52e4604",
-                "sha256:f180904f33bdd1e92967923a43c22899e303906d19b2cf8bb547db6653ea6e7d",
-                "sha256:f1d18718f9d78182c6b60f568c9a9cec8a7204d7cb6fad4e511a2ef279e4cb05",
-                "sha256:f4c7bf687303ca47d69f9f0133274958fd672efaa33fb5bcde467862d6c621f0",
-                "sha256:f76176492ff082657ada0d0f10c794b6da5800249ef1692b35cf49b1e93e8ef7"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==4.3.3"
-        },
-        "mako": {
-            "hashes": [
-                "sha256:9ec3a1583713479fae654f83ed9fa8c9a4c16b7bb0daba0e6bbebff50c0d983d",
-                "sha256:a91198468092a2f1a0de86ca92690fb0cfc43ca90ee17e15d93662b4c04b241a"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==1.3.6"
-        },
         "markupsafe": {
             "hashes": [
                 "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
@@ -711,64 +622,6 @@
             "markers": "python_version >= '3.10'",
             "version": "==3.4.2"
         },
-        "numpy": {
-            "hashes": [
-                "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b",
-                "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818",
-                "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20",
-                "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0",
-                "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010",
-                "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a",
-                "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea",
-                "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c",
-                "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71",
-                "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110",
-                "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be",
-                "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a",
-                "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a",
-                "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5",
-                "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed",
-                "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd",
-                "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c",
-                "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e",
-                "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0",
-                "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c",
-                "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a",
-                "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b",
-                "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0",
-                "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6",
-                "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2",
-                "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a",
-                "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30",
-                "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218",
-                "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5",
-                "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07",
-                "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2",
-                "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4",
-                "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764",
-                "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef",
-                "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3",
-                "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"
-            ],
-            "markers": "python_version >= '3.7' and python_version < '3.11'",
-            "version": "==1.26.4"
-        },
-        "oauthlib": {
-            "hashes": [
-                "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca",
-                "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"
-            ],
-            "markers": "python_version >= '3.6'",
-            "version": "==3.2.2"
-        },
-        "openpyxl": {
-            "hashes": [
-                "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2",
-                "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==3.1.5"
-        },
         "packaging": {
             "hashes": [
                 "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
@@ -777,37 +630,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==24.2"
         },
-        "pandas": {
-            "hashes": [
-                "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9",
-                "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d",
-                "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8",
-                "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034",
-                "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34",
-                "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139",
-                "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1",
-                "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6",
-                "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d",
-                "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b",
-                "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860",
-                "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a",
-                "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540",
-                "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092",
-                "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821",
-                "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9",
-                "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623",
-                "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984",
-                "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171",
-                "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e",
-                "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead",
-                "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732",
-                "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46",
-                "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf",
-                "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.1.4"
-        },
         "parsedatetime": {
             "hashes": [
                 "sha256:4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455",
@@ -848,70 +670,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==4.25.5"
         },
-        "pyarrow": {
-            "hashes": [
-                "sha256:00178509f379415a3fcf855af020e3340254f990a8534294ec3cf674d6e255fd",
-                "sha256:03f40b65a43be159d2f97fd64dc998f769d0995a50c00f07aab58b0b3da87e1f",
-                "sha256:082ba62bdcb939824ba1ce10b8acef5ab621da1f4c4805e07bfd153617ac19d4",
-                "sha256:09f30690b99ce34e0da64d20dab372ee54431745e4efb78ac938234a282d15f9",
-                "sha256:2333f93260674e185cfbf208d2da3007132572e56871f451ba1a556b45dae6e2",
-                "sha256:28f9c39a56d2c78bf6b87dcc699d520ab850919d4a8c7418cd20eda49874a2ea",
-                "sha256:2c664ab88b9766413197733c1720d3dcd4190e8fa3bbdc3710384630a0a7207b",
-                "sha256:2c992716cffb1088414f2b478f7af0175fd0a76fea80841b1706baa8fb0ebaad",
-                "sha256:2e549a748fa8b8715e734919923f69318c953e077e9c02140ada13e59d043310",
-                "sha256:320ae9bd45ad7ecc12ec858b3e8e462578de060832b98fc4d671dee9f10d9954",
-                "sha256:336addb8b6f5208be1b2398442c703a710b6b937b1a046065ee4db65e782ff5a",
-                "sha256:3ac24b2be732e78a5a3ac0b3aa870d73766dd00beba6e015ea2ea7394f8b4e55",
-                "sha256:45476490dd4adec5472c92b4d253e245258745d0ccaabe706f8d03288ed60a79",
-                "sha256:4c381857754da44326f3a49b8b199f7f87a51c2faacd5114352fc78de30d3aba",
-                "sha256:4d5ca5d707e158540312e09fd907f9f49bacbe779ab5236d9699ced14d2293b8",
-                "sha256:58a62549a3e0bc9e03df32f350e10e1efb94ec6cf63e3920c3385b26663948ce",
-                "sha256:5f0510608ccd6e7f02ca8596962afb8c6cc84c453e7be0da4d85f5f4f7b0328a",
-                "sha256:603cd8ad4976568954598ef0a6d4ed3dfb78aff3d57fa8d6271f470f0ce7d34f",
-                "sha256:606e9a3dcb0f52307c5040698ea962685fb1c852d72379ee9412be7de9c5f9e2",
-                "sha256:616ea2826c03c16e87f517c46296621a7c51e30400f6d0a61be645f203aa2b93",
-                "sha256:66dcc216ebae2eb4c37b223feaf82f15b69d502821dde2da138ec5a3716e7463",
-                "sha256:6dd1b52d0d58dd8f685ced9971eb49f697d753aa7912f0a8f50833c7a7426319",
-                "sha256:871b292d4b696b09120ed5bde894f79ee2a5f109cb84470546471df264cae136",
-                "sha256:8c70c1965cde991b711a98448ccda3486f2a336457cf4ec4dca257a926e149c9",
-                "sha256:8f40ec677e942374e3d7f2fad6a67a4c2811a8b975e8703c6fd26d3b168a90e2",
-                "sha256:907ee0aa8ca576f5e0cdc20b5aeb2ad4d3953a3b4769fc4b499e00ef0266f02f",
-                "sha256:a1824f5b029ddd289919f354bc285992cb4e32da518758c136271cf66046ef22",
-                "sha256:a6aa027b1a9d2970cf328ccd6dbe4a996bc13c39fd427f502782f5bdb9ca20f5",
-                "sha256:a71ab0589a63a3e987beb2bc172e05f000a5c5be2636b4b263c44034e215b5d7",
-                "sha256:b30a927c6dff89ee702686596f27c25160dd6c99be5bcc1513a763ae5b1bfc03",
-                "sha256:b46591222c864e7da7faa3b19455196416cd8355ff6c2cc2e65726a760a3c420",
-                "sha256:b5bd7fd32e3ace012d43925ea4fc8bd1b02cc6cc1e9813b518302950e89b5a22",
-                "sha256:bc1daf7c425f58527900876354390ee41b0ae962a73ad0959b9d829def583bb1",
-                "sha256:bc97316840a349485fbb137eb8d0f4d7057e1b2c1272b1a20eebbbe1848f5122",
-                "sha256:be08af84808dff63a76860847c48ec0416928a7b3a17c2f49a072cac7c45efbd",
-                "sha256:d5795e37c0a33baa618c5e054cd61f586cf76850a251e2b21355e4085def6280",
-                "sha256:d6331f280c6e4521c69b201a42dd978f60f7e129511a55da9e0bfe426b4ebb8d",
-                "sha256:dc892be34dbd058e8d189b47db1e33a227d965ea8805a235c8a7286f7fd17d3a",
-                "sha256:e7ab04f272f98ebffd2a0661e4e126036f6936391ba2889ed2d44c5006237802",
-                "sha256:eb7e3abcda7e1e6b83c2dc2909c8d045881017270a119cc6ee7fdcfe71d02df8",
-                "sha256:f1a198a50c409ab2d009fbf20956ace84567d67f2c5701511d4dd561fae6f32e",
-                "sha256:fe92efcdbfa0bcf2fa602e466d7f2905500f33f09eb90bf0bcf2e6ca41b574c8"
-            ],
-            "markers": "python_version >= '3.7' and python_version < '3.11'",
-            "version": "==18.0.0"
-        },
-        "pyasn1": {
-            "hashes": [
-                "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629",
-                "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.6.1"
-        },
-        "pyasn1-modules": {
-            "hashes": [
-                "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd",
-                "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==0.4.1"
-        },
         "pycparser": {
             "hashes": [
                 "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
@@ -1241,14 +999,6 @@
             "markers": "python_version >= '3.9'",
             "version": "==0.21.0"
         },
-        "rsa": {
-            "hashes": [
-                "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7",
-                "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"
-            ],
-            "markers": "python_version >= '3.6' and python_version < '4'",
-            "version": "==4.9"
-        },
         "six": {
             "hashes": [
                 "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
@@ -1257,64 +1007,6 @@
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.16.0"
         },
-        "sqlalchemy": {
-            "hashes": [
-                "sha256:02d2ecb9508f16ab9c5af466dfe5a88e26adf2e1a8d1c56eb616396ccae2c186",
-                "sha256:0b76bbb1cbae618d10679be8966f6d66c94f301cfc15cb49e2f2382563fb6efb",
-                "sha256:0de620f978ca273ce027769dc8db7e6ee72631796187adc8471b3c76091b809e",
-                "sha256:1183599e25fa38a1a322294b949da02b4f0da13dbc2688ef9dbe746df573f8a6",
-                "sha256:12bc0141b245918b80d9d17eca94663dbd3f5266ac77a0be60750f36102bbb0f",
-                "sha256:1390ca2d301a2708fd4425c6d75528d22f26b8f5cbc9faba1ddca136671432bc",
-                "sha256:13e91d6892b5fcb94a36ba061fb7a1f03d0185ed9d8a77c84ba389e5bb05e936",
-                "sha256:14b3f4783275339170984cadda66e3ec011cce87b405968dc8d51cf0f9997b0d",
-                "sha256:1576fba3616f79496e2f067262200dbf4aab1bb727cd7e4e006076686413c80c",
-                "sha256:1990d5a6a5dc358a0894c8ca02043fb9a5ad9538422001fb2826e91c50f1d539",
-                "sha256:1d83cd1cc03c22d922ec94d0d5f7b7c96b1332f5e122e81b1a61fb22da77879a",
-                "sha256:1e8c1b9ecaf9f2590337d5622189aeb2f0dbc54ba0232fa0856cf390957584a9",
-                "sha256:26e78444bc77d089e62874dc74df05a5c71f01ac598010a327881a48408d0064",
-                "sha256:2b37931eac4b837c45e2522066bda221ac6d80e78922fb77c75eb12e4dbcdee5",
-                "sha256:3112de9e11ff1957148c6de1df2bc5cc1440ee36783412e5eedc6f53638a577d",
-                "sha256:394b0135900b62dbf63e4809cdc8ac923182af2816d06ea61cd6763943c2cc05",
-                "sha256:3f01c2629a7d6b30d8afe0326b8c649b74825a0e1ebdcb01e8ffd1c920deb07d",
-                "sha256:41cffc63c7c83dfc30c4cab5b4308ba74440a9633c4509c51a0c52431fb0f8ab",
-                "sha256:4470fbed088c35dc20b78a39aaf4ae54fe81790c783b3264872a0224f437c31a",
-                "sha256:5ed3576675c187e3baa80b02c4c9d0edfab78eff4e89dd9da736b921333a2432",
-                "sha256:6b24364150738ce488333b3fb48bfa14c189a66de41cd632796fbcacb26b4585",
-                "sha256:6da60fb24577f989535b8fc8b2ddc4212204aaf02e53c4c7ac94ac364150ed08",
-                "sha256:76c2ba7b5a09863d0a8166fbc753af96d561818c572dbaf697c52095938e7be4",
-                "sha256:954816850777ac234a4e32b8c88ac1f7847088a6e90cfb8f0e127a1bf3feddff",
-                "sha256:9c24dd161c06992ed16c5e528a75878edbaeced5660c3db88c820f1f0d3fe1f4",
-                "sha256:a01bc25eb7a5688656c8770f931d5cb4a44c7de1b3cec69b84cc9745d1e4cc10",
-                "sha256:a19f816f4702d7b1951d7576026c7124b9bfb64a9543e571774cf517b7a50b29",
-                "sha256:a41611835010ed4ea4c7aed1da5b58aac78ee7e70932a91ed2705a7b38e40f52",
-                "sha256:a49730afb716f3f675755afec109895cab95bc9875db7ffe2e42c1b1c6279482",
-                "sha256:a86b0e4be775902a5496af4fb1b60d8a2a457d78f531458d294360b8637bb014",
-                "sha256:a8a72259a1652f192c68377be7011eac3c463e9892ef2948828c7d58e4829988",
-                "sha256:af00236fe21c4d4f4c227b6ccc19b44c594160cc3ff28d104cdce85855369277",
-                "sha256:b05e0626ec1c391432eabb47a8abd3bf199fb74bfde7cc44a26d2b1b352c2c6e",
-                "sha256:b5933c45d11cbd9694b1540aa9076816cc7406964c7b16a380fd84d3a5fe3241",
-                "sha256:b5e0d47d619c739bdc636bbe007da4519fc953393304a5943e0b5aec96c9877c",
-                "sha256:b67589f7955924865344e6eacfdcf70675e64f36800a576aa5e961f0008cde2a",
-                "sha256:c5a2530400a6e7e68fd1552a55515de6a4559122e495f73554a51cedafc11669",
-                "sha256:cafe0ba3a96d0845121433cffa2b9232844a2609fce694fcc02f3f31214ece28",
-                "sha256:cdb2886c0be2c6c54d0651d5a61c29ef347e8eec81fd83afebbf7b59b80b7393",
-                "sha256:d0cf7076c8578b3de4e43a046cc7a1af8466e1c3f5e64167189fe8958a4f9c02",
-                "sha256:f1e1b92ee4ee9ffc68624ace218b89ca5ca667607ccee4541a90cc44999b9aea",
-                "sha256:f941aaf15f47f316123e1933f9ea91a6efda73a161a6ab6046d1cde37be62c88",
-                "sha256:fb59a11689ff3c58e7652260127f9e34f7f45478a2f3ef831ab6db7bcd72108f",
-                "sha256:fc9ffd9a38e21fad3e8c5a88926d57f94a32546e937e0be46142b2702003eba7"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
-            "version": "==1.4.54"
-        },
-        "sqlparams": {
-            "hashes": [
-                "sha256:454beae170183836429013dfdfcca6eb168ec06168f332c8658cccaf6452de15",
-                "sha256:a74d4d60f07a0bd06a6f4251db07ece512af512b363f718b72bfbd4883499a29"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==6.1.0"
-        },
         "sqlparse": {
             "hashes": [
                 "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4",
@@ -1330,12 +1022,6 @@
             ],
             "version": "==1.3"
         },
-        "thrift": {
-            "hashes": [
-                "sha256:2b5b6488fcded21f9d312aa23c9ff6a0195d0f6ae26ddbd5ad9e3e25dfc14408"
-            ],
-            "version": "==0.16.0"
-        },
         "tomli": {
             "hashes": [
                 "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8",
@@ -1352,14 +1038,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==4.12.2"
         },
-        "tzdata": {
-            "hashes": [
-                "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc",
-                "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"
-            ],
-            "markers": "python_version >= '2'",
-            "version": "==2024.2"
-        },
         "urllib3": {
             "hashes": [
                 "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e",
diff --git a/testing/profiles.yml b/testing/profiles.yml
index 1701dc714..a557ee46e 100644
--- a/testing/profiles.yml
+++ b/testing/profiles.yml
@@ -2,9 +2,6 @@ jaffle_shop:
   target: jaffle_shop
   outputs:
     jaffle_shop:
-      type: databricks
-      host: "{{ env_var('DATABRICKS_HOST') }}"
-      token: "{{ env_var('DATABRICKS_TOKEN') }}"
-      schema: "{{ env_var('DATABRICKS_TARGET') }}"
-      http_path: "/sql/1.0/endpoints/{{ env_var('DATABRICKS_ENDPOINT') }}"
+      type: duckdb
+      path: dbt.duckdb
       threads: 300

From d949b23600de0e190e743a402853c34fe72a1f7d Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 11:46:45 +0900
Subject: [PATCH 17/25] add final models

---
 jaffle_shop/models/final/_models.yml          | 29 +++++++++++++++++++
 .../models/final/fnl_finance_returnsamout.sql | 16 ++++++++++
 .../models/final/fnl_sales_newcustomers.sql   | 13 +++++++++
 3 files changed, 58 insertions(+)
 create mode 100644 jaffle_shop/models/final/_models.yml
 create mode 100644 jaffle_shop/models/final/fnl_finance_returnsamout.sql
 create mode 100644 jaffle_shop/models/final/fnl_sales_newcustomers.sql

diff --git a/jaffle_shop/models/final/_models.yml b/jaffle_shop/models/final/_models.yml
new file mode 100644
index 000000000..911bdcf91
--- /dev/null
+++ b/jaffle_shop/models/final/_models.yml
@@ -0,0 +1,29 @@
+version: 2
+
+models:
+  - name: fnl_sales_newcustomers
+    meta:
+      owner: 'nathan.lugg@kraken.tech'
+    description: A row per month with the number of customers that made their first order
+    columns:
+      - name: first_order_month
+        description: Primary key. The month we are counting the number of new customers in
+        tests:
+          - unique
+          - not_null
+      - name: num_new_customers
+        description: |
+          The number of new customers in the repsective month, where a new customer is
+          defined as a customer that made an order for the first time
+  - name: fnl_finance_returnsamout
+    meta:
+      owner: 'nathan.lugg@kraken.tech'
+    description: A row per customer (ID) and the amount (in AUD) of their returned orders
+    columns:
+      - name: customer_id
+        description: Primary key. The customer ID
+        tests:
+          - unique
+          - not_null
+      - name: total_returned_amount_aud
+        description: The total amount (in AUD) that the customer has returned
diff --git a/jaffle_shop/models/final/fnl_finance_returnsamout.sql b/jaffle_shop/models/final/fnl_finance_returnsamout.sql
new file mode 100644
index 000000000..dfb12a1cf
--- /dev/null
+++ b/jaffle_shop/models/final/fnl_finance_returnsamout.sql
@@ -0,0 +1,16 @@
+WITH returned_ AS (
+  SELECT
+    customer_id
+    , SUM(total_amount_aud) AS total_returned_amount_aud
+  FROM {{ ref('wh_orders') }}
+  WHERE status = 'returned'
+  GROUP BY customer_id
+)
+
+
+SELECT
+  customers_.customer_id
+  , COALESCE(returned_.total_returned_amount_aud, 0) AS total_returned_amount_aud
+FROM {{ ref('wh_customers') }} AS customers_
+LEFT JOIN returned_
+  ON customers_.customer_id = returned_.customer_id
diff --git a/jaffle_shop/models/final/fnl_sales_newcustomers.sql b/jaffle_shop/models/final/fnl_sales_newcustomers.sql
new file mode 100644
index 000000000..9fdb3b0be
--- /dev/null
+++ b/jaffle_shop/models/final/fnl_sales_newcustomers.sql
@@ -0,0 +1,13 @@
+WITH customers_ AS (
+  SELECT
+    customer_id
+    , DATE_TRUNC('MONTH', first_order) AS first_order_month
+  FROM {{ ref('wh_customers') }}
+)
+
+
+SELECT
+  first_order_month
+  , COUNT(*) AS num_new_customers
+FROM customers_
+GROUP BY first_order_month

From 71b343eb3457f9dee7ca31d0419a7b0e567e03f7 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 11:50:44 +0900
Subject: [PATCH 18/25] add altair and jupyterlab for plotting

---
 Pipfile      |    7 +-
 Pipfile.lock | 1557 +++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 1480 insertions(+), 84 deletions(-)

diff --git a/Pipfile b/Pipfile
index f5e1e12d9..27350f147 100644
--- a/Pipfile
+++ b/Pipfile
@@ -4,13 +4,16 @@ verify_ssl = true
 name = "pypi"
 
 [packages]
-duckdb = "*"
 dbt-core = "==1.7.17"
 dbt-duckdb = "*"
-pytest-mock = "*"
+duckdb = "*"
 glob2 = "*"
 
 [dev-packages]
+altair = "*"
+jupyterlab = "*"
+pandas = "*"
+pyarrow = "*"
 pytest = "*"
 pytest-mock = "*"
 
diff --git a/Pipfile.lock b/Pipfile.lock
index 6053bb601..8beea8f6e 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "eaabf0a27708063860caa61b6960b07532666fd0cc67e3285b1b8acf497e056e"
+            "sha256": "43969e8630da55f06729904607387083070c6b1ce6955c8b9e327a0cf73c59eb"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -362,14 +362,6 @@
             "markers": "python_full_version >= '3.7.0'",
             "version": "==1.1.3"
         },
-        "exceptiongroup": {
-            "hashes": [
-                "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b",
-                "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
-            ],
-            "markers": "python_version < '3.11'",
-            "version": "==1.2.2"
-        },
         "glob2": {
             "hashes": [
                 "sha256:85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c"
@@ -393,14 +385,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==6.11.0"
         },
-        "iniconfig": {
-            "hashes": [
-                "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
-                "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
-            ],
-            "markers": "python_version >= '3.7'",
-            "version": "==2.0.0"
-        },
         "isodate": {
             "hashes": [
                 "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96",
@@ -645,14 +629,6 @@
             "markers": "python_version >= '3.7'",
             "version": "==0.11.2"
         },
-        "pluggy": {
-            "hashes": [
-                "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
-                "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==1.5.0"
-        },
         "protobuf": {
             "hashes": [
                 "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41",
@@ -781,23 +757,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==2.23.4"
         },
-        "pytest": {
-            "hashes": [
-                "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181",
-                "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==8.3.3"
-        },
-        "pytest-mock": {
-            "hashes": [
-                "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f",
-                "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"
-            ],
-            "index": "pypi",
-            "markers": "python_version >= '3.8'",
-            "version": "==3.14.0"
-        },
         "python-dateutil": {
             "hashes": [
                 "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
@@ -1022,14 +981,6 @@
             ],
             "version": "==1.3"
         },
-        "tomli": {
-            "hashes": [
-                "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8",
-                "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"
-            ],
-            "markers": "python_version < '3.11'",
-            "version": "==2.1.0"
-        },
         "typing-extensions": {
             "hashes": [
                 "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
@@ -1056,62 +1007,1504 @@
         }
     },
     "develop": {
-        "exceptiongroup": {
+        "altair": {
             "hashes": [
-                "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b",
-                "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
+                "sha256:0ce8c2e66546cb327e5f2d7572ec0e7c6feece816203215613962f0ec1d76a82",
+                "sha256:0fb130b8297a569d08991fb6fe763582e7569f8a04643bbd9212436e3be04aef"
             ],
-            "markers": "python_version < '3.11'",
-            "version": "==1.2.2"
+            "index": "pypi",
+            "markers": "python_version >= '3.8'",
+            "version": "==5.4.1"
         },
-        "iniconfig": {
+        "anyio": {
             "hashes": [
-                "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
-                "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
+                "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c",
+                "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==4.6.2.post1"
+        },
+        "appnope": {
+            "hashes": [
+                "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee",
+                "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"
+            ],
+            "markers": "platform_system == 'Darwin'",
+            "version": "==0.1.4"
+        },
+        "argon2-cffi": {
+            "hashes": [
+                "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08",
+                "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"
             ],
             "markers": "python_version >= '3.7'",
-            "version": "==2.0.0"
+            "version": "==23.1.0"
         },
-        "packaging": {
+        "argon2-cffi-bindings": {
             "hashes": [
-                "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
-                "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
+                "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670",
+                "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f",
+                "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583",
+                "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194",
+                "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c",
+                "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a",
+                "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082",
+                "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5",
+                "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f",
+                "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7",
+                "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d",
+                "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f",
+                "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae",
+                "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3",
+                "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86",
+                "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367",
+                "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d",
+                "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93",
+                "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb",
+                "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e",
+                "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"
             ],
-            "markers": "python_version >= '3.8'",
-            "version": "==24.2"
+            "markers": "python_version >= '3.6'",
+            "version": "==21.2.0"
         },
-        "pluggy": {
+        "arrow": {
             "hashes": [
-                "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
-                "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
+                "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80",
+                "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==1.5.0"
+            "version": "==1.3.0"
         },
-        "pytest": {
+        "asttokens": {
             "hashes": [
-                "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181",
-                "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"
+                "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24",
+                "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"
+            ],
+            "version": "==2.4.1"
+        },
+        "async-lru": {
+            "hashes": [
+                "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627",
+                "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==8.3.3"
+            "version": "==2.0.4"
         },
-        "pytest-mock": {
+        "attrs": {
             "hashes": [
-                "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f",
-                "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"
+                "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346",
+                "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==24.2.0"
+        },
+        "babel": {
+            "hashes": [
+                "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b",
+                "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"
             ],
-            "index": "pypi",
             "markers": "python_version >= '3.8'",
-            "version": "==3.14.0"
+            "version": "==2.16.0"
         },
-        "tomli": {
+        "beautifulsoup4": {
             "hashes": [
-                "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8",
-                "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"
+                "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051",
+                "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"
             ],
-            "markers": "python_version < '3.11'",
-            "version": "==2.1.0"
+            "markers": "python_full_version >= '3.6.0'",
+            "version": "==4.12.3"
+        },
+        "bleach": {
+            "hashes": [
+                "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e",
+                "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==6.2.0"
+        },
+        "certifi": {
+            "hashes": [
+                "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8",
+                "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==2024.8.30"
+        },
+        "cffi": {
+            "hashes": [
+                "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8",
+                "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2",
+                "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1",
+                "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15",
+                "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36",
+                "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824",
+                "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8",
+                "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36",
+                "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17",
+                "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf",
+                "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc",
+                "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3",
+                "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed",
+                "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702",
+                "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1",
+                "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8",
+                "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903",
+                "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6",
+                "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d",
+                "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b",
+                "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e",
+                "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be",
+                "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c",
+                "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683",
+                "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9",
+                "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c",
+                "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8",
+                "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1",
+                "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4",
+                "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655",
+                "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67",
+                "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595",
+                "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0",
+                "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65",
+                "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41",
+                "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6",
+                "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401",
+                "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6",
+                "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3",
+                "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16",
+                "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93",
+                "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e",
+                "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4",
+                "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964",
+                "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c",
+                "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576",
+                "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0",
+                "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3",
+                "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662",
+                "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3",
+                "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff",
+                "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5",
+                "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd",
+                "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f",
+                "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5",
+                "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14",
+                "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d",
+                "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9",
+                "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7",
+                "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382",
+                "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a",
+                "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e",
+                "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a",
+                "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4",
+                "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99",
+                "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
+                "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.17.1"
+        },
+        "charset-normalizer": {
+            "hashes": [
+                "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621",
+                "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6",
+                "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8",
+                "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912",
+                "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c",
+                "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b",
+                "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d",
+                "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d",
+                "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95",
+                "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e",
+                "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565",
+                "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64",
+                "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab",
+                "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be",
+                "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e",
+                "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907",
+                "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0",
+                "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2",
+                "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62",
+                "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62",
+                "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23",
+                "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc",
+                "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284",
+                "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca",
+                "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455",
+                "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858",
+                "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b",
+                "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594",
+                "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc",
+                "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db",
+                "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b",
+                "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea",
+                "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6",
+                "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920",
+                "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749",
+                "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7",
+                "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd",
+                "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99",
+                "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242",
+                "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee",
+                "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129",
+                "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2",
+                "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51",
+                "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee",
+                "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8",
+                "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b",
+                "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613",
+                "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742",
+                "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe",
+                "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3",
+                "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5",
+                "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631",
+                "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7",
+                "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15",
+                "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c",
+                "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea",
+                "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417",
+                "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250",
+                "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88",
+                "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca",
+                "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa",
+                "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99",
+                "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149",
+                "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41",
+                "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574",
+                "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0",
+                "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f",
+                "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d",
+                "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654",
+                "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3",
+                "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19",
+                "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90",
+                "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578",
+                "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9",
+                "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1",
+                "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51",
+                "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719",
+                "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236",
+                "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a",
+                "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c",
+                "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade",
+                "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944",
+                "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc",
+                "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6",
+                "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6",
+                "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27",
+                "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6",
+                "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2",
+                "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12",
+                "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf",
+                "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114",
+                "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7",
+                "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf",
+                "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d",
+                "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b",
+                "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed",
+                "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03",
+                "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4",
+                "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67",
+                "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365",
+                "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a",
+                "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748",
+                "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b",
+                "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079",
+                "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"
+            ],
+            "markers": "python_full_version >= '3.7.0'",
+            "version": "==3.4.0"
+        },
+        "comm": {
+            "hashes": [
+                "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e",
+                "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.2.2"
+        },
+        "debugpy": {
+            "hashes": [
+                "sha256:09cc7b162586ea2171eea055985da2702b0723f6f907a423c9b2da5996ad67ba",
+                "sha256:0cc94186340be87b9ac5a707184ec8f36547fb66636d1029ff4f1cc020e53996",
+                "sha256:143ef07940aeb8e7316de48f5ed9447644da5203726fca378f3a6952a50a9eae",
+                "sha256:19ffbd84e757a6ca0113574d1bf5a2298b3947320a3e9d7d8dc3377f02d9f864",
+                "sha256:26b461123a030e82602a750fb24d7801776aa81cd78404e54ab60e8b5fecdad5",
+                "sha256:3a9c013077a3a0000e83d97cf9cc9328d2b0bbb31f56b0e99ea3662d29d7a6a2",
+                "sha256:4b93e4832fd4a759a0c465c967214ed0c8a6e8914bced63a28ddb0dd8c5f078b",
+                "sha256:535f4fb1c024ddca5913bb0eb17880c8f24ba28aa2c225059db145ee557035e9",
+                "sha256:53709d4ec586b525724819dc6af1a7703502f7e06f34ded7157f7b1f963bb854",
+                "sha256:5c0e5a38c7f9b481bf31277d2f74d2109292179081f11108e668195ef926c0f9",
+                "sha256:5c6e885dbf12015aed73770f29dec7023cb310d0dc2ba8bfbeb5c8e43f80edc9",
+                "sha256:64674e95916e53c2e9540a056e5f489e0ad4872645399d778f7c598eacb7b7f9",
+                "sha256:705cd123a773d184860ed8dae99becd879dfec361098edbefb5fc0d3683eb804",
+                "sha256:890fd16803f50aa9cb1a9b9b25b5ec321656dd6b78157c74283de241993d086f",
+                "sha256:90244598214bbe704aa47556ec591d2f9869ff9e042e301a2859c57106649add",
+                "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d",
+                "sha256:b01f4a5e5c5fb1d34f4ccba99a20ed01eabc45a4684f4948b5db17a319dfb23f",
+                "sha256:c399023146e40ae373753a58d1be0a98bf6397fadc737b97ad612886b53df318",
+                "sha256:d4483836da2a533f4b1454dffc9f668096ac0433de855f0c22cdce8c9f7e10c4",
+                "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6",
+                "sha256:e6355385db85cbd666be703a96ab7351bc9e6c61d694893206f8001e22aee091",
+                "sha256:ec684553aba5b4066d4de510859922419febc710df7bba04fe9e7ef3de15d34f",
+                "sha256:eea8821d998ebeb02f0625dd0d76839ddde8cbf8152ebbe289dd7acf2cdc6b98",
+                "sha256:f3cbf1833e644a3100eadb6120f25be8a532035e8245584c4f7532937edc652a",
+                "sha256:f95651bdcbfd3b27a408869a53fbefcc2bcae13b694daee5f1365b1b83a00113",
+                "sha256:ffe94dd5e9a6739a75f0b85316dc185560db3e97afa6b215628d1b6a17561cb2"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.8.8"
+        },
+        "decorator": {
+            "hashes": [
+                "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
+                "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
+            ],
+            "markers": "python_version >= '3.5'",
+            "version": "==5.1.1"
+        },
+        "defusedxml": {
+            "hashes": [
+                "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69",
+                "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+            "version": "==0.7.1"
+        },
+        "exceptiongroup": {
+            "hashes": [
+                "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b",
+                "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
+            ],
+            "markers": "python_version < '3.11'",
+            "version": "==1.2.2"
+        },
+        "executing": {
+            "hashes": [
+                "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf",
+                "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.1.0"
+        },
+        "fastjsonschema": {
+            "hashes": [
+                "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23",
+                "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"
+            ],
+            "version": "==2.20.0"
+        },
+        "fqdn": {
+            "hashes": [
+                "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f",
+                "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"
+            ],
+            "version": "==1.5.1"
+        },
+        "h11": {
+            "hashes": [
+                "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
+                "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==0.14.0"
+        },
+        "httpcore": {
+            "hashes": [
+                "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f",
+                "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.0.6"
+        },
+        "httpx": {
+            "hashes": [
+                "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0",
+                "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.27.2"
+        },
+        "idna": {
+            "hashes": [
+                "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
+                "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==3.10"
+        },
+        "iniconfig": {
+            "hashes": [
+                "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
+                "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==2.0.0"
+        },
+        "ipykernel": {
+            "hashes": [
+                "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5",
+                "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==6.29.5"
+        },
+        "ipython": {
+            "hashes": [
+                "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8",
+                "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb"
+            ],
+            "markers": "python_version >= '3.10'",
+            "version": "==8.29.0"
+        },
+        "isoduration": {
+            "hashes": [
+                "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9",
+                "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"
+            ],
+            "version": "==20.11.0"
+        },
+        "jedi": {
+            "hashes": [
+                "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0",
+                "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==0.19.2"
+        },
+        "jinja2": {
+            "hashes": [
+                "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369",
+                "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==3.1.4"
+        },
+        "json5": {
+            "hashes": [
+                "sha256:1f82f36e615bc5b42f1bbd49dbc94b12563c56408c6ffa06414ea310890e9a6e",
+                "sha256:29c56f1accdd8bc2e037321237662034a7e07921e2b7223281a5ce2c46f0c4df"
+            ],
+            "markers": "python_full_version >= '3.8.0'",
+            "version": "==0.9.28"
+        },
+        "jsonpointer": {
+            "hashes": [
+                "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942",
+                "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"
+            ],
+            "version": "==3.0.0"
+        },
+        "jsonschema": {
+            "hashes": [
+                "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4",
+                "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==4.23.0"
+        },
+        "jsonschema-specifications": {
+            "hashes": [
+                "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272",
+                "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==2024.10.1"
+        },
+        "jupyter-client": {
+            "hashes": [
+                "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419",
+                "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==8.6.3"
+        },
+        "jupyter-core": {
+            "hashes": [
+                "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409",
+                "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==5.7.2"
+        },
+        "jupyter-events": {
+            "hashes": [
+                "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960",
+                "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.10.0"
+        },
+        "jupyter-lsp": {
+            "hashes": [
+                "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da",
+                "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.2.5"
+        },
+        "jupyter-server": {
+            "hashes": [
+                "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd",
+                "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.14.2"
+        },
+        "jupyter-server-terminals": {
+            "hashes": [
+                "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa",
+                "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.5.3"
+        },
+        "jupyterlab": {
+            "hashes": [
+                "sha256:7c6835cbf8df0af0ec8a39332e85ff11693fb9a468205343b4fc0bfbc74817e5",
+                "sha256:f67e1095ad61ae04349024f0b40345062ab108a0c6998d9810fec6a3c1a70cd5"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.8'",
+            "version": "==4.3.0"
+        },
+        "jupyterlab-pygments": {
+            "hashes": [
+                "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d",
+                "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.3.0"
+        },
+        "jupyterlab-server": {
+            "hashes": [
+                "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4",
+                "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.27.3"
+        },
+        "markupsafe": {
+            "hashes": [
+                "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
+                "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
+                "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
+                "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
+                "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
+                "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
+                "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
+                "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
+                "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
+                "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
+                "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
+                "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
+                "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
+                "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
+                "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
+                "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
+                "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
+                "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
+                "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
+                "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
+                "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
+                "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
+                "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
+                "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
+                "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
+                "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
+                "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
+                "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
+                "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
+                "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
+                "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
+                "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
+                "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
+                "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
+                "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
+                "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
+                "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
+                "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
+                "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
+                "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
+                "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
+                "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
+                "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
+                "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
+                "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
+                "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
+                "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
+                "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
+                "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
+                "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
+                "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
+                "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
+                "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
+                "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
+                "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
+                "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
+                "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
+                "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
+                "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
+                "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
+                "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==3.0.2"
+        },
+        "matplotlib-inline": {
+            "hashes": [
+                "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90",
+                "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.1.7"
+        },
+        "mistune": {
+            "hashes": [
+                "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205",
+                "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==3.0.2"
+        },
+        "narwhals": {
+            "hashes": [
+                "sha256:cde49b59b4540885d822777b747ed3fad65632b3d34648040308afcf08e62547",
+                "sha256:db95cb5b5a6b99bad9fe7f2e2dacf937d57dee1c76c4544d4354a324084e36b5"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.13.3"
+        },
+        "nbclient": {
+            "hashes": [
+                "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09",
+                "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"
+            ],
+            "markers": "python_full_version >= '3.8.0'",
+            "version": "==0.10.0"
+        },
+        "nbconvert": {
+            "hashes": [
+                "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3",
+                "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==7.16.4"
+        },
+        "nbformat": {
+            "hashes": [
+                "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a",
+                "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==5.10.4"
+        },
+        "nest-asyncio": {
+            "hashes": [
+                "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe",
+                "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"
+            ],
+            "markers": "python_version >= '3.5'",
+            "version": "==1.6.0"
+        },
+        "notebook-shim": {
+            "hashes": [
+                "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef",
+                "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==0.2.4"
+        },
+        "numpy": {
+            "hashes": [
+                "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe",
+                "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0",
+                "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48",
+                "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a",
+                "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564",
+                "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958",
+                "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17",
+                "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0",
+                "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee",
+                "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b",
+                "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4",
+                "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4",
+                "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6",
+                "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4",
+                "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d",
+                "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f",
+                "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f",
+                "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f",
+                "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56",
+                "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9",
+                "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd",
+                "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23",
+                "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed",
+                "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a",
+                "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098",
+                "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1",
+                "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512",
+                "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f",
+                "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09",
+                "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f",
+                "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc",
+                "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8",
+                "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0",
+                "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761",
+                "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef",
+                "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5",
+                "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e",
+                "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b",
+                "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d",
+                "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43",
+                "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c",
+                "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41",
+                "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff",
+                "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408",
+                "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2",
+                "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9",
+                "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57",
+                "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb",
+                "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9",
+                "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3",
+                "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a",
+                "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0",
+                "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e",
+                "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598",
+                "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4"
+            ],
+            "markers": "python_version < '3.11'",
+            "version": "==2.1.3"
+        },
+        "overrides": {
+            "hashes": [
+                "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a",
+                "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==7.7.0"
+        },
+        "packaging": {
+            "hashes": [
+                "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
+                "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==24.2"
+        },
+        "pandas": {
+            "hashes": [
+                "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a",
+                "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d",
+                "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5",
+                "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4",
+                "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0",
+                "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32",
+                "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea",
+                "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28",
+                "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f",
+                "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348",
+                "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18",
+                "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468",
+                "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5",
+                "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e",
+                "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667",
+                "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645",
+                "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13",
+                "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30",
+                "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3",
+                "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d",
+                "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb",
+                "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3",
+                "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039",
+                "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8",
+                "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd",
+                "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761",
+                "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659",
+                "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57",
+                "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c",
+                "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c",
+                "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4",
+                "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a",
+                "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9",
+                "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42",
+                "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2",
+                "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39",
+                "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc",
+                "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698",
+                "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed",
+                "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015",
+                "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24",
+                "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.9'",
+            "version": "==2.2.3"
+        },
+        "pandocfilters": {
+            "hashes": [
+                "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e",
+                "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "version": "==1.5.1"
+        },
+        "parso": {
+            "hashes": [
+                "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18",
+                "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==0.8.4"
+        },
+        "pexpect": {
+            "hashes": [
+                "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523",
+                "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"
+            ],
+            "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'",
+            "version": "==4.9.0"
+        },
+        "platformdirs": {
+            "hashes": [
+                "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907",
+                "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==4.3.6"
+        },
+        "pluggy": {
+            "hashes": [
+                "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
+                "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.5.0"
+        },
+        "prometheus-client": {
+            "hashes": [
+                "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166",
+                "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.21.0"
+        },
+        "prompt-toolkit": {
+            "hashes": [
+                "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90",
+                "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"
+            ],
+            "markers": "python_full_version >= '3.7.0'",
+            "version": "==3.0.48"
+        },
+        "psutil": {
+            "hashes": [
+                "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047",
+                "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc",
+                "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e",
+                "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747",
+                "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e",
+                "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a",
+                "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b",
+                "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76",
+                "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca",
+                "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688",
+                "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e",
+                "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38",
+                "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85",
+                "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be",
+                "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942",
+                "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a",
+                "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
+            "version": "==6.1.0"
+        },
+        "ptyprocess": {
+            "hashes": [
+                "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35",
+                "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"
+            ],
+            "markers": "os_name != 'nt'",
+            "version": "==0.7.0"
+        },
+        "pure-eval": {
+            "hashes": [
+                "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0",
+                "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"
+            ],
+            "version": "==0.2.3"
+        },
+        "pyarrow": {
+            "hashes": [
+                "sha256:00178509f379415a3fcf855af020e3340254f990a8534294ec3cf674d6e255fd",
+                "sha256:03f40b65a43be159d2f97fd64dc998f769d0995a50c00f07aab58b0b3da87e1f",
+                "sha256:082ba62bdcb939824ba1ce10b8acef5ab621da1f4c4805e07bfd153617ac19d4",
+                "sha256:09f30690b99ce34e0da64d20dab372ee54431745e4efb78ac938234a282d15f9",
+                "sha256:2333f93260674e185cfbf208d2da3007132572e56871f451ba1a556b45dae6e2",
+                "sha256:28f9c39a56d2c78bf6b87dcc699d520ab850919d4a8c7418cd20eda49874a2ea",
+                "sha256:2c664ab88b9766413197733c1720d3dcd4190e8fa3bbdc3710384630a0a7207b",
+                "sha256:2c992716cffb1088414f2b478f7af0175fd0a76fea80841b1706baa8fb0ebaad",
+                "sha256:2e549a748fa8b8715e734919923f69318c953e077e9c02140ada13e59d043310",
+                "sha256:320ae9bd45ad7ecc12ec858b3e8e462578de060832b98fc4d671dee9f10d9954",
+                "sha256:336addb8b6f5208be1b2398442c703a710b6b937b1a046065ee4db65e782ff5a",
+                "sha256:3ac24b2be732e78a5a3ac0b3aa870d73766dd00beba6e015ea2ea7394f8b4e55",
+                "sha256:45476490dd4adec5472c92b4d253e245258745d0ccaabe706f8d03288ed60a79",
+                "sha256:4c381857754da44326f3a49b8b199f7f87a51c2faacd5114352fc78de30d3aba",
+                "sha256:4d5ca5d707e158540312e09fd907f9f49bacbe779ab5236d9699ced14d2293b8",
+                "sha256:58a62549a3e0bc9e03df32f350e10e1efb94ec6cf63e3920c3385b26663948ce",
+                "sha256:5f0510608ccd6e7f02ca8596962afb8c6cc84c453e7be0da4d85f5f4f7b0328a",
+                "sha256:603cd8ad4976568954598ef0a6d4ed3dfb78aff3d57fa8d6271f470f0ce7d34f",
+                "sha256:606e9a3dcb0f52307c5040698ea962685fb1c852d72379ee9412be7de9c5f9e2",
+                "sha256:616ea2826c03c16e87f517c46296621a7c51e30400f6d0a61be645f203aa2b93",
+                "sha256:66dcc216ebae2eb4c37b223feaf82f15b69d502821dde2da138ec5a3716e7463",
+                "sha256:6dd1b52d0d58dd8f685ced9971eb49f697d753aa7912f0a8f50833c7a7426319",
+                "sha256:871b292d4b696b09120ed5bde894f79ee2a5f109cb84470546471df264cae136",
+                "sha256:8c70c1965cde991b711a98448ccda3486f2a336457cf4ec4dca257a926e149c9",
+                "sha256:8f40ec677e942374e3d7f2fad6a67a4c2811a8b975e8703c6fd26d3b168a90e2",
+                "sha256:907ee0aa8ca576f5e0cdc20b5aeb2ad4d3953a3b4769fc4b499e00ef0266f02f",
+                "sha256:a1824f5b029ddd289919f354bc285992cb4e32da518758c136271cf66046ef22",
+                "sha256:a6aa027b1a9d2970cf328ccd6dbe4a996bc13c39fd427f502782f5bdb9ca20f5",
+                "sha256:a71ab0589a63a3e987beb2bc172e05f000a5c5be2636b4b263c44034e215b5d7",
+                "sha256:b30a927c6dff89ee702686596f27c25160dd6c99be5bcc1513a763ae5b1bfc03",
+                "sha256:b46591222c864e7da7faa3b19455196416cd8355ff6c2cc2e65726a760a3c420",
+                "sha256:b5bd7fd32e3ace012d43925ea4fc8bd1b02cc6cc1e9813b518302950e89b5a22",
+                "sha256:bc1daf7c425f58527900876354390ee41b0ae962a73ad0959b9d829def583bb1",
+                "sha256:bc97316840a349485fbb137eb8d0f4d7057e1b2c1272b1a20eebbbe1848f5122",
+                "sha256:be08af84808dff63a76860847c48ec0416928a7b3a17c2f49a072cac7c45efbd",
+                "sha256:d5795e37c0a33baa618c5e054cd61f586cf76850a251e2b21355e4085def6280",
+                "sha256:d6331f280c6e4521c69b201a42dd978f60f7e129511a55da9e0bfe426b4ebb8d",
+                "sha256:dc892be34dbd058e8d189b47db1e33a227d965ea8805a235c8a7286f7fd17d3a",
+                "sha256:e7ab04f272f98ebffd2a0661e4e126036f6936391ba2889ed2d44c5006237802",
+                "sha256:eb7e3abcda7e1e6b83c2dc2909c8d045881017270a119cc6ee7fdcfe71d02df8",
+                "sha256:f1a198a50c409ab2d009fbf20956ace84567d67f2c5701511d4dd561fae6f32e",
+                "sha256:fe92efcdbfa0bcf2fa602e466d7f2905500f33f09eb90bf0bcf2e6ca41b574c8"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.9'",
+            "version": "==18.0.0"
+        },
+        "pycparser": {
+            "hashes": [
+                "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
+                "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.22"
+        },
+        "pygments": {
+            "hashes": [
+                "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199",
+                "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.18.0"
+        },
+        "pytest": {
+            "hashes": [
+                "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181",
+                "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.8'",
+            "version": "==8.3.3"
+        },
+        "pytest-mock": {
+            "hashes": [
+                "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f",
+                "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.8'",
+            "version": "==3.14.0"
+        },
+        "python-dateutil": {
+            "hashes": [
+                "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
+                "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
+            "version": "==2.9.0.post0"
+        },
+        "python-json-logger": {
+            "hashes": [
+                "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c",
+                "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==2.0.7"
+        },
+        "pytz": {
+            "hashes": [
+                "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a",
+                "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"
+            ],
+            "version": "==2024.2"
+        },
+        "pyyaml": {
+            "hashes": [
+                "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
+                "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
+                "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
+                "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
+                "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
+                "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
+                "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
+                "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
+                "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
+                "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
+                "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
+                "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
+                "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
+                "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
+                "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
+                "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
+                "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
+                "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
+                "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
+                "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
+                "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
+                "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
+                "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
+                "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
+                "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
+                "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
+                "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
+                "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
+                "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
+                "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
+                "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
+                "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
+                "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
+                "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
+                "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
+                "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
+                "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
+                "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
+                "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
+                "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
+                "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
+                "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
+                "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
+                "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
+                "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
+                "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
+                "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
+                "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
+                "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
+                "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
+                "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
+                "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
+                "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==6.0.2"
+        },
+        "pyzmq": {
+            "hashes": [
+                "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6",
+                "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a",
+                "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9",
+                "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f",
+                "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37",
+                "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc",
+                "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed",
+                "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097",
+                "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d",
+                "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52",
+                "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6",
+                "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6",
+                "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2",
+                "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282",
+                "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3",
+                "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732",
+                "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5",
+                "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18",
+                "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306",
+                "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f",
+                "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3",
+                "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b",
+                "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277",
+                "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a",
+                "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797",
+                "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca",
+                "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c",
+                "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f",
+                "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5",
+                "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a",
+                "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44",
+                "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20",
+                "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4",
+                "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8",
+                "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780",
+                "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386",
+                "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5",
+                "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2",
+                "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0",
+                "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971",
+                "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b",
+                "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50",
+                "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c",
+                "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f",
+                "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231",
+                "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c",
+                "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08",
+                "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5",
+                "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6",
+                "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073",
+                "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e",
+                "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4",
+                "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317",
+                "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3",
+                "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072",
+                "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad",
+                "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a",
+                "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb",
+                "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd",
+                "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f",
+                "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef",
+                "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5",
+                "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187",
+                "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711",
+                "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988",
+                "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640",
+                "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c",
+                "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764",
+                "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1",
+                "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1",
+                "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289",
+                "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb",
+                "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a",
+                "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218",
+                "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c",
+                "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf",
+                "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7",
+                "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8",
+                "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726",
+                "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9",
+                "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93",
+                "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88",
+                "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115",
+                "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6",
+                "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672",
+                "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2",
+                "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea",
+                "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc",
+                "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b",
+                "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa",
+                "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003",
+                "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797",
+                "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940",
+                "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db",
+                "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc",
+                "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27",
+                "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3",
+                "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e",
+                "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98",
+                "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b",
+                "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629",
+                "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9",
+                "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6",
+                "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec",
+                "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951",
+                "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae",
+                "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4",
+                "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6",
+                "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==26.2.0"
+        },
+        "referencing": {
+            "hashes": [
+                "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c",
+                "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.35.1"
+        },
+        "requests": {
+            "hashes": [
+                "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
+                "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.32.3"
+        },
+        "rfc3339-validator": {
+            "hashes": [
+                "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b",
+                "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+            "version": "==0.1.4"
+        },
+        "rfc3986-validator": {
+            "hashes": [
+                "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9",
+                "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+            "version": "==0.1.1"
+        },
+        "rpds-py": {
+            "hashes": [
+                "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba",
+                "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d",
+                "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e",
+                "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a",
+                "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202",
+                "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271",
+                "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250",
+                "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d",
+                "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928",
+                "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0",
+                "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d",
+                "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333",
+                "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e",
+                "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a",
+                "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18",
+                "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044",
+                "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677",
+                "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664",
+                "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75",
+                "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89",
+                "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027",
+                "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9",
+                "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e",
+                "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8",
+                "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44",
+                "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3",
+                "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95",
+                "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd",
+                "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab",
+                "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a",
+                "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560",
+                "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035",
+                "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919",
+                "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c",
+                "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266",
+                "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e",
+                "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592",
+                "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9",
+                "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3",
+                "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624",
+                "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9",
+                "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b",
+                "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f",
+                "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca",
+                "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1",
+                "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8",
+                "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590",
+                "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed",
+                "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952",
+                "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11",
+                "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061",
+                "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c",
+                "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74",
+                "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c",
+                "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94",
+                "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c",
+                "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8",
+                "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf",
+                "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a",
+                "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5",
+                "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6",
+                "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5",
+                "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3",
+                "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed",
+                "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87",
+                "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b",
+                "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72",
+                "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05",
+                "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed",
+                "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f",
+                "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c",
+                "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153",
+                "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b",
+                "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0",
+                "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d",
+                "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d",
+                "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e",
+                "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e",
+                "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd",
+                "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682",
+                "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4",
+                "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db",
+                "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976",
+                "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937",
+                "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1",
+                "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb",
+                "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a",
+                "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7",
+                "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356",
+                "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==0.21.0"
+        },
+        "send2trash": {
+            "hashes": [
+                "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9",
+                "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
+            "version": "==1.8.3"
+        },
+        "setuptools": {
+            "hashes": [
+                "sha256:1dc484f5cf56fd3fe7216d7b8df820802e7246cfb534a1db2aa64f14fcb9cdcb",
+                "sha256:b3c5d862f98500b06ffdf7cc4499b48c46c317d8d56cb30b5c8bce4d88f5c216"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==75.4.0"
+        },
+        "six": {
+            "hashes": [
+                "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
+                "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
+            "version": "==1.16.0"
+        },
+        "sniffio": {
+            "hashes": [
+                "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
+                "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==1.3.1"
+        },
+        "soupsieve": {
+            "hashes": [
+                "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb",
+                "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.6"
+        },
+        "stack-data": {
+            "hashes": [
+                "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9",
+                "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"
+            ],
+            "version": "==0.6.3"
+        },
+        "terminado": {
+            "hashes": [
+                "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0",
+                "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.18.1"
+        },
+        "tinycss2": {
+            "hashes": [
+                "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7",
+                "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.4.0"
+        },
+        "tomli": {
+            "hashes": [
+                "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8",
+                "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"
+            ],
+            "markers": "python_version < '3.11'",
+            "version": "==2.1.0"
+        },
+        "tornado": {
+            "hashes": [
+                "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8",
+                "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f",
+                "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4",
+                "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3",
+                "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14",
+                "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842",
+                "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9",
+                "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698",
+                "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7",
+                "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d",
+                "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==6.4.1"
+        },
+        "traitlets": {
+            "hashes": [
+                "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7",
+                "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==5.14.3"
+        },
+        "types-python-dateutil": {
+            "hashes": [
+                "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d",
+                "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.9.0.20241003"
+        },
+        "typing-extensions": {
+            "hashes": [
+                "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
+                "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==4.12.2"
+        },
+        "tzdata": {
+            "hashes": [
+                "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc",
+                "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"
+            ],
+            "markers": "python_version >= '2'",
+            "version": "==2024.2"
+        },
+        "uri-template": {
+            "hashes": [
+                "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7",
+                "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"
+            ],
+            "version": "==1.3.0"
+        },
+        "urllib3": {
+            "hashes": [
+                "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e",
+                "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
+            "version": "==1.26.20"
+        },
+        "wcwidth": {
+            "hashes": [
+                "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859",
+                "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"
+            ],
+            "version": "==0.2.13"
+        },
+        "webcolors": {
+            "hashes": [
+                "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9",
+                "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"
+            ],
+            "version": "==24.11.1"
+        },
+        "webencodings": {
+            "hashes": [
+                "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78",
+                "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"
+            ],
+            "version": "==0.5.1"
+        },
+        "websocket-client": {
+            "hashes": [
+                "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526",
+                "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.8.0"
         }
     }
 }

From bf1e60ad11d491cd7a0b9cd694d6f71b57495ae8 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 11:51:24 +0900
Subject: [PATCH 19/25] gitignore: ignore duckdb databases

---
 .gitignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.gitignore b/.gitignore
index 2d9126631..621679ca9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,5 @@ logs/
 # Python temp files
 *.pyc
 __pycache__
+
+*.duckdb

From 288a9a6dbb9d87c3917a1469106340d135681ce2 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 12:19:45 +0900
Subject: [PATCH 20/25] run the actual models

---
 Makefile | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 47ead95a7..78f0e65f4 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,10 @@ dbt-build: build-env
 	pipenv run dbt build --selector jaffle_shop --project-dir jaffle_shop
 
 run-dbt-project-evaluator: dbt-deps build-env
-	pipenv run dbt --warn-error build --select package:dbt_project_evaluator dbt_project_evaluator_exceptions --project-dir jaffle_shop
+	pipenv run dbt --warn-error build \
+		--select package:dbt_project_evaluator dbt_project_evaluator_exceptions \
+		--select jaffle_shop \
+		--project-dir jaffle_shop
 
 lint: build-env
 	pipenv run sqlfluff lint

From 4abb7e9c73edcb0a98c0fd0e83c73466fd1f2943 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 12:20:28 +0900
Subject: [PATCH 21/25] drop number of threads

---
 testing/profiles.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/testing/profiles.yml b/testing/profiles.yml
index a557ee46e..02f88967c 100644
--- a/testing/profiles.yml
+++ b/testing/profiles.yml
@@ -4,4 +4,4 @@ jaffle_shop:
     jaffle_shop:
       type: duckdb
       path: dbt.duckdb
-      threads: 300
+      threads: 10

From b5dde09979c0dd9e8b0ff04c3e3c5367a6d228c4 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 12:20:57 +0900
Subject: [PATCH 22/25] don't include customers who have not made an order

---
 jaffle_shop/models/final/fnl_sales_newcustomers.sql | 1 +
 1 file changed, 1 insertion(+)

diff --git a/jaffle_shop/models/final/fnl_sales_newcustomers.sql b/jaffle_shop/models/final/fnl_sales_newcustomers.sql
index 9fdb3b0be..1cb6927fa 100644
--- a/jaffle_shop/models/final/fnl_sales_newcustomers.sql
+++ b/jaffle_shop/models/final/fnl_sales_newcustomers.sql
@@ -3,6 +3,7 @@ WITH customers_ AS (
     customer_id
     , DATE_TRUNC('MONTH', first_order) AS first_order_month
   FROM {{ ref('wh_customers') }}
+  WHERE first_order IS NOT NULL
 )
 
 

From 6cf23dfa39dddc1e468cdc788677bdf9f718b4ad Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 12:21:09 +0900
Subject: [PATCH 23/25] duckdb specific SHA function

---
 jaffle_shop/macros/sensitive/hash_of_column.sql | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/jaffle_shop/macros/sensitive/hash_of_column.sql b/jaffle_shop/macros/sensitive/hash_of_column.sql
index d282fb9e3..90a8ce5da 100644
--- a/jaffle_shop/macros/sensitive/hash_of_column.sql
+++ b/jaffle_shop/macros/sensitive/hash_of_column.sql
@@ -1,13 +1,12 @@
 {% macro hash_of_column(column) %}
 
-    SHA2(
+    SHA256(
         TRIM(
             LOWER(
                 CAST({{ column|lower }} AS {{ dbt.type_string() }})
                 || '{{ jaffle_shop.get_salt(column|lower) }}'
             )
-        ),
-        256
+        )
     ) AS {{column|lower}}_hash,
 
 {% endmacro %}

From d8af6210bbb199dd2bfc33e4023876a6a04054da Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 12:21:22 +0900
Subject: [PATCH 24/25] actually add final tables to run

---
 jaffle_shop/dbt_project.yml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/jaffle_shop/dbt_project.yml b/jaffle_shop/dbt_project.yml
index 3fb17bf6e..8ee39b443 100644
--- a/jaffle_shop/dbt_project.yml
+++ b/jaffle_shop/dbt_project.yml
@@ -41,6 +41,9 @@ models:
     warehouse:
       +materialized: table
 
+    final:
+      +materialized: table
+
 seeds:
   dbt_project_evaluator:
     dbt_project_evaluator_exceptions:

From f8bd9fb1aeaeff2393de84806c1f38c626bb3ea7 Mon Sep 17 00:00:00 2001
From: Nathan Lugg <nrlugg@gmail.com>
Date: Tue, 12 Nov 2024 12:21:36 +0900
Subject: [PATCH 25/25] add notebook with plots

---
 Pipfile         |   1 +
 Pipfile.lock    |  15 +++++-
 workspace.ipynb | 139 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 154 insertions(+), 1 deletion(-)
 create mode 100644 workspace.ipynb

diff --git a/Pipfile b/Pipfile
index 27350f147..367af0871 100644
--- a/Pipfile
+++ b/Pipfile
@@ -16,6 +16,7 @@ pandas = "*"
 pyarrow = "*"
 pytest = "*"
 pytest-mock = "*"
+vl-convert-python = "*"
 
 [requires]
 python_version = "3.10"
diff --git a/Pipfile.lock b/Pipfile.lock
index 8beea8f6e..12aad7a83 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "43969e8630da55f06729904607387083070c6b1ce6955c8b9e327a0cf73c59eb"
+            "sha256": "fedf7a76aff16c5d52bae3a59af88a0c38d1802867cd2f6cc324a1bd38b7bbdb"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -2477,6 +2477,19 @@
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
             "version": "==1.26.20"
         },
+        "vl-convert-python": {
+            "hashes": [
+                "sha256:285bbadb1ce8a922c87f6e75a9544fe10a652d37bd4c1519fb93f90bab381588",
+                "sha256:51f99c58b1d0d74126455ece7d41972740cb4430b8dfdf7e0908270eed5be32d",
+                "sha256:8b50c492b640abb89a54a71e2c26f0f2d2c1cedc42030cc55bcc202670334724",
+                "sha256:90fba4356bd621bd31e72507a55e26dd13ebe79efa784715743116109afd0d47",
+                "sha256:962100d7670b9d35f9bb9745cdf590412f62f57c134b4a142340ba93a4dbddba",
+                "sha256:bc9e1f8ca0d8d3b3789c66e37cd6a8cf0a83406427d5143133346c2b5004485b"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.7'",
+            "version": "==1.7.0"
+        },
         "wcwidth": {
             "hashes": [
                 "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859",
diff --git a/workspace.ipynb b/workspace.ipynb
new file mode 100644
index 000000000..51bf0cb6c
--- /dev/null
+++ b/workspace.ipynb
@@ -0,0 +1,139 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "RendererRegistry.enable('png')"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "import altair as alt\n",
+    "import duckdb\n",
+    "\n",
+    "alt.renderers.enable(\"png\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "c = duckdb.connect(\"dbt.duckdb\", read_only=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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XV7vxXjlh27w0Ic+lKue09Oe9jQe+tCHctWL7mlPexoPfehDuepf9rSnPY2HPvShPAAAsm3+h/qSL/kSfn/3wVz1onuX13sxXvmhGzz0oQ/lquf0tKc9jYc+9KFc9aJ72tOexkMf+lCu+pc97WlP46EPfSgPAIBsm/+hvuRLvoTf330wV73o3uX1XoxXfugGD33oQ7nqOT3taU/joQ99KFe96J72tKfx0Ic+lKv+ZU972tN46EMfygMAINvmf6gv+ZIv4fd3H8xVL7p3eb0X45UfusFDH/pQrnpOT3va03joQx/KVS+6pz3taTz0oQ/lqn/Z0572NB760IfyAADItvlPcOutt/I1X/M17O7u8l7v9V689mu/NgDf8z3fw0//9E/z4Ac/mM/6rM/i+PHjvCBf8iVfwu/vPpirXnTv8novxis/dIOHPvShXPWcnva0p/HQhz6Uq150T3va03joQx/KVf+ypz3taTz0oQ/lAQCQbfOf4KVf+qX56q/+al76pV+a137t1+a7v/u7ufXWW/nu7/5uvvu7v5vf/u3f5mu+5mv4rd/6LV6QL/mSL+H3dx/MVS+6d3m9F+OVH7rBQx/6UK56Tk972tN46EMfylUvuqc97Wk89KEP5ap/2dOe9jQe+tCH8gAAyLb5D7a7u8tP//RP897v/d4AfPRHfzSv/dqvzfHjx3nwgx/Mgx/8YACOHz/O7u4uL8iXfMmX8Pu7D+aqF927vN6L8coP3eChD30oVz2npz3taTz0oQ/lqhfd0572NB760Idy1b/saU97Gg996EN5AABk2/wn+uu//mve+q3fmr/+67/m+PHj3O+zP/uz2d3d5au/+qt5Qb7kS76E3999MFe96N7l9V6MV37oBg996EO56jk97WlP46EPfShXveie9rSn8dCHPpSr/mVPe9rTeOhDH8oDACDb5j/JX//1X/PWb/3W/PRP/zQv/dIvzf0+5mM+hosXL/Ld3/3d3O/3f//3+YM/+AOe2+/vPpirXnRv/LI38CYvdyNXXXXVf72HPvShPAAAsm3+E/z1X/817/3e7813f/d389Iv/dLc733e532wzXd/93fzL/mSL/kSfn/3wVz1onuX13sxXvmhGzz0oQ/lquf0tKc9jYc+9KFc9aJ72tOexkMf+lCu+pc97WlP46EPfSgPAIBsm/9gu7u7POQhD+G7v/u7OX78OAAPetCD+O7v/m5+5md+hq/+6q/mfq/1Wq/FC/IlX/Il/P7ug7nqRfcur/divPJDN3joQx/KVc/paU97Gg996EO56kX3tKc9jYc+9KFc9S972tOexkMf+lAeAADZNv/Bbr31Vr77u7+bB3rt135tbr31Vm699VYe6LM/+7N5Qb7kS76E3999MFe96N7l9V6MV37oBg996EO56jk97WlP46EPfShXveie9rSn8dCHPpSr/mVPe9rTeOhDH8oDACDb5n+oL/mSL+H3dx/MVS+6d3m9F+OVH7rBQx/6UK56Tk972tN46EMfylUvuqc97Wk89KEP5ap/2dOe9jQe+tCH8gAAyLb5H+pLvuRL+P3dB3PVi+5dXu/FeOWHbvDQhz6Uq57T0572NB760Idy1YvuaU97Gg996EO56l/2tKc9jYc+9KE8AACybf6H+pIv+RJ+f/fBXPWie5fXezFe+aEbPPShD+Wq5/S0pz2Nhz70oVz1onva057GQx/6UK76lz3taU/joQ99KA8AgGyb/6G+5Eu+hN/ffTBXveje5fVejFd+6AYPfehDueo5Pe1pT+OhD30oV73onva0p/HQhz6Uq/5lT3va03joQx/KAwAg2+Z/qC/5ki/h93cfzFUvund5vRfjlR+6wUMf+lCuek5Pe9rTeOhDH8pVL7qnPe1pPPShD+Wqf9nTnvY0HvrQh/IAAMi2+R/qS77kS/j93Qdz1YvuXV7vxXjlh27w0Ic+lKue09Oe9jQe+tCHctWL7mlPexoPfehDuepf9rSnPY2HPvShPAAAsm3+h/qSL/kSfn/3wVz1onuX13sxXvmhGzz0oQ/lquf0tKc9jYc+9KFc9aJ72tOexkMf+lCu+pc97WlP46EPfSgPAIBsm/+hvuRLvoTf330wV73o3uX1XoxXfugGD33oQ7nqOT3taU/joQ99KFe96J72tKfx0Ic+lKv+ZU972tN46EMfygMAINvmf6gv+ZIv4fd3H8xVL7p3eb0X45UfusFDH/pQrnpOT3va03joQx/KVS+6pz3taTz0oQ/lqn/Z0572NB760IfyAADItvkf6ku+5Ev4/d0Hc9WL7l1e78V45Ydu8NCHPpSrntPTnvY0HvrQh3LVi+5pT3saD33oQ7nqX/a0pz2Nhz70oTwAALJt/of6ki/5En5/98Fc9aJ7l9d7MV75oRs89KEP5arn9LSnPY2HPvShXPWie9rTnsZDH/pQrvqXPe1pT+OhD30oDwCAbJv/ob7kS76E3999MFe96N7l9V6MV37oBg996EO56jk97WlP46EPfShXveie9rSn8dCHPpSr/mVPe9rTeOhDH8oDACDb5n+oL/mSL+H3dx/MVS+6d3m9F+OVH7rBQx/6UK56Tk972tN46EMfylUvuqc97Wk89KEP5ap/2dOe9jQe+tCH8gAAyLb5H+pLvuRL+P3dB3PVi+5dXu/FeOWHbvDQhz6Uq57T0572NB760Idy1YvuaU97Gg996EO56l/2tKc9jYc+9KE8AACybf6H+pIv+RJ+f/fBXPWie5fXezFe+aEbPPShD+Wq5/S0pz2Nhz70oVz1onva057GQx/6UK76lz3taU/joQ99KA8AgGyb/6G+5Eu+hN/ffTBXveje5fVejFd+6AYPfehDueo5Pe1pT+OhD30oV73onva0p/HQhz6Uq/5lT3va03joQx/KAwAg2+Z/qC/5ki/h93cfzFUvund5vRfjlR+6wUMf+lCuek5Pe9rTeOhDH8pVL7qnPe1pPPShD+Wqf9nTnvY0HvrQh/IAAMi2+U9w66238jVf8zXs7u7yXu/1Xrz2a782AD/90z/N93zP9/DSL/3SfNRHfRTHjx/nBfmSL/kSfn/3wVz1onuX13sxXvmhGzz0oQ/lquf0tKc9jYc+9KFc9aJ72tOexkMf+lCu+pc97WlP46EPfSgPAIBsm/8EL/3SL81Xf/VX89Iv/dK89mu/Nt/93d8NwHu/93vz27/923z1V381u7u7fPVXfzUvyJd8yZfw+7sP5qoX3bu83ovxyg/d4KEPfShXPaenPe1pPPShD+WqF93TnvY0HvrQh3LVv+xpT3saD33oQ3kAAGTb/Afb3d3lp3/6p3nv935vAD76oz+a137t1+av//qvefCDH8x7v/d7A/CQhzyEpz/96bwgX/IlX8Lv7z6Yq1507/J6L8YrP3SDhz70oVz1nJ72tKfx0Ic+lKtedE972tN46EMfylX/sqc97Wk89KEP5QEAkG3zn+iv//qveeu3fmv++q//mo/+6I/mvd/7vXnt135tACRhmxfkS77kS/j93Qdz1YvuXV7vxXjlh27w0Ic+lKue09Oe9jQe+tCHctWL7mlPexoPfehDuepf9rSnPY2HPvShPAAAsm3+k/z1X/81b/3Wb81P//RP89Iv/dJ89Ed/NG/91m/Na7/2awMgCdsA/P7v/z5/8Ad/wHP7/d0Hc9WL7o1f9gbe5OVu5Kqrrvqv99CHPpQHAEC2zX+Cv/7rv+a93/u9+e7v/m5e+qVfGoDP/uzP5sEPfjDv/d7vze7uLi/90i/NrbfeygvyJV/yJfz+7oO56kX3Lq/3YrzyQzd46EMfylXP6WlPexoPfehDuepF97SnPY2HPvShXPUve9rTnsZDH/pQHgAA2Tb/wXZ3d3nIQx7Cd3/3d3P8+HEAHvSgBwHwNm/zNnzXd30X3/M938OxY8f47M/+bF6QL/mSL+H3dx/MVS+6d3m9F+OVH7rBQx/6UK56Tk972tN46EMfylUvuqc97Wk89KEP5ap/2dOe9jQe+tCH8gAAyLb5D3brrbfy3d/93TzQa7/2a/Par/3a/PZv/za//du/zfHjx/noj/5oXpgv+ZIv4fd3H8xVL7p3eb0X45UfusFDH/pQrnpOT3va03joQx/KVS+6pz3taTz0oQ/lqn/Z0572NB760IfyAADItvkf6ku+5Ev4/d0Hc9WL7l1e78V45Ydu8NCHPpSrntPTnvY0HvrQh3LVi+5pT3saD33oQ7nqX/a0pz2Nhz70oTwAALJt/of6ki/5En5/98Fc9aJ7l9d7MV75oRs89KEP5arn9LSnPY2HPvShXPWie9rTnsZDH/pQrvqXPe1pT+OhD30oDwCAbJv/ob7kS76E3999MFe96N7l9V6MV37oBg996EO56jk97WlP46EPfShXveie9rSn8dCHPpSr/mVPe9rTeOhDH8oDACDb5n+oL/mSL+H3dx/MVS+6d3m9F+OVH7rBQx/6UK56Tk972tN46EMfylUvuqc97Wk89KEP5ap/2dOe9jQe+tCH8gAAyLb5H+pLvuRL+P3dB3PVi+5dXu/FeOWHbvDQhz6Uq57T0572NB760Idy1YvuaU97Gg996EO56l/2tKc9jYc+9KE8AACybf6H+pIv+RJ+f/fBXPWie5fXezFe+aEbPPShD+Wq5/S0pz2Nhz70oVz1onva057GQx/6UK76lz3taU/joQ99KA8AgGyb/6G+5Eu+hN/ffTBXveje5fVejFd+6AYPfehDueo5Pe1pT+OhD30oV73onva0p/HQhz6Uq/5lT3va03joQx/KAwAg2+Z/qC/5ki/h93cfzFUvund5vRfjlR+6wUMf+lCuek5Pe9rTeOhDH8pVL7qnPe1pPPShD+Wqf9nTnvY0HvrQh/IAAMi2+R/qS77kS/j93Qdz1YvuXV7vxXjlh27w0Ic+lKue09Oe9jQe+tCHctWL7mlPexoPfehDuepf9rSnPY2HPvShPAAAsm3+h/qSL/kSfn/3wVz1onuX13sxXvmhGzz0oQ/lquf0tKc9jYc+9KFc9aJ72tOexkMf+lCu+pc97WlP46EPfSgPAIBsm/+hvuRLvoTf330wV73o3uX1XoxXfugGD33oQ7nqOT3taU/joQ99KFe96J72tKfx0Ic+lKv+ZU972tN46EMfygMAINvmf6gv+ZIv4fd3H8xVL7p3eb0X45UfusFDH/pQrnpOT3va03joQx/KVS+6pz3taTz0oQ/lqn/Z0572NB760IfyAADItvkf6ku+5Ev4/d0Hc9WL7l1e78V45Ydu8NCHPpSrntPTnvY0HvrQh3LVi+5pT3saD33oQ7nqX/a0pz2Nhz70oTwAALJt/of6ki/5En5/98Fc9aJ7l9d7MV75oRs89KEP5arn9LSnPY2HPvShXPWie9rTnsZDH/pQrvqXPe1pT+OhD30oDwCAbJv/ob7kS76E3999MFe96N7l9V6MV37oBg996EO56jk97WlP46EPfShXveie9rSn8dCHPpSr/mVPe9rTeOhDH8oDACDb5n+oL/mSL+H3dx/MVS+6d3m9F+OVH7rBQx/6UK56Tk972tN46EMfylUvuqc97Wk89KEP5ap/2dOe9jQe+tCH8gAAyLb5H+pLvuRL+P3dB3PVi+5dXu/FeOWHbvDQhz6Uq57T0572NB760Idy1YvuaU97Gg996EO56l/2tKc9jYc+9KE8AACybf4TffZnfzaf/dmfzf1++qd/mu/5nu/htV/7tXmv93ovjh8/zgvyJV/yJfz+7oO56kX3Lq/3YrzyQzd46EMfylXP6WlPexoPfehDuepF97SnPY2HPvShXPUve9rTnsZDH/pQHgAA2Tb/ST7mYz6Gr/7qr8Y2AH/913/NR3/0R/PTP/3TfPd3fzd//dd/zXd/93fzgnzJl3wJv7/7YK560b3L670Yr/zQDR760Idy1XN62tOexkMf+lCuetE97WlP46EPfShX/cue9rSn8dCHPpQHAEC2zX+Cr/7qrwbgp3/6p/nt3/5tAH77t3+b7/7u7+a7v/u7+emf/mm++7u/m5/+6Z/mBfmSL/kSfn/3wVz1onuX13sxXvmhGzz0oQ/lquf0tKc9jYc+9KFc9aJ72tOexkMf+lCu+pc97WlP46EPfSgPAIBsm/9Er/3ar81v//Zvc7/XeZ3XAeDWW2/lu77ru3jt135tXpAv+ZIv4fd3H8xVL7p3eb0X45UfusFDH/pQrnpOT3va03joQx/KVS+6pz3taTz0oQ/lqn/Z0572NB760IfyAADItvlP9Nqv/dr89m//NgDf/d3fzW//9m/z3d/93fz2b/82n/M5n8Nv/dZvAfD7v//7/MEf/AHP7fd3H8xVL7o3ftkbAPjlv7yLq57tjV/2BgB++S/v4qoX3dd8wCtw1YvuoQ99KA8AgGyb/0Sv/dqvzW//9m8D8NEf/dG89Vu/Na/92q8NwEMe8hCe/vSn84J8yZd8Cb+/+2CuetG9y+u9GBcvXuSX//Iurnq2d3m9F+PixYv88l/exVUvuq/5gFfgoQ99KFf9y572tKfx0Ic+lAcAQLbNf6LXfu3X5rd/+7cB+Omf/mm+53u+h8/6rM/id37nd/ipn/opfvu3f5sX5Eu+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf4Tffd3fzfv/d7vzf1++qd/mr/+67/m+PHjvPd7vzfHjx/nBfmSL/kSfn/3wVz1onuX13sxLl68yC//5V1c9Wzv8novxsWLF/nlv7yLq150X/MBr8BDH/pQrvqXPe1pT+OhD30oDwCAbJv/ob7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+Z/qC/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCjz0oQ/lqn/Z0572NB760IfyAADItvkf6ku+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf6H+pIv+RJ+f/fBXPWie5fXezEuXrzIL//lXVz1bO/yei/GxYsX+eW/vIurXnRf8wGvwEMf+lCu+pc97WlP46EPfSgPAIBsm/+hvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5n+oL/mSL+H3dx/MVS+6d3m9F+PixYv88l/exVXP9i6v92JcvHiRX/7Lu7jqRfc1H/AKPPShD+Wqf9nTnvY0HvrQh/IAAMi2+R/qS77kS/j93Qdz1YvuXV7vxbh48SK//Jd3cdWzvcvrvRgXL17kl//yLq560X3NB7wCD33oQ7nqX/a0pz2Nhz70oTwAALJt/of6ki/5En5/98Fc9aJ7l9d7MS5evMgv/+VdXPVs7/J6L8bFixf55b+8i6tedF/zAa/AQx/6UK76lz3taU/joQ99KA8AgGyb/6G+5Eu+hN/ffTBXveje5fVejIsXL/LLf3kXVz3bu7zei3Hx4kV++S/v4qoX3dd8wCvw0Ic+lKv+ZU972tN46EMfygMAINvmf6gv+ZIv4fd3H8xVL7p3eb0X4+LFi/zyX97FVc/2Lq/3Yly8eJFf/su7uOpF9zUf8Ao89KEP5ap/2dOe9jQe+tCH8gAAyLb5H+pLvuRL+P3dB3PVi+5dXu/FuHjxIr/8l3dx1bO9y+u9GBcvXuSX//IurnrRfc0HvAIPfehDuepf9rSnPY2HPvShPAAAsm3+h/qSL/kSfn/3wVz1onuX13sxLl68yC//5V1c9Wzv8novxsWLF/nlv7yLq150X/MBr8BDH/pQrvqXPe1pT+OhD30oDwCAbJv/ob7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+Z/qC/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCjz0oQ/lqn/Z0572NB760IfyAADItvkf6ku+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf6Vfud3fofXeq3X4j/bl3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTbvAhe53Veh+/6ru/icz7nc/ju7/5uXvqlX5rf+q3f4vjx4/xn+ZIv+RJ+f/fBXPWie5fXezEuXrzIL//lXVz1bO/yei/GxYsX+eW/vIurXnRf8wGvwEMf+lCu+pc97WlP46EPfSgPAIBsm3/Bd3/3d/PRH/3R/PZv/zYv8zIvw0d91Efx0z/903z0R380H/3RH80L89mf/dl89md/Nvf767/+a77ma76G48eP81mf9VkcP36cF+RLvuRL+P3dB3PVi+5dXu/FuHjxIr/8l3dx1bO9y+u9GBcvXuSX//IurnrRfc0HvAIPfehDuepf9rSnPY2HPvShPAAAsm3+BZ/92Z/Nb//2b/Pe7/3evM/7vA9/9Vd/xXd/93dz/PhxPvuzP5sX5GM+5mP46q/+amwDcOutt/LWb/3W/PZv/za//du/zXd/93fz0z/907wgX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8y/46Z/+aT7mYz6G48ePc/HiRb77u7+bt3mbt+GrvuqreO/3fm+en6/+6q8G4Kd/+qf57d/+bQA++7M/mwc/+MG89Vu/NcePH+fWW2/lwQ9+MC/Il3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTbvAje+73fm7/+67/msz/7swH46q/+an77t3+bf8lrv/Zr89u//dsAvPd7vzfPeMYzsM2tt97KZ3/2Z/Pe7/3evCBf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zL/jt3/5tfuZnfoav+qqv4l/rtV/7tfnt3/5tAN76rd+al37pl+azP/uz2d3d5SEPeQgXL14E4Pd///f5gz/4A57b7+8+mKtedG/8sjcA8Mt/eRdXPdsbv+wNAPzyX97FVS+6r/mAV+CqF91DH/pQHgAA2Tb/gq/+6q/mYz7mY7DNv9Zrv/Zr89u//dsAfPZnfzYv/dIvzVu/9VsDIAnbvCBf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zL7j11lt5mZd5GR784Afz2q/92hw/fhyA13qt1+K1X/u1eWFe+7Vfm9/+7d8G4NZbb+Vt3uZt+Kmf+il+5md+hr/6q7/iu7/7u3lBvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5l/w27/927zO67wOz+2zPuuz+OzP/mxemO/+7u/mvd/7vbnfX//1X/PTP/3THD9+nPd+7/fm+PHjvCBf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zP9SXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNu8CH77t3+br/mar+Gv//qv+amf+in++q//mvd+7/fmP9OXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8C2699VZe5mVehpd6qZfid37nd/ipn/op3uZt3obf+q3f4rVf+7X5z/IlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGHPvShXPUve9rTnsZDH/pQHgAA2Tb/gq/+6q/mu7/7u/nrv/5rJGGb137t1+a1X/u1+ezP/mz+s3zJl3wJv7/7YK560b3L670YFy9e5Jf/8i6uerZ3eb0X4+LFi/zyX97FVS+6r/mAV+ChD30oV/3Lnva0p/HQhz6UBwBAts2/4Kd/+qd5n/d5H777u7+bt37rt+anf/qnee/3fm++67u+i7d+67fmP8uXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNu8CF77tV+b3/md3+F+L/VSL8Vf//Vf85/pS77kS/j93Qdz1YvuXV7vxbh48SK//Jd3cdWzvcvrvRgXL17kl//yLq560X3NB7wCD33oQ7nqX/a0pz2Nhz70oTwAALJtXkS//du/zV//9V/z0i/90rz2a782/9m+5Eu+hN/ffTBXveje5fVejIsXL/LLf3kXVz3bu7zei3Hx4kV++S/v4qoX3dd8wCvw0Ic+lKv+ZU972tN46EMfygMAINvmRfDbv/3b/M7v/A4P9Fqv9Vq89mu/Nv9ZvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5l/w27/927zO67wOz+2zPuuz+OzP/mz+s3zJl3wJv7/7YK560b3L670YFy9e5Jf/8i6uerZ3eb0X4+LFi/zyX97FVS+6r/mAV+ChD30oV/3Lnva0p/HQhz6UBwBAts2/4LM/+7P56Z/+af76r/+a/0pf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zL7j11lt57dd+bX76p3+al37pl+a/ypd8yZfw+7sP5qoX3bu83otx8eJFfvkv7+KqZ3uX13sxLl68yC//5V1c9aL7mg94BR760Idy1b/saU97Gg996EN5AABk2/wLbr31Vl7ndV6HW2+9lQf6rM/6LD77sz+b/yxf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zL/jsz/5svvqrv5qP/uiP5oFe+7Vfm9d+7dfmP8uXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8C/76r/+a93mf9+Gv/uqv+K/0JV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bhz70oVz1L3va057GQx/6UB4AANk2/4Jbb72V13md1+H48eMcP36c+73Xe70X7/3e781/li/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCjz0oQ/lqn/Z0572NB760IfyAADItvkX/PZv/zav8zqvw3P7rM/6LD77sz+b/yxf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zP9SXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNu8CH76p3+aj/mYj+HWW2/lwQ9+MF/1VV/FW7/1W/Mv+ezP/mw++7M/m+f2Pu/zPnzXd30XL8yXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8C2699VZe5mVehpd6qZfitV/7tfnt3/5tfud3foenP/3pPPjBD+YF+ZiP+Ri++qu/Gts80Gd/9mfz1V/91ezu7vLCfMmXfAm/v/tgrnrRvcvrvRgXL17kl//yLq56tnd5vRfj4sWL/PJf3sVVL7qv+YBX4KEPfShX/cue9rSn8dCHPpQHAEC2zb/gu7/7u/nsz/5sbr31Vu730i/90rz3e783H/3RH83z89Vf/dUA/PRP/zS//du/zf3++q//ms/+7M9md3eX3/7t3+aF+ZIv+RJ+f/fBXPWie5fXezEuXrzIL//lXVz1bO/yei/GxYsX+eW/vIurXnRf8wGvwEMf+lCu+pc97WlP46EPfSgPAIBsm3/BV3/1V/M1X/M1/NVf/RXHjx9nd3eXl3mZl+GjPuqj+OiP/mhemNd+7dfmt3/7twHY3d3lrd/6rfnpn/5p3vqt35rf/u3f5oX5ki/5En5/98Fc9aJ7l9d7MS5evMgv/+VdXPVs7/J6L8bFixf55b+8i6tedF/zAa/AQx/6UK76lz3taU/joQ99KA8AgGybf8Hu7i4PfvCDkcRLv/RLc+utt3Lx4kX++q//mgc/+MG8MK/92q/Nb//2bwPw0R/90bz1W781r/3ar81rv/Zr89u//dvc7/d///f5gz/4A57b7+8+mKtedG/8sjcA8Mt/eRdXPdsbv+wNAPzyX97FVS+6r/mAV+CqF91DH/pQHgAA2TYvgr/+67/mq7/6q7n11ls5fvw4n/3Zn81Lv/RL8y957dd+bX77t38bgNd+7dfmfn/913/NS7/0S/Pbv/3bvCBf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zL7j11lv5nu/5Hj7rsz6L+333d383L/3SL81Lv/RL88K89mu/Nr/927/Nc3vt135tfvu3f5sX5ku+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybV6AW2+9le/5nu/h1ltv5bu/+7v57M/+bO733d/93bzXe70Xn/3Zn80L893f/d2893u/N8/tu7/7u3nv935vXpgv+ZIv4fd3H8xVL7p3eb0X4+LFi/zyX97FVc/2Lq/3Yly8eJFf/su7uOpF9zUf8Ao89KEP5ap/2dOe9jQe+tCH8gAAyLZ5IV77tV+b3/md3+H5+a3f+i1e+7Vfm/8sX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8y/467/+az76oz+a3/7t3+a/0pd8yZfw+7sP5qoX3bu83otx8eJFfvkv7+KqZ3uX13sxLl68yC//5V1c9aL7mg94BR760Idy1b/saU97Gg996EN5AABk27wIbr31Vh784Adz66238j3f8z281mu9Fq/92q/Nf6Yv+ZIv4fd3H8xVL7p3eb0X4+LFi/zyX97FVc/2Lq/3Yly8eJFf/su7uOpF9zUf8Ao89KEP5ap/2dOe9jQe+tCH8gAAyLb5F9x66628zMu8DD/1Uz/F+7zP+3DrrbcC8PSnP50HP/jB/Gf5ki/5En5/98Fc9aJ7l9d7MS5evMgv/+VdXPVs7/J6L8bFixf55b+8i6tedF/zAa/AQx/6UK76lz3taU/joQ99KA8AgGybf8FXf/VX893f/d189Vd/Na/zOq/Dd33Xd/HTP/3TvPRLvzSf/dmfzX+WL/mSL+H3dx/MVS+6d3m9F+PixYv88l/exVXP9i6v92JcvHiRX/7Lu7jqRfc1H/AKPPShD+Wqf9nTnvY0HvrQh/IAAMi2+Rd89md/Nr/927/NW7/1W/MxH/MxXLx4kY/+6I/mwQ9+MJ/92Z/Nf5Yv+ZIv4fd3H8xVL7p3eb0X4+LFi/zyX97FVc/2Lq/3Yly8eJFf/su7uOpF9zUf8Ao89KEP5ap/2dOe9jQe+tCH8gAAyLb5F/z1X/81L/MyL8Px48d5qZd6Kd77vd+b93mf9+Gv/uqveOmXfmn+s3zJl3wJv7/7YK560b3L670YFy9e5Jf/8i6uerZ3eb0X4+LFi/zyX97FVS+6r/mAV+ChD30oV/3Lnva0p/HQhz6UBwBAts2L4Kd/+qf567/+az76oz+aW2+9lb/+67/mvd/7vfnP9CVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegYc+9KFc9S972tOexkMf+lAeAADZNv+C3d1d/uZv/obn9qAHPYgHP/jB/Gf5ki/5En5/98Fc9aJ7l9d7MS5evMgv/+VdXPVs7/J6L8bFixf55b+8i6tedF/zAa/AQx/6UK76lz3taU/joQ99KA8AgGybf8Fv//Zv8zqv8zo8t8/6rM/isz/7s/nP8iVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegYc+9KFc9S972tOexkMf+lAeAADZNv+C3d1d/vqv/5r7/fVf/zVf/dVfzW//9m/z4Ac/mP8sX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt82/w2q/92rz3e7837/3e781/li/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCjz0oQ/lqn/Z0572NB760IfyAADItvkX3HrrrXzP93wP99vd3eW7v/u7+azP+iw++qM/mv8sX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8y/47d/+bV7ndV6HB3qt13otfvqnf5rjx4/zn+VLvuRL+P3dB3PVi+5dXu/FuHjxIr/8l3dx1bO9y+u9GBcvXuSX//IurnrRfc0HvAIPfehDuepf9rSnPY2HPvShPAAAsm3+h/qSL/kSfn/3wVz1onuX13sxLl68yC//5V1c9Wzv8novxsWLF/nlv7yLq150X/MBr8BDH/pQrvqXPe1pT+OhD30oDwCAbJsXwXd/93cD8N7v/d589Ed/NA95yEP4qI/6KP4zfcmXfAm/v/tgrnrRvcvrvRgXL17kl//yLq56tnd5vRfj4sWL/PJf3sVVL7qv+YBX4KEPfShX/cue9rSn8dCHPpQHAEC2zb/gr//6r3mZl3kZvuu7vov3fu/35rM/+7P5nM/5HH7rt36L137t1+Y/y5d8yZfw+7sP5qoX3bu83otx8eJFfvkv7+KqZ3uX13sxLl68yC//5V1c9aL7mg94BR760Idy1b/saU97Gg996EN5AABk2/wLPvuzP5vf/u3f5rd/+7e532u/9mvz2q/92nz2Z382L8xnf/Zn89mf/dnc73u+53v46Z/+aR784AfzWZ/1WRw/fpwX5Eu+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf4FP/3TP837vM/78N3f/d086EEP4hnPeAbv/d7vzVd91Vfx3u/93rwgH/MxH8NXf/VXYxuAn/7pn+a7v/u7+e7v/m5++7d/m6/5mq/ht37rt3hBvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5kXw2q/92vzO7/wO93upl3op/vqv/5oX5Ku/+qsB+Omf/ml++7d/G4Df/u3f5sEPfjAPfvCDATh+/Di7u7u8IF/yJV/C7+8+mKtedO/yei/GxYsX+eW/vIurnu1dXu/FuHjxIr/8l3dx1Yvuaz7gFXjoQx/KVf+ypz3taTz0oQ/lAQCQbfMi+u3f/m3++q//mpd+6ZfmtV/7tQG49dZbAXjwgx/M8/Par/3a/PZv/zbP7bM/+7PZ3d3lq7/6q3lBvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5t/hsz/7swH47M/+bJ6f137t1+a3f/u3eaCP+ZiP4eLFi3z3d3839/v93/99/uAP/oDn9vu7D+aqF90bv+wNAPzyX97FVc/2xi97AwC//Jd3cdWL7ms+4BW46kX30Ic+lAcAQLbNv8Nnf/ZnA/DZn/3ZPD+v/dqvzW//9m9zv/d5n/fBNt/93d/Nv+RLvuRL+P3dB3PVi+5dXu/FuHjxIr/8l3dx1bO9y+u9GBcvXuSX//IurnrRfc0HvAIPfehDuepf9rSnPY2HPvShPAAAsm3+HT77sz8bgM/+7M/m+Xnt135tfvu3fxuAz/7sz+ZnfuZn+Oqv/mru91qv9Vq8IF/yJV/C7+8+mKtedO/yei/GxYsX+eW/vIurnu1dXu/FuHjxIr/8l3dx1Yvuaz7gFXjoQx/KVf+ypz3taTz0oQ/lAQCQbfPv8Nmf/dkAfPZnfzbPz3d/93fz3u/93gB893d/N7feeisP9Nmf/dm8IF/yJV/C7+8+mKtedO/yei/GxYsX+eW/vIurnu1dXu/FuHjxIr/8l3dx1Yvuaz7gFXjoQx/KVf+ypz3taTz0oQ/lAQCQbfPv8Nmf/dkAfPZnfzb/0b7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+bf4bM/+7MB+OzP/mz+o33Jl3wJv7/7YK560b3L670YFy9e5Jf/8i6uerZ3eb0X4+LFi/zyX97FVS+6r/mAV+ChD30oV/3Lnva0p/HQhz6UBwBAts2/4Ld/+7f5mq/5Gt76rd+at3qrt+L48eP8V/iSL/kSfn/3wVz1onuX13sxLl68yC//5V1c9Wzv8novxsWLF/nlv7yLq150X/MBr8BDH/pQrvqXPe1pT+OhD30oDwCAbJt/wa233sp7v/d78zu/8zsAvPZrvzZv/dZvzVu91Vvx4Ac/mP8sX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8yLa3d3lq7/6q/mar/kadnd3+azP+iw++7M/m/8sX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8y+49dZb+ZiP+Rh++7d/m93dXV7qpV6K137t1+ajP/qjefCDH8x/li/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCjz0oQ/lqn/Z0572NB760IfyAADItvkX/PZv/zav8zqvA8BHf/RH89Zv/da81mu9Fv/ZvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5kXw13/91/z0T/80v/3bv83v/M7vAPBd3/VdvPd7vzf/Wb7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+ZF8Nd//df8zu/8Dj/90z/Nb//2b3Ps2DG++qu/mvd+7/fmP8uXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8C377t3+b13md1+HYsWO89Vu/NW/91m/NW7/1W/Of7Uu+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf4Ft956K7feeiuv/dqvzX+lL/mSL+H3dx/MVS+6d3m9F+PixYv88l/exVXP9i6v92JcvHiRX/7Lu7jqRfc1H/AKPPShD+Wqf9nTnvY0HvrQh/IAAMi2eRH89E//NJ/zOZ/DX//1X/Nbv/Vb/MzP/Axf9VVfxX+mL/mSL+H3dx/MVS+6d3m9F+PixYv88l/exVXP9i6v92JcvHiRX/7Lu7jqRfc1H/AKPPShD+Wqf9nTnvY0HvrQh/IAAMi2+RfceuutPOQhD+G93uu9+J7v+R5+67d+i9d5ndfhp37qp3jrt35r/rN8yZd8Cb+/+2CuetG9y+u9GBcvXuSX//Iurnq2d3m9F+PixYv88l/exVUvuq/5gFfgoQ99KFf9y572tKfx0Ic+lAcAQLbNv+Crv/qr+emf/ml++7d/G0nY5rVf+7V57dd+bT77sz+b/yxf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zL/jpn/5p3ud93oev/uqv5r3f+7356Z/+ad77vd+b7/qu7+Kt3/qt+c/yJV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bhz70oVz1L3va057GQx/6UB4AANk2L4L3fu/35nu+53u431u91Vvx0z/90/xn+pIv+RJ+f/fBXPWie5fXezEuXrzIL//lXVz1bO/yei/GxYsX+eW/vIurXnRf8wGvwEMf+lCu+pc97WlP46EPfSgPAIBsmxfRX//1X7O7u8vx48d56Zd+af6zfcmXfAm/v/tgrnrRvcvrvRgXL17kl//yLq56tnd5vRfj4sWL/PJf3sVVL7qv+YBX4KEPfShX/cue9rSn8dCHPpQHAEC2zYvge77ne7j11lt5oNd6rdfitV/7tXlhPvuzP5vP/uzP5n4//dM/zfd8z/fw0i/90nzUR30Ux48f5wX5ki/5En5/98Fc9aJ7l9d7MS5evMgv/+VdXPVs7/J6L8bFixf55b+8i6tedF/zAa/AQx/6UK76lz3taU/joQ99KA8AgGybf8Fv//Zv8zqv8zo8t8/6rM/isz/7s3lBPuZjPoav/uqvxjYAf/3Xf817v/d789u//dt89Vd/Nbu7u3z1V381L8iXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8C776q7+a7/7u7+av//qveVF99Vd/NQA//dM/zW//9m8D8Nmf/dk8+MEP5r3f+70BeMhDHsLTn/50XpAv+ZIv4fd3H8xVL7p3eb0X4+LFi/zyX97FVc/2Lq/3Yly8eJFf/su7uOpF9zUf8Ao89KEP5ap/2dOe9jQe+tCH8gAAyLb5F9x666289Vu/Nb/927/N8ePH+dd47dd+bX77t38bgPd+7/fmvd/7vXnt135tACRhmxfkS77kS/j93Qdz1YvuXV7vxbh48SK//Jd3cdWzvcvrvRgXL17kl//yLq560X3NB7wCD33oQ7nqX/a0pz2Nhz70oTwAALJt/gV//dd/zdu8zdtw66238kCf9VmfxWd/9mfzwrz2a782v/3bvw3AR3/0R/PWb/3WvPZrvzYAkrANwO///u/zB3/wBzy33999MFe96N74ZW8A4Jf/8i6uerY3ftkbAPjlv7yLq150X/MBr8BVL7qHPvShPAAAsm3+BX/913/NR3/0R/Pc3vu935v3fu/35oV57dd+bX77t38bgM/+7M/mwQ9+MO/93u/N7u4uL/3SL82tt97KC/IlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGHPvShXPUve9rTnsZDH/pQHgAA2Tb/Dt/93d8NwHu/93vz/Lz2a782v/3bvw3Arbfeytu8zdvwXd/1XXzP93wPx44d47M/+7N5Qb7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+bf4bM/+7MB+OzP/myen+/+7u/mvd/7vbnfb//2b/Pbv/3bHD9+nI/+6I/mhfmSL/kSfn/3wVz1onuX13sxLl68yC//5V1c9Wzv8novxsWLF/nlv7yLq150X/MBr8BDH/pQrvqXPe1pT+OhD30oDwCAbJt/h8/+7M8G4LM/+7P5j/YlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGHPvShXPUve9rTnsZDH/pQHgAA2Tb/Dp/92Z8NwGd/9mfzH+1LvuRL+P3dB3PVi+5dXu/FuHjxIr/8l3dx1bO9y+u9GBcvXuSX//IurnrRfc0HvAIPfehDuepf9rSnPY2HPvShPAAAsm3+HT77sz8bgM/+7M/mP9qXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8O3z2Z382AJ/92Z/Nf7Qv+ZIv4fd3H8xVL7p3eb0X4+LFi/zyX97FVc/2Lq/3Yly8eJFf/su7uOpF9zUf8Ao89KEP5ap/2dOe9jQe+tCH8gAAyLb5d/jt3/5tAF77tV+b/2hf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zIviYj/kY/vqv/5oHeq/3ei/e+73fm/8sX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8y/47u/+bt7nfd6H13qt1+KB3vu935v3fu/35j/Ll3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTb/Au++qu/mp/+6Z/mt3/7t/mv9CVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegYc+9KFc9S972tOexkMf+lAeAADZNv+C3d1dXvu1X5u3eZu34bVf+7W534Me9CAe/OAH85/lS77kS/j93Qdz1YvuXV7vxbh48SK//Jd3cdWzvcvrvRgXL17kl//yLq560X3NB7wCD33oQ7nqX/a0pz2Nhz70oTwAALJt/gW//du/zeu8zuvw3D7rsz6Lz/7sz+Y/y5d8yZfw+7sP5qoX3bu83otx8eJFfvkv7+KqZ3uX13sxLl68yC//5V1c9aL7mg94BR760Idy1b/saU97Gg996EN5AABk2/wLvvqrv5qv/uqv5ru/+7t5oAc/+ME8+MEP5j/Ll3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTb/AtuvfVW3vqt35rf/u3f5vjx4/xX+ZIv+RJ+f/fBXPWie5fXezEuXrzIL//lXVz1bO/yei/GxYsX+eW/vIurXnRf8wGvwEMf+lCu+pc97WlP46EPfSgPAIBsm3/BX//1X/M6r/M67O7u8kCf9VmfxWd/9mfzn+VLvuRL+P3dB3PVi+5dXu/FuHjxIr/8l3dx1bO9y+u9GBcvXuSX//IurnrRfc0HvAIPfehDuepf9rSnPY2HPvShPAAAsm3+BX/913/NR3/0R/Pc3vu935v3fu/35j/Ll3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTb/A/1JV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bhz70oVz1L3va057GQx/6UB4AANk2/4Lf/u3f5nVe53V4bp/1WZ/FZ3/2Z/Of5Uu+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf4Ft956K9/93d/N/f76r/+a3/md3+GnfuqneO3Xfm3+s3zJl3wJv7/7YK560b3L670YFy9e5Jf/8i6uerZ3eb0X4+LFi/zyX97FVS+6r/mAV+ChD30oV/3Lnva0p/HQhz6UBwBAts2/wWu/9mvz2Z/92bz2a782/xo//dM/zfd8z/fw2q/92rzXe70Xx48f5wX5ki/5En5/98Fc9aJ7l9d7MS5evMgv/+VdXPVs7/J6L8bFixf55b+8i6tedF/zAa/AQx/6UK76lz3taU/joQ99KA8AgGybf8Hu7i5/8zd/w/12d3f56I/+aN7rvd6Lz/7sz+ZF9dd//dd89Ed/ND/90z/Nd3/3d/PXf/3XfPd3fzcvyJd8yZfw+7sP5qoX3bu83otx8eJFfvkv7+KqZ3uX13sxLl68yC//5V1c9aL7mg94BR760Idy1b/saU97Gg996EN5AABk2/wLfvu3f5vXeZ3X4YGOHTvGX//1X/PgBz+YF9Vv//Zv893f/d1893d/Nz/90z/Nd3/3d/PTP/3TvCBf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zL9jd3eWv//qveaCXfumX5vjx4/xrvc7rvA4At956K9/1Xd/Fa7/2a/OCfMmXfAm/v/tgrnrRvcvrvRgXL17kl//yLq56tnd5vRfj4sWL/PJf3sVVL7qv+YBX4KEPfShX/cue9rSn8dCHPpQHAEC2zYtgd3eXv/mbv+GBHvSgB/HgBz+YF9V3f/d389u//dt893d/N7/927/N53zO5/Bbv/VbAPz+7/8+f/AHf8Bz+/3dB3PVi+6NX/YGAH75L+/iqmd745e9AYBf/su7uOpF9zUf8Apc9aJ76EMfygMAINvmX3DrrbfyMi/zMuzu7vJAn/VZn8Vnf/Zn86L66I/+aN76rd+a137t1wbgIQ95CE9/+tN5Qb7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+Zf8Nmf/dl89Vd/Nd/93d/N8ePHud+DH/xgHvzgB/Oi+umf/mm+53u+h8/6rM/id37nd/ipn/opfvu3f5sX5Eu+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf4Ff/3Xf837vM/78Fd/9Vf8e/30T/80f/3Xf83x48d57/d+b44fP84L8iVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegYc+9KFc9S972tOexkMf+lAeAADZNv+CW2+9ldd5ndfhpV/6pXnpl35p7vdar/VavPZrvzb/Wb7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+Zf8Nu//du8zuu8Ds/tsz7rs/jsz/5s/rN8yZd8Cb+/+2CuetG9y+u9GBcvXuSX//Iurnq2d3m9F+PixYv88l/exVUvuq/5gFfgoQ99KFf9y572tKfx0Ic+lAcAQLbN/1Bf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zP9SXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8D/UlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGHPvShXPUve9rTnsZDH/pQHgAA2Tb/Q33Jl3wJv7/7YK560b3L670YFy9e5Jf/8i6uerZ3eb0X4+LFi/zyX97FVS+6r/mAV+ChD30oV/3Lnva0p/HQhz6UBwBAts3/UF/yJV/C7+8+mKtedO/yei/GxYsX+eW/vIurnu1dXu/FuHjxIr/8l3dx1Yvuaz7gFXjoQx/KVf+ypz3taTz0oQ/lAQCQbfM/1Jd8yZfw+7sP5qoX3bu83otx8eJFfvkv7+KqZ3uX13sxLl68yC//5V1c9aL7mg94BR760Idy1b/saU97Gg996EN5AABk2/wP9SVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegYc+9KFc9S972tOexkMf+lAeAADZNv9DfcmXfAm/v/tgrnrRvcvrvRgXL17kl//yLq56tnd5vRfj4sWL/PJf3sVVL7qv+YBX4KEPfShX/cue9rSn8dCHPpQHAEC2zf9QX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8z/Ul3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTb/A/1JV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bhz70oVz1L3va057GQx/6UB4AANk2/0N9yZd8Cb+/+2CuetG9y+u9GBcvXuSX//Iurnq2d3m9F+PixYv88l/exVUvuq/5gFfgoQ99KFf9y572tKfx0Ic+lAcAQLbN/1Bf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zP9SXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8D/UlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGHPvShXPUve9rTnsZDH/pQHgAA2Tb/hf76r/+ar/mar+H48eN81md9FsePH+cF+ZIv+RJ+f/fBXPWie5fXezEuXrzIL//lXVz1bO/yei/GxYsX+eW/vIurXnRf8wGvwEMf+lCu+pc97WlP46EPfSgPAIBsm/8it956K2/91m/Nb//2b/Pbv/3bfPd3fzc//dM/zQvyJV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bhz70oVz1L3va057GQx/6UB4AANk2/0U++7M/mwc/+MG89Vu/NcePH+fWW2/lwQ9+MC/Il3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTb/Bd57/d+b57xjGdgm1tvvZXP/uzP5r3f+715Qb7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+a/yFu/9Vvz0i/90nz2Z382u7u7POQhD+HixYsA/P7v/z5/8Ad/wHP7/d0Hc9WL7o1f9gYAfvkv7+KqZ3vjl70BgF/+y7u46kX3NR/wClz1onvoQx/KAwAg2+a/yGd/9mfz0i/90rz1W781AJKwzQvyJV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bhz70oVz1L3va057GQx/6UB4AANk2/0VuvfVW3uZt3oaf+qmf4md+5mf4q7/6K777u7+bF+RLvuRL+P3dB3PVi+5dXu/FuHjxIr/8l3dx1bO9y+u9GBcvXuSX//IurnrRfc0HvAIPfehDuepf9rSnPY2HPvShPAAAsm3+C/31X/81P/3TP83x48d57/d+b44fP84L8iVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegYc+9KFc9S972tOexkMf+lAeAADZNv9DfcmXfAm/v/tgrnrRvcvrvRgXL17kl//yLq56tnd5vRfj4sWL/PJf3sVVL7qv+YBX4KEPfShX/cue9rSn8dCHPpQHAEC2zf9QX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8z/Ul3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTb/A/1JV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bhz70oVz1L3va057GQx/6UB4AANk2/0N9yZd8Cb+/+2CuetG9y+u9GBcvXuSX//Iurnq2d3m9F+PixYv88l/exVUvuq/5gFfgoQ99KFf9y572tKfx0Ic+lAcAQLbN/1Bf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3zP9SXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAUe+tCHctW/7GlPexoPfehDeQAAZNv8D/UlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGHPvShXPUve9rTnsZDH/pQHgAA2Tb/Q33Jl3wJv7/7YK560b3L670YFy9e5Jf/8i6uerZ3eb0X4+LFi/zyX97FVS+6r/mAV+ChD30oV/3Lnva0p/HQhz6UBwBAts3/UF/yJV/C7+8+mKtedO/yei/GxYsX+eW/vIurnu1dXu/FuHjxIr/8l3dx1Yvuaz7gFXjoQx/KVf+ypz3taTz0oQ/lAQCQbfM/1Jd8yZfw+7sP5qoX3bu83otx8eJFfvkv7+KqZ3uX13sxLl68yC//5V1c9aL7mg94BR760Idy1b/saU97Gg996EN5AABk2/wP9SVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegYc+9KFc9S972tOexkMf+lAeAADZNv9DfcmXfAm/v/tgrnrRvcvrvRgXL17kl//yLq56tnd5vRfj4sWL/PJf3sVVL7qv+YBX4KEPfShX/cue9rSn8dCHPpQHAEC2zf9QX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt8z/Ul3zJl/D7uw/mqhfdu7zei3Hx4kV++S/v4qpne5fXezEuXrzIL//lXVz1ovuaD3gFHvrQh3LVv+xpT3saD33oQ3kAAGTb/A/1JV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bhz70oVz1L3va057GQx/6UB4AANk2/0N9yZd8Cb+/+2CuetG9y+u9GBcvXuSX//Iurnq2d3m9F+PixYv88l/exVUvuq/5gFfgoQ99KFf9y572tKfx0Ic+lAcAQLbNf4P3eZ/34bu+67t4Yb7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+a/2Gd/9mfz1V/91ezu7vLCfMmXfAm/v/tgrnrRvcvrvRgXL17kl//yLq56tnd5vRfj4sWL/PJf3sVVL7qv+YBX4KEPfShX/cue9rSn8dCHPpQHAEC2zX+hv/7rv+azP/uz2d3d5bd/+7d5Yb7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+a/yO7uLm/91m/NT//0T/PWb/3W/PZv/zYvzJd8yZfw+7sP5qoX3bu83otx8eJFfvkv7+KqZ3uX13sxLl68yC//5V1c9aL7mg94BR760Idy1b/saU97Gg996EN5AABk2/wX+eiP/mje+q3fmtd+7dfmtV/7tfnt3/5t7vf7v//7/MEf/AHP7fd3H8xVL7o3ftkbAPjlv7yLq57tjV/2BgB++S/v4qoX3dd8wCtw1YvuoQ99KA8AgGyb/yKv/dqvzf3++q//mpd+6Zfmt3/7t3lBvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5r/Ba7/2a/Pbv/3bvDBf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BV46EMfylX/sqc97Wk89KEP5QEAkG3z3+C7v/u7ee/3fm9emC/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCjz0oQ/lqn/Z0572NB760IfyAADItvkf6ku+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf6H+pIv+RJ+f/fBXPWie5fXezEuXrzIL//lXVz1bO/yei/GxYsX+eW/vIurXnRf8wGvwEMf+lCu+pc97WlP46EPfSgPAIBsm/+hvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5n+oL/mSL+H3dx/MVS+6d3m9F+PixYv88l/exVXP9i6v92JcvHiRX/7Lu7jqRfc1H/AKPPShD+Wqf9nTnvY0HvrQh/IAAMi2+R/qS77kS/j93Qdz1YvuXV7vxbh48SK//Jd3cdWzvcvrvRgXL17kl//yLq560X3NB7wCD33oQ7nqX/a0pz2Nhz70oTwAALJt/of6ki/5En5/98Fc9aJ7l9d7MS5evMgv/+VdXPVs7/J6L8bFixf55b+8i6tedF/zAa/AQx/6UK76lz3taU/joQ99KA8AgGyb/6G+5Eu+hN/ffTBXveje5fVejIsXL/LLf3kXVz3bu7zei3Hx4kV++S/v4qoX3dd8wCvw0Ic+lKv+ZU972tN46EMfygMAINvmf6gv+ZIv4fd3H8xVL7p3eb0X4+LFi/zyX97FVc/2Lq/3Yly8eJFf/su7uOpF9zUf8Ao89KEP5ap/2dOe9jQe+tCH8gAAyLb5H+pLvuRL+P3dB3PVi+5dXu/FuHjxIr/8l3dx1bO9y+u9GBcvXuSX//IurnrRfc0HvAIPfehDuepf9rSnPY2HPvShPAAAsm3+h/qSL/kSfn/3wVz1onuX13sxLl68yC//5V1c9Wzv8novxsWLF/nlv7yLq150X/MBr8BDH/pQrvqXPe1pT+OhD30oDwCAbJv/ob7kS76E3999MFe96N7l9V6Mixcv8st/eRdXPdu7vN6LcfHiRX75L+/iqhfd13zAK/DQhz6Uq/5lT3va03joQx/KAwAg2+Z/qC/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCjz0oQ/lqn/Z0572NB760IfyAADItvkf6ku+5Ev4/d0Hc9WL7l1e78W4ePEiv/yXd3HVs73L670YFy9e5Jf/8i6uetF9zQe8Ag996EO56l/2tKc9jYc+9KE8AACybf6H+pIv+RJ+f/fBXPWie5fXezEuXrzIL//lXVz1bO/yei/GxYsX+eW/vIurXnRf8wGvwEMf+lCu+pc97WlP46EPfSgPAIBsm/+hvuRLvoTf330wV73o3uX1XoyLFy/yy395F1c927u83otx8eJFfvkv7+KqF93XfMAr8NCHPpSr/mVPe9rTeOhDH8oDACDb5n+oL/mSL+H3dx/MVS+6d3m9F+PixYv88l/exVXP9i6v92JcvHiRX/7Lu7jqRfc1H/AKPPShD+Wqf9nTnvY0HvrQh/IAAMi2+R/qS77kS/j93Qdz1YvuXV7vxbh48SK//Jd3cdWzvcvrvRgXL17kl//yLq560X3NB7wCD33oQ7nqX/a0pz2Nhz70oTwAALJt/gt9z/d8Dz/90z/Ngx/8YD7rsz6L48eP84J8yZd8Cb+/+2CuetG9y+u9GBcvXuSX//Iurnq2d3m9F+PixYv88l/exVUvuq/5gFfgoQ99KFf9y572tKfx0Ic+lAcAQLbNf5Gf/umf5ru/+7v57u/+bn77t3+br/mar+G3fuu3eEG+5Eu+hN/ffTBXveje5fVejIsXL/LLf3kXVz3bu7zei3Hx4kV++S/v4qoX3dd8wCvw0Ic+lKv+ZU972tN46EMfygMAINvmv8hv//Zv8+AHP5gHP/jBABw/fpzd3V1ekC/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCjz0oQ/lqn/Z0572NB760IfyAADItvlv8Nmf/dns7u7y1V/91bwgX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAVeOhDH8pV/7KnPe1pPPShD+UBAJBt81/sYz7mY7h48SLf/d3fzf1+//d/nz/4gz/guf3+7oO56kX3xi97AwC//Jd3cdWzvfHL3gDAL//lXVz1ovuaD3gFPurb/oyr/mVf8wGvwEMf+lAeAADZNv+F3ud93gfbfPd3fzf/ki/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCnzUt/0ZV/3LvuYDXoGHPvShPAAAsm3+i3z2Z382P/MzP8NXf/VXc7/Xeq3X4gX5ki/5En5/98Fc9aJ7l9d7MS5evMgv/+VdXPVs7/J6L8bFixf55b+8i6tedF/zAa/AR33bn3HVv+xrPuAVeOhDH8oDACDb5r/Id3/3d3PrrbfyQJ/92Z/NC/IlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGP+rY/46p/2dd8wCvw0Ic+lAcAQLbN/1Bf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BX4qG/7M676l33NB7wCD33oQ3kAAGTb/A/1JV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bj/q2P+Oqf9nXfMAr8NCHPpQHAEC2zf9QX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAV+Khv+zOu+pd9zQe8Ag996EN5AABk2/wP9SVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegY/6tj/jqn/Z13zAK/DQhz6UBwBAts3/UF/yJV/C7+8+mKtedO/yei/GxYsX+eW/vIurnu1dXu/FuHjxIr/8l3dx1Yvuaz7gFfiob/szrvqXfc0HvAIPfehDeQAAZNv8D/UlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGP+rY/46p/2dd8wCvw0Ic+lAcAQLbN/1Bf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BX4qG/7M676l33NB7wCD33oQ3kAAGTb/A/1JV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bj/q2P+Oqf9nXfMAr8NCHPpQHAEC2zf9QX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAV+Khv+zOu+pd9zQe8Ag996EN5AABk2/wP9SVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegY/6tj/jqn/Z13zAK/DQhz6UBwBAts3/UF/yJV/C7+8+mKtedO/yei/GxYsX+eW/vIurnu1dXu/FuHjxIr/8l3dx1Yvuaz7gFfiob/szrvqXfc0HvAIPfehDeQAAZNv8D/UlX/Il/P7ug7nqRfcur/diXLx4kV/+y7u46tne5fVejIsXL/LLf3kXV73ovuYDXoGP+rY/46p/2dd8wCvw0Ic+lAcAQLbN/1Bf8iVfwu/vPpirXnTv8novxsWLF/nlv7yLq57tXV7vxbh48SK//Jd3cdWL7ms+4BX4qG/7M676l33NB7wCD33oQ3kAAGTb/A/1JV/yJfz+7oO56kX3Lq/3Yly8eJFf/su7uOrZ3uX1XoyLFy/yy395F1e96L7mA16Bj/q2P+Oqf9nXfMAr8NCHPpQHAEC2zf9QX/IlX8Lv7z6Yq1507/J6L8bFixf55b+8i6ue7V1e78W4ePEiv/yXd3HVi+5rPuAV+Khv+zOu+pd9zQe8Ag996EN5AABk2/wP9SVf8iX8/u6DuepF9y6v92JcvHiRX/7Lu7jq2d7l9V6Mixcv8st/eRdXvei+5gNegY/6tj/jqn/Z13zAK/DQhz6UBwBAts3/UF/yJV/C7+8+mKtedO/yei/GxYsX+eW/vIurnu1dXu/FuHjxIr/8l3dx1Yvuaz7gFfiob/szrvqXfc0HvAIPfehDeQAAZNv8F/rpn/5pvud7voeXfumX5qM+6qM4fvw4L8iXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAU+6tv+jKv+ZV/zAa/AQx/6UB4AANk2/0X++q//mvd+7/fmt3/7t/nqr/5qdnd3+eqv/mpekC/5ki/h93cfzFUvund5vRfj4sWL/PJf3sVVz/Yur/diXLx4kV/+y7u46kX3NR/wCnzUt/0ZV/3LvuYDXoGHPvShPAAAsm3+i3z2Z382D37wg3nv935vAB7ykIfw9Kc/nRfkS77kS/j93Qdz1YvuXV7vxbh48SK//Jd3cdWzvcvrvRgXL17kl//yLq560X3NB7wCH/Vtf8ZV/7Kv+YBX4KEPfSgPAIBsm/8i7/3e7817v/d789qv/doASMI2L8iXfMmX8Pu7D+aqF927vN6LcfHiRX75L+/iqmd7l9d7MS5evMgv/+VdXPWi+5oPeAU+6tv+jKv+ZV/zAa/AQx/6UB4AANk2/0U++qM/mrd+67fmtV/7tQGQhG0Afv/3f58/+IM/4IG6rmMcR6666qqr/qc7c+YM7/u+78sDACDb5r/IZ3/2Z/PgBz+Y937v92Z3d5eXfumX5tZbb+UF+ZIv+RI+6ZM+iav+db7kS76ET/qkT+Kq5/QlX/IlfNInfRJXvei+5Eu+hE/6pE/iqn/Zl3zJl/BJn/RJPAAAsm3+i9x66628zdu8Dd/1Xd/F93zP93Ds2DE++7M/mxfkS77kS/ikT/okrvrX+ZIv+RI+6ZM+iaue05d8yZfwSZ/0SVz1ovuSL/kSPumTPomr/mVf8iVfwid90ifxAADItvkv9Nu//dv89m//NsePH+ejP/qjeWG+5Eu+hE/6pE/iqn+dL/mSL+GTPumTuOo5fcmXfAmf9EmfxFUvui/5ki/hkz7pk7jqX/YlX/IlfNInfRIPAIBsm/+hvuRLvoRP+qRP4qp/nS/5ki/hkz7pk7jqOX3Jl3wJn/RJn8RVL7ov+ZIv4ZM+6ZO46l/2JV/yJXzSJ30SDwCAbJv/oX7/93+fV3/1V+eqf53f//3f59Vf/dW56jn9/u//Pq/+6q/OVS+63//93+fVX/3Vuepf9vu///u8+qu/Og8AgGybq6666qqr/qMBINvmqquuuuqq/2gAyLb5X+Cv//qv+e7v/m6++qu/mn+rW2+9la/5mq9hd3eXt3qrt+Kt3/qtAfjpn/5pvud7voeXfumX5qM+6qM4fvw49/vu7/5uXvqlX5qXfumXBuC3f/u3+Z7v+R6OHz/OZ33WZ3H8+HH+Pf76r/+aj/mYj+GB3uu93ov3fu/35vn56I/+aL76q7+aF+Z7vud7+Omf/mle+qVfmo/6qI/i+PHj7O7u8jmf8znceuutfNRHfRSv/dqvzf12d3f57M/+bL76q78agN3dXb7ne76H3/7t3+a93uu9eOu3fmv+q333d3833/M938N3fdd38eAHP5j7vc3bvA1v9VZvxXu/93vzr/U93/M9/PRP/zSv/dqvzXu913tx/Phxdnd3+ZzP+RxuvfVWPuqjPorXfu3X5n67u7t89md/Nl/91V8NwO7uLt/zPd/Db//2b/Ne7/VevPVbvzX/U9166628z/u8Dz/1Uz/F8ePH+bfY3d3la77ma/jrv/5r3vqt35r3eq/3AuCv//qv+Zqv+RoAvuqrvorjx49zv5/+6Z9md3eX937v9wbgr//6r/mar/kaAD7rsz6LBz/4wfxrfPRHfzSXLl3iu77ru7jfX//1X/MxH/MxfNVXfRUv/dIvzb/FX//1X/M1X/M1ALzXe70Xr/3arw3AT//0T/M1X/M1vPVbvzUf9VEfxQN99md/Np/92Z/N/X76p3+a7/me7+G1X/u1ea/3ei+OHz/OcwFAts3/Ar/927/NZ3/2Z/Pbv/3b/Fu99Eu/NF/91V/NS7/0S/Par/3afPd3fzfHjx/nrd/6rfnt3/5tvvqrv5rd3V2++qu/GoCv+Zqv4aM/+qP5rd/6LV77tV+b3d1dXvu1X5vf/u3f5rd/+7f57u/+bn76p3+af4/f/u3f5qM/+qP56q/+au734Ac/mAc/+ME8P6/92q/Nb//2b/OCfPd3fze//du/zVd/9Vfz0z/90/z0T/80P/3TP817v/d789qv/dq89mu/Nm/91m/NT//0T/PgBz+YW2+9lbd5m7fh2LFj/PZv/zYA7/3e781Lv/RL897v/d689Vu/NV/91V/NS7/0S/Nf6bM/+7P56q/+aj77sz+bj/7ojwbgr//6r3mZl3kZPuuzPovP/uzP5l/ju7/7u/nt3/5tvvqrv5qf/umf5qd/+qf56Z/+ad76rd+at37rt+a1X/u1eeu3fmt++qd/mgc/+MHceuutvM3bvA3Hjh3jt3/7twF47/d+b176pV+a937v9+at3/qt+eqv/mpe+qVfmv+JPvuzP5vf/u3f5q3f+q356I/+aP4t3vqt35r3fu/35rVf+7V57/d+b976rd+at37rt+a1X/u1+emf/mn++q//mq/5mq/ht37rtwD46Z/+ad7nfd6Hj/qoj+KzP/uzAXjwgx/MT//0TwPwNm/zNjz96U/nX+O1X/u1+eu//mv++q//mgc/+MEAfPRHfzTf/d3fzU//9E/z2q/92vxr7e7u8tIv/dL89m//NgBv/dZvzU//9E9z66238tVf/dV893d/Nx/90R/NS7/0S/PRH/3RAHzMx3wMX/3VX41tAP76r/+aj/7oj+anf/qn+e7v/m7++q//mu/+7u/muQAg2+Z/gd/+7d/msz/7s/nt3/5t/vqv/5rP+ZzPYXd3lwc/+MF813d9F3/913/Nb//2b/M7v/M77O7u8lEf9VG89Vu/Nffb3d3lp3/6p3nv935vAD76oz+aBz/4wezu7nL8+HE++qM/GoATJ05w8eJFvvqrv5rd3V1++7d/m8/+7M/mtV/7tfnrv/5r3ud93oe/+qu/Ynd3l5d+6Zfm1ltv5d/jt3/7t/nsz/5sfvu3f5vn9jVf8zX89E//NMePH+ervuqrePCDH8xrv/Zr8zZv8zb89E//NK/92q/NZ33WZ/FAP/3TP81Lv/RL8+AHP5jd3V1e+7Vfm7/+67/mwQ9+MLfeeisAn/3Zn83x48f56I/+aF77tV+bt37rt+anf/qn+e3f/m0A3vqt35r3fu/35q3f+q356I/+aF77tV+bt37rt+a/0md/9mdz66238jd/8zf81V/9FQAf/dEfza233spLv/RL89mf/dn89E//NF/zNV8DwHu913vx3u/93nz3d383f/3Xf83f/M3f8FM/9VMcP34cgJ/+6Z/mpV/6pXnwgx/M7u4ur/3ar81f//Vf8+AHP5hbb70VgM/+7M/mwQ9+MO/93u/Na7/2a/PWb/3W/PRP/zS//du/DcBbv/Vb897v/d689Vu/NR/90R/Na7/2a/PWb/3W/E/0kIc8hJ/6qZ/ibd7mbXj6058OwHd/93cD8D3f8z0cP36c7/qu7+L48eO8zuu8Di/90i+Nbb76q7+a+332Z382n/3Znw3Ad3/3d3Prrbfy0i/90vz2b/82X/3VXw3AS7/0S/Pbv/3b/PVf/zXf/d3fzfHjxzl+/Dif/dmfDcBDHvIQnv70pwNw4sQJLl68yL/Ga7/2a/PgBz+Yl37pl+ajP/qjAXjt135tAD77sz+bl37pl+ZjPuZjuPXWWwH4qq/6KgB++qd/ms/+7M8G4Ku/+qt57dd+bV76pV8agFtvvZXf/u3f5r3f+70BeO3Xfm0++7M/m+/+7u/mrd/6rXnrt35rbr31Vt77vd+b3/7t3+arv/qrAfjpn/5pfvu3fxuA3/7t3+a7v/u7+e7v/m5++qd/mu/+7u/mp3/6p3kuAMi2+V/gt3/7t/nsz/5sfvu3f5vXfu3X5qd/+qc5fvw4b/3Wb81Hf/RHA/De7/3e/PVf/zW33norb/M2b8PTn/50np+//uu/5q3f+q3567/+a776q7+a137t1+a1X/u1ATh+/Di7u7vc77Vf+7X57M/+bF77tV8bgLd+67fmGc94Bru7u3zVV30Vb/3Wb82/x2//9m/zPu/zPrz3e7839/usz/osfvqnf5rv/u7v5qd/+qf567/+a97nfd6Hv/qrv+K1X/u1eeu3fms++qM/mrd+67fmrd/6rXnv935vnp/3eZ/34UEPehDv/d7vzXu/93vz27/92wB89md/NgCf/dmfDcBv//Zv89mf/dn89m//NgC//du/zfu8z/vw4Ac/GIDf+q3f4r/aZ3/2ZwPw0z/90/z0T/80D37wg3nt135tXvu1XxuA937v9+ajP/qj+emf/ml2d3d56Zd+aW699VY++7M/m7/+67/msz/7s3npl35pnp/3eZ/34UEPehDv/d7vzXu/93vz27/92wB89md/NgCf/dmfDcBv//Zv89mf/dn89m//NgC//du/zfu8z/vw4Ac/mGPHjvHTP/3T/E/00z/90/z0T/803/3d381bv/Vb89Ef/dG89mu/Np/92Z/Nb//2b/Pbv/3b/PZv/zaf8zmfw2/91m8hiZ/6qZ/iwQ9+MC/90i/Nc9vd3eVlXuZl+Kmf+il++qd/GoDP/uzPBuC1X/u1+ezP/mxe+7VfG4DP/uzPBuCzP/uzAfjqr/5qvuZrvgaAj/qoj+KjP/qj+dd47dd+bT76oz+az/mcz+Gv/uqv+Ou//mu++7u/m7/+67/msz/7s9nd3eWv//qv+ezP/mx++qd/mq/+6q/mt3/7t3npl35pfvu3f5vjx4/z4Ac/mFtvvZXn56//+q957/d+b/76r/+a137t1+azP/uzee3Xfm0AHvKQh/D0pz+d+732a782v/3bv839Xud1XgeAW2+9le/6ru/itV/7tXkuAMi2+V/gt3/7t/nsz/5sfvu3f5tbb72Vn/mZn+HWW2/lp3/6p/mu7/ouAL77u7+b7/7u7wZAErZ5bn/913/NW7/1W/PTP/3TvPRLvzSf/dmfzWu/9mvz2q/92gCcOHGCixcvcr/Xfu3X5rM/+7N57dd+bX77t3+bz/7sz+anf/qnufXWW3nrt35r/vqv/5rjx4/zb/Xbv/3bfPRHfzRf/dVfzf1e+7Vfm4/+6I/m0qVLPPjBDwbgu7/7u3n605/Oa7/2a/Pbv/3bAPz2b/82X/3VX81P//RP89ze533eB9t893d/N7u7u7z1W781v/3bvw3AZ3/2ZwPw2Z/92QD89m//Np/92Z/Nb//2bwPwOq/zOnzUR30Ub/3Wb817v/d789Iv/dJ89Ed/NP+VPvuzPxuA48ePA/DgBz+Yv/7rv+Z+n/3Zn81f//Vf8zM/8zPceuut/PRP/zQXL17ksz/7s3nt135tXvu1X5vn533e532wzXd/93ezu7vLW7/1W/Pbv/3bAHz2Z382AJ/92Z8NwG//9m/z2Z/92fz2b/82AK/zOq/DR33UR/HWb/3WvPd7vzev/dqvzXu/93vzP817v/d7c+nSJV76pV+a3/7t3+ZBD3oQ3/3d381nf/Zn8+AHP5j3fu/3BuD48ePs7u4iCds8P7u7u7zO67wOH/VRH8V7v/d789mf/dkAfPZnfzYAr/3ar81nf/Zn89qv/doAfPZnfzYAn/3Zn82tt97KW7/1W/Pbv/3b7O7u8tZv/db89E//NA9+8IN5Ub32a782n/3Zn81Xf/VX89Vf/dV89Vd/Ne/93u/NR3/0R/PZn/3ZvPZrvzbf8z3fw6233spf//Vfc/HiRX77t3+bj/7oj+alX/qlOX78OL/927/NV3/1V/Pcfvu3f5uP/uiP5ru/+7t56Zd+aV77tV+bz/7sz+a1X/u1AXjpl35p/vqv/5r7vfZrvza//du/DcB3f/d389u//dt893d/N7/927/N53zO5/Bbv/VbPBcAZNv8D3Xrrbfy0z/903z0R380v/3bv81nf/Zn89u//ds8+MEP5qu/+qt56Zd+ab77u7+b137t1wbgt3/7t/nsz/5sACRhmwf667/+a977vd+b7/7u7+alX/qlAfjqr/5qAD76oz8agAc/+MHceuut3O+1X/u1+ezP/mxe+7Vfm8/+7M8G4LM/+7MBeO3Xfm2++qu/mpd+6Zfm3+q3f/u3+ezP/mx++7d/mwf66I/+aI4fP85rv/ZrA7C7u8tbv/Vb89qv/dr89E//NMePH+e3f/u3+emf/mm++qu/mgd6n/d5H44dO8ZXf/VXc7+HPOQhPP3pTwfgoz/6o3npl35p3vu93xuA3/7t3+azP/uz+e3f/m0AJGEbgN/+7d/mq7/6q/npn/5p/it99md/NgAf/dEfzeu8zuvwUi/1Unz2Z3823/3d3w3Aa7/2a/PRH/3RfPVXfzUv/dIvzeu8zuvwV3/1V3z2Z382r/3ar81rv/Zr89ze533eh2PHjvHVX/3V3O8hD3kIT3/60wH46I/+aF76pV+a937v9wbgt3/7t/nsz/5sfvu3fxsASdgG4Ld/+7f56q/+an76p3+a/0l2d3d56Zd+ab77u7+b+731W781t956K1/91V/N8ePH+eiP/mgAJGEbSdjmuf31X/81b/3Wb813f/d389qv/doA/PZv/zY//dM/zVd/9VcD8JCHPISnP/3p3O+zP/uzAfjsz/5sfvu3f5vf/u3f5rM/+7MB+OzP/mxe+7Vfm9d+7dfmRfXar/3afPZnfza33noru7u7/PRP/zS//du/zWu/9mvz2Z/92fz0T/80u7u7vPd7vzfHjx/noz/6o/nt3/5tbr31Vj76oz+a48eP89Ef/dG89Eu/NA/03d/93Xz1V381v/3bv83x48cBeO/3fm/e+q3fmrd+67fm1ltv5b3f+7357d/+be732q/92vz2b/82AB/90R/NW7/1W/Par/3aADzkIQ/h6U9/Os8FANk2/0Pt7u7y0i/90nzN13wNP/3TP82DHvQgPvqjP5qXeZmX4bd+67e49dZbee/3fm8++7M/mwc/+MH89m//Np/92Z8NgCRsc7/d3V0e8pCH8N3f/d0cP34cgAc96EEAvM3bvA3f9V3fxc/8zM9gm8/+7M/mfq/92q/NZ3/2Z/Par/3a/PVf/zXv8z7vw3d913fxjGc8g8/6rM/ir//6r/n3+O3f/m0++7M/m9/+7d/mgX77t3+bj/mYj+G7vuu7eMYznsFnfdZn8dd//de89mu/Ng95yEP4qI/6KD7mYz6Gz/qsz+K1X/u1ud9nf/Zn8zd/8zd89Ed/NPd7rdd6Ld77vd+bl3mZl+G1Xuu1eO/3fm9++7d/m+PHjwPw27/923z2Z382v/3bvw3Aa7/2a/M2b/M2vNZrvRaf8zmfw3u913vx1m/91vxX+uzP/mwAPvuzP5u3fuu3Znd3l9/+7d/msz/7swF48IMfzM/8zM/wXd/1XXzP93wPH/3RH41tPvuzP5vXfu3X5rVf+7V5oM/+7M/mb/7mb/joj/5o7vdar/VavPd7vzcv8zIvw0u91Evx0R/90fz2b/82x48fB+C3f/u3+ezP/mx++7d/G4DXfu3X5m3e5m14rdd6LT7ncz6H93qv9+Kt3/qt+Z/kq7/6q7n11lv56q/+au730R/90Rw/fhyAn/mZn+Grvuqr+J3f+R2e/vSn893f/d1IwjbP7WVe5mV47/d+b176pV8agAc96EE8+MEP5sEPfjDf/d3fzd/8zd/wW7/1W/z0T/809/vsz/5sAD77sz+bW2+9lbd+67fmq7/6qwF47/d+b377t3+bBz/4wbyoXvu1X5vP/uzP5qVf+qV5yEMewnu913vx1V/91bz2a782n/3Zn81Xf/VX89qv/dq893u/Nx/zMR/D05/+dH77t38bgJd+6Zfm+PHj/PZv/zYPdOutt/IyL/MyfPd3fzfHjx8H4KVe6qX467/+a77ma76Gz/qsz+JrvuZreK3Xei3e+73fm/u99mu/Nr/9278NwE//9E/zPd/zPXzWZ30Wv/M7v8NP/dRP8du//ds8FwBk2/wP9tu//dv89m//NsePH+ejP/qjAfjt3/5tfvu3f5vjx4/z0i/90gA8+MEP5tZbb+W1X/u1Afjsz/5sPvuzP5v73XrrrXz3d383D/Tar/3avPZrvzZ//dd/zU//9E9z/PhxPvqjP5oH+u7v/m5e+7Vfmwc/+MEA/PZv/za//du/DcBHf/RHc/z4cf49br31Vn77t3+b937v9+a5/fZv/za//du/DcBHf/RHc/z4cb77u7+b48eP89d//de89Eu/NG/91m/NA333d383t956Kw/02Z/92QB89Vd/Nbu7u7z1W781L/3SL839br31Vn77t3+b937v9wZgd3eX7/7u72Z3d5eXfumX5q3f+q35r/bbv/3bALz2a782v/3bvw3Aa7/2a/Pbv/3bALz2a782X/3VX83u7i4PfvCDOX78OC/90i/NrbfeyoMf/GAe/OAH80Df/d3fza233soDffZnfza7u7t8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C3Prrbfy3d/93bz3e783D37wg/nu7/5uAN77vd+bW2+9le/+7u/mvd/7vXnwgx/Mrbfeynd/93cD8OAHP5j3fu/3BuC3f/u3+e3f/m0++7M/G4DP/uzP5rVf+7V57dd+bf76r/+an/7pn+bBD34wr/3ar813f/d3897v/d48+MEP5rd/+7f57d/+bT77sz+bB7r11lt5yEMewl/91V/x0i/90gB893d/N+/zPu/DT/3UT/HWb/3W3O+rv/qr2d3d5fjx47z3e783x48f59Zbb+W7v/u7AXjrt35rfvqnf5r3fu/35tZbb+W3f/u3+ezP/myen9/+7d/mt3/7t/nsz/5sbr31Vr77u7+b137t1+a1X/u1+e7v/m4A3vu93xuA3/7t3+a3f/u3AXjv935vHvzgBwPw2Z/92bz2a782r/3ar82tt97Kd3/3d/Pe7/3ePPjBD+arv/qr2d3d5bVf+7UB+O3f/m0++7M/G4DP/uzP5rVf+7V57dd+bb77u7+bz/7sz+bWW2/lqhcKANk2V/2/tLu7y9/8zd/w/LzWa70W/5V+53d+h+fnpV7qpTh+/Dj/07z1W781D37wg/nqr/5qPudzPoef/umf5uLFi9x66638X/fWb/3WvPRLvzSf/dmfzVUvFACyba76f+mv//qv+eiP/mien9/+7d/mv9Jrv/Zr8/x89Vd/NS/90i/N/zS33norH/3RH81P//RP89qv/doAfPVXfzUv/dIvzf9lu7u7vPd7vzff/d3fzfHjx7nqhQJAts1VV1111VX/0QCQbXPVVVddddV/NABk21x11VVXXfUfDQDZNlddddVVV/1HA+AfAdeV6LEbqm5mAAAAAElFTkSuQmCC",
+      "text/plain": [
+       "alt.Chart(...)"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {
+      "image/png": {
+       "height": 347,
+       "width": 345
+      }
+     },
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "t = c.sql(\n",
+    "    \"\"\"\n",
+    "    SELECT *\n",
+    "    FROM fnl_sales_newcustomers\n",
+    "    ORDER BY first_order_month\n",
+    "    \"\"\"\n",
+    ")\n",
+    "\n",
+    "(\n",
+    "    alt.Chart(t)\n",
+    "    .mark_bar()\n",
+    "    .encode(\n",
+    "        x=alt.X(\"yearmonth(first_order_month):T\"),\n",
+    "        y=alt.Y(\"num_new_customers:Q\"),\n",
+    "    )\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "alt.Chart(...)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {
+      "image/png": {
+       "height": 122,
+       "width": 345
+      }
+     },
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "t = c.sql(\n",
+    "    \"\"\"\n",
+    "    SELECT *\n",
+    "    FROM fnl_finance_returnsamout\n",
+    "    WHERE total_returned_amount_aud > 0\n",
+    "    \"\"\"\n",
+    ")\n",
+    "\n",
+    "(\n",
+    "    alt.Chart(t)\n",
+    "    .mark_bar()\n",
+    "    .encode(\n",
+    "        x=alt.X(\"total_returned_amount_aud:Q\"),\n",
+    "        y=alt.Y(\"customer_id:O\", sort=alt.Sort(\"-x\")),\n",
+    "    )\n",
+    ")"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": ".venv",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.14"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}