#
tokens: 63133/50000 1/526 files (page 323/326)
lines: off (toggle) GitHub
raw markdown copy
This is page 323 of 326. Use http://codebase.md/tosin2013/mcp-adr-analysis-server?page={x} to view the full context.

# Directory Structure

```
├── .commitlintrc.json
├── .editorconfig
├── .eslintrc.json
├── .github
│   ├── AUTO-RELEASE-GUIDE.md
│   ├── auto-release.config.json
│   ├── dependabot.yml
│   ├── release-drafter.yml
│   └── workflows
│       ├── ai-release-notes.yml
│       ├── auto-release-on-merge.yml
│       ├── build.yml
│       ├── codeql-analysis.yml
│       ├── dependabot-auto-release.yml
│       ├── dependencies.yml
│       ├── deploy-docusaurus.yml
│       ├── lint.yml
│       ├── publish.yml
│       ├── release-drafter.yml
│       ├── security-scanning.yml
│       ├── test.yml
│       └── update-dashboard.yml
├── .gitignore
├── .gitleaks.toml
├── .husky
│   ├── pre-commit
│   └── pre-push
├── .npm-cache
│   ├── _cacache
│   │   ├── content-v2
│   │   │   └── sha512
│   │   │       ├── 03
│   │   │       │   └── aa
│   │   │       │       └── 7fa6effa7f205c0354d1cff1aa5983d58a996b7ed716da0642f6aefd9e0342280791fd7de070475740797828d5d5fb7c20209d423e4250dc81ccea572cc8
│   │   │       ├── 04
│   │   │       │   └── 72
│   │   │       │       └── 7f10aaee348a897ff41a86fc704195caca0390db9ea6c9e37f130f931dc01ae6af8f8f24d330c78d402e03670e40c1fbde96c52b03a07aecd28ca970dbcd
│   │   │       ├── 05
│   │   │       │   └── 1e
│   │   │       │       └── 43b4d472f80b30589102c80d7baa1503bebac267acd73827e4418e734a66fde815546e9540bf4dd6a5c8dcc2d0b088b6c800dc7781e6c739c5d89f5107a3
│   │   │       ├── 06
│   │   │       │   ├── 36
│   │   │       │   │   └── ac5238b13c5752f8d2a4ca9732c8de4f9a0f373a5b2dd3e73abc6a2fd1d8b04c4a3a9a076a551ea1c5c12016e87842b02ced173ef4ab8627d4d50a3d19ce
│   │   │       │   └── ce
│   │   │       │       └── 31fb3fed118c646f6e00945cceb9a34fecdd5adcad388f7f5669a78f520f94152c7b9705050d2b75271ad435ef9a02ef0076d755fb4a971560ee12af01aa
│   │   │       ├── 07
│   │   │       │   └── 9c
│   │   │       │       └── 64367edfde90cc006ec5f3bb7de4729249d8a6109e6623a81d91a3352eae9898510906396501c4ade6c1218f61a2a89bbd181585d158fc7f4821631e91b3
│   │   │       ├── 0a
│   │   │       │   └── e5
│   │   │       │       └── 1eac2045db1c8aebb0151acc0ca1816a3be8edf3c55498ca5db667c882c91dcdb2d06b3275d5f2f7b2d3a899ac30a2eda148d0b6de8a8b7bab545b939c25
│   │   │       ├── 0c
│   │   │       │   ├── 4b
│   │   │       │   │   └── d5d99176af6ffadd5fad2bc850beb4766469f5d2cac76d7be24e572fecaa73c3c8d688d4ea6d58233b7218f11c6bace505f153cc410172b18618bf4619c7
│   │   │       │   └── f7
│   │   │       │       └── b9a5515a02c8a749a57a42343a81d89e7560dc4426d4ba241f41adb099657bfb10bd6c6ba5188f3e4dd466a059003da05793c0ab01b9e56362129e2278ed
│   │   │       ├── 0d
│   │   │       │   ├── 45
│   │   │       │   │   └── 89af7f942e9e335e6a25fd266415fdc91ac4bdfd222ff98dd1b7ddff5233e90e99250797f57abe0edcf3886d4b9427715782ab5ed90ed2ad4eb302ac24f3
│   │   │       │   ├── 6b
│   │   │       │   │   └── 4980e8d959c39aa171daa68623bfec5c3d968e5d78a0d9d2773930f4d67dd7e0916e81dbf5740ca364b6e316d1866355a0a728d2f4ab857acfe89a0fbc3d
│   │   │       │   ├── a8
│   │   │       │   │   └── 60c4a2eb1b2e30279d36798085e5e115a314910a1d1d21efb968601a78bfac7b2cca627390009fa368b3d36ef75f0f53bb7ab05a745704f5440c96bb70e2
│   │   │       │   └── c4
│   │   │       │       └── 630c2ba32bf90293f7147bc5f3f194a99bc992de634da6d6be8c6080e944840df92d94dbe6d7e22e67d7937036cd938d411f0a471de5be37594a0b3e333b
│   │   │       ├── 0e
│   │   │       │   └── 84
│   │   │       │       └── ba988a9e094e474eedc514f9cc47bab77688bad0caf4ecd3b9661705bc3adc6f0a83799741b7753ef2ac98f307f4b80126e8caa67cdd487afd1facf842d5
│   │   │       ├── 11
│   │   │       │   └── 3c
│   │   │       │       └── d5f5465209faebee25f63e9010bca5a554329ecb0d2da692e3f85001c26a19be9576bd25986d6d89965521d8cf21826a95862f6846645a97866ddaebc8f7
│   │   │       ├── 13
│   │   │       │   └── fe
│   │   │       │       └── 41ffc9210c7229cb80999a03c1c4ea99e9c57b3bad67b57950b352fd0d5e2c8599a3dac95f26e215279550e4c24123b4bf4164476ce6d5eea9277a2ce45e
│   │   │       ├── 14
│   │   │       │   └── 98
│   │   │       │       └── 584680da89ab5f12450af072a589c9aeff7486143e75ab78ad2831a8493cac4090677ce7315391b19e113513ab2807be8c6d3d0c06d9ca26e5f2031fbde9
│   │   │       ├── 15
│   │   │       │   ├── d5
│   │   │       │   │   └── 9bc5ffd5b08ba922af15c5bede73eff1e4e91ea1fe37ecfd69c1b77566679c911d4211fb42c58b3967095cd58dcbc24f20436f4130241e1de1468365610d
│   │   │       │   ├── e7
│   │   │       │   │   └── 70d1a66f921ca7a0f625039597acc080326fa7496759b7a973250ece93c4ba43e56c1e61e94569dd55127c05ed196e47cf7392d1607fb95ebcd770478b45
│   │   │       │   └── f2
│   │   │       │       └── a8e7b707e5e9518303c730748c6ee0a0140aac2c0c1c360e3a7e09c3973c78a2d38f23929df83daee2fe7aea3568f9a19705d2f5ce53d3a701c0498f3264
│   │   │       ├── 16
│   │   │       │   ├── 1f
│   │   │       │   │   └── 6b18dd0ca08e191543727c554d538cbd2d4cfddeef7fd0afb22e00366f04688f133c254d43cafbcc05a6e764f060316444009bd4da38d5ceaf8bac552097
│   │   │       │   ├── 40
│   │   │       │   │   └── 4cc03faa6c641e32ed5c3879ee181eb1e32ccf8e1a3c6a9e56b5b109dbaba6860a955db85e90a5103be85910bd6f53dd9adf01f0769d0701ca80505e620e
│   │   │       │   ├── 76
│   │   │       │   │   └── 62b03e9b3ac2ad016d1c2e26de5d25f280e9f820e5333eb411c7320ad87d8fd403b83797bb1f53c0ae988397e083c5a2c30338d5f551502047d079ad6620
│   │   │       │   └── 90
│   │   │       │       └── c3f63e1e16b74a41b3552260bcd4e17f30731bcbc70d5170b5b885b1514c6949190b345113994f940dd20289e16008cca66d9f36df967a08025e6ddc15d7
│   │   │       ├── 17
│   │   │       │   ├── a7
│   │   │       │   │   └── a82deef4e79206e8790cdfaf87f07ccfde91a8387651bafd6d2097ee237b48abea1f9d4c29dbfbf95578912441b579fa6312bc2cf178543fe8a663fecb7e
│   │   │       │   └── e3
│   │   │       │       └── 35b4b84efa695068e5aca44f16b2d83ecfa3f0c7045df2843c21771e5b3f7691f0266a54d17f4123ae8b907a8ed0b2c10f7c29f4e41e0886cd4af5643fef
│   │   │       ├── 18
│   │   │       │   ├── 17
│   │   │       │   │   └── 2c6f66933d8224db098964aaebb84a14c275ad10bda78ae0d6066b062e3f676c3acc3457d01605912d328043e2b8af2affafa904fb4205724e71d0189edd
│   │   │       │   └── cc
│   │   │       │       └── 46c566c580d2b56df24eb14f496c62d30cc42ea9879071b0028c9404d1cca53c7f27e7b05b92922605872b322b7e9109391143c39757ff9cee0c5ee96bd4
│   │   │       ├── 1c
│   │   │       │   └── fc
│   │   │       │       └── 29188ce4976f265b266a1b9da38aa0c9d76c1a3f5d4f6b5946a22c9490812e30b04fd2878afc2f3d7ac6d7af1b24cb9c1eedd7ddf14e7c9e6d128005a957
│   │   │       ├── 1d
│   │   │       │   └── 38
│   │   │       │       └── 605604f39c56109b865b34b66e0bfeb2f6b04d676074fbc378d1983d84cf2c58603121897c729da17ba39321fc7831535a0670947ab1bc2b11455a98dbc8
│   │   │       ├── 1e
│   │   │       │   └── 93
│   │   │       │       └── 21f3ea1a86621d3ae4b968528a63a3f2a20f8535a655fd7c893aaedbe18170b051dee7261f75b21a948e24def5369d20ea97b62c92652c787b11ac9a883c
│   │   │       ├── 1f
│   │   │       │   └── 1b
│   │   │       │       └── e177266c2b98bff3d459b4e608fa2437800ac9b4dd6e69f1b8cde4c8435319f627ca5417a0c62131c11ab8ddab308c01bbcdded77501b31478037d52a2c4
│   │   │       ├── 20
│   │   │       │   └── de
│   │   │       │       └── b0e0f4f8d27d6a4f04764ae0520cf3dd978c855f06065f84e0e7591f6e4fb14688f083a26c0ab279d66799273bce2f96abdf74c0a9d6db9b290a7443aaa6
│   │   │       ├── 21
│   │   │       │   └── c8
│   │   │       │       └── 4d7fa74de2d1e8305227ffb384f0b599d7d63aabfebb0667fabe719112ff1149b0556fd2cf27111c9f0adcc17ea2c52bda886a2898052fbb8612c57ad583
│   │   │       ├── 22
│   │   │       │   ├── 5d
│   │   │       │   │   └── 3e6e813bc3f5de6d41f2063ae813e0db072391191f4a2a6213cdb47b3324386a4a4e4583ff6666e102bd031bb466981aa83a765dcb6425bda8c9d90039f6
│   │   │       │   └── df
│   │   │       │       └── bd43e119bfcdc65fadc88ec5d0e51220fc5160d3683f632fbe344309e1ee65344c0125a61caa86902199070998d5fa2046a296ce310a76bda954f2ab7ecc
│   │   │       ├── 23
│   │   │       │   └── 7d
│   │   │       │       └── 11c9d3be6e79f63d0cedbe8db9b6cc0f1fec050637a1546b666a0914efcc8c7704f055fd76c2700e17e01e3fc4b637cc43fb950f6c686451f3f2bd3fa6c1
│   │   │       ├── 24
│   │   │       │   ├── 6e
│   │   │       │   │   └── 701d2dbef953d94fc775ac26e8374d60c74e5e221e452dab052146a41e5b65eaa638e4bba6b2be1ff23951e04fd0d7e3481dc3290517fc4f227d48d0063f
│   │   │       │   └── 91
│   │   │       │       └── 3565ad4d45f0f351efc14f7d18e388db111fd7528201d413f939472e5a090b71720982f2cd78636067b5fdb154787e13b0198bd5a97b086d7db432edb8c0
│   │   │       ├── 25
│   │   │       │   └── 31
│   │   │       │       └── 7df54ffa5c88c2068d30aa4539b0ad7482561edbb31146c7f0a22ab9cf338464b1d4dc0dca08c6b95ff6b37a4611089d0797023472b0174bfe5d1074f30e
│   │   │       ├── 27
│   │   │       │   ├── ba
│   │   │       │   │   └── 7ade1462023c35343130c355bb8b7efe07222b3963b95d0400cd9dd539c2f43cdc9bc297e657f374e73140cf043d512c84717eaddd43be2b96aa0503881f
│   │   │       │   └── cc
│   │   │       │       └── 7ff9f02546d7f9b76029a3c43c960234a1c7afcecf2b1219560c52a7796787359a0657587250b34bf3167b668259f47ba5b7bc63a8c09f7e808103fc5901
│   │   │       ├── 28
│   │   │       │   ├── 5a
│   │   │       │   │   └── 94f127c3ab2e4cf2543dcf54148bba1a2436a0fdb2befabecbbdd43c121d33494a8b14a0f401b1362d03d6063c01f93a0b7c5039ddfe45671cbbd31e006c
│   │   │       │   └── 86
│   │   │       │       └── 0b08226085f1d9c6a8d8044eeb132d0e06e4dde710874bbb47560bc22e4c7b4ad2286b1c0d5b784200b80452315f79193e306fd0c66a7fbed113105ded44
│   │   │       ├── 29
│   │   │       │   ├── af
│   │   │       │   │   └── bd4ebbadbfb1bc33a593e927a2456cfbf762b9a84a881841b35ca84013ac4e58063aa4f1fc53ef48637a0232fea4a9398bb2fed787fdb0d918a091e3ccb2
│   │   │       │   └── b9
│   │   │       │       └── b63de994402dfb4aa2bebf8c8c4e7f85ef10a2d1432f36a3fcc355a9b86f1d6c7a1d23df0f9cf31de30cf4450d8a753e0592af3c5c5d2740953da44fad5d
│   │   │       ├── 2b
│   │   │       │   └── c4
│   │   │       │       └── 318a283459760f3737be2a0420bf3bd97864683ea1b7d5e3552be33ccd92d13186a76151c06c0426cd1a9b440c2310ccbe2812d7bdd5a1189a3054915f04
│   │   │       ├── 2f
│   │   │       │   └── 43
│   │   │       │       └── aba62f2a1a9446fff35df87f74bc507ede21e7b9ed734921a634e38287518b27bad4295c15d87be28e9846412d949a15197b04bd560bf1608760afe7c6d4
│   │   │       ├── 32
│   │   │       │   ├── 42
│   │   │       │   │   └── 82c319574e0cfa085a09c77a42c27d3b18aa77ebe699caefeed8b9f656b0390dc7720999004840c14ddf31e708534102f90a261fe29ad728b72041dbf6f6
│   │   │       │   ├── 50
│   │   │       │   │   └── a0bf72bb8f50802b1bc27dcdcbb2b57cdcfc7bbb7a08fd31f5b0c86082afbed10fa778ad4970f5dd0917df0c0680c1f9ddcf6af8948357afa9178ccbe6c4
│   │   │       │   ├── 95
│   │   │       │   │   └── 043763a876d533c6f29097bd9c505ed14391221ec1af4ac546d226bd73945b5862f6088e02ec4a4f4bc513048a659e5cd988db95e7ac3e16e371cb7b72d9
│   │   │       │   └── fe
│   │   │       │       └── d03dc4f0f2db74f9cdcce912a7b1e396ece6a35e14ecbb79361548bf368e5efa879c26b1794557b4796dc917d1ce9eead2d58df006ed72fa7db186976806
│   │   │       ├── 35
│   │   │       │   └── 64
│   │   │       │       └── 36ff779dce8c7028d4aa782f582b6ea57d5f3314ae9c284778255b682c3024b33a7516328f5df85e55ab35fa0239880111b0ea824e974922956f42a65f18
│   │   │       ├── 36
│   │   │       │   └── a7
│   │   │       │       └── 29fade5c4c1f018a71646605e23099e2407d0fb14b76939d455216dd7de2af738002706dae427898ffcfa1d58bfa2b36b843b943ecf415d33d2889c13432
│   │   │       ├── 37
│   │   │       │   └── e3
│   │   │       │       └── 1e5d8a2aaf7a4e827f317f244f44437b8076a42d88e1b07856193ddf58088be08900b74883c35e108a2126d9b137d1ce575f9ab416d000dc22b97fdfc152
│   │   │       ├── 38
│   │   │       │   └── e7
│   │   │       │       └── 210e087817609c84e5fde1c455aa1bf2edbdc015bfbfad05f2b309b39866a445f90c8285958df9cb5a4462adf2c47ee0f8cac556d7a797cf0b778c723328
│   │   │       ├── 39
│   │   │       │   └── b9
│   │   │       │       └── a7205e215cd83506a8671e681b0c44c5f1d2cf0a08195818e441f859a5bb3366762eaf90d49634dc0878a2e4b0b7279134c9e3bfd4b20cc87f94bc7420cb
│   │   │       ├── 3a
│   │   │       │   └── a9
│   │   │       │       └── 4b2189b9033e8e0452f291bf1628d8a260a95c48549720363efa716f86c7a0b0ce583f321496abdf76a10a5ae3c37b4b158a6ae3b60487d43a3f2dc91979
│   │   │       ├── 3c
│   │   │       │   └── 42
│   │   │       │       └── 06098e6d4a552de7472ac8c5df0b35fea0e3ea374bee1aa5b36dc276c6f9e4ce4ab8ea83a9cfb7506930c175f2026f8375e3e1804540f0d97576378b6fce
│   │   │       ├── 3d
│   │   │       │   ├── 70
│   │   │       │   │   └── 9e407e6f3f59d8bf9189580edf77bce75b0d73d1eaae1ea7f0c20e364f8f0fa94d555a9a24e394123b4417de5981f73d033b4512e2756c93bb197a62d026
│   │   │       │   └── f1
│   │   │       │       └── 792d00bfabe4a782198843daef29cf196e00d6be6021d201339cc4dff8375656be6fd60ee482860da519ccbdda237852e681b925604272bb81d8d6f4257c
│   │   │       ├── 3f
│   │   │       │   └── e5
│   │   │       │       └── 6ed6a5dfcde7628ab987382df1286018799b4f715f60efa5fec60d850f8b58811ef57b0300df9637b02cf7ce188dfddc1e7d1a495f4c81720c22d5f5cd40
│   │   │       ├── 40
│   │   │       │   └── 6c
│   │   │       │       └── 5d5813cf17bfca0a5e9bc1958f2a9dcb625db6c63d171adcb4846a4f33b0a08a831263cdf57fbfa19f97a06866a6aedab04b56eee9f213f453da1fe24f3c
│   │   │       ├── 41
│   │   │       │   └── 36
│   │   │       │       └── 2e0deb12d15b6e1cd36f321f828e5289e0b26272408c500aa3944dfe8fcc3e465469c325f76a91102861736d919da3b5cd1b5b576be6d0a8813b1c85d3db
│   │   │       ├── 42
│   │   │       │   └── 9f
│   │   │       │       └── 166d93817be6e5829b944fe970db185e2cff2ad286ad73d5299a27a61080b11af14b6261e6f50a30559187b499466d2e80eb227789589a77fd9c5639ce88
│   │   │       ├── 43
│   │   │       │   └── 46
│   │   │       │       └── b3719a32898bc593e5539cc01a560fbb1f2e869f334b88933568e90365a6817382299f68b60d5533d4631c22fb0bb778f3473fea6ca5e4a0fa752e1a66ba
│   │   │       ├── 45
│   │   │       │   └── b2
│   │   │       │       └── 514b85164059331d34f057298c4d4bfc12a6213a9f1d38ebe22e3dae82d4e25d1691412ec62c6c594cb2f58d684c7a84827f9ce671992a4e5f488987d771
│   │   │       ├── 47
│   │   │       │   └── 96
│   │   │       │       └── 71f6670946a78202c3ff887c52b9e731adf421cb47d1a5282140115de89f3a26448a89769a3059920fa60903de08c132f78ce0990db0b1eb376340ad1d6d
│   │   │       ├── 4b
│   │   │       │   └── b3
│   │   │       │       └── 88f6f6507f3628937e2977e64b60c8827c40969944b9fc4872e672a4c1f1af2c8c5088ebc1c912b8d3b98ae381869d5b789210d4c5ce3976fc52e02c6f36
│   │   │       ├── 4c
│   │   │       │   └── 28
│   │   │       │       └── 25551b7395f7d137144c132477e831812c9a5ebac15c80c543f4f644cc02a752cd65282817e6ef41982d9883e2cbf4c8190ee80516cd5597e269e2dfcf1b
│   │   │       ├── 50
│   │   │       │   └── e4
│   │   │       │       └── a1b0fc33ecdacc52a851eadd215a315dbaf3b36edbfbb680c7d7f848adf44d2030679c159dd02c094c6bd3a67815966c0609d3fdfd997fb55ac3a9cb98cd
│   │   │       ├── 51
│   │   │       │   └── c5
│   │   │       │       └── 5f55f68ae127389bb5f77544a81e8a3340604415e0c2fb3568d3ab7df317bc0b31d265905e90d5c7fadbb435a947a25709fd0006a92e3a1de7fb41704833
│   │   │       ├── 52
│   │   │       │   └── a9
│   │   │       │       └── 3e82c7f2c883d4ae09b0914cd26570a6eb14a5630f94eaff12e10cd6a445b42447a99e88451a3ec2585462a33a0df5de21124cecadbcace20fc819ef6f24
│   │   │       ├── 53
│   │   │       │   ├── 1e
│   │   │       │   │   └── 328065acbb673b8ac1567bc62ed5896e266a95871a8ad9c2d735003901c0b741f6c636933b7eed18f1bff3d7aa572e7171658bd685dddf84163d0cb982e9
│   │   │       │   └── 67
│   │   │       │       └── 3524cf804eb4a5a184fd2a5cb1c74ff43800a3b0b150bff1e03d9b5c17b20da7ccc388c7b4370b9f56d1a4fb68322457012d332d0f98728b420a950195db
│   │   │       ├── 54
│   │   │       │   └── 76
│   │   │       │       └── f38d9361ee93db65ec9e436476815c59fa45ad7ba18f8d2784b84e42a140d509f482d9bd8985073bcb5e2dd7695ae91e0d118e2b5d51c1f9a50dfa4209c5
│   │   │       ├── 56
│   │   │       │   └── cb
│   │   │       │       └── fb9056979bea6d1c3319ee2cda46c3fbd0682b5bd341346b30b7d39969504b944d123690eaf1ebbf5465f217dafb3346b32b75b2ece9585ecbb260b1731e
│   │   │       ├── 58
│   │   │       │   └── 42
│   │   │       │       └── e747c96d01e41476955b36960cdedd5179094ccd826e3c32a65468132a18f093f6db9655401ad49693f38cdbc20d31d5f978e8a69476ddea6b767c28d38e
│   │   │       ├── 59
│   │   │       │   ├── 01
│   │   │       │   │   └── 3c1d8e5428225103af34c913eae58ea0145d6932ee45bbf5014bef3d76912a96fcfe1006fa88d749cc57d159304cb378a7d177c01699fdac050cb048ff74
│   │   │       │   └── 8f
│   │   │       │       └── f74d4304d31dca3d875147110926f5d11d5e0fc8fa14b31b596bbf25c08b7045044785dd94f713ac71a4ff6137fcb825c8023789385055121ffb16d0fc5e
│   │   │       ├── 5f
│   │   │       │   └── 11
│   │   │       │       └── 407da4bcd54592ed39c7394f97f3b2fb205152456ead1fd34f89b2645e365d41703af669ef2540da0d08c99e450563440dac5d917f71eae214069883e9b1
│   │   │       ├── 61
│   │   │       │   └── 3d
│   │   │       │       └── 46a8f48bf24267db47637a5317eff713469fd8f70e48647bdfc504d51eb3aa6b6c8c97b8bf51f32a29153957b984c8a4eb5158095e13503d5086f0f04ba1
│   │   │       ├── 62
│   │   │       │   ├── 00
│   │   │       │   │   └── 697491cfc90d94139c7e8654977277a3cc0bc3d1bdb65363ae00ffbc3a79494fe3e358fc6d8261aa28a73e4604cceb753d80dd18ceb61cef5476593fe14c
│   │   │       │   └── 5c
│   │   │       │       └── 559b200fce09df6b6d7d026e684db52cfed15974235f7ee9b98206b82334f452e29f9e014f64e554b3aa61020003ec3bc31df28911e4b58c3e60efce4577
│   │   │       ├── 64
│   │   │       │   └── 19
│   │   │       │       └── a11350bd2dc3e81fd5d949dc223ed6cf1d944ec009cccbe90815056b9cc0b16380ae765cf78013a9ce29607348ce8116a24f7b0859fa4ca265b66abda8ad
│   │   │       ├── 68
│   │   │       │   ├── 64
│   │   │       │   │   └── f16e96e0f3f6f925f5351d74ab6c7df05d9b8b3c970d11c65014cc4bb37a12ce0b55bba9c53e46db18652f05c523295d98c81f56c7169ba3e1c41fdb5c45
│   │   │       │   └── c5
│   │   │       │       └── 933533de497fc54cbd70cd6feb0b322bac19a5400a287def6dcf6da202936e4d5adebd8d659df4e6ff66c732eb11074d53cd8357ae000135570a67d2f1b7
│   │   │       ├── 69
│   │   │       │   └── e3
│   │   │       │       └── 661e70716e2d92b746aee950550bb25716584b94e9ef20895e3cd9e2c943400a5ce6b4050463cfe90622b78878ee7ce97003e736d3ff239e0a3bc5cae0f0
│   │   │       ├── 6a
│   │   │       │   ├── 61
│   │   │       │   │   └── 84cabafdddcaf7f155acaf643b8e274cf2b3b0f6d4e3f2b3966012d50d977b74abcf00e70cd30d7e604cffd62539a3825d5075b7190dda35e960c0c092ff
│   │   │       │   └── 6a
│   │   │       │       └── 5357458344d33ab7d8a6c73b040d35996b0669cdf7100c5a0f6f2b6eb79633dccea6546372802233aecff1d2f8fb786751c173855c3e057ddcc36f9471da
│   │   │       ├── 6c
│   │   │       │   └── 1c
│   │   │       │       └── b3af5f9ea75ce4e15b9b784555895e7ddafbb69471360596393a7cde859a8e3a0a2037cd3e98db42a8f9219f6824949a8ea715a03e86134a78410aaa4e5d
│   │   │       ├── 6e
│   │   │       │   ├── 92
│   │   │       │   │   └── 31bead3789fe943705d9f874caef524b87800fbe75e7b4373a5ce5fc515ab85d039597b970a24d00bc897e6fcce00b0ddf49a55364ca403cf6a05db2a61d
│   │   │       │   └── e7
│   │   │       │       └── b01f332f60bdbd8dd7904d520b79c49a64a9edfd12568e8642179396eb467aeff1a648b06438533baa1d4f237cc536d25b6992f9790bb5bcb7daccec23e2
│   │   │       ├── 6f
│   │   │       │   └── a8
│   │   │       │       └── d2bf1bd59f2a6d0222e36e458b13f94e9d1e257d3b43025f9e502ed1672f9041673ac11cc8576084eb106e3260f1736a888a1b430990f934f38597b7d105
│   │   │       ├── 70
│   │   │       │   └── f1
│   │   │       │       └── 8d93b90989f0ea548b6fee279cc7109402a57c6d1c0466f79c2f19c2e8f4579e1a83507bf35f7ef365bc35cbc4d80a80ec4f9c3b0613e85884fcee89f2fe
│   │   │       ├── 72
│   │   │       │   └── a7
│   │   │       │       └── 9fb91b21d76a56c86b08a0128903d96e16ede6471080f8e459bc0e24b4b4b322e094b56571188b978a01303b9ff2c1614c67640418a5af9191b5cc33136a
│   │   │       ├── 74
│   │   │       │   └── d0
│   │   │       │       └── 2fb0045ff1cb4285d2d1716050b44ab3155593ae35372fabc4d5ad65d2240e88fa417fbf25e754d5f01cce0b1b10b94de1db3ae6db536dec534b31fe7771
│   │   │       ├── 75
│   │   │       │   ├── 10
│   │   │       │   │   └── 7bf2cacdfe5ea0a96ba56a1f52af17989f179d7481b7d3e18ea8affd3a52d5c8b8371cf9ebe92a8e59358e5ca4700b6786602919e7d34db9282f4aba6038
│   │   │       │   ├── a3
│   │   │       │   │   └── a3f7440c563aba907ae0516c81759a218da2b906da1989ec63393ec9b20606733d03c27756cf1662a0525a68327d5efde0804d2937381f608cfcc872f800
│   │   │       │   └── c2
│   │   │       │       └── 855f78e7d0ca486978e2b2846f7b12095442b36aaef3dab64ac5ff8c4abf5391d9879ac5389b695c2e88eb8ff14797c9a4e55c4c99803e7ed4643ffde829
│   │   │       ├── 76
│   │   │       │   └── 12
│   │   │       │       └── 9ff74dd4fcf41963a6e834db4019d59b1bce5601b8d3ff5c58a19202ec5018d3259aa4e05056c56b0e5e7c5bcebffded55a4c341b5157831a5df74cc9214
│   │   │       ├── 77
│   │   │       │   ├── 62
│   │   │       │   │   └── 562c28af999613488a207bd32c805099aede7bd418a47161989230b59219656d3783946a99d83f2f0fc13f9496bc58659b6fb3e59bcfd725857b2091d967
│   │   │       │   └── 97
│   │   │       │       └── 4b4ed1a5c47e3b8cfe73cd5529ab55029854420395ff865b9735647a32741aa3ff3502cd830ba2df80b1bdee0aa454c8bb96de2db8f016f005b47b479357
│   │   │       ├── 78
│   │   │       │   └── c0
│   │   │       │       └── 6b11b047b69af1116cdc8c7416a1601f7402d3acda0d1bbbde0aa3dec9b8a3e7e9e626c78a8e7787d83316de4dc12ccd9b73053f7beb7a485de0d521975b
│   │   │       ├── 79
│   │   │       │   ├── 7d
│   │   │       │   │   └── b6e1fca9606766d0dde9da715c03323e25af187d1cfbcf8495257703bdb476d278f0aae4bbc55483ad6db2767f1381b31619e334c12071e1d137366b7b2e
│   │   │       │   └── 89
│   │   │       │       └── b441606d52b0566561b4777f3a386030d7a67df793e2395a3607b6e35926c779d1a5e5ed1959aabae6438681448d7ac1080e407d2126d383f24af5d84264
│   │   │       ├── 7a
│   │   │       │   └── 58
│   │   │       │       └── dc8040e5127b3fec05c5a2c0792bfda708ce0fec540f90673f0d62f2e6b985116bd96b21ab8a4d5df7f4086399c9e1ff58b15bc1900ea42691e7f6b21275
│   │   │       ├── 7b
│   │   │       │   ├── 0a
│   │   │       │   │   └── d74434c0a805e5925eadfdf91758d021157f48f8290a970eb38c4c24f3a4523cac19af7c69051b28eb9e5aa9869fc2d9dba472e3eada05ce677ac5d569b5
│   │   │       │   └── 82
│   │   │       │       └── 092aa37cb3662a311779faa568fb5378b34db475209553248505bbac1d4bffff9f78e6a241a159fde805f205a1d1a978290d0783e32a55f8cf71a357e93f
│   │   │       ├── 7c
│   │   │       │   └── 95
│   │   │       │       └── e3148786596741652419f62b7050f594580fe637e4bd092b38980d4dd6846c59e026e8229584e8b17770b35ad310916bed3729e9d0fc0db589153a3e0b29
│   │   │       ├── 7d
│   │   │       │   ├── 3a
│   │   │       │   │   └── fed3ed3b4eb6ed9e6214fac0edb28d53c3f3a08072b0fbb5f07feb16409c5e200137afaff9f0ab664666d2288c52c18936c0f3f1be80ece3d7bab2b1ae1e
│   │   │       │   └── ea
│   │   │       │       └── bdbede422630fa52908016aa17d4f671f25457aa01d2536ea80bfb35a8e4181420bdef7176655b118af4cf701de6cabce22e2129e1876139552b6a053339
│   │   │       ├── 7e
│   │   │       │   └── c7
│   │   │       │       └── eb3b433157ae199e8cbcfe5d6f5488e31dadbd499cb2a8f8100708620dc696f3025cd96dd7595386c78337a09067bffcdd519208a75803792f7c1b33fc36
│   │   │       ├── 7f
│   │   │       │   ├── 24
│   │   │       │   │   └── 088460e1cdf73da4ada41fa3e5f5ce010c919f3243ea932220603b61c8d628360df0561a0930c875f564b8529ff528c3c556936c4f6ab75a65e7d8dd66ea
│   │   │       │   ├── 41
│   │   │       │   │   └── 45a4875c1e09fccdc3d26dfd5d45ebf0b74e3b60c9da889337bb6c3645ec2b07e7e86ffcde3d972b3b24282cc30eeda04875d2dc40810ae5d62390b9c6ad
│   │   │       │   └── 72
│   │   │       │       └── 9d5113edc958d59fe45617ba62bafb6c0cfc8e074e5fd0fd94df0768ab589726b5d3dcbf315addd14f7e6f4fd37eb139796bf15d7b27a9d3fb25c6f152bb
│   │   │       ├── 80
│   │   │       │   ├── 13
│   │   │       │   │   └── b20a2571ad76a461bb0810cfc3ee5ab35d5d27837b68b7ebba141ab227d0aebc3009ab0f979b11f9f2919bfa1980466cecf60f5319d18e8c6672ee5ce16e
│   │   │       │   └── e2
│   │   │       │       └── 879241f4307f0e5a82afac4d57ac9a294e7152edd7234c37cce8e9991e85f545996c735b8d146092668b171ca3639638f4b661454f0a895195085cf04fde
│   │   │       ├── 81
│   │   │       │   └── 34
│   │   │       │       └── 2159872524c81acd6fe2bfecfa09ae0309057356f3cd16746072e23309de6079f18391e5b666a924ddbd1848ec65924e38b515318909593644389af6a8f2
│   │   │       ├── 82
│   │   │       │   └── 06
│   │   │       │       └── 35fc6a4769192719292c0abf2b072d271c2aff9c6977daed1b00ca945ca4350ec4f88cd6d5c213ac83647a105b42f59605fcd1826144b5ee690a06d17cc6
│   │   │       ├── 84
│   │   │       │   ├── 79
│   │   │       │   │   └── 4d3a41a02d827d4087dcd49a2f9328190acc7549f0033f7d81c2886e36003dbaa4254da63c5adca84d9b69b4fdcc27aaa8ed08d91be06ec61f2855ed6a8b
│   │   │       │   └── b1
│   │   │       │       └── c971ecc90c5fac945891d7d8677fa7178bf6fccc23b853378d0d5209bb8150d0c7e968a5095df5ad6049e82a07d6bdc52cd310f81f211930b9c3e66c742a
│   │   │       ├── 87
│   │   │       │   ├── 51
│   │   │       │   │   └── c8274b42245cfba0f50963b50f4e0c1822647ef67eac0b1f19aef5f2be17651e402f82b24cde8aeddfb34c58b02a07ba6605fbc37f987cd1a4c706c553ed
│   │   │       │   └── 71
│   │   │       │       └── 5b8ac6b69ca18fc42a66f3d1e4df79412ec9da181bdcb50a2968148e5bfb88b3a1537b5013c809ca149af356cf6fa4676c4deef7585dd5e2522c93819a73
│   │   │       ├── 89
│   │   │       │   └── 83
│   │   │       │       └── 4ecc75316bff72be6a6ff571991467ee0999b790cdc344e13b9b699401301382e6f36f484e96b62191c8600c9ef62a15d3f2f7c2800e1b6ffef0db64cf8e
│   │   │       ├── 8a
│   │   │       │   ├── 4d
│   │   │       │   │   └── d9802f5d63f95855533ef8e212b1a6037a0d6d6f456d3f9b8bde8ba1d64a0639a50c0cfa5b1487a2e099058a659414f9fdd2c6cc34c5d000854e96760a24
│   │   │       │   └── 97
│   │   │       │       └── 1f9c6fe9e382d2b35525df2f2f42927626596f77609512fff85ab306c45b554a1645809137769b0f9d225c5dd00ecbfb1208bb9417a6fe6eed3f8ee575d8
│   │   │       ├── 8b
│   │   │       │   └── 24
│   │   │       │       └── 57649cc4cc2d8bfaf6bf56dd7d3ee5000820cbdc9b7a9a8699063ff5b0cc59d283f106057e573a80b237c49f1f7316aad99a7fa500c3467d74720661b904
│   │   │       ├── 8c
│   │   │       │   └── 28
│   │   │       │       └── bf40a50cdabd49bb96b727ae131f60394a9280821d0ba649f2a9d4389ba0c2574c49d871b5c40451c0d18f41f8b548b74b599d4e273e85e0e30104d88624
│   │   │       ├── 8d
│   │   │       │   └── 02
│   │   │       │       └── f79519e871a16dbb7574d094e8633ff8424356b30c628c368254d6518914cedc74032ec76ed59b66214bd5e323e9fabbd69b98f4cb44c6fd2eb572e8a34e
│   │   │       ├── 8f
│   │   │       │   ├── 45
│   │   │       │   │   └── bda0c24c37e625fa1587c9283016b66e926b7cd38cd4f86790f318b07d951687a9f63eb43e5f07d589e09df82b387ee6d19016db83ecd7126329377eef45
│   │   │       │   └── 77
│   │   │       │       └── d52e0bd3a39dbb6a7c98c893864d825b1bebe79d062f1349b99a691cd532be9f1029a6408b3082f4699e1d6e55423681928619be933138654ca4068320e2
│   │   │       ├── 90
│   │   │       │   ├── 0e
│   │   │       │   │   └── 56428355a38b7d94dc769103450b129e065e486db48d065d4cfed2e4c3d5829fe871341016e5087c81d86ceb70899e18c9db3416168a8f24fdac2b5015e4
│   │   │       │   └── 69
│   │   │       │       └── 067a0608750b0e6f85e3b1f33deeb5ec887681c1ca3e84523aea83b8b3d2d4f8f2c00b9a09ee485d395171921b2695ba54a8302f5f0d750a5b973fe8e41e
│   │   │       ├── 91
│   │   │       │   └── 11
│   │   │       │       └── 91670ddb2e5148483060c13480d5330114de89e865837ae6e60c4dc017edfec972fc8535aff2be6b90b6ea6176384633e4fc4cc79c2948df341fd5c1661c
│   │   │       ├── 92
│   │   │       │   └── bd
│   │   │       │       └── 17dbee98cbfbc9ccb60950f09911cf127d071ffb508e16802a6ae266ef8ba6421b5af4cee53491cfed0412def92f7062d051b5a9333c2b5d8c2b633b4728
│   │   │       ├── 94
│   │   │       │   └── 6e
│   │   │       │       └── ccd41785b69a3cbe6733bab9c3cb8311092f5d44d32d9d86157b712c156f3dc877209bed0d1511c6d366687506a1b17ccd1f1fb86fac924ce266825906fe
│   │   │       ├── 95
│   │   │       │   ├── 88
│   │   │       │   │   └── 86f66880d649a434abc280f67605abbb47711d06bfdea32cea11a9429704d0564033bbe4f9d5c883412b9525389f7f29fc9865f553762c9f263680b74248
│   │   │       │   └── cf
│   │   │       │       └── da6a19feb78fd2595fea726ba6623ca62ec59f37710b869995b9416382c391aeeb993d54b0010af2abe1c71af3bf488d8a557dba6f1f849fece133c83c85
│   │   │       ├── 97
│   │   │       │   ├── 2b
│   │   │       │   │   └── b13c6aff59f86b95e9b608bfd472751cd7372a280226043cee918ed8e45ff242235d928ebe7d12debe5c351e03324b0edfeb5d54218e34f04b71452a0add
│   │   │       │   └── 9b
│   │   │       │       └── 930ca6e7be7018e79ca9e2f88256e0094e45700f6042e4f4b7be887dc897ddb413ed3d5f1c7cab977e75d565d9d5a36a2335aab01309f3246a780e66ba06
│   │   │       ├── 98
│   │   │       │   ├── 9a
│   │   │       │   │   └── 68e84545cf186953b6927c75871a5e5f661d07ef805b585fa7c3a0c5be109626fd58145345d8bb858e94e1b66b59937dc1c3d4eb628c1c660dea5c352de7
│   │   │       │   └── ac
│   │   │       │       └── 864ad4b45e218c1f4de4d9f3b6c472c17387abd03684f2342e86b2ad5e72f68852c8c6e8ecce321554dbbecfb4675963f590d69a590ed55a1a6caef56aed
│   │   │       ├── 99
│   │   │       │   └── 98
│   │   │       │       └── 448f12378f9292ce130fc418d98bbf63a156f6d27e8eed850861153c0edcb5e811bad603432cc61b4f94549f2d43e8c48367de701b7ae30eca763af6018a
│   │   │       ├── 9b
│   │   │       │   ├── 3e
│   │   │       │   │   └── f67c86d00bc662f0c2cbed99d6642875488172be12158566b611303af794512f2efbf85a10234e59382d58b563f336d50407396c650a1f409d4af467e88e
│   │   │       │   ├── d6
│   │   │       │   │   └── 15ca4945a64c3bf495423b7131b87e3a97bee25d335e002733b2994ad038333639a7227df838fbdbb1c2c77dc3c1de199a53731445c081b4fd0c6973eade
│   │   │       │   └── d8
│   │   │       │       └── 13c11921cb696f08f7ba409a787771b54d81141e7fc5cc952dabd3231f8e9a9f5c0953e19da060b954ba1ff115fc16dfc3969b21029921b300cb6731c871
│   │   │       ├── a0
│   │   │       │   └── a9
│   │   │       │       └── db845c91217a54b9ecfc881326c846b89db8f820e432ba173fc32f6463bfd654f73020ef5503aebc3eef1190eefed06efa48b44e7b2c3d0a9434eb58b898
│   │   │       ├── a1
│   │   │       │   └── 16
│   │   │       │       └── 42c6790ed2f6bb0d8a2fa3d42ec39ae52b1f8c51fd99266c3eb50ad3f93da11c955666ddd334a871eb7e5d32df2d95fe4b411dc952edc2ec440075d2e4c7
│   │   │       ├── a2
│   │   │       │   └── 81
│   │   │       │       └── e7e49fbe8656a387fddebf50395ed76f90be5bde0d8da3e071dbaffa84d3fe80032b33ce9dc72a6feccd310b2b6c0ff2cb4e3b96afa5f64be198029a2977
│   │   │       ├── a3
│   │   │       │   └── 07
│   │   │       │       └── a03949db85191d4909f468f63cea33e3f1165e5851039ea92a6fdfe71c1a212684a0e979a2c59001a5d077f9627e64ac9808c3c23101d3e903dd678b2360
│   │   │       ├── a4
│   │   │       │   ├── c8
│   │   │       │   │   └── 4e7c50cf8aff6de638c85e41e8b169a44b241bbec80454d933d044476ee2e1d93ffb8f832aaa9cf9db715ef0c558f3d282e9287f41f4b6b0cf928e014373
│   │   │       │   └── d8
│   │   │       │       └── d31dae18a09757cdcfbf9ddfbba4eb2ced665dbc390b2319d6d3458cfe3931794c1bd7d09c8fd0990c0a836ac2b52e4c7a32da40824f2c2e9ad2828e9633
│   │   │       ├── a5
│   │   │       │   └── d9
│   │   │       │       └── d16d0e1c40b653ae71d75bbe980854d13737e87032bb5a41cab0335e2c19e80fdd1b630c2916090388deafd50c7901422926898f1dc9ee2272e2f790c246
│   │   │       ├── a6
│   │   │       │   ├── 45
│   │   │       │   │   └── 2e8a52ed9bc6f424126dd4d7da19cb119632aed03ca6dd744311f5edcc3b07a99242b1ac823c861dbc4ccb33ef1cc3f1b4a158438644851d2e6cc467b931
│   │   │       │   └── 5b
│   │   │       │       └── f44a23e04004f4fcb8c2d0c986b28a3fb1da52e95e13a4e500c4ee09dc39ef9cb2da2279cd87d8625354a51a00a3b11bf49cdf53bd7f69591a959d91fd93
│   │   │       ├── a7
│   │   │       │   ├── 32
│   │   │       │   │   └── 6ad76b4469a221aa36f3a42baffceca9258fc13dabcea1f9be75b69bf8c1cb6a3cb6efbfb594b9ba245706805e5eb2427a9aab868ab857636183ffcbbc52
│   │   │       │   ├── 7f
│   │   │       │   │   └── 3b7e7150102a863fe3f0c7edf01b5ebed441e1c485f1b97a3ac58ab37da80e535b9cde6231a3b7f09c4b2f1b566035d0610bfe0557ac9ae62216f1c01a50
│   │   │       │   └── d8
│   │   │       │       └── ff298663e8ee2d918a19a0a00435a7537ce757a337e6dd8597e213c9e56d4ce61b5be30c4b719c5054fed981c51f78a88f5389a1922dab4dcf5248e83c4c
│   │   │       ├── aa
│   │   │       │   └── 90
│   │   │       │       └── 80bd197db2db8e1ef78ab27ec79dc251befe74d6a21a70acd094effe2f0c5cf7ed2adb02f2bf80dfbedf34fc33e7da9a8e06c25d0e2a205c647df8ebf047
│   │   │       ├── ab
│   │   │       │   ├── 20
│   │   │       │   │   └── 87e36d5840f4b65850f10e37ed7dcd5947958a433573aaca789fd3369108553a8fc1c9a845a143497e5e7c90e70419f43fffbc1e1530e19beb2cf0473183
│   │   │       │   └── 90
│   │   │       │       └── a0dc68efd52e822d9d3b85754d0fdfcbf354308c8deba163bd0d9a25aa2ff3ffa91a4f516c78729887b3f82207b16c569db31b0fcfda64172e02808adf01
│   │   │       ├── ac
│   │   │       │   ├── 1c
│   │   │       │   │   └── 7865a5ac22a0bb027fcfbce2f71d4397d8847e951d782302ffd6e7dc65b329403a8408bddfe2410655ebc3a9e60ba4322b2930e6d32a039078654b548e94
│   │   │       │   ├── 51
│   │   │       │   │   └── e187fe9d41cda368bfed295f36e4ae7ad00117f4fd4cabc1ae41877ea3efc3cb5e620033fcab4d2b81c9906697165c165c9eb06d09c3f255e6bb627c3839
│   │   │       │   └── d5
│   │   │       │       └── 1ada8215399d75d02c07b0f09d6312f36af582cf44d1c5602926e26a7c8ec08371d2d44f9d457f4118c891f13f54ee29cc1f09f193c8a7148fddf9901d61
│   │   │       ├── ad
│   │   │       │   └── 48
│   │   │       │       └── d0a32ede8194fd5d855704ad637bd724067369eeacd164e84b431e51704a767421a55e8fa6bfabdfec09b82e29847050492086734867e04ea73d402acf4b
│   │   │       ├── af
│   │   │       │   └── 39
│   │   │       │       └── 5d2143741ba08238f96ddff36759c58c63b72cb2ace9b9d61da859fad9b26bb3996e4ff4755f8d512979dae21b107a1b67fbf120fa53187890dd08590d35
│   │   │       ├── b0
│   │   │       │   ├── 69
│   │   │       │   │   └── ef6f9766ac968a119f8b0c8a60baf757ddb0e5125966bf8fc2950f5ac1c98266b971e63432c8c58533990123e13234e0830e22a4f22974cdeb97dd9960ff
│   │   │       │   ├── c0
│   │   │       │   │   └── 6287fba94763d8f3bc9319dc82b1dcedef258efaf60c010e7ed197574d26380855104a640b6e1789895d846c1f52d4eb20267e7c0f1fc6687bdb0502bf99
│   │   │       │   ├── c4
│   │   │       │   │   └── 86eae8813cc26b7dfb5c095299e8d9b392c4d3b26e95a0736a0e93e14e5a532b33da47ecb9f8c6756f22a21ea62399d17e15f3c3819ecaa7043faa2e8914
│   │   │       │   └── da
│   │   │       │       └── 8dedbdab711791e11403743c443259923b3cfd3c763ac2b6dac038489319c7af46f4e0247e6e42be79aea56dc8e06bb9181ea26bdf8bfe4ff5e3ceb61c32
│   │   │       ├── b3
│   │   │       │   ├── 1a
│   │   │       │   │   └── 7f56449634bc6e62aad466db2af6562e57fda7258e005182788e3cd7642e657eb8cc865a4aaa3e607779c9076547a315a3328ee124b9c3d889af9f2a814b
│   │   │       │   ├── dc
│   │   │       │   │   └── 2c7145ba3c560a768d1533825be8d86c4f0afbf5ab6f4e664f0cd18f995a035188194d8495b01f2313f3cfdabbe528a40ef97c4127901e9e647b28e19f5a
│   │   │       │   └── eb
│   │   │       │       └── 39f998983a92db61bac89488a0adce33ed82cc1956815b337a97ee86515ad142f4d3d45ad1e332c7c5713591623b4b4017b0fd21eaaabe2843c2c69fbeb9
│   │   │       ├── b4
│   │   │       │   └── fb
│   │   │       │       └── 863930d065d0bb76f5651b3768e84387f4152d72303c3bd9761825cfa8c81d4e2c9c938025b8679f319c4b8d611f9626ba4d029f8475dc6ff586fe5979fd
│   │   │       ├── b5
│   │   │       │   ├── 37
│   │   │       │   │   └── cf317838766ab773d9617270de8511dd367bf7467f2b2288457a4bda388fdd00f3b1dc6a77e57848299423f08c9195f61ce16ae9d89f77798b9bc8cc57dd
│   │   │       │   └── 8e
│   │   │       │       └── ec56dd722fda33231be66ed379aad987da4ad770109f8c488280a18baae9c91ef82f646d8f725da843791b7190116f50461077642f371818ef329d59627a
│   │   │       ├── b6
│   │   │       │   ├── 3c
│   │   │       │   │   └── 0ce5ec4c83a046448fa43664e7b4db2f7594b55fc045612ead9c9da1747d2457133afde559db1cbe16a4ad496bd89ad7c53032c8c6eae8ac7c0329f0f3e5
│   │   │       │   └── 47
│   │   │       │       └── c51185189afee296af509cd342d0b1db64f8e4429ebd9b6a73eb6e59d67b5aa459b73c785beab5152061562876c7b4f09cfd2d913c0d1fa4e78814d23d63
│   │   │       ├── b7
│   │   │       │   ├── 63
│   │   │       │   │   └── 839645c14329fb8e497a4cd6b0fccb55115bc819e9490c21b8d4e92afcac14b090704385d566c1c055490ae2606fddec22012dcf1ae516b98d81a0ae1953
│   │   │       │   └── 85
│   │   │       │       └── 3df3088c6764797e7a179e32a80030fa7cbf022fef63c8c7f3ec5a65aa06d7ca593d705bde0d7b806cf0f7f944fdb66541229b42fe8d10525f7d39c896ce
│   │   │       ├── b8
│   │   │       │   └── 24
│   │   │       │       └── 3c28a65d120aeac2fb2d4de11c5f6593118bb868cbc14a7c4c3c8c10a707a0d9b55ff09e592f29a2f3f2075cf6d3db5a2a9d1edbf4e9dce27ae4e5b903a1
│   │   │       ├── b9
│   │   │       │   └── e1
│   │   │       │       └── 1ea67ba3a6a79eda8e5a2189ef1d4e82d00e3630d76c2037aacb907276b92e0b947566e5059e6dbb11e1491a8107250827dee95e46f9935da2607d76ede2
│   │   │       ├── bb
│   │   │       │   └── cc
│   │   │       │       └── 7c0db6fc0e8b37e0cecdf29e1ee0017ef818b50fe96af9d9110af2e2e50b9bfdd23be59ed84c85c17b30382db2084a5cbe11c9f4e5f7687f3670ab23afa6
│   │   │       ├── bc
│   │   │       │   └── 5b
│   │   │       │       └── f1455b099cabb9d8a6727135517bc28c43a223700d02c2cea588290de796c471d64d7cc6c97b7b6483d75b3fc88fedce342dbef7bafbcd492b7596a3134a
│   │   │       ├── be
│   │   │       │   └── 60
│   │   │       │       └── c3d7e8b035532cd971773988d125be5d9f3a7a698705b0a413fd08f7a91ae9efbbfab450561406f519cbe50fd85e2505f8be0a06dad1cc9e82b0c5a61a1e
│   │   │       ├── bf
│   │   │       │   └── 18
│   │   │       │       └── 54cb827c9727b28a71fb033975a5d778dc6261647fed3f6c1e37c4e7b506e5398f80d176d3f03264d7fa023ee38eca0fc96bbe7bac6d028077160bc39f30
│   │   │       ├── c0
│   │   │       │   ├── 0c
│   │   │       │   │   └── 6be3097ad962bee4229c4963415041ba3e48c57906c8c41a44937e26387be6882937d0d4ecc066ddbb4d152f7b2470c4b1448494dbb0a965e9876f6159f1
│   │   │       │   ├── 16
│   │   │       │   │   └── e9bfe3507ed1c3746f3a41cd292325e4e48477b4cf157749d62ca0dc5fc9cd9f89d714e170b0abaac36a2403fd43fe6a5a0249aeca776b3c94d80cd66d17
│   │   │       │   └── 1f
│   │   │       │       └── 0e75de3b862a4efcce4709d870b00fe43a864938289e23df5d43fe767ff3b8e2581e0eaa4feccf7d226fea861e9fa9f59a0e0470e42d2929412aaca5ae8a
│   │   │       ├── c1
│   │   │       │   ├── 2f
│   │   │       │   │   └── a1020252851d0a844bcf240adfb8f54dd7e1f3d6dd18ea7e632eb1906e46f8bab80f13fd11bdefb590c075bffa16807826e1621c57e8bb176a53563fb689
│   │   │       │   └── ae
│   │   │       │       └── d88f25067cd667808fefb4ad141c037e9600c2c413c2ca55571a9d33bb9f45cf96a21ad3576aadc3848a2fd3adcca2b07e55fb9f2e1dc9945d8a7532b7c6
│   │   │       ├── c5
│   │   │       │   ├── 23
│   │   │       │   │   └── 32519743bdedde63440ebffface305fc949686914dfcc2075cb850df6d2d7e4880f9d2c802eb2a8dc6d157eb74cb4442d5b2280cc8b486369e7e83e7d1bc
│   │   │       │   └── b6
│   │   │       │       └── c21f9742614e53f0b704861ba1ec727cf075ee5b7aac237634cce64529f6441dca5688753f271ce4eb6f41aec69bfe63221d0b62f7030ffbce3944f7b756
│   │   │       ├── c6
│   │   │       │   └── 4a
│   │   │       │       └── 67867eda208dceb36587eb399998dfd962207f9a25345a6c58e4d905c66c7330b2808b28d74afa4d79e91cf4d17769eb04d23d57f905b347b51db9143e02
│   │   │       ├── c7
│   │   │       │   ├── 94
│   │   │       │   │   └── 4bf58da9e7e4a1dc3dfc161f62fe243964af9ee31b9745dfe919b3380f5ded828fcc1b06edb5493c7a6cad72bd58633058b3e6a99d49e00431587e98cfb9
│   │   │       │   └── 9c
│   │   │       │       └── 4fab30e96ea730f3dd6b17884ae570f6a995a64029b6f853539b45c9fb64aa09540c15d496b4035a767b9b922f6c61c05ad88cba5a2e82f1cfa0a26c605a
│   │   │       ├── c9
│   │   │       │   ├── 0f
│   │   │       │   │   └── 42a371464ab760d591f588236bbdb498921141ee5849b2f5dfe4ce0e73fcdf4490c75edbfc83d0ca321b2b502c8ec705d8e66dc9414c5792531d550ebe2d
│   │   │       │   └── b0
│   │   │       │       └── 7244d7a1418095d97556fee24a89d1a3715b1b33d5845c4d53389f9dbcc6f9de8e2f983971f95732a5a2b90f1bd0d170d34359cf7dd294eb7a72f30a3002
│   │   │       ├── ca
│   │   │       │   ├── 87
│   │   │       │   │   └── 4a20524d4b42f751277b655d217ceeb1056a3c4319403050c7c8ff0667257b3a951e95ddd1ce7934cf7d1593e4af44057aa38fdfc44c54b3b33453189c66
│   │   │       │   ├── 97
│   │   │       │   │   └── 66254fd36c16f2d83c626eebfb64b5b706cd5012633b9c78c400d7e88492ef1345d5ba38ac9f5a8f25c67183ea83b9cb2bf9b3fa7cb0f5acf4b702127b11
│   │   │       │   ├── c4
│   │   │       │   │   └── fc9a1762c562ba1f0de2d55d80791a99e567d78351b8de6aa86253369dceb7f3c16ae63717cabe6646ca9588bc7f18961da0bd1b7d70fc9e617e667fc8a3
│   │   │       │   ├── d4
│   │   │       │   │   └── 080544005e733d3410ee04a580ae76e113c7c96cf6c46ef911e81db70436e4c5e31aeee0c4390aa643707d5df971f8f640d2b3cbbe2d6ba72d998a391b9d
│   │   │       │   └── ee
│   │   │       │       └── 294450a70a4b84bf3b89e152404c8f083f74a4ba786211b0155a743137bbf8eae432a8c53c73d6901f31714e573a3eade2972c4440e3a31bf1c8e3cbd1eb
│   │   │       ├── cb
│   │   │       │   └── 86
│   │   │       │       └── 2d309376a857f6fcfc38277e510b28f343876db7c89627103f93c9e61d4b32837103654fad9dfc59b28e3c41256aa36b70d43f5ca9e1d686c000cb8d04f3
│   │   │       ├── cd
│   │   │       │   └── b0
│   │   │       │       └── 7dac22404f5adb8e25436f686a2851cd60bc60b64f0d511c59dc86700f717a36dc5b5d94029e74a2d4b931f880e885d3e5169db6db05402c885e64941212
│   │   │       ├── cf
│   │   │       │   └── 87
│   │   │       │       └── aa26f7e236714c1c822f5cfdc2639ef2d9626ce60dafdd7d339bd984264ae436fe2b0f1bbeb20f4987c1245f27aa06407b48e71ba28f5d315aa1cab00222
│   │   │       ├── d0
│   │   │       │   └── d2
│   │   │       │       └── 50e0b14552e5a413b3b17f486d04a4baccb9248c11fe84cd6e93b360ef4e51791f26fee7a576ecb50c1a343f20573ca567040e9806553de0c0465eb4810b
│   │   │       ├── d1
│   │   │       │   └── 1f
│   │   │       │       └── 629116faebc1c1ed00f14f5be4a6e501b6a739dd8c80c0cc0679414a4688d8fcd58abdd67ef5462d45f1a686a35b4644d256931b9b28578a9145bf671bfc
│   │   │       ├── d2
│   │   │       │   └── b1
│   │   │       │       └── 60fd18f643ad8d0a6eb68d9c34417edadeccfa402414d0ba5974dac95fc6f2446686553a9bad6f630282001f2310aac369799f356204a2cceb79597ab43f
│   │   │       ├── d3
│   │   │       │   └── 40
│   │   │       │       └── 2ad23a9449077c89d8b4bbd6bf341d1ea1cf3711c191c9e4bb1f529d607c1f16c85709b8afcbcf0beb01181c36cd694b424413bfb590016508a7b4c3b0d2
│   │   │       ├── d5
│   │   │       │   └── 41
│   │   │       │       └── 16457ea39ce036cb81f959ccd9e3880e3a34c49a5aafd6e356e0600910ee7e6dab82061bfcb2763ae48c39fd5392fe084a37d82bd8a8e72cac6bb2fa0c57
│   │   │       ├── d9
│   │   │       │   └── d1
│   │   │       │       └── df4e80a3fe9cdc6b60a4ef6e0e6792f4115aebdde1d136c1bf6f7c5024b036859a55092f7d6cb017fa19b52075c3127cd4e9bcb9cffe4c218efde3f6bc35
│   │   │       ├── dc
│   │   │       │   ├── 17
│   │   │       │   │   └── a5b7ab5d73c6cf800b5b72676d349962ad5a139846f97b6802f783e7930116f6323a0801d47a81bce6d8d63f95aabaa7dabe832d330886e0ff76e9928ab9
│   │   │       │   ├── d6
│   │   │       │   │   └── 84b678e2efff1539dd12f7425ef76630d3778113ad0ec39e45589e122824507d3a7094f30c0542a0834a23f485fdd982d6bb91213f5ace9f249af4b49c6c
│   │   │       │   └── e4
│   │   │       │       └── b3dd369c516cb85ad397577f03820c31a2a24ae3e78390d325e59fcc2596a850f68fe3ff657fcd715cc7b523645e4c0a6dbdead95296cf638c16c16c8be6
│   │   │       ├── df
│   │   │       │   └── b6
│   │   │       │       └── 709849a279c02c19b1b4bdb6a81743d23ca14c40b8bdadcd835424e4c0b6afdfccc3f9421aa8be1837a5e111d4d5533ded5d7cf3f22830beb9a31bd60bfd
│   │   │       ├── e0
│   │   │       │   ├── 95
│   │   │       │   │   └── faac46ad404be59a053cd30672abd453f7a1d925af3cabc869d2905df8badccde0c8e28eae03633ebafc678151e8e0886bf2e89b5f11fafbbd3384016b57
│   │   │       │   └── a5
│   │   │       │       └── adbacd54192a2fe66c7b8f4ab78998b920ad0f70a69c47dd0de48302d7e4d32f017f420d92a8080765b0e0ed11759d04da6c85f6e30d6f992c8e0ff3a427
│   │   │       ├── e1
│   │   │       │   └── 71
│   │   │       │       └── f77479e68534ec1a2b93d8fc47c7a1399a534f50e98fda4e5c47d2d7210a51a869c271f2732f74df3aba4c3cbc0a5e2d47cc03390b056afb8d95767b0a3c
│   │   │       ├── e2
│   │   │       │   └── c4
│   │   │       │       └── e4fe3527435943bfd91bc759cde394aca00a43c56f218ca2ca7079c787d9df45510df525beca552336f5420cfef8c523690fcbf9a7a349c955ad6587cf58
│   │   │       ├── e6
│   │   │       │   ├── 31
│   │   │       │   │   └── c208522e3a132e9adde8101848478efcfdbd9d9dedef1a3498f8528e2e3bd63e9b03c11b1b689f80ef79cc3007e9d8113692b75d99b6cc8fd4fc524f3f15
│   │   │       │   └── 6e
│   │   │       │       └── 2740aa7ead945bd3d2cd1f9f463380714e1f76e75ff295b2886e97bb4e91b17c9fbd92fe812e42c15c88e3b296e06e720136a948db7b519d3593d2c9d423
│   │   │       ├── e7
│   │   │       │   ├── c4
│   │   │       │   │   └── bd403a86d17c76ed8c0f4adf5f2718af8d8978df6602c1f0cc7d9fbbd5102a52b65e7fb2eb2906772c72cec024b814b341a653f9df7671f3de5278e087bc
│   │   │       │   └── c9
│   │   │       │       └── 66c4a480e013722f3f871cc53394e129834f4557e7afe9931edef262860771ce073067c5681043e600b0991bd2e6a9f56834c30aa6db48613546eae0d8ec
│   │   │       ├── ea
│   │   │       │   └── 6a
│   │   │       │       └── e08b4fd9ee6e6504f13f3cdc682341d990770d134d9cb9eea062db05dbdeedec59beac621234d04aec080e7ecc761a0cb5ba6fb176d12a4c594e1affe34d
│   │   │       ├── eb
│   │   │       │   └── fb
│   │   │       │       └── f002c3c2e7371e2c96b7c632a51ed57545731aaaf1d2a2f7e4e81436dbbe703688886d65cad4a0e67a70677a5dd18e30f11710b5405773110be17ec09295
│   │   │       ├── ec
│   │   │       │   └── 0e
│   │   │       │       └── 92f634a09bf4beecc76d34349bf8853ce7dbd0a89fd002d71841c7c50ba5bc452e08c4864395d2d1d31a82159e830b2ad02e32cfb31b5335c8798d503894
│   │   │       ├── ee
│   │   │       │   └── 49
│   │   │       │       └── 3ab8e198f724a0085b11b91a655b3be3884c2e946f3bea97e78d0c6a681240714969dcdd72aceb7b61030166cc6fa29f911b0e7421e8623ee1acfbba21fb
│   │   │       ├── ef
│   │   │       │   ├── 17
│   │   │       │   │   └── 5c6ad83bfd4fbbf94772a23db3a1db48f47fc8228a6aa3e60e21c64eab59c9c1758167da7cc62bb99655e57a40db66471aefd6bf7e8cc46105c8038b16e8
│   │   │       │   └── 20
│   │   │       │       └── 10a43d94309ccb8b50eabfba856273db68fc7b65f14ae8f888c50e0f7e418fc8dca5d94831f9afee994a2798aaa384ce039df6ccbdd5faa2d5eaf37b2841
│   │   │       ├── f0
│   │   │       │   └── e4
│   │   │       │       └── a5493e3c7cf613ac0c16fb8ab8e0f240eec72decd3f67282dbb7528a041e4f509299294bd218553aa13f8255c4410e359acc0da417ab748ddb7f9e84870c
│   │   │       ├── f3
│   │   │       │   └── 3f
│   │   │       │       └── 5f545883735913820f7b9388c4bb8f5506d3a5342991621e9eb2d29c70ead7e24ed11fd239488463723f922bd375fd8cb1aeaf5d0118c7475cb516a11090
│   │   │       ├── f5
│   │   │       │   └── 3f
│   │   │       │       └── 548d6debd145b973543b193c25969b57c21bd8984cc587331f67d1fb1505adfae65e3e364f8c13ff5b5644c99d6dc065a89b9ff9e9317894f72a8e70c772
│   │   │       ├── f6
│   │   │       │   └── bf
│   │   │       │       └── b28bdfa6814df700a723e886d3f684423bbf16ae24a3eadfdc17c0d605927d68e18f393103bdd503cf51702a29bb4175b0987aad7479d125f840c441b8e9
│   │   │       ├── f8
│   │   │       │   └── 6d
│   │   │       │       └── ad94b9e6993772c5d9a05196731ca28aab1cec43bc63c70e16720eeb8905183896317bf54f03b08ead598d1c8574e8fd07f97f2344e801d4d99bb9997ac1
│   │   │       ├── fb
│   │   │       │   └── 07
│   │   │       │       └── 5b4f51db21cf13bb2531a41b5bb56490f2bdef064219525582fbc6edb0ace29922fb8613e7bf811cccabea9bf8bf817f3504b3cad598254fc5d28abfb7e4
│   │   │       ├── fc
│   │   │       │   └── cc
│   │   │       │       └── 2b4a058cdaf75b3dad8ffb7f2072d0d69160ad6b6cdddabfd348d4defb96799baa61adc2ad9c254944e9c3286516534e61c34ffd2bc242537aa40b056d5a
│   │   │       ├── fe
│   │   │       │   ├── 32
│   │   │       │   │   └── 99a0ca70d05f06470978fde2d138f03771f717b4b0293f44332e6513fc7b8f0995b207b218f59acc78ac363bf9c522a3d00773d533d6989b4177d760170d
│   │   │       │   ├── 37
│   │   │       │   │   └── c4c0d0dd41504236f8e41a2b7887aa4c3b3abc6c7928a6ae39f1d3edda5323c7e781414a2164d1bd03b0ed3bf3b9ba449bc6e68d1973231e2720c32eab41
│   │   │       │   └── b1
│   │   │       │       └── 5e0a934941b852663195c0ef51155df13ea6e71114bc326210cc2b43ff397a82926e57f6cc2ee37dda81b717b77ca031071d1aee8d25cd52bf1fa639ed2b
│   │   │       └── ff
│   │   │           └── 2e
│   │   │               └── ed24a00b559d653f3799641f636279adacbeddd0ddb3928ae28b96bbafb7611e4588b8b4f36696733092cad5d9984605ff34273889aad33b717b052d9cfc
│   │   └── index-v5
│   │       ├── 00
│   │       │   ├── b0
│   │       │   │   └── a5285b1dd41927c25a437d6e06e180ad401616f52c278cd64474969fb3e1
│   │       │   └── df
│   │       │       └── 216782e75230fb7e8d7057093e134da919f2d56aa9db5f6f7258b3b537d3
│   │       ├── 01
│   │       │   ├── 3c
│   │       │   │   └── 9305c09d5789a41fefc7aa0cd3a8a3813243d247f506487c2f66e9ff5971
│   │       │   ├── 85
│   │       │   │   └── ac002ce9e68821cd39a876c92f3e1be8caeddcf6419d6bc324f70d32b4e9
│   │       │   └── a9
│   │       │       └── b0d0d67beda769e84926f207549943c0bc17abbf66bc20099aaa1bb51736
│   │       ├── 02
│   │       │   └── 3d
│   │       │       └── 7ff49953c213d0e9070efaadaaf3c5ec6740893a6f3704b4f14e805bcfa2
│   │       ├── 03
│   │       │   └── 48
│   │       │       └── 75977735688016c583178c5e6055c5d811bf783ee09da9fe4b1137891c98
│   │       ├── 04
│   │       │   └── bb
│   │       │       └── e70e70e0cbc9b00841927b0c23c58d97f21063208f3e872c3e04db58c13b
│   │       ├── 06
│   │       │   ├── 5a
│   │       │   │   └── 98f8c4232b39b6ac68023a0bc186c128dffdec812a144648c26dac71f91a
│   │       │   └── 5e
│   │       │       └── 2009163f0b101c063269056e566eec4bbc4ec9c8e69f769867337a8ed57b
│   │       ├── 07
│   │       │   └── 2f
│   │       │       └── c26409f0f3f5f0a9723c9865acfaf682ce8a5f593e491d912d58f53f9ae7
│   │       ├── 08
│   │       │   └── b9
│   │       │       └── 8c0c17709bc08fb63e5f0c39c65b93c80c9663f548e949eb55cb434a357a
│   │       ├── 09
│   │       │   └── 8b
│   │       │       └── 0ac0d0ead7b0eee61d826bc69cca1c7d40e187e8282c876253d740b9e9f0
│   │       ├── 0a
│   │       │   ├── 08
│   │       │   │   └── 7555feef8088d2832129af7ce022f6637283712a9ecd731e4a9ef4932c14
│   │       │   ├── 2c
│   │       │   │   └── 10ae97cc0ddca9e23bc5e1c1a10c38f60b99fa734eb5749276bb78987586
│   │       │   └── a2
│   │       │       └── 6a45098c63203072b3c3abfd9346c85ac9bc463e9506bc2bdf17478905a3
│   │       ├── 0d
│   │       │   └── b3
│   │       │       └── 097d1aa2272aa0a4559d84bc3e8aa1b5438104f60d0a303dd8cf4a4919e2
│   │       ├── 0f
│   │       │   └── f7
│   │       │       └── ef3ad5111001a610f814d854d1ce9853e9d6d710a41430d086d07a0986cb
│   │       ├── 10
│   │       │   └── 17
│   │       │       └── fba3d249f38fffb6e9b99fc904d81622ca3edbd864d546795aece3329bb4
│   │       ├── 11
│   │       │   ├── 42
│   │       │   │   └── 63f22fbcf0c21b1e268e7098ba936a48f7ddd6c06761a6c5b4a5fe434ebf
│   │       │   └── d4
│   │       │       └── 2f9f9df8a204a306e5baed8f658a43e437792315d561c5eb0315c7a97d50
│   │       ├── 16
│   │       │   └── cb
│   │       │       └── 5a69d7ce799d5fc7d26a2056473c94a7bb373b72395bb56a9b740dffd152
│   │       ├── 1c
│   │       │   └── 65
│   │       │       └── 74c26755259935f238329c24af2f3305f57b1107f720cc0082e513d83ebb
│   │       ├── 1d
│   │       │   └── 59
│   │       │       └── c56cdb49f40694dc6b984bd43ff53d96f6ea1dbb06ee467a00e4a697e664
│   │       ├── 1f
│   │       │   └── 85
│   │       │       └── 3e0b21cc5deb10a0dc51ed6dace9f5ae0f08f66b5c064b262517165cfa2f
│   │       ├── 27
│   │       │   └── ef
│   │       │       └── 452a94b385f28d524a6fd9178863fe32cc70bc3d94033a3dda9c91b2e128
│   │       ├── 2b
│   │       │   ├── 0f
│   │       │   │   └── b8787add1f0675f7298f5d4e498f1c0091c7438fd73df02d649bbcc9c1ce
│   │       │   └── 2e
│   │       │       └── aa61c0bc2734278e23d60eeeab1fd752744ea5536b3ba08b35b3a667d229
│   │       ├── 2d
│   │       │   ├── 80
│   │       │   │   └── b5e9ca2e40744e7fa089861626d2a29c62363c01729964f4cf0c3e8ee632
│   │       │   └── f4
│   │       │       └── 9196d70f82f15d107105ed433fd462721c91b1594984d87b54d57730cb20
│   │       ├── 2e
│   │       │   └── 5e
│   │       │       └── 52bb770674006416c55571d38721a1575036bc260e9debd40db850bc0b20
│   │       ├── 2f
│   │       │   └── 2c
│   │       │       └── 2a12420aab34889ed2c64b80f9b722e2e90e139a130f13e34a1c7a0e1e29
│   │       ├── 31
│   │       │   ├── 7a
│   │       │   │   └── 9c96d52885c2170f2365ba2c1bb1035008b9daa92b20f4c5e52f16b85113
│   │       │   └── ca
│   │       │       └── a8c3ab0670811a3887ede187dcd3856d14272349a18f6844f7c8007cc05e
│   │       ├── 33
│   │       │   ├── 19
│   │       │   │   └── a311e591a2b51610ed276fe9968065a74c2f19efd7f917616967040ce127
│   │       │   └── f9
│   │       │       └── 071d7d949ade71febc395082397753f9a225031462df3ac9c8ff4104bbad
│   │       ├── 34
│   │       │   ├── 05
│   │       │   │   └── 127f37b0ff3cd9c76b1497b5838d265a8a2b7ef495b7f9841f5d4665ba67
│   │       │   └── 9e
│   │       │       └── 35f5913aa7a542b3357025e12a2a126c13ab15a9bfbb40721b56f89ecb48
│   │       ├── 35
│   │       │   ├── 45
│   │       │   │   └── acc6960018d880bf033f23b050a6c442be8b02eb6cd96e01c7ef7b61b640
│   │       │   └── fd
│   │       │       └── 45154839db33174def1653b1ca377b1d2a65a4c4e56564fe11d85b67a96e
│   │       ├── 38
│   │       │   ├── 04
│   │       │   │   └── a49ce7d19c6d98ec2d5f259e71f17a5727961200c4cf22a88e33ff7bbe5c
│   │       │   └── 36
│   │       │       └── 08fcd3ee98bd9b00bb28cc7d417209f374feb4bb23f9093fdab5ff57857b
│   │       ├── 3a
│   │       │   ├── 10
│   │       │   │   └── 33ebb16ca229c4cbdad65ac0947fbeb3765befe98674faa960578851637f
│   │       │   ├── 21
│   │       │   │   └── 946df9356ae372c19a7700e322d8d0276a406143c7375ce22124fad7dfcd
│   │       │   └── 46
│   │       │       └── 4a802da9ee2134f8f76df15df8ddd2d0f2b05e7de9b1d7e01669c4278824
│   │       ├── 3c
│   │       │   └── f6
│   │       │       └── 26a7f7dccb969c764b8bdecb3667023c64bc1159e674fbeeca633c54964c
│   │       ├── 3d
│   │       │   └── 2f
│   │       │       └── f8441bbef005e18fb70c8e8654894abf17ac44b2140cfd60f172246d894f
│   │       ├── 3e
│   │       │   └── 49
│   │       │       └── fc9a5a5b33508297834c9a4acf4d4de5b46348df8093fa7d0a6f82aba3d5
│   │       ├── 3f
│   │       │   ├── 3a
│   │       │   │   └── 2f0714110028b8f228c7c95100ea873c5a00ea03a97ed1d1f555cd404e1f
│   │       │   └── 55
│   │       │       └── a551d4620944369d858a04648adf3994a33934840d738144392e51784ac1
│   │       ├── 40
│   │       │   ├── 17
│   │       │   │   └── 8828f1bc3c004a75e5f93ab594b7418ca18ac8660a28916cc6e51643994d
│   │       │   └── 1e
│   │       │       └── 89f0b89d2ca92cd54ff481086fdd599c67170ea69eb9b22d37e34638d25e
│   │       ├── 42
│   │       │   └── 8b
│   │       │       └── c02d827ace565a38508b184eec46432a592ba2550cdb1930cd90b866d766
│   │       ├── 43
│   │       │   ├── 5f
│   │       │   │   └── 110819c5903563df1824b2214749ef7781289e80d4a600347e3901aac1c4
│   │       │   └── b0
│   │       │       └── 1da35d6e384e0146648258aa5ea61333fd10d6d00300adf4aac974f6d1e2
│   │       ├── 44
│   │       │   └── 10
│   │       │       └── 7cf4f1b3974687000c3e81a7b9d017adb6b8416e32f27309b764b12b8be5
│   │       ├── 45
│   │       │   └── 2e
│   │       │       └── 93eac58d3d5aa3f5721ac09fa7c3b814ccb98bc5000550243f4497f78a67
│   │       ├── 46
│   │       │   └── 98
│   │       │       └── 3144eac06844196da14c933cccc766b529c8917a7efc1c6c79bba5651a6e
│   │       ├── 47
│   │       │   └── 12
│   │       │       └── 2b0123c780f4536fbd0b803d54bb573a256230046b95fd342da9df92dc8d
│   │       ├── 48
│   │       │   ├── 7f
│   │       │   │   └── 4f4a841cc66ee33998620da1f4f341e422d9ebb37bb00178f3707927db1b
│   │       │   ├── ae
│   │       │   │   ├── 1499701156e55c38f37c319e42d8ee632f62ee16e676fb96bf268dc03e39
│   │       │   │   └── f6dae96ac72c3518cd54e6a1cf5ac3bc59c80cfdc62d65a101a0cb67304a
│   │       │   └── dd
│   │       │       └── 8c8b3dd9e0048fc9974197e48fdfa5ceb084560780473574323b9bfdebd4
│   │       ├── 4e
│   │       │   ├── 45
│   │       │   │   └── 17bdb2bc7c0f1b72ba954a40424fb4a9ef5929f88e922704c80b3d264ccc
│   │       │   └── be
│   │       │       └── da18b216664b1e58df4ffd6782d77f3c28a3f61355544535ff7704cc1b2d
│   │       ├── 50
│   │       │   ├── 85
│   │       │   │   └── a29f2ec233233dedaf6d110ada83bf22af3e52848fda04a91b64f889f53a
│   │       │   └── bb
│   │       │       └── 1a5b513e51544ef3ffcb8dade26b2fd155f2f50104e8ac073030a9d119ee
│   │       ├── 51
│   │       │   └── 89
│   │       │       └── 3d02d342de41905761accac02260bce79c49652be9e6066da254d77ba04d
│   │       ├── 52
│   │       │   ├── 20
│   │       │   │   └── 702ec5d12a1e111e2534ce89eb0f33f79fe3ffee0e80a428299cdaa0d007
│   │       │   ├── a2
│   │       │   │   └── ba77c6a126c66982a48c1fb49ac1ca7f841619a89a1f0fc5de3512a4b7f0
│   │       │   └── bd
│   │       │       └── 1b45d5168ed8296f6d5d5167fe2f8076e2cd5e5d67d2766935784d3e798d
│   │       ├── 53
│   │       │   └── e1
│   │       │       └── 0dc9829fd62522b01d70c6eff1025e862877619ba63ab3f1445df0451b8c
│   │       ├── 56
│   │       │   ├── 4b
│   │       │   │   └── 859813b09e1e5020654bf65fb2f19970c51f08f788d3c4f2ea5137051e1e
│   │       │   ├── 71
│   │       │   │   └── fa4fe23b6bc134c60d26da3033c87003fb50204af907f8ec32c9a7c9e48c
│   │       │   └── 9b
│   │       │       └── 5bc545281ee1f49775ff8b0f2921a08251d503d559ff3f999be9886f1712
│   │       ├── 57
│   │       │   └── b7
│   │       │       └── 2772f8c4daa4b31074e03545f8e473b547e88ef3141501fe2a54e1abdfc4
│   │       ├── 58
│   │       │   ├── 92
│   │       │   │   └── 5799a11997482f78a71307f2134a84b508b74d7faa3535d40d26c6261638
│   │       │   └── f0
│   │       │       └── 4fe556f104b09be642895a82afa463fe560d9a0dc8f507efeef825a6905e
│   │       ├── 5b
│   │       │   └── 42
│   │       │       └── b4487d788874a06f49235360174f1ba8832e8f6a83cb8533883b8fa09f4b
│   │       ├── 5d
│   │       │   ├── 58
│   │       │   │   └── 39fdc57612a04067ef7ec1c141646752e6563b84430cd56ba1df2434de91
│   │       │   └── ad
│   │       │       └── 1cb61ae613816d5f049cd87dd24009e364126f73726b1f8eab2350fec505
│   │       ├── 60
│   │       │   └── df
│   │       │       └── 89f1345cb5849d888a2cce2e6d6ddc0014eb3d6722956a06241f6e7f3d58
│   │       ├── 63
│   │       │   └── d3
│   │       │       └── bb861348e4b5fc53b62454cd498b01af8a51c93c0ebb3f9ca712ca253566
│   │       ├── 69
│   │       │   ├── 33
│   │       │   │   └── b968e19e42cda755b43c4bd1e354056b2be0e8ff44896e82e4bc9fdb6322
│   │       │   ├── 7f
│   │       │   │   └── ee4d73554ca4b3320cb01b422b9a9d45f388513d8fd2ccf4df9187578ce1
│   │       │   └── 97
│   │       │       └── dc07bc0d29ed2880b0e39905e8bc8a24a0344155c90a7ca65c8093d51295
│   │       ├── 6a
│   │       │   ├── 86
│   │       │   │   └── 14653864a77b7c8644710834018401ea9fd5653744bbbea2201a6af48a9f
│   │       │   └── a7
│   │       │       └── 23f89bea37ae703ce622e7188ccb889113f1d355f754c11544a1caec4cc6
│   │       ├── 6d
│   │       │   ├── 40
│   │       │   │   └── 0b02ee474cc305b6d0da00248cfa61780731440b4f237c6251314258b9bd
│   │       │   ├── 61
│   │       │   │   └── c9e7e8446341cea439547eb023fbf47c954ba932e6944a3fd50413c1e861
│   │       │   └── 65
│   │       │       └── 05c74d488e52e860b9de3668e482a62f5796264d2bf9f2700cf9423add5e
│   │       ├── 6e
│   │       │   └── 9e
│   │       │       └── 2004cc0984629401a6a3d3fa16900d49ac70112df7a8c515ec028b34c59d
│   │       ├── 6f
│   │       │   └── 9f
│   │       │       └── 4244544732d3e784c8fd360e0ea256a943488c53a834da3d0ddf3e83af9b
│   │       ├── 73
│   │       │   ├── c1
│   │       │   │   └── d8bbb109a8fa2903d912518bf54776b7794c8f6f0a759234283c3c2eefab
│   │       │   └── e2
│   │       │       └── 434e6cce71a37629e1945f6d35d5e52c1e34aa88ef24d1915846c72775f1
│   │       ├── 77
│   │       │   ├── 59
│   │       │   │   └── 986079464467eb2c4f1c178bf1c9fa9179b3c8384bd1eff68534419250ea
│   │       │   └── d8
│   │       │       └── 4c73393b4c86b064a434ecae7c4c202784cc49493fdc99469a7dc797494b
│   │       ├── 79
│   │       │   └── 0e
│   │       │       └── e6e294a39cc9407b6358b7284df63feda5d4f96e51519630d06219175167
│   │       ├── 7a
│   │       │   ├── 05
│   │       │   │   └── 8c39e8b9b5af7db5ea9983334f3ee2532aae9b7973de1dbb581781947ed3
│   │       │   ├── 1d
│   │       │   │   └── aa5b15d3f974ebd32c44778518e0984265598aa1e2dddc4ded4feb2a11b1
│   │       │   └── 23
│   │       │       └── df8deeb6de869825106ce68786ba9e16686f20a8b4f1c626c9635a5bc8da
│   │       ├── 7b
│   │       │   └── 1d
│   │       │       └── 314b6515b77b62a66c8a2ac140ac4a6926135c5866837fddded37acb1acf
│   │       ├── 7c
│   │       │   ├── 20
│   │       │   │   └── cba9852dc5e0811d9e6e24e74108bf7727a0c2730516ec8f41a08f13116b
│   │       │   └── 9a
│   │       │       └── 13a1f5cfe2738ebf2558b3fc8173e47bffd478a46c35ee5e0fc6e72e511d
│   │       ├── 7d
│   │       │   └── e8
│   │       │       └── 5446c5cdae0493e4ad3b10347b77c8df4b17b5fbe14834f5c6b06faa9f95
│   │       ├── 7f
│   │       │   ├── d5
│   │       │   │   └── 36068d8df17b31ccdbeedbb62ae94e354f6d768324e0dd6578917b8ecc16
│   │       │   └── f6
│   │       │       └── 5e3925b158405271b2f44be4d1ecbb5c60b3b7da87819ce03956b759b051
│   │       ├── 83
│   │       │   └── ef
│   │       │       └── aff47278d7ef72e864717a2bb5e09eca947c1b761d2a3f590af1b5f1b379
│   │       ├── 85
│   │       │   ├── 20
│   │       │   │   └── 71a0d0584d5ae3631b6b48b18785908616327f10115d683585b05072ca1b
│   │       │   ├── d3
│   │       │   │   └── 1b45f9b1e17b38c211d236888c737ca95cd5b9ca0e42c51cff12aece643f
│   │       │   └── d8
│   │       │       └── 7da2d1eaa517a5e80f7a1a8d7dee184babfd49523097c7b2ea907d755944
│   │       ├── 86
│   │       │   └── df
│   │       │       └── f30ac40daf6afa3c806cd525ffbf33eaad06c5f38e08f7ce9428a303241e
│   │       ├── 87
│   │       │   └── eb
│   │       │       └── ab402da37b8ea447b0cac7c54cf3452aae056ac8c63514cb6730629409a8
│   │       ├── 89
│   │       │   ├── 0b
│   │       │   │   └── e2ba88ed525834b932f3ddb5624a540e279742a3c6851ec4ee466890a5ed
│   │       │   ├── 0c
│   │       │   │   └── 98d70e9e25b9a23c255f11b8acd5d9ebed836d0004871577846f3bc3f03f
│   │       │   ├── 39
│   │       │   │   └── d7518a088b510f892a8355a21e2971328f68a8ef26d1962bbcfc70c84725
│   │       │   └── 58
│   │       │       └── 62a9a2b49fd26f8d788adbe5cc377e776463c3a01839945896d96fa48d4f
│   │       ├── 8a
│   │       │   ├── e9
│   │       │   │   └── f78a927b119d27ece8b731dfde1470b48159f26c89ce35d5fe0fc80122ed
│   │       │   └── ea
│   │       │       └── a9d2d6ff75cba71d63171f51aa258a77d99513740280af3884c1dea1f7cd
│   │       ├── 8b
│   │       │   ├── 4c
│   │       │   │   └── 6c0c483d470762dc61c704d8d07e1edd6421400f274c32ea22f543bfdb16
│   │       │   ├── d9
│   │       │   │   └── 617f84454e0342f885f6cbdd2661990c9060f183e29553e39e0506dbd847
│   │       │   └── ee
│   │       │       └── c2ea22c4bf9c5ddcd0333850e543442de3364478847c7ebc382b1ff3a70d
│   │       ├── 8c
│   │       │   └── 9a
│   │       │       └── e014072a08e7ba0b90a6897c5737bc438be37650b0470bfd7c0b83e18e23
│   │       ├── 8e
│   │       │   ├── 58
│   │       │   │   └── 1ce1355f39c75fa063f8dc1c958c11d57446438253b206afc18efb9f28c9
│   │       │   └── ff
│   │       │       └── fc9a834a298aa364d38f286bfc395217fe0559c9b322231ff5f6265ba504
│   │       ├── 91
│   │       │   └── 08
│   │       │       └── 56fc6b8aa67287e6e60a90a5e8bd6500ef9e97a317a38b324cca616a7d25
│   │       ├── 93
│   │       │   └── 31
│   │       │       └── 9f96e29572a9b3bd880f19dde2e443b99ec81a4258f3e56ce1c4fff64852
│   │       ├── 94
│   │       │   ├── 07
│   │       │   │   └── a7c22ba183764c0c27f706d74812444c27c14a97fc43669b7dd7c32a717f
│   │       │   └── 49
│   │       │       └── 0c8e6bfaa289aa93424dc1f6f28b3decc9f59cb08be977c3040f7d244ac3
│   │       ├── 96
│   │       │   ├── 7c
│   │       │   │   └── 454eb1ff3ec3546d35165170f771ff1c65f055203c5ab9f907e6af7067a8
│   │       │   └── c5
│   │       │       └── cfd4f290453cd7201716a3217433fe76e994d06ad3a598a6ab5772d5280f
│   │       ├── 98
│   │       │   └── fe
│   │       │       └── c68a85433f7c743aa9b9427fb21be6fd8c25f9e7893bd5cf65537496008d
│   │       ├── 9a
│   │       │   ├── 76
│   │       │   │   └── 06192603daebdeebec6ad6e070357bb297b864354a3998c359fa50ad570b
│   │       │   └── bc
│   │       │       └── 143ae50ba22ddec235347ed6a62762b673eddb52cb1939aea401679de36b
│   │       ├── 9d
│   │       │   └── 0d
│   │       │       └── cb301e666cb1b3f23405c9a023a97e35e0b646458b0dc07d4e4c45f072d2
│   │       ├── 9e
│   │       │   └── 24
│   │       │       └── 74490f75d8dec7ba5051c2fb1e3119fa15abb79366ea7664e5fbb2977153
│   │       ├── 9f
│   │       │   └── 43
│   │       │       └── 3636172cbc03abf2262c921f9f71572e6b049aa3db8c65d166bcfe5aca5f
│   │       ├── a1
│   │       │   └── 78
│   │       │       └── ee48142ac207e21a1a2eac9ca7111587ce699eebdc565abb3dfe976abf96
│   │       ├── a2
│   │       │   ├── 60
│   │       │   │   └── ea4e9555df962e8a55d27858ec6e935db7b0356b46d10718029046780c27
│   │       │   ├── 68
│   │       │   │   └── b7b4c1f69b4b4ff6c19e7de1b75dfa3eefbab3d36b6ce4ef15d6f64afb9c
│   │       │   └── b5
│   │       │       └── f2c35332a5ab256ee9271034e3b3b301ece6931e6e92531ca0bd8c08fe9a
│   │       ├── a3
│   │       │   └── 50
│   │       │       └── b739b1f6f936987c26973cec93f36482ed240ab90158c0d04899bab0de13
│   │       ├── a4
│   │       │   └── b7
│   │       │       └── a7cebac941d6c47ac2f6fde93c17edf93f4ae4aa6b051499d8f2ffeab614
│   │       ├── a5
│   │       │   ├── 87
│   │       │   │   └── bc838260e09216f01f45e48f0f96cb7691d978001a792540928b1153baa5
│   │       │   └── b8
│   │       │       └── 454c882933ab15d532e2493b0bd7ce7019f1caca2abb46f076ca0855330b
│   │       ├── a6
│   │       │   └── 54
│   │       │       └── c1733144b73a0422b1daf6390b4562d52ec887d209b643d8b0b789a2e4b1
│   │       ├── a7
│   │       │   └── 04
│   │       │       └── d0646f5e87aed79d9f0ad28e40eff59b4872fd92336c436b29f7280a9d3a
│   │       ├── a9
│   │       │   ├── 92
│   │       │   │   └── c230215c94371d341f1b38927e5f481994a870132101fd50efb0449f27c2
│   │       │   └── f7
│   │       │       └── 4c2a9fe6575921726a5579be73ddb2a3e8a7abbbb66a28c50ca8deaeccc5
│   │       ├── aa
│   │       │   └── cb
│   │       │       └── eb7e78deaaf4e5eba36039b514bbe6541a5e440f56bda5447a6a0c81f2aa
│   │       ├── ab
│   │       │   └── f0
│   │       │       └── 041961d523d853b40e4e55be33fe676651a97b630d01af1b06b28abc5697
│   │       ├── ac
│   │       │   ├── 5d
│   │       │   │   └── bac3965880e0e18bc7d1e21519c9073430f53c69821d54a4aeb5c313357f
│   │       │   └── 86
│   │       │       └── c0732592365d753d382502d91754a3c88f8b20e22cc25a0327beb9429687
│   │       ├── ad
│   │       │   ├── 5c
│   │       │   │   └── 217f4a9502eed2896935b005b187e4713d93ba3dc76eff284b00a1a8b92a
│   │       │   └── 7c
│   │       │       └── cc598261aa7c1f089fdcd0478664f8f5c80f8f02f241f08e3be264a9e616
│   │       ├── ae
│   │       │   └── 78
│   │       │       └── cedd14d309b153583ec33b511626642a5b2cecfae082a664e1e6a368bc97
│   │       ├── af
│   │       │   └── 8a
│   │       │       └── d90cfcd33a9895fbbb880406407aee65cd5b37556b94baafb95ba5cb93dd
│   │       ├── b0
│   │       │   └── 4a
│   │       │       └── c18a99a2710b49b5a3a1121226be4940f623f8ba056f8108a634ed347da9
│   │       ├── b1
│   │       │   ├── 4a
│   │       │   │   └── 6796e751962cdc0f1d356f7c34ae7e66a41858d769156329b5bd4379d591
│   │       │   └── 8f
│   │       │       └── 5767f914aa664f32503df614481bac973784e2bcd2b8af02e84faabe168d
│   │       ├── b2
│   │       │   └── 53
│   │       │       └── a51760f3239bd143eb2f11ec8f083702e47b0ca67ac04a9a45e7336f6cde
│   │       ├── b3
│   │       │   └── 63
│   │       │       └── f693e1cbbd8c651339dc83ea677e236d61935b81de6396cb4847fd5b08e4
│   │       ├── b4
│   │       │   └── d4
│   │       │       └── aa802aaebfa5cce97b6f2e688062d965ef9940c20866c45eb34a72b47d05
│   │       ├── b7
│   │       │   ├── 38
│   │       │   │   └── 992d3e6c01fc9098d137f7dbccfcaa5f5124ba9c487e582e6e0d83f99d30
│   │       │   └── fe
│   │       │       └── e66fb9a38a1ef7da481d041bc0dd117c0c2bddfa61bcf516da1e1486c290
│   │       ├── bd
│   │       │   └── e8
│   │       │       └── 7741857e809594830141a639d3d54110945a88bb85691de2f9dc97402c84
│   │       ├── be
│   │       │   ├── a3
│   │       │   │   └── c0779c8e0be92c748c91a7dad4e6f0fe57ba0158b6bb1bcfddd8fc56c934
│   │       │   └── f0
│   │       │       └── 1030b67d1c2d501a0e14ff9aea82addbf8b2e760ef58a5be510d7b4bad3c
│   │       ├── bf
│   │       │   ├── 03
│   │       │   │   └── d5dd5fa44593b3e2d24e270c89a4ebe5809a69837946acbe11b5f9ab29d0
│   │       │   └── 7c
│   │       │       └── 375aec77f76404d91225e72006a0105b2a6ec04bb02cfa365ebcd4a0232b
│   │       ├── c0
│   │       │   └── 83
│   │       │       └── 1295af917239a2fbe94404f49d472949b2a2519701a35e8dc9841f02ae34
│   │       ├── c1
│   │       │   ├── 3e
│   │       │   │   └── 4c4d082623156529b4fa73601a4ac92e33a6b20f963f1096cee31b6d9010
│   │       │   └── 8c
│   │       │       └── e4e9afe177a9d6771d71fe96d51887f262a8fede9d9d3e06ca7ddcf20990
│   │       ├── c2
│   │       │   └── d9
│   │       │       └── 7fb959fc2a833b8e68b8306a1b7d4cd5f15c8b4e0c9d6b46a6765796482e
│   │       ├── c3
│   │       │   └── c6
│   │       │       └── be9e8d92e3e1f8898fedbe33cae4e67f0352de1b0d48fee9cb29ecc1d6ab
│   │       ├── c4
│   │       │   ├── 11
│   │       │   │   └── bf2dd5bf2d9b9006f82aeedaffc7f69ad64358a9a08afe81cbcdca1766f2
│   │       │   ├── 68
│   │       │   │   └── b71baf5025326649162df1bd325b5637dd1e72f59a32177b49318d5efeac
│   │       │   ├── ac
│   │       │   │   └── 4511be3eecea50ee9cadc09a612f9be8598d7b29d5c8b1253c75fa283cc5
│   │       │   └── ca
│   │       │       └── df46b5b6c6148487b1afb20084da52f2838a08143f9b0ebd217d2a229e9a
│   │       ├── ca
│   │       │   ├── 98
│   │       │   │   └── 29ae16b7b413d7a609c6beba2ab22ac51a8f88aa3c3a36759292907ce3ac
│   │       │   └── f8
│   │       │       └── 5fdf8973f1896e77c07a4919f6166c6a04ef8354c5efb0156670a06d24e3
│   │       ├── cb
│   │       │   └── c7
│   │       │       └── 8dc870ee1a760dfda5ed1c13aec5056dae100cec5c9af892474d802a65b0
│   │       ├── cc
│   │       │   ├── 25
│   │       │   │   └── 0a0ad2d0308b6807a70e488194992de068d68b749910eee4847c38629984
│   │       │   ├── 60
│   │       │   │   └── ca5eb4c028e64ab99a3a71e5e6cff685d49a0052a23f473310db7d984f23
│   │       │   └── fb
│   │       │       └── 96cd6e2c34dfd1fc2a68d5b85c353ec81fec75a8e0856070c12777141d13
│   │       ├── d0
│   │       │   ├── 12
│   │       │   │   └── 0e893a332c0e07c4e6ad382322604cf61f86ba7822a3e02b24d4105846cb
│   │       │   ├── 39
│   │       │   │   └── f3ea46b7a48d1b108681523c9e802f48f2779894068bc9b984863ca18939
│   │       │   ├── 57
│   │       │   │   └── 3aa5d94761ad382e1a1acc61203736494009e20422bce1dd1433666dd012
│   │       │   └── f3
│   │       │       └── 570007f66e0a594c21201eb3e8f15d7a4d92bcb97b59246e5b7194b3b290
│   │       ├── d1
│   │       │   ├── 34
│   │       │   │   └── dd11aca2ddd3aeb854849cd81cab78174fc5ea935c0fd552de94684f90a8
│   │       │   ├── 3b
│   │       │   │   └── 5d145862c809774efedb998cae0b11c4062b94265112f8db93a55edb929e
│   │       │   └── 91
│   │       │       └── 1ea8e1c5735aa7333775abaea09cba50e98296556053fba7d4dd227c6732
│   │       ├── d2
│   │       │   ├── 3c
│   │       │   │   └── 9b2e81a9ef349bd31c3c94f1c2d4040643ee96b8128c972db597415d555c
│   │       │   └── 53
│   │       │       └── 0423c306fc66318eb336eeb4033781a7b495f0aa3ba92eec00f34069f13e
│   │       ├── d4
│   │       │   ├── 42
│   │       │   │   └── dcecd9ea33544599eb1e71ac0fd23e843f4caf0dd35ae634e5a1e2bca450
│   │       │   ├── 8f
│   │       │   │   └── 715a86aa779da41ab634b8f3191069d4b2966a3c5b47cb739ab6a9b93aec
│   │       │   └── a2
│   │       │       └── 61ef4c73c2a4a1a021b2b9d9d54cd0acbea9f5e44cebff230278f27bd92a
│   │       ├── d5
│   │       │   └── f4
│   │       │       └── 0913a74f5e223a4fe6108493dd3b03c2d47259df459926160659513c9ad3
│   │       ├── d6
│   │       │   ├── 3c
│   │       │   │   └── 3fd6a899c59ae533d9a5bb44570ada1eddb5802483d3e7812df2c207a7e1
│   │       │   ├── 47
│   │       │   │   └── 2d4e4b363564f0b3d6e59012bb07573fb947a866841f5259a96439aa3964
│   │       │   └── 4d
│   │       │       └── 95351bd7b1c4630fa6590049d83b56ced950f5f2fd281f27e28527249cee
│   │       ├── d7
│   │       │   └── 98
│   │       │       └── 895bffa858148e74eb0bae5ede536d11e4eb6ba643223069874bea4f6498
│   │       ├── d8
│   │       │   ├── 62
│   │       │   │   └── fa9d7982c1af34cc1664c1504cdcf5728bee5cbfba341507a5c033098737
│   │       │   └── f2
│   │       │       └── dfd78c09b8752f2fd7100ea4a9f64cec29a053d57d72983420eb853b3e6a
│   │       ├── dc
│   │       │   ├── 47
│   │       │   │   └── 9e3985de44e70129e4e28c25bdc69a204acabcbdd5962cf5109db4ca7aa5
│   │       │   └── 8a
│   │       │       └── 4dc2a1bdf5b195e99648a945ce742de5f6d0b1aac410a6fe3e7155933cc7
│   │       ├── e1
│   │       │   └── 53
│   │       │       └── 4da55a553f57b5ef4eb84d567d8d4fbd67732c8c090da290c199e0ac2ed4
│   │       ├── e3
│   │       │   └── c5
│   │       │       └── ad2fd86fe0c1b9f233d92c25e56b1a582b8425b52db4767f8d72410c021f
│   │       ├── e4
│   │       │   └── f2
│   │       │       └── 0b57f65571788559ed93ba6d26cacaac21da8e4adfe374787669e431e875
│   │       ├── e6
│   │       │   ├── 37
│   │       │   │   └── c9e69f5074e9a22c766ffcc622280d4e580d2ee0238f670f28199487dd44
│   │       │   └── f1
│   │       │       └── aa87087a727f6fb26b60b78c06c2b830f509c809c7b1752ab1bcab0a15af
│   │       ├── e7
│   │       │   ├── 40
│   │       │   │   └── 70186a6ceaad19b6b11ac1bccf00fa5e038b8151d455127f9868f0051d57
│   │       │   ├── 6f
│   │       │   │   └── 6df2d13a4e315af18cce3e1c8a09c911262fc54f57e6fc47d361ddcf408d
│   │       │   ├── 9e
│   │       │   │   └── 9df988403d9266b9610bf520678520e200090b726c2ea164a0fe727500ba
│   │       │   ├── a3
│   │       │   │   └── 60cfc8947cb925b4deffc13cf15258a667e1653daa12cf0001b2e0083bfb
│   │       │   └── e9
│   │       │       └── d2369beb18730dc4f30e1c9dcdf5bf16ac9bd28dec641b81ff8e8616e7fc
│   │       ├── e9
│   │       │   ├── 6e
│   │       │   │   └── ba29811d787f0fd92ce7f4bc3a6827dc6d66c47153d50683c80d6e7a9a6f
│   │       │   ├── 9a
│   │       │   │   └── b309e8b758264ef32fd578a2928ad1ac4a3241e8c570a5c275e121dd7ee1
│   │       │   ├── bf
│   │       │   │   └── 0bfc4abc982e4aecac42d77dbded146ef0ce46649865b55d62144af5a96d
│   │       │   ├── cb
│   │       │   │   └── b6d58aac267a95803951157a42d29db6c17ef57c66eb59c48684c280e4e8
│   │       │   └── df
│   │       │       └── 500f6d65c0cf35c0f7c0635f953b37393168aa27cb55c7b0ce3399c0d7f2
│   │       ├── ec
│   │       │   ├── 87
│   │       │   │   └── d81e1e7b2d776e609dbfaa2175a5825c0a63a9bcc70fdb5694b81e7f4fc3
│   │       │   └── 8e
│   │       │       └── 97eeecddd26637708519813d42ee2a5ec256bd4831ffa02269e8993e19b7
│   │       ├── ed
│   │       │   └── 40
│   │       │       └── e67da4ad085eef0344d8e253e4455423e0efc042d3898be0a399d1a76b79
│   │       ├── ee
│   │       │   ├── 3d
│   │       │   │   └── 1ab77d088759d13cd44eab2a2f7764233b7908340d97282d9765e014f29c
│   │       │   ├── 60
│   │       │   │   └── 850558038dbacbcba5202b181a0a0c4f947405cf3682df3e1c20dec79137
│   │       │   └── 7a
│   │       │       └── ee0e1b8bea3f05c1b42f1fe4a17fdc2aa37be14405f4e293de10bd30eb80
│   │       ├── f1
│   │       │   ├── 53
│   │       │   │   └── 8aee994a2b5c701755cdc5660748a90199cf48437f5f93fdd0572344f2f1
│   │       │   └── a1
│   │       │       └── 1de8ff1c9230508fdf1c71b3faa1a9d2aade80a7e0b0d4daa6f4040d8ba2
│   │       ├── f3
│   │       │   ├── 2c
│   │       │   │   └── 80267cf9b394a43404ccabe3e574f5fd89b769b43be625b75ff9b1b4a2ee
│   │       │   ├── 8b
│   │       │   │   └── 4a6b7b0714b6f1c94fff48ad31ee18cb6aa93ed63612067b4de30efd43f8
│   │       │   └── f5
│   │       │       └── d11839881d6df2061b642074ebfaf84ce0d4b1d8e227ad335d364cf6a913
│   │       ├── f4
│   │       │   └── 47
│   │       │       └── 8cb011f7e5de40eae9588617e8f3bce662a0ba2d60796b559a420b44783a
│   │       ├── f6
│   │       │   └── c7
│   │       │       └── c2aee6453a94a772577d770a438f34805af27cbf0c7a776b19d6850307b5
│   │       ├── f9
│   │       │   └── 82
│   │       │       └── 228120d240455dd412cb68cbe2007319fbf91d96bb998e7f24c45faadc0b
│   │       ├── fa
│   │       │   ├── 88
│   │       │   │   └── 31cbd6ca584e75edf3642c6f8b079c1f2b5eca1d7b2780ce2e86c24f1e84
│   │       │   └── a1
│   │       │       └── dd9e9a25a0a13875f496dfc7b415ddc641f6b30648050accc001be4635ee
│   │       ├── fb
│   │       │   └── fc
│   │       │       └── 6282476d454ca3b17e0ba6cf70a4b6a87142bd8f3139517d572b2f9911a4
│   │       ├── fc
│   │       │   └── ee
│   │       │       └── fc3e1dd6706bd557d2840d92ff10cdd6928b92fb8c46d2195dfbd8d4b2be
│   │       ├── fd
│   │       │   └── 60
│   │       │       └── 528c5445a438483b66270e6a4dddfa6e9bdcceb2b998cb6f7580d23ceb1b
│   │       └── ff
│   │           ├── 9f
│   │           │   └── 48b5354df0d5feb3420245101c38efe5fb13f171ce2093c16eeb4ba41c7e
│   │           └── d6
│   │               └── 9ea5f7eac400baceca422723dd933d7c505c100130f066f787943d1ac679
│   └── _update-notifier-last-checked
├── .pre-commit-config.yaml
├── .pre-commit-setup.md
├── .prettierrc.json
├── .tmp
│   └── temp-1758247471070.ts
├── archive
│   └── ebook
│       └── enterprise_architecture_mcp_ebook.pdf
├── async-fix-verification-summary.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── custom
│   ├── dir
│   │   └── adr-0001-complete-decision.md
│   └── research
│       ├── dir
│       │   └── perform_research_test_research_001.md
│       └── README.md
├── debug_test.js
├── docker-compose.docs.yml
├── docs
│   ├── .dockerignore
│   ├── .gitignore
│   ├── .vitepress
│   │   └── config.js
│   ├── adrs
│   │   ├── adr-0001-integration-test-decision.md
│   │   ├── adr-0001-test-decision.md
│   │   ├── adr-001-mcp-protocol-implementation-strategy.md
│   │   ├── adr-002-ai-integration-and-advanced-prompting-strategy.md
│   │   ├── adr-003-memory-centric-architecture.md
│   │   ├── adr-004-security-and-content-masking-strategy.md
│   │   ├── adr-005-testing-and-quality-assurance-strategy.md
│   │   ├── adr-006-tree-sitter-integration-strategy.md
│   │   ├── adr-007-cicd-pipeline-strategy.md
│   │   ├── adr-008-development-workflow-strategy.md
│   │   ├── adr-009-package-distribution-strategy.md
│   │   └── README.md
│   ├── api-styles.css
│   ├── CODE_OF_CONDUCT.md
│   ├── community
│   │   ├── .github
│   │   │   ├── ISSUE_TEMPLATE
│   │   │   │   ├── bug_report.yml
│   │   │   │   └── feature_request.yml
│   │   │   └── PULL_REQUEST_TEMPLATE.md
│   │   ├── CODE_OF_CONDUCT.md
│   │   ├── CONTRIBUTING.md
│   │   ├── README-library.md
│   │   └── SECURITY.md
│   ├── configuration.md
│   ├── CONTRIBUTING.md
│   ├── CONVERSION_CHECKLIST.md
│   ├── DEPENDABOT.md
│   ├── DEPLOYMENT_GUIDE.md
│   ├── development.md
│   ├── diataxis-index.md
│   ├── DOCKER_SETUP.md
│   ├── DOCKER_TEST_SUCCESS.txt
│   ├── docker-compose.yml
│   ├── Dockerfile
│   ├── DOCUMENTATION_IMPROVEMENT_PLAN.md
│   ├── DOCUMENTATION-UPDATE-PLAN.md
│   ├── DOCUSAURUS_MIGRATION.md
│   ├── DOCUSAURUS_QUICKSTART.md
│   ├── docusaurus.config.js
│   ├── explanation
│   │   ├── adr-philosophy.md
│   │   ├── ai-architecture-concepts.md
│   │   ├── ai-workflow-concepts.md
│   │   ├── ape-framework-design.md
│   │   ├── architecture-overview.md
│   │   ├── context-file-tool-coverage.md
│   │   ├── index.md
│   │   ├── knowledge-generation-framework-design.md
│   │   ├── knowledge-graph.md
│   │   ├── mcp-architecture-flow.md
│   │   ├── mcp-concepts.md
│   │   ├── performance-design.md
│   │   ├── prompt-engineering.md
│   │   ├── reflexion-framework-design.md
│   │   ├── security-philosophy.md
│   │   ├── self-learning-architecture.md
│   │   ├── server-architecture.md
│   │   └── tool-design.md
│   ├── how-to
│   │   ├── deploy-to-production.md
│   │   └── index.md
│   ├── how-to-guides
│   │   ├── ape-implementation-strategy.md
│   │   ├── ape-usage-guide.md
│   │   ├── bootstrap-architecture-docs.md
│   │   ├── cicd-integration.md
│   │   ├── contribute.md
│   │   ├── custom-rules.md
│   │   ├── deploy-your-own-server.md
│   │   ├── deployment-readiness.md
│   │   ├── firecrawl-setup.md
│   │   ├── generate-adrs-from-prd.md
│   │   ├── getting-started-workflow-guidance.md
│   │   ├── installation-guide.md
│   │   ├── interactive-adr-planning.md
│   │   ├── knowledge-generation-usage-guide.md
│   │   ├── large-team-scaling.md
│   │   ├── llm-context-file-configuration.md
│   │   ├── mcp-client-compatibility.md
│   │   ├── migrate-existing-adrs.md
│   │   ├── performance-testing.md
│   │   ├── prd-to-adrs.md
│   │   ├── progress-tracking.md
│   │   ├── prompting-guide.md
│   │   ├── reflexion-implementation-strategy.md
│   │   ├── reflexion-usage-guide.md
│   │   ├── research-integration.md
│   │   ├── security-analysis.md
│   │   ├── server-context-file.md
│   │   ├── testing-guide.md
│   │   ├── tool-development.md
│   │   ├── troubleshooting.md
│   │   └── work-with-existing-adrs.md
│   ├── ide-rules
│   │   ├── additional-workflows.md
│   │   ├── command-structure.md
│   │   ├── environment-validation-workflow.md
│   │   ├── ide-specific
│   │   │   ├── cursor
│   │   │   │   └── cursor-rules-template.md
│   │   │   ├── jetbrains
│   │   │   │   └── jetbrains-rules-template.md
│   │   │   ├── vscode
│   │   │   │   └── vscode-rules-template.md
│   │   │   └── windsurf
│   │   │       └── windsurf-rules-template.md
│   │   ├── quickstart-guide.md
│   │   ├── README.md
│   │   ├── standalone-usage.md
│   │   └── universal-workflows.md
│   ├── index.md
│   ├── LOGO_DESIGN_PROMPT.md
│   ├── Makefile
│   ├── mcp-planning-tool-usage.md
│   ├── MIGRATION_GUIDE.md
│   ├── nginx.conf
│   ├── notes
│   │   ├── DEVELOPER_GUIDANCE.md
│   │   ├── knowledge-graph.md
│   │   ├── media
│   │   │   ├── 01-first-steps.md
│   │   │   ├── diataxis-index.md
│   │   │   ├── install-rhel.sh
│   │   │   ├── LICENSE
│   │   │   ├── mcp-client-config.md
│   │   │   ├── mcp-concepts.md
│   │   │   ├── performance-design.md
│   │   │   ├── security-philosophy.md
│   │   │   └── troubleshooting.md
│   │   ├── performance-design.md
│   │   ├── prompt-engineering.md
│   │   ├── README.md
│   │   ├── RESEARCH-DRIVEN-ARCHITECTURE.md
│   │   ├── RESEARCH-DRIVEN-INTEGRATION-ANALYSIS.md
│   │   ├── research-driven-workflow.md
│   │   ├── research-integration.md
│   │   ├── technical-debt
│   │   │   └── LINT_CLEANUP_PLAN.md
│   │   ├── tool-design.md
│   │   └── USER_GUIDANCE.md
│   ├── package-lock.json
│   ├── package.json
│   ├── public
│   │   └── logo.png
│   ├── QUICK_START.md
│   ├── README_SCRIPTS.md
│   ├── README-library.md
│   ├── README.md
│   ├── reference
│   │   ├── analysis-tools.md
│   │   ├── api-documentation.md
│   │   ├── api-reference-updated.md
│   │   ├── api-reference.md
│   │   ├── comprehensive-api-reference.md
│   │   ├── environment-config.md
│   │   ├── generation-tools.md
│   │   ├── index.md
│   │   ├── mcp-client-config.md
│   │   ├── security-tools.md
│   │   ├── usage-examples.md
│   │   └── validation-tools.md
│   ├── release-dashboard.md
│   ├── research
│   │   ├── perform_research_research_000.md
│   │   ├── perform_research_research_001.md
│   │   ├── perform_research_research_002.md
│   │   ├── perform_research_research_003.md
│   │   ├── perform_research_research_004.md
│   │   ├── perform_research_research_005.md
│   │   ├── perform_research_research_006.md
│   │   ├── perform_research_research_007.md
│   │   ├── perform_research_research_008.md
│   │   ├── perform_research_research_009.md
│   │   ├── perform_research_research_010.md
│   │   ├── perform_research_research_011.md
│   │   ├── perform_research_research_012.md
│   │   ├── perform_research_research_013.md
│   │   ├── perform_research_research_014.md
│   │   ├── perform_research_research_015.md
│   │   ├── perform_research_research_016.md
│   │   ├── perform_research_research_017.md
│   │   ├── perform_research_research_018.md
│   │   ├── perform_research_research_019.md
│   │   ├── perform_research_research_020.md
│   │   ├── perform_research_research_021.md
│   │   ├── perform_research_research_022.md
│   │   ├── perform_research_research_023.md
│   │   ├── perform_research_research_024.md
│   │   ├── perform_research_research_025.md
│   │   ├── perform_research_research_026.md
│   │   ├── perform_research_research_027.md
│   │   ├── perform_research_research_028.md
│   │   ├── perform_research_research_029.md
│   │   ├── perform_research_research_030.md
│   │   ├── perform_research_research_031.md
│   │   ├── perform_research_research_032.md
│   │   ├── perform_research_research_033.md
│   │   ├── perform_research_research_034.md
│   │   ├── perform_research_research_035.md
│   │   ├── perform_research_research_036.md
│   │   ├── perform_research_research_037.md
│   │   ├── perform_research_research_038.md
│   │   ├── perform_research_research_039.md
│   │   ├── perform_research_research_040.md
│   │   ├── perform_research_research_041.md
│   │   ├── perform_research_research_042.md
│   │   ├── perform_research_research_043.md
│   │   ├── perform_research_research_044.md
│   │   ├── perform_research_research_045.md
│   │   ├── perform_research_research_046.md
│   │   ├── perform_research_research_047.md
│   │   ├── perform_research_research_048.md
│   │   ├── perform_research_research_049.md
│   │   ├── perform_research_test_research__________001.md
│   │   ├── perform_research_test_research_001.md
│   │   ├── perform_research_test_research_002.md
│   │   ├── perform_research_test_unicode.md
│   │   └── README.md
│   ├── SECURITY.md
│   ├── setup-docusaurus.sh
│   ├── setup-website.sh
│   ├── sidebars.js
│   ├── sitemap.xml
│   ├── src
│   │   └── css
│   │       └── custom.css
│   ├── static
│   │   └── img
│   │       ├── logo.png
│   │       └── og-image.png
│   ├── technical.md
│   ├── TESTING_GUIDE.md
│   ├── TODO_MANAGEMENT_FIX.md
│   ├── tsconfig.json
│   ├── tutorials
│   │   ├── 01-first-steps.md
│   │   ├── 02-existing-projects.md
│   │   ├── 03-advanced-analysis.md
│   │   ├── index.md
│   │   ├── security-focused-workflow.md
│   │   └── team-collaboration.md
│   ├── VERSION_MANAGEMENT.md
│   └── WEBSITE_SETUP.md
├── eslint.config.js
├── jest.config.js
├── LICENSE
├── LLM_CONTEXT.md
├── Makefile
├── mcp-inspector-config.json
├── mcp-test-results.json
├── package-lock.json
├── package.json
├── README.md
├── RELEASE_NOTES_v2.0.22.md
├── reports
│   ├── comprehensive-validation_20251003_185155.json
│   ├── link-summary_20251003_185121.json
│   ├── link-validation_20250922_151241.txt
│   ├── link-validation_20250922_151242.txt
│   ├── link-validation_20251003_184136.txt
│   ├── link-validation_20251003_184141.txt
│   ├── link-validation_20251003_184945.txt
│   ├── link-validation_20251003_185000.txt
│   ├── link-validation_20251003_185121.txt
│   └── markdown-validation_20251003_185155.txt
├── sample-project
│   ├── docs
│   │   └── adrs
│   │       ├── 001-database-architecture.md
│   │       ├── 002-api-authentication.md
│   │       └── 003-legacy-data-migration.md
│   └── README.md
├── scripts
│   ├── ai-release-notes.ts
│   ├── check-docs-links.sh
│   ├── check-duplicate-links.ts
│   ├── cleanup-template-docs.sh
│   ├── docs-workflow.sh
│   ├── fix-broken-links.py
│   ├── fix-docs-accuracy.sh
│   ├── fix-docs-content-accuracy.sh
│   ├── install-rhel.sh
│   ├── pre-commit-check.sh
│   ├── pre-commit-checklist.sh
│   ├── remove-duplicate-docs.sh
│   ├── sync-tags-to-npm.sh
│   ├── test-advanced-prompting.sh
│   ├── test-infrastructure.sh
│   ├── test-mcp-functionality.sh
│   ├── test-mcp-logging.ts
│   ├── test-mcp-server.sh
│   ├── test-node-compatibility.js
│   ├── test-npm-package.sh
│   ├── test-release-integration.sh
│   ├── validate-build.js
│   ├── validate-docs.sh
│   └── validate-links-with-sitemap.ts
├── SECURITY.md
├── src
│   ├── config
│   │   └── ai-config.ts
│   ├── index.ts
│   ├── prompts
│   │   ├── adr-suggestion-prompts.ts
│   │   ├── analysis-prompts.ts
│   │   ├── deployment-analysis-prompts.ts
│   │   ├── environment-analysis-prompts.ts
│   │   ├── index.ts
│   │   ├── research-integration-prompts.ts
│   │   ├── research-question-prompts.ts
│   │   ├── rule-generation-prompts.ts
│   │   └── security-prompts.ts
│   ├── resources
│   │   ├── adr-by-id-resource.ts
│   │   ├── code-quality-resource.ts
│   │   ├── deployment-history-resource.ts
│   │   ├── deployment-status-resource.ts
│   │   ├── environment-analysis-resource.ts
│   │   ├── index.ts
│   │   ├── memory-snapshots-resource.ts
│   │   ├── pattern-by-name-resource.ts
│   │   ├── project-metrics-resource.ts
│   │   ├── project-status-resource.ts
│   │   ├── research-by-topic-resource.ts
│   │   ├── research-index-resource.ts
│   │   ├── resource-cache.ts
│   │   ├── resource-router.ts
│   │   ├── rule-by-id-resource.ts
│   │   ├── rule-catalog-resource.ts
│   │   ├── rule-generation-resource.ts
│   │   ├── technology-by-name-resource.ts
│   │   ├── todo-by-id-resource.ts
│   │   └── todo-list-resource.ts
│   ├── templates
│   │   └── domain-knowledge-templates.ts
│   ├── tools
│   │   ├── adr-bootstrap-validation-tool.ts
│   │   ├── adr-suggestion-tool.ts
│   │   ├── adr-validation-tool.ts
│   │   ├── bootstrap-validation-loop-tool.ts
│   │   ├── content-masking-tool.ts
│   │   ├── conversation-memory-tool.ts
│   │   ├── deployment-analysis-tool.ts
│   │   ├── deployment-guidance-tool.ts
│   │   ├── deployment-readiness-tool.ts
│   │   ├── environment-analysis-tool.ts
│   │   ├── expand-analysis-tool.ts
│   │   ├── get-server-context-tool.ts
│   │   ├── interactive-adr-planning-tool.ts
│   │   ├── llm-cloud-management-tool.ts
│   │   ├── llm-database-management-tool.ts
│   │   ├── llm-web-search-tool.ts
│   │   ├── mcp-planning-tool.ts
│   │   ├── memory-loading-tool.ts
│   │   ├── perform-research-tool.ts
│   │   ├── research-integration-tool.ts
│   │   ├── research-question-tool.ts
│   │   ├── review-existing-adrs-tool.ts
│   │   ├── rule-generation-tool.ts
│   │   ├── smart-git-push-tool-v2.ts
│   │   ├── smart-git-push-tool.ts
│   │   ├── tool-chain-orchestrator.ts
│   │   └── troubleshoot-guided-workflow-tool.ts
│   ├── types
│   │   ├── ape-framework.ts
│   │   ├── conversation-context.ts
│   │   ├── conversation-memory.ts
│   │   ├── enhanced-errors.ts
│   │   ├── index.ts
│   │   ├── knowledge-generation.ts
│   │   ├── knowledge-graph-schemas.ts
│   │   ├── memory-entities.ts
│   │   ├── reflexion-framework.ts
│   │   ├── state-reinforcement.ts
│   │   ├── tiered-response.ts
│   │   ├── tool-arguments.ts
│   │   └── tool-context.ts
│   └── utils
│       ├── actual-file-operations.ts
│       ├── adr-discovery.ts
│       ├── adr-knowledge-initializer.ts
│       ├── adr-suggestions.ts
│       ├── ai-executor.ts
│       ├── apply-cot-enhancement.ts
│       ├── automatic-prompt-engineering.ts
│       ├── cache.ts
│       ├── chain-of-thought-template.ts
│       ├── conditional-request.ts
│       ├── config.ts
│       ├── content-masking.ts
│       ├── conversation-memory-manager.ts
│       ├── deployment-analysis.ts
│       ├── deployment-type-registry.ts
│       ├── directory-compat.ts
│       ├── dynamic-deployment-intelligence.ts
│       ├── enhanced-logging.ts
│       ├── environment-analysis.ts
│       ├── environment-capability-registry.ts
│       ├── file-system.ts
│       ├── file-system.ts.backup
│       ├── gitleaks-detector.ts
│       ├── index.ts
│       ├── interactive-approval.ts
│       ├── json-safe.ts
│       ├── knowledge-generation.ts
│       ├── knowledge-graph-manager.ts
│       ├── llm-artifact-detector.ts
│       ├── location-filter.ts
│       ├── mcp-response-validator.ts
│       ├── memory-entity-manager.ts
│       ├── memory-health-scoring.ts
│       ├── memory-migration-manager.ts
│       ├── memory-relationship-mapper.ts
│       ├── memory-rollback-manager.ts
│       ├── memory-transformation.ts
│       ├── monitoring.ts
│       ├── output-masking.ts
│       ├── prompt-composition.ts
│       ├── prompt-execution.ts
│       ├── reflexion.ts
│       ├── release-readiness-detector.ts
│       ├── research-documentation.ts
│       ├── research-integration.ts
│       ├── research-orchestrator.ts
│       ├── research-questions.ts
│       ├── resource-versioning.ts
│       ├── ripgrep-wrapper.ts
│       ├── root-manager.ts
│       ├── rule-format.ts
│       ├── rule-generation.ts
│       ├── server-context-generator.ts
│       ├── state-reinforcement-manager.ts
│       ├── tiered-response-manager.ts
│       └── tree-sitter-analyzer.ts
├── test-results
│   └── junit.xml
├── tests
│   ├── __mocks__
│   │   ├── @tree-sitter-grammars
│   │   │   └── tree-sitter-hcl.ts
│   │   ├── tree-sitter-bash.ts
│   │   ├── tree-sitter-dockerfile.ts
│   │   ├── tree-sitter-javascript.ts
│   │   ├── tree-sitter-json.ts
│   │   ├── tree-sitter-python.ts
│   │   ├── tree-sitter-typescript.ts
│   │   ├── tree-sitter-yaml.ts
│   │   └── tree-sitter.ts
│   ├── ape.test.ts
│   ├── cache-architecture-analysis.md
│   ├── cache.test.ts
│   ├── config
│   │   └── ai-config.test.ts
│   ├── config.test.ts
│   ├── index.test.ts
│   ├── integration
│   │   ├── memory-migration-integration.test.ts
│   │   ├── memory-migration-simple.test.ts
│   │   ├── memory-system-integration.test.ts
│   │   └── smart-code-linking.test.ts
│   ├── knowledge-generation.test.ts
│   ├── mcp-server.test.ts
│   ├── performance
│   │   └── memory-performance.test.ts
│   ├── performance-effectiveness.test.ts
│   ├── prompts
│   │   ├── deployment-analysis-prompts.test.ts
│   │   ├── environment-analysis-prompts.test.ts
│   │   ├── research-integration-prompts.test.ts
│   │   ├── research-question-prompts.test.ts
│   │   ├── rule-generation-prompts.test.ts
│   │   └── security-prompts.test.ts
│   ├── README.md
│   ├── reflexion.test.ts
│   ├── research-integration-tool.test.ts
│   ├── research-question-tool.test.ts
│   ├── resources
│   │   ├── code-quality-resource.test.ts
│   │   └── deployment-history-resource.test.ts
│   ├── setup.ts
│   ├── smart-git-push-release-readiness.test.ts
│   ├── smart-git-push-v2.test.ts
│   ├── smart-git-push.test.ts
│   ├── smoke.test.ts
│   ├── templates
│   │   └── domain-knowledge-templates.test.ts
│   ├── tools
│   │   ├── adr-bootstrap-validation-tool.test.ts
│   │   ├── adr-suggestion-tool.test.ts
│   │   ├── adr-validation-tool.test.ts
│   │   ├── content-masking-tool.test.ts
│   │   ├── deployment-analysis-tool.test.ts
│   │   ├── deployment-guidance-tool.test.ts
│   │   ├── deployment-readiness-tool.test.ts
│   │   ├── environment-analysis-tool.test.ts
│   │   ├── interactive-adr-planning-tool.test.ts
│   │   ├── mcp-planning-tool.test.ts
│   │   ├── memory-loading-tool.test.ts
│   │   ├── perform-research-tool.test.ts
│   │   ├── perform-research-tool.test.ts.backup
│   │   ├── research-integration-tool.test.ts
│   │   ├── review-existing-adrs-tool.test.ts
│   │   ├── rule-generation-tool.test.ts
│   │   ├── smart-git-push-tool-v2.test.ts
│   │   ├── smart-git-push-tool.test.ts
│   │   ├── tool-chain-orchestrator.test.ts
│   │   └── troubleshoot-guided-workflow-tool.test.ts
│   ├── types
│   │   └── conversation-context.test.ts
│   ├── types.test.ts
│   ├── utils
│   │   ├── adr-knowledge-initializer.test.ts
│   │   ├── advanced-prompting-test-utils.ts
│   │   ├── ai-executor.test.ts
│   │   ├── conditional-request.test.ts
│   │   ├── deployment-analysis.test.ts
│   │   ├── environment-capability-registry.test.ts
│   │   ├── file-system.test.ts
│   │   ├── find-related-code.test.ts
│   │   ├── gitleaks-detector.test.ts
│   │   ├── interactive-approval.test.ts
│   │   ├── llm-artifact-detector.test.ts
│   │   ├── location-filter.test.ts
│   │   ├── mcp-response-validator.test.ts
│   │   ├── memory-entity-manager.test.ts
│   │   ├── memory-relationship-mapper.test.ts
│   │   ├── memory-rollback-manager.test.ts
│   │   ├── memory-transformation.test.ts
│   │   ├── monitoring-smoke.test.ts
│   │   ├── monitoring.test.ts
│   │   ├── output-masking.test.ts
│   │   ├── prompt-composition.test.ts
│   │   ├── prompt-execution.test.ts
│   │   ├── release-readiness-detector.test.ts
│   │   ├── research-documentation.test.ts
│   │   ├── research-integration.test.ts
│   │   ├── research-orchestrator.test.ts
│   │   ├── research-questions.test.ts
│   │   ├── resource-versioning.test.ts
│   │   ├── rule-format.test.ts
│   │   ├── rule-generation.test.ts
│   │   ├── test-config.ts
│   │   ├── test-helpers.test.ts
│   │   ├── test-helpers.ts
│   │   ├── test-infrastructure.test.ts
│   │   ├── test-infrastructure.ts
│   │   ├── tree-sitter-analyzer.test.ts
│   │   └── tree-sitter-jest-integration.test.ts
│   └── version.test.ts
├── tsconfig.json
└── typedoc.json
```

# Files

--------------------------------------------------------------------------------
/src/tools/deployment-readiness-tool.ts:
--------------------------------------------------------------------------------

```typescript
/**
 * Deployment Readiness Tool - Version 2.0
 *
 * Comprehensive deployment validation with test failure tracking, deployment history analysis,
 * and hard blocking integration with smart git push.
 * Enhanced with memory integration for deployment assessment tracking and pattern recognition.
 *
 * IMPORTANT FOR AI ASSISTANTS: This tool provides:
 * 1. Test Execution Validation: Zero tolerance for test failures
 * 2. Deployment History Analysis: Pattern detection and success rate tracking
 * 3. Code Quality Gates: Mock vs production code detection
 * 4. Hard Blocking: Prevents unsafe deployments via smart git push integration
 * 5. Memory Integration: Stores deployment assessments as memory entities
 *
 * Memory Dependencies:
 * - CREATES: deployment_assessment memory entities
 * - MIGRATES: Existing deployment history to memory entities
 * - ANALYZES: Deployment patterns across memory entities
 * - INTEGRATES: smart-git-push-tool for deployment blocking
 * - INTEGRATES: todo-file-watcher for automatic task creation
 */

import { z } from 'zod';
import { McpAdrError } from '../types/index.js';
import { execSync } from 'child_process';
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
import { join, basename } from 'path';
import * as os from 'os';
import { validateMcpResponse } from '../utils/mcp-response-validator.js';
import { jsonSafeError } from '../utils/json-safe.js';
import { MemoryEntityManager } from '../utils/memory-entity-manager.js';
import { EnhancedLogger } from '../utils/enhanced-logging.js';
import { TreeSitterAnalyzer } from '../utils/tree-sitter-analyzer.js';
import { findFiles, findRelatedCode } from '../utils/file-system.js';
import { ResearchOrchestrator } from '../utils/research-orchestrator.js';

// Core schemas
const DeploymentReadinessSchema = z.object({
  operation: z
    .enum([
      'check_readiness', // Full deployment readiness check
      'validate_production', // Production-specific validation
      'test_validation', // Test execution and failure analysis
      'deployment_history', // Deployment history analysis
      'full_audit', // Comprehensive audit (all checks)
      'emergency_override', // Emergency bypass with justification
    ])
    .describe('Operation to perform'),

  // Core Configuration
  projectPath: z.string().optional().describe('Project root path'),
  targetEnvironment: z
    .enum(['staging', 'production', 'integration'])
    .default('production')
    .describe('Target deployment environment'),
  strictMode: z.boolean().default(true).describe('Enable strict validation (recommended)'),

  // Code Quality Gates
  allowMockCode: z
    .boolean()
    .default(false)
    .describe('Allow mock code in deployment (NOT RECOMMENDED)'),
  productionCodeThreshold: z
    .number()
    .default(85)
    .describe('Minimum production code quality score (0-100)'),
  mockCodeMaxAllowed: z.number().default(0).describe('Maximum mock code indicators allowed'),

  // Test Failure Gates
  maxTestFailures: z
    .number()
    .default(0)
    .describe('Maximum test failures allowed (0 = zero tolerance)'),
  requireTestCoverage: z.number().default(80).describe('Minimum test coverage percentage required'),
  blockOnFailingTests: z.boolean().default(true).describe('Block deployment if tests are failing'),
  testSuiteRequired: z
    .array(z.string())
    .default([])
    .describe('Required test suites that must pass'),

  // Deployment History Gates
  maxRecentFailures: z.number().default(2).describe('Maximum recent deployment failures allowed'),
  deploymentSuccessThreshold: z
    .number()
    .default(80)
    .describe('Minimum deployment success rate required (%)'),
  blockOnRecentFailures: z.boolean().default(true).describe('Block if recent deployments failed'),
  rollbackFrequencyThreshold: z
    .number()
    .default(20)
    .describe('Maximum rollback frequency allowed (%)'),

  // Integration Rules
  requireAdrCompliance: z.boolean().default(true).describe('Require ADR compliance validation'),
  integrateTodoTasks: z.boolean().default(true).describe('Auto-create blocking tasks for issues'),
  updateHealthScoring: z.boolean().default(true).describe('Update project health scores'),
  triggerSmartGitPush: z.boolean().default(false).describe('Trigger smart git push validation'),

  // Human Override System
  emergencyBypass: z.boolean().default(false).describe('Emergency bypass for critical fixes'),
  businessJustification: z.string().optional().describe('Business justification for overrides'),
  approvalRequired: z.boolean().default(true).describe('Require approval for overrides'),

  // Memory Integration
  enableMemoryIntegration: z.boolean().default(true).describe('Enable memory entity storage'),
  migrateExistingHistory: z
    .boolean()
    .default(false)
    .describe('Migrate existing deployment history to memory'),

  // Tree-sitter Analysis
  enableTreeSitterAnalysis: z
    .boolean()
    .default(true)
    .describe('Use tree-sitter for enhanced code analysis'),
  treeSitterLanguages: z
    .array(z.string())
    .default(['typescript', 'javascript', 'python', 'yaml', 'hcl'])
    .describe('Languages to analyze with tree-sitter'),

  // Research-Driven Integration
  enableResearchIntegration: z
    .boolean()
    .default(true)
    .describe('Use research-orchestrator to verify environment readiness'),
  researchConfidenceThreshold: z
    .number()
    .default(0.7)
    .describe('Minimum confidence for environment research (0-1)'),
});

// Result interfaces
interface TestValidationResult {
  testSuitesExecuted: TestSuiteResult[];
  overallTestStatus: 'passed' | 'failed' | 'partial' | 'not_run';
  failureCount: number;
  coveragePercentage: number;
  requiredSuitesMissing: string[];
  criticalTestFailures: TestFailure[];
  testExecutionTime: number;
  lastTestRun: string;
}

interface TestSuiteResult {
  suiteName: string;
  status: 'passed' | 'failed' | 'skipped';
  passedTests: number;
  failedTests: number;
  coverage: number;
  executionTime: number;
  failureDetails: TestFailure[];
}

interface TestFailure {
  testName: string;
  testSuite: string;
  errorMessage: string;
  severity: 'critical' | 'high' | 'medium' | 'low';
  blocksDeployment: boolean;
  relatedFiles: string[];
}

interface DeploymentHistoryAnalysis {
  recentDeployments: DeploymentRecord[];
  successRate: number;
  rollbackRate: number;
  averageDeploymentTime: number;
  failurePatterns: FailurePattern[];
  environmentStability: EnvironmentStability;
  recommendedAction: 'proceed' | 'block' | 'investigate';
}

interface DeploymentRecord {
  deploymentId: string;
  timestamp: string;
  environment: string;
  status: 'success' | 'failed' | 'rolled_back' | 'in_progress';
  duration: number;
  failureReason?: string;
  rollbackRequired: boolean;
  testResults?: TestValidationResult;
  gitCommit: string;
  deployedBy: string;
}

interface FailurePattern {
  pattern: string;
  frequency: number;
  environments: string[];
  lastOccurrence: string;
  resolution: string;
  preventable: boolean;
}

interface EnvironmentStability {
  stabilityScore: number;
  riskLevel: 'low' | 'medium' | 'high' | 'critical';
  recommendation: string;
}

interface DeploymentBlocker {
  category:
    | 'test_failure'
    | 'deployment_history'
    | 'code_quality'
    | 'adr_compliance'
    | 'environment';
  title: string;
  description: string;
  severity: 'critical' | 'high' | 'medium' | 'low';
  impact: string;
  resolutionSteps: string[];
  estimatedResolutionTime: string;
  blocksDeployment: boolean;
}

interface CodeQualityAnalysis {
  qualityScore: number;
  productionIndicators: number;
  mockIndicators: number;
  failingFiles: string[];
  recommendations: string[];
  // Enhanced with tree-sitter analysis
  securityIssues: Array<{
    type: string;
    severity: 'low' | 'medium' | 'high' | 'critical';
    message: string;
    file: string;
    line: number;
  }>;
  architecturalViolations: string[];
  codeComplexity: {
    averageComplexity: number;
    highComplexityFiles: string[];
    totalFunctions: number;
  };
  dependencyAnalysis: {
    dangerousImports: Array<{
      module: string;
      file: string;
      reason: string;
    }>;
    frameworksDetected: string[];
    securityLibraries: string[];
  };
}

interface AdrComplianceResult {
  score: number;
  compliantAdrs: number;
  totalAdrs: number;
  missingImplementations: string[];
  recommendations: string[];
}

interface DeploymentReadinessResult {
  // Overall Status
  isDeploymentReady: boolean;
  overallScore: number;
  confidence: number;

  // Detailed Analysis
  codeQualityAnalysis: CodeQualityAnalysis;
  testValidationResult: TestValidationResult;
  deploymentHistoryAnalysis: DeploymentHistoryAnalysis;
  adrComplianceResult: AdrComplianceResult;

  // Blocking Issues
  criticalBlockers: DeploymentBlocker[];
  testFailureBlockers: DeploymentBlocker[];
  deploymentHistoryBlockers: DeploymentBlocker[];
  warnings: string[];

  // Actions Taken
  todoTasksCreated: string[];
  healthScoreUpdate: any;
  gitPushStatus: 'allowed' | 'blocked' | 'conditional';
  overrideStatus: any;

  // Enhanced Features
  smartCodeAnalysis?: string; // Smart Code Linking analysis
  environmentResearch?: {
    answer: string;
    confidence: number;
    sources: Array<{ type: string; found: boolean }>;
    needsWebSearch: boolean;
    warnings: string[];
  };
}

/**
 * Deployment Memory Manager for tracking deployment assessments and patterns
 */
class DeploymentMemoryManager {
  private memoryManager: MemoryEntityManager;
  private logger: EnhancedLogger;

  constructor() {
    this.memoryManager = new MemoryEntityManager();
    this.logger = new EnhancedLogger();
  }

  async initialize(): Promise<void> {
    await this.memoryManager.initialize();
  }

  /**
   * Store deployment assessment as memory entity
   */
  async storeDeploymentAssessment(
    environment: string,
    readinessData: DeploymentReadinessResult,
    validationResults: any,
    projectPath?: string
  ): Promise<string> {
    try {
      const assessmentData = {
        environment: environment as 'development' | 'staging' | 'production' | 'testing',
        readinessScore: readinessData.overallScore / 100, // Convert to 0-1 range
        validationResults: {
          testResults: {
            passed: readinessData.testValidationResult.testSuitesExecuted.reduce(
              (sum, suite) => sum + suite.passedTests,
              0
            ),
            failed: readinessData.testValidationResult.failureCount,
            coverage: readinessData.testValidationResult.coveragePercentage / 100, // Convert to 0-1 range
            criticalFailures: readinessData.testValidationResult.criticalTestFailures.map(
              f => f.testName
            ),
          },
          securityValidation: {
            vulnerabilities: 0, // Default - could be enhanced with actual security scan data
            securityScore: 0.8, // Default - could be enhanced with actual security analysis
            criticalIssues: readinessData.criticalBlockers
              .filter(b => b.category === 'adr_compliance')
              .map(b => b.title),
          },
          performanceValidation: {
            performanceScore: Math.max(0, (readinessData.overallScore - 20) / 80), // Derived from overall score
            bottlenecks: [],
            resourceUtilization: {},
          },
        },
        blockingIssues: [
          ...readinessData.criticalBlockers.map(b => ({
            issue: `${b.title}: ${b.description}`,
            severity: b.severity as 'low' | 'medium' | 'high' | 'critical',
            category: this.mapBlockerCategory(b.category),
            resolution: b.resolutionSteps.join('; '),
            estimatedEffort: b.estimatedResolutionTime,
          })),
          ...readinessData.testFailureBlockers.map(b => ({
            issue: `${b.title}: ${b.description}`,
            severity: b.severity as 'low' | 'medium' | 'high' | 'critical',
            category: 'test' as const,
            resolution: b.resolutionSteps.join('; '),
            estimatedEffort: b.estimatedResolutionTime,
          })),
          ...readinessData.deploymentHistoryBlockers.map(b => ({
            issue: `${b.title}: ${b.description}`,
            severity: b.severity as 'low' | 'medium' | 'high' | 'critical',
            category: 'configuration' as const,
            resolution: b.resolutionSteps.join('; '),
            estimatedEffort: b.estimatedResolutionTime,
          })),
        ],
        deploymentStrategy: {
          type: 'rolling' as const, // Default strategy - could be made configurable
          rollbackPlan: 'Automated rollback via deployment pipeline with health check validation',
          monitoringPlan:
            'Monitor application metrics, error rates, and performance indicators for 30 minutes post-deployment',
          estimatedDowntime: readinessData.isDeploymentReady
            ? '0 minutes (rolling deployment)'
            : 'Cannot deploy - blockers present',
        },
        complianceChecks: {
          adrCompliance: readinessData.adrComplianceResult.score / 100, // Convert to 0-1 range
          regulatoryCompliance: [], // Could be enhanced with actual compliance data
          auditTrail: [
            `Deployment assessment completed at ${new Date().toISOString()}`,
            `Test validation: ${readinessData.testValidationResult.overallTestStatus}`,
            `Overall readiness score: ${readinessData.overallScore}%`,
            `Git push status: ${readinessData.gitPushStatus}`,
          ],
        },
      };

      const entity = await this.memoryManager.upsertEntity({
        type: 'deployment_assessment',
        title: `Deployment Assessment: ${environment} - ${readinessData.isDeploymentReady ? 'READY' : 'BLOCKED'} - ${new Date().toISOString().split('T')[0]}`,
        description: `Deployment readiness assessment for ${environment} environment${readinessData.isDeploymentReady ? ' - APPROVED' : ' - BLOCKED'}`,
        tags: [
          'deployment',
          environment.toLowerCase(),
          'readiness-assessment',
          readinessData.isDeploymentReady ? 'approved' : 'blocked',
          `score-${Math.floor(readinessData.overallScore / 10) * 10}`,
          ...(readinessData.criticalBlockers.length > 0 ? ['critical-issues'] : []),
          ...(readinessData.testValidationResult.failureCount > 0 ? ['test-failures'] : []),
          ...(readinessData.deploymentHistoryAnalysis.rollbackRate > 20
            ? ['high-rollback-risk']
            : []),
        ],
        assessmentData,
        relationships: [],
        context: {
          projectPhase: 'deployment-validation',
          technicalStack: this.extractTechnicalStack(validationResults),
          environmentalFactors: [environment, projectPath || 'unknown-project'].filter(Boolean),
          stakeholders: ['deployment-team', 'qa-team', 'infrastructure-team'],
        },
        accessPattern: {
          lastAccessed: new Date().toISOString(),
          accessCount: 1,
          accessContext: ['deployment-assessment'],
        },
        evolution: {
          origin: 'created',
          transformations: [
            {
              timestamp: new Date().toISOString(),
              type: 'assessment_creation',
              description: `Deployment assessment created for ${environment}`,
              agent: 'deployment-readiness-tool',
            },
          ],
        },
        validation: {
          isVerified: readinessData.isDeploymentReady,
          verificationMethod: 'comprehensive-deployment-audit',
          verificationTimestamp: new Date().toISOString(),
        },
      });

      this.logger.info(
        `Deployment assessment stored for ${environment}`,
        'DeploymentMemoryManager',
        {
          environment,
          entityId: entity.id,
          readinessScore: readinessData.overallScore,
          isReady: readinessData.isDeploymentReady,
          blockingIssues: assessmentData.blockingIssues.length,
        }
      );

      return entity.id;
    } catch (error) {
      this.logger.error(
        'Failed to store deployment assessment',
        'DeploymentMemoryManager',
        error as Error
      );
      throw error;
    }
  }

  /**
   * Migrate existing deployment history to memory entities
   */
  async migrateExistingHistory(historyPath: string): Promise<void> {
    try {
      if (!existsSync(historyPath)) {
        this.logger.info(
          'No existing deployment history found to migrate',
          'DeploymentMemoryManager'
        );
        return;
      }

      const historyData = JSON.parse(readFileSync(historyPath, 'utf8'));
      const deployments = historyData.deployments || [];

      let migratedCount = 0;
      for (const deployment of deployments) {
        try {
          await this.migrateDeploymentRecord(deployment);
          migratedCount++;
        } catch (error) {
          this.logger.error(
            `Failed to migrate deployment ${deployment.deploymentId}`,
            'DeploymentMemoryManager',
            error as Error
          );
        }
      }

      this.logger.info(
        `Migration completed: ${migratedCount}/${deployments.length} deployments migrated`,
        'DeploymentMemoryManager'
      );
    } catch (error) {
      this.logger.error(
        'Failed to migrate deployment history',
        'DeploymentMemoryManager',
        error as Error
      );
      throw error;
    }
  }

  /**
   * Analyze deployment patterns across memory entities
   */
  async analyzeDeploymentPatterns(environment?: string): Promise<{
    patterns: any[];
    trends: any[];
    recommendations: string[];
    riskFactors: any[];
  }> {
    try {
      const query: any = {
        entityTypes: ['deployment_assessment'],
        limit: 100,
        sortBy: 'lastModified',
      };

      if (environment) {
        query.tags = [environment.toLowerCase()];
      }

      const assessments = await this.memoryManager.queryEntities(query);

      const patterns = this.detectDeploymentPatterns(assessments.entities);
      const trends = this.calculateDeploymentTrends(assessments.entities);
      const recommendations = this.generatePatternRecommendations(patterns, trends);
      const riskFactors = this.identifyRiskFactors(assessments.entities);

      return {
        patterns,
        trends,
        recommendations,
        riskFactors,
      };
    } catch (error) {
      this.logger.error(
        'Failed to analyze deployment patterns',
        'DeploymentMemoryManager',
        error as Error
      );
      throw error;
    }
  }

  /**
   * Compare current assessment with historical patterns
   */
  async compareWithHistory(
    currentAssessment: DeploymentReadinessResult,
    environment: string
  ): Promise<{
    isImprovement: boolean;
    comparison: any;
    insights: string[];
  }> {
    try {
      const recentAssessments = await this.memoryManager.queryEntities({
        entityTypes: ['deployment_assessment'],
        tags: [environment.toLowerCase()],
        limit: 10,
        sortBy: 'lastModified',
      });

      if (recentAssessments.entities.length === 0) {
        return {
          isImprovement: true,
          comparison: { type: 'first_assessment' },
          insights: ['This is the first deployment assessment for this environment'],
        };
      }

      const lastAssessment = recentAssessments.entities[0] as any;
      const comparison = this.compareAssessments(currentAssessment, lastAssessment.assessmentData);

      return {
        isImprovement: comparison.scoreImprovement > 0,
        comparison,
        insights: this.generateComparisonInsights(comparison),
      };
    } catch (error) {
      this.logger.error(
        'Failed to compare with history',
        'DeploymentMemoryManager',
        error as Error
      );
      return {
        isImprovement: false,
        comparison: { type: 'comparison_failed' },
        insights: ['Unable to compare with historical data'],
      };
    }
  }

  // Private helper methods

  private async migrateDeploymentRecord(deployment: DeploymentRecord): Promise<void> {
    const assessmentData = {
      environment: deployment.environment as 'development' | 'staging' | 'production' | 'testing',
      readinessScore: deployment.status === 'success' ? 1.0 : 0.0, // Use 0-1 range
      validationResults: {
        testResults: deployment.testResults
          ? {
              passed: deployment.testResults.testSuitesExecuted.reduce(
                (sum, suite) => sum + suite.passedTests,
                0
              ),
              failed: deployment.testResults.failureCount,
              coverage: deployment.testResults.coveragePercentage / 100,
              criticalFailures: deployment.testResults.criticalTestFailures.map(f => f.testName),
            }
          : {
              passed: 0,
              failed: 0,
              coverage: 0,
              criticalFailures: [],
            },
        securityValidation: {
          vulnerabilities: 0,
          securityScore: 0.8,
          criticalIssues: [],
        },
        performanceValidation: {
          performanceScore: deployment.status === 'success' ? 0.8 : 0.2,
          bottlenecks: [],
          resourceUtilization: {},
        },
      },
      blockingIssues: deployment.failureReason
        ? [
            {
              issue: `Historical Deployment Failure: ${deployment.failureReason}`,
              severity: 'high' as const,
              category: 'configuration' as const,
              resolution: 'Review and address historical failure causes',
            },
          ]
        : [],
      deploymentStrategy: {
        type: 'rolling' as const,
        rollbackPlan: 'Standard rollback procedure',
        monitoringPlan: 'Basic monitoring',
        estimatedDowntime: deployment.rollbackRequired ? 'Variable' : '0 minutes',
      },
      complianceChecks: {
        adrCompliance: 1.0,
        regulatoryCompliance: [],
        auditTrail: [
          `Migrated deployment record from ${deployment.timestamp}`,
          `Original status: ${deployment.status}`,
          `Rollback required: ${deployment.rollbackRequired}`,
        ],
      },
    };

    await this.memoryManager.upsertEntity({
      type: 'deployment_assessment',
      title: `Historical Deployment: ${deployment.environment} - ${deployment.status.toUpperCase()} - ${deployment.timestamp.split('T')[0]}`,
      description: `Migrated deployment record for ${deployment.environment} (ID: ${deployment.deploymentId})`,
      tags: [
        'deployment',
        deployment.environment.toLowerCase(),
        'migrated-record',
        deployment.status,
        ...(deployment.rollbackRequired ? ['rollback-required'] : []),
      ],
      assessmentData,
      relationships: [],
      context: {
        projectPhase: 'deployment-execution',
        technicalStack: [],
        environmentalFactors: [deployment.environment],
        stakeholders: ['deployment-team'],
      },
      accessPattern: {
        lastAccessed: new Date().toISOString(),
        accessCount: 1,
        accessContext: ['migration'],
      },
      evolution: {
        origin: 'imported',
        transformations: [
          {
            timestamp: new Date().toISOString(),
            type: 'migration',
            description: `Migrated from deployment-history.json (original: ${deployment.timestamp})`,
            agent: 'deployment-readiness-tool',
          },
        ],
      },
      validation: {
        isVerified: true,
        verificationMethod: 'historical-migration',
        verificationTimestamp: new Date().toISOString(),
      },
    });
  }

  private extractTechnicalStack(_validationResults: any): string[] {
    // Extract technical stack from validation results
    // This is a simplified implementation
    return [];
  }

  private detectDeploymentPatterns(assessments: any[]): any[] {
    // Analyze deployment patterns across assessments
    const patterns = [];

    // Pattern: Time-based failures
    const timePatterns = this.analyzeTimePatterns(assessments);
    if (timePatterns.length > 0) {
      patterns.push({ type: 'time_based', patterns: timePatterns });
    }

    // Pattern: Environment-specific issues
    const envPatterns = this.analyzeEnvironmentPatterns(assessments);
    if (envPatterns.length > 0) {
      patterns.push({ type: 'environment_specific', patterns: envPatterns });
    }

    return patterns;
  }

  private calculateDeploymentTrends(assessments: any[]): any[] {
    if (assessments.length < 3) return [];

    const trends = [];
    const scores = assessments.map((a: any) => a.assessmentData.readinessScore);

    // Calculate score trend
    const scoreTrend = this.calculateTrend(scores);
    trends.push({
      metric: 'readiness_score',
      trend: scoreTrend > 0 ? 'improving' : scoreTrend < 0 ? 'declining' : 'stable',
      change: scoreTrend,
    });

    return trends;
  }

  private generatePatternRecommendations(patterns: any[], trends: any[]): string[] {
    const recommendations: string[] = [];

    // Generate recommendations based on patterns
    patterns.forEach(pattern => {
      if (pattern.type === 'time_based') {
        recommendations.push('Consider scheduling deployments during low-risk time windows');
      }
      if (pattern.type === 'environment_specific') {
        recommendations.push('Address environment-specific configuration issues');
      }
    });

    // Generate recommendations based on trends
    trends.forEach(trend => {
      if (trend.metric === 'readiness_score' && trend.trend === 'declining') {
        recommendations.push('Investigate causes of declining deployment readiness scores');
      }
    });

    return recommendations;
  }

  /**
   * Map deployment blocker category to schema-compliant category
   */
  private mapBlockerCategory(
    category: string
  ): 'test' | 'security' | 'performance' | 'configuration' | 'dependencies' {
    switch (category) {
      case 'test_failure':
        return 'test';
      case 'adr_compliance':
      case 'environment':
      case 'deployment_history':
        return 'configuration';
      case 'code_quality':
        return 'performance';
      default:
        return 'configuration';
    }
  }

  private identifyRiskFactors(assessments: any[]): any[] {
    const riskFactors = [];

    // Analyze recent failures
    const recentFailures = assessments
      .filter((a: any) => !a.assessmentData.deploymentReady)
      .slice(0, 5);

    if (recentFailures.length >= 3) {
      riskFactors.push({
        factor: 'frequent_failures',
        description: `${recentFailures.length} deployment blocks in recent assessments`,
        severity: 'high',
      });
    }

    return riskFactors;
  }

  private compareAssessments(current: DeploymentReadinessResult, historical: any): any {
    return {
      scoreImprovement: current.overallScore - historical.readinessScore,
      confidenceChange: current.confidence - historical.confidence,
      blockingIssuesChange: current.criticalBlockers.length - historical.blockingIssues.length,
      testImprovements: {
        failureCountChange:
          current.testValidationResult.failureCount -
          (historical.validationResults?.testValidation?.failureCount || 0),
        coverageChange:
          current.testValidationResult.coveragePercentage -
          (historical.validationResults?.testValidation?.coveragePercentage || 0),
      },
    };
  }

  private generateComparisonInsights(comparison: any): string[] {
    const insights = [];

    if (comparison.scoreImprovement > 0) {
      insights.push(`Deployment readiness improved by ${comparison.scoreImprovement} points`);
    } else if (comparison.scoreImprovement < 0) {
      insights.push(
        `Deployment readiness declined by ${Math.abs(comparison.scoreImprovement)} points`
      );
    }

    if (comparison.testImprovements.failureCountChange < 0) {
      insights.push(
        `Test stability improved: ${Math.abs(comparison.testImprovements.failureCountChange)} fewer failures`
      );
    }

    if (comparison.testImprovements.coverageChange > 0) {
      insights.push(`Test coverage increased by ${comparison.testImprovements.coverageChange}%`);
    }

    return insights;
  }

  private analyzeTimePatterns(_assessments: any[]): any[] {
    // Simplified time pattern analysis
    return [];
  }

  private analyzeEnvironmentPatterns(_assessments: any[]): any[] {
    // Simplified environment pattern analysis
    return [];
  }

  private calculateTrend(values: number[]): number {
    if (values.length < 2) return 0;

    const recent = values.slice(0, Math.min(5, values.length));
    const older = values.slice(Math.min(5, values.length));

    const recentAvg = recent.reduce((a, b) => a + b, 0) / recent.length;
    const olderAvg = older.length > 0 ? older.reduce((a, b) => a + b, 0) / older.length : recentAvg;

    return recentAvg - olderAvg;
  }
}

/**
 * Main deployment readiness function
 */
export async function deploymentReadiness(args: any): Promise<any> {
  try {
    const validatedArgs = DeploymentReadinessSchema.parse(args);

    // Initialize paths and cache
    const projectPath = validatedArgs.projectPath || process.cwd();
    const projectName = basename(projectPath);
    const cacheDir = join(os.tmpdir(), projectName, 'cache');
    const deploymentHistoryPath = join(cacheDir, 'deployment-history.json');
    const readinessCachePath = join(cacheDir, 'deployment-readiness-cache.json');

    // Ensure cache directory exists
    if (!existsSync(cacheDir)) {
      mkdirSync(cacheDir, { recursive: true });
    }

    // Initialize memory manager if enabled
    let memoryManager: DeploymentMemoryManager | null = null;
    if (validatedArgs.enableMemoryIntegration) {
      memoryManager = new DeploymentMemoryManager();
      await memoryManager.initialize();

      // Migrate existing history if requested
      if (validatedArgs.migrateExistingHistory) {
        await memoryManager.migrateExistingHistory(deploymentHistoryPath);
      }
    }

    let result: DeploymentReadinessResult;

    switch (validatedArgs.operation) {
      case 'test_validation':
        result = await performTestValidation(validatedArgs, projectPath);
        break;

      case 'deployment_history':
        result = await performDeploymentHistoryAnalysis(validatedArgs, deploymentHistoryPath);
        break;

      case 'check_readiness':
      case 'validate_production':
      case 'full_audit':
        result = await performFullAudit(validatedArgs, projectPath, deploymentHistoryPath);
        break;

      case 'emergency_override':
        result = await performEmergencyOverride(validatedArgs, projectPath);
        break;

      default:
        throw new McpAdrError('INVALID_ARGS', `Unknown operation: ${validatedArgs.operation}`);
    }

    // Cache result for performance
    writeFileSync(
      readinessCachePath,
      JSON.stringify(
        {
          timestamp: new Date().toISOString(),
          operation: validatedArgs.operation,
          result,
        },
        null,
        2
      )
    );

    // Memory integration: store assessment and analyze patterns
    let memoryIntegrationInfo = '';
    if (memoryManager) {
      try {
        // Store deployment assessment
        const assessmentId = await memoryManager.storeDeploymentAssessment(
          validatedArgs.targetEnvironment,
          result,
          { projectPath, operation: validatedArgs.operation },
          projectPath
        );

        // Compare with historical patterns
        const historyComparison = await memoryManager.compareWithHistory(
          result,
          validatedArgs.targetEnvironment
        );

        // Analyze deployment patterns
        const patternAnalysis = await memoryManager.analyzeDeploymentPatterns(
          validatedArgs.targetEnvironment
        );

        memoryIntegrationInfo = `

## 🧠 Memory Integration Analysis

- **Assessment Stored**: ✅ Deployment assessment saved (ID: ${assessmentId.substring(0, 8)}...)
- **Environment**: ${validatedArgs.targetEnvironment}
- **Historical Comparison**: ${historyComparison.isImprovement ? '📈 Improvement detected' : '📊 Baseline established'}

${
  historyComparison.insights.length > 0
    ? `### Historical Insights
${historyComparison.insights.map(insight => `- ${insight}`).join('\n')}
`
    : ''
}

${
  patternAnalysis.trends.length > 0
    ? `### Deployment Trends
${patternAnalysis.trends.map(trend => `- **${trend.metric}**: ${trend.trend} (${trend.change > 0 ? '+' : ''}${trend.change})`).join('\n')}
`
    : ''
}

${
  patternAnalysis.recommendations.length > 0
    ? `### Pattern-Based Recommendations
${patternAnalysis.recommendations.map(rec => `- ${rec}`).join('\n')}
`
    : ''
}

${
  patternAnalysis.riskFactors.length > 0
    ? `### Risk Factors Identified
${patternAnalysis.riskFactors.map(risk => `- **${risk.factor}**: ${risk.description} (${risk.severity})`).join('\n')}
`
    : ''
}
`;
      } catch (memoryError) {
        memoryIntegrationInfo = `

## 🧠 Memory Integration Status

- **Status**: ⚠️ Memory integration failed - assessment continued without persistence
- **Error**: ${memoryError instanceof Error ? memoryError.message : 'Unknown error'}
`;
      }
    }

    // Generate enhanced response with memory integration
    const baseResponse = generateDeploymentReadinessResponse(result, validatedArgs);

    // Add memory integration info if available
    if (memoryIntegrationInfo && baseResponse.content?.[0]?.text) {
      baseResponse.content[0].text += memoryIntegrationInfo;
    }

    return baseResponse;
  } catch (error) {
    throw new McpAdrError(
      'DEPLOYMENT_READINESS_ERROR',
      `Deployment readiness check failed: ${jsonSafeError(error)}`
    );
  }
}

/**
 * Perform comprehensive test validation
 */
async function performTestValidation(
  args: z.infer<typeof DeploymentReadinessSchema>,
  projectPath: string
): Promise<DeploymentReadinessResult> {
  const testResult = await executeTestSuite(projectPath, args.testSuiteRequired);
  const testBlockers: DeploymentBlocker[] = [];

  // Check for test failures
  if (testResult.failureCount > args.maxTestFailures) {
    testBlockers.push({
      category: 'test_failure',
      title: 'Test Failures Detected',
      description: `${testResult.failureCount} test failures found (max allowed: ${args.maxTestFailures})`,
      severity: 'critical',
      impact: 'Blocks deployment due to failing tests',
      resolutionSteps: [
        'Run npm test to see detailed failures',
        'Fix failing tests one by one',
        'Ensure all tests pass before deployment',
        'Consider increasing test coverage',
      ],
      estimatedResolutionTime: `${Math.ceil(testResult.failureCount * 0.5)} hours`,
      blocksDeployment: args.blockOnFailingTests,
    });
  }

  // Check test coverage
  if (testResult.coveragePercentage < args.requireTestCoverage) {
    testBlockers.push({
      category: 'test_failure',
      title: 'Insufficient Test Coverage',
      description: `Test coverage is ${testResult.coveragePercentage}% (minimum required: ${args.requireTestCoverage}%)`,
      severity: 'high',
      impact: 'May indicate untested code paths',
      resolutionSteps: [
        'Add tests for uncovered code',
        'Run npm run test:coverage to see detailed coverage',
        'Focus on critical business logic first',
      ],
      estimatedResolutionTime: '2-4 hours',
      blocksDeployment: args.strictMode,
    });
  }

  // Basic result structure
  return {
    isDeploymentReady: testBlockers.length === 0,
    overallScore: calculateTestScore(testResult, args),
    confidence: 85,
    codeQualityAnalysis: await analyzeCodeQualityWithTreeSitter(
      args.projectPath || process.cwd(),
      args.enableTreeSitterAnalysis,
      args.treeSitterLanguages
    ),
    testValidationResult: testResult,
    deploymentHistoryAnalysis: {
      recentDeployments: [],
      successRate: 100,
      rollbackRate: 0,
      averageDeploymentTime: 0,
      failurePatterns: [],
      environmentStability: {
        stabilityScore: 100,
        riskLevel: 'low',
        recommendation: 'Proceed with deployment',
      },
      recommendedAction: 'proceed',
    },
    adrComplianceResult: {
      score: 100,
      compliantAdrs: 0,
      totalAdrs: 0,
      missingImplementations: [],
      recommendations: [],
    },
    criticalBlockers: testBlockers.filter(b => b.severity === 'critical'),
    testFailureBlockers: testBlockers,
    deploymentHistoryBlockers: [],
    warnings: [],
    todoTasksCreated: [],
    healthScoreUpdate: {},
    gitPushStatus: testBlockers.length === 0 ? 'allowed' : 'blocked',
    overrideStatus: {},
  };
}

/**
 * Execute test suite and analyze results
 */
async function executeTestSuite(
  projectPath: string,
  _requiredSuites: string[]
): Promise<TestValidationResult> {
  const startTime = Date.now();
  let testOutput = '';
  let exitCode = 0;

  try {
    // Try to run tests with different commands
    const testCommands = ['npm test', 'yarn test', 'npx jest'];

    for (const command of testCommands) {
      try {
        testOutput = execSync(command, {
          cwd: projectPath,
          encoding: 'utf8',
          timeout: 300000, // 5 minute timeout
        });
        break;
      } catch (error: any) {
        if (error.status !== undefined) {
          // Command executed but tests failed
          testOutput = error.stdout + error.stderr;
          exitCode = error.status;
          break;
        }
        // Command not found, try next
      }
    }
  } catch (error) {
    testOutput = `Test execution failed: ${error}`;
    exitCode = 1;
  }

  const executionTime = Date.now() - startTime;

  // Parse test results (simplified for now)
  const testSuites = parseTestOutput(testOutput);
  const totalFailures = testSuites.reduce((sum, suite) => sum + suite.failedTests, 0);
  const overallStatus = exitCode === 0 ? 'passed' : totalFailures > 0 ? 'failed' : 'partial';

  // Check coverage (simplified)
  const coverage = await checkTestCoverage(projectPath);

  return {
    testSuitesExecuted: testSuites,
    overallTestStatus: overallStatus,
    failureCount: totalFailures,
    coveragePercentage: coverage,
    requiredSuitesMissing: [],
    criticalTestFailures: testSuites.flatMap(suite =>
      suite.failureDetails.filter(f => f.severity === 'critical')
    ),
    testExecutionTime: executionTime,
    lastTestRun: new Date().toISOString(),
  };
}

/**
 * Parse test output to extract results
 */
function parseTestOutput(output: string): TestSuiteResult[] {
  // Simplified parser - in production, would handle Jest, Mocha, etc.
  const lines = output.split('\n');
  const suites: TestSuiteResult[] = [];

  // Look for Jest-style output
  let currentSuite: Partial<TestSuiteResult> = {};

  for (const line of lines) {
    if (line.includes('PASS') || line.includes('FAIL')) {
      if (currentSuite.suiteName) {
        suites.push(currentSuite as TestSuiteResult);
      }

      currentSuite = {
        suiteName: line.split(' ').pop() || 'unknown',
        status: line.includes('PASS') ? 'passed' : 'failed',
        passedTests: 0,
        failedTests: 0,
        coverage: 0,
        executionTime: 0,
        failureDetails: [],
      };
    }

    // Count tests
    if (line.includes('✓') || line.includes('✗')) {
      if (line.includes('✓')) {
        currentSuite.passedTests = (currentSuite.passedTests || 0) + 1;
      } else {
        currentSuite.failedTests = (currentSuite.failedTests || 0) + 1;
        // Add failure detail
        currentSuite.failureDetails?.push({
          testName: line.trim(),
          testSuite: currentSuite.suiteName || 'unknown',
          errorMessage: line,
          severity: 'medium',
          blocksDeployment: true,
          relatedFiles: [],
        });
      }
    }
  }

  if (currentSuite.suiteName) {
    suites.push(currentSuite as TestSuiteResult);
  }

  return suites.length > 0
    ? suites
    : [
        {
          suiteName: 'default',
          status: output.includes('failing') ? 'failed' : 'passed',
          passedTests: 0,
          failedTests: output.includes('failing') ? 1 : 0,
          coverage: 0,
          executionTime: 0,
          failureDetails: [],
        },
      ];
}

/**
 * Check test coverage
 */
async function checkTestCoverage(projectPath: string): Promise<number> {
  try {
    // Try to read coverage from common locations
    const coverageFiles = [
      'coverage/lcov-report/index.html',
      'coverage/coverage-summary.json',
      'coverage/coverage-final.json',
    ];

    for (const file of coverageFiles) {
      const filePath = join(projectPath, file);
      if (existsSync(filePath)) {
        const content = readFileSync(filePath, 'utf8');

        // Extract coverage percentage (simplified)
        const match = content.match(/(\d+(?:\.\d+)?)%/);
        if (match && match[1]) {
          return parseFloat(match[1]);
        }
      }
    }
  } catch {
    // Coverage not available
  }

  return 0; // Default to 0 if coverage cannot be determined
}

/**
 * Perform deployment history analysis
 */
async function performDeploymentHistoryAnalysis(
  args: z.infer<typeof DeploymentReadinessSchema>,
  historyPath: string
): Promise<DeploymentReadinessResult> {
  const history = loadDeploymentHistory(historyPath);
  const analysis = analyzeDeploymentHistory(history, args.targetEnvironment);
  const historyBlockers: DeploymentBlocker[] = [];

  // Check success rate
  if (analysis.successRate < args.deploymentSuccessThreshold) {
    historyBlockers.push({
      category: 'deployment_history',
      title: 'Low Deployment Success Rate',
      description: `Success rate is ${analysis.successRate}% (minimum required: ${args.deploymentSuccessThreshold}%)`,
      severity: 'high',
      impact: 'Indicates potential infrastructure or process issues',
      resolutionSteps: [
        'Review recent deployment failures',
        'Fix underlying infrastructure issues',
        'Improve deployment process reliability',
        'Add more comprehensive pre-deployment checks',
      ],
      estimatedResolutionTime: '1-2 days',
      blocksDeployment: args.blockOnRecentFailures,
    });
  }

  // Check rollback rate
  if (analysis.rollbackRate > args.rollbackFrequencyThreshold) {
    historyBlockers.push({
      category: 'deployment_history',
      title: 'High Rollback Frequency',
      description: `Rollback rate is ${analysis.rollbackRate}% (threshold: ${args.rollbackFrequencyThreshold}%)`,
      severity: 'medium',
      impact: 'May indicate deployment quality issues',
      resolutionSteps: [
        'Improve testing before deployment',
        'Add more validation steps',
        'Review rollback causes',
        'Strengthen deployment pipeline',
      ],
      estimatedResolutionTime: '4-8 hours',
      blocksDeployment: args.strictMode,
    });
  }

  return {
    isDeploymentReady: historyBlockers.length === 0,
    overallScore: Math.min(analysis.successRate, 100 - analysis.rollbackRate),
    confidence: 80,
    codeQualityAnalysis: await analyzeCodeQualityWithTreeSitter(
      args.projectPath || process.cwd(),
      args.enableTreeSitterAnalysis,
      args.treeSitterLanguages
    ),
    testValidationResult: {
      testSuitesExecuted: [],
      overallTestStatus: 'not_run',
      failureCount: 0,
      coveragePercentage: 0,
      requiredSuitesMissing: [],
      criticalTestFailures: [],
      testExecutionTime: 0,
      lastTestRun: '',
    },
    deploymentHistoryAnalysis: analysis,
    adrComplianceResult: {
      score: 100,
      compliantAdrs: 0,
      totalAdrs: 0,
      missingImplementations: [],
      recommendations: [],
    },
    criticalBlockers: historyBlockers.filter(b => b.severity === 'critical'),
    testFailureBlockers: [],
    deploymentHistoryBlockers: historyBlockers,
    warnings: [],
    todoTasksCreated: [],
    healthScoreUpdate: {},
    gitPushStatus: historyBlockers.length === 0 ? 'allowed' : 'blocked',
    overrideStatus: {},
  };
}

/**
 * Load deployment history from cache
 */
function loadDeploymentHistory(historyPath: string): { deployments: DeploymentRecord[] } {
  if (!existsSync(historyPath)) {
    return { deployments: [] };
  }

  try {
    const content = readFileSync(historyPath, 'utf8');
    return JSON.parse(content);
  } catch {
    return { deployments: [] };
  }
}

/**
 * Analyze deployment history patterns
 */
function analyzeDeploymentHistory(
  history: { deployments: DeploymentRecord[] },
  environment: string
): DeploymentHistoryAnalysis {
  const recentDeployments = history.deployments
    .filter(d => d.environment === environment)
    .slice(0, 10);

  const successCount = recentDeployments.filter(d => d.status === 'success').length;
  const rollbackCount = recentDeployments.filter(d => d.rollbackRequired).length;

  const successRate =
    recentDeployments.length > 0 ? (successCount / recentDeployments.length) * 100 : 100;
  const rollbackRate =
    recentDeployments.length > 0 ? (rollbackCount / recentDeployments.length) * 100 : 0;

  const failurePatterns = analyzeFailurePatterns(
    recentDeployments.filter(d => d.status === 'failed')
  );

  return {
    recentDeployments,
    successRate,
    rollbackRate,
    averageDeploymentTime: calculateAverageDeploymentTime(recentDeployments),
    failurePatterns,
    environmentStability: assessEnvironmentStability(successRate, rollbackRate),
    recommendedAction: recommendAction(successRate, rollbackRate, failurePatterns.length),
  };
}

/**
 * Analyze failure patterns
 */
function analyzeFailurePatterns(failedDeployments: DeploymentRecord[]): FailurePattern[] {
  const patterns: Map<string, FailurePattern> = new Map();

  failedDeployments.forEach(deployment => {
    if (deployment.failureReason) {
      const category = categorizeFailure(deployment.failureReason);
      const existing = patterns.get(category);

      if (existing) {
        existing.frequency++;
        existing.lastOccurrence = deployment.timestamp;
      } else {
        patterns.set(category, {
          pattern: category,
          frequency: 1,
          environments: [deployment.environment],
          lastOccurrence: deployment.timestamp,
          resolution: suggestResolution(category),
          preventable: isPreventable(category),
        });
      }
    }
  });

  return Array.from(patterns.values());
}

/**
 * Research environment readiness using research-orchestrator
 */
async function performEnvironmentResearch(
  args: z.infer<typeof DeploymentReadinessSchema>,
  projectPath: string
): Promise<{
  answer: string;
  confidence: number;
  sources: Array<{ type: string; found: boolean }>;
  needsWebSearch: boolean;
  warnings: string[];
}> {
  if (!args.enableResearchIntegration) {
    return {
      answer: 'Environment research disabled',
      confidence: 1.0,
      sources: [],
      needsWebSearch: false,
      warnings: [],
    };
  }

  try {
    const orchestrator = new ResearchOrchestrator(projectPath, 'docs/adrs');

    const researchQuestion = `Verify deployment readiness for ${args.targetEnvironment} environment:
1. Are required deployment tools available (Docker/Podman, Kubernetes/OpenShift)?
2. What is the current infrastructure state and health?
3. Are environment configurations present and valid?
4. What deployment patterns are documented in ADRs?
5. Are there any known deployment blockers or issues?`;

    const research = await orchestrator.answerResearchQuestion(researchQuestion);

    const warnings: string[] = [];

    // Check confidence level
    if (research.confidence < args.researchConfidenceThreshold) {
      warnings.push(
        `Research confidence (${(research.confidence * 100).toFixed(1)}%) below threshold (${(args.researchConfidenceThreshold * 100).toFixed(1)}%)`
      );
    }

    // Check if web search is needed
    if (research.needsWebSearch) {
      warnings.push('Local environment data insufficient - external research may be needed');
    }

    // Check for environment capability availability
    const hasKubernetes = research.sources.some(
      s => s.type === 'environment' && s.data?.capabilities?.includes('kubernetes')
    );
    const hasDocker = research.sources.some(
      s => s.type === 'environment' && s.data?.capabilities?.includes('docker')
    );
    const hasOpenShift = research.sources.some(
      s => s.type === 'environment' && s.data?.capabilities?.includes('openshift')
    );
    const hasPodman = research.sources.some(
      s => s.type === 'environment' && s.data?.capabilities?.includes('podman')
    );

    if (!hasKubernetes && !hasOpenShift && !hasDocker && !hasPodman) {
      warnings.push(
        'No container orchestration tools detected - manual deployment verification required'
      );
    }

    return {
      answer: research.answer || 'No environment research results available',
      confidence: research.confidence,
      sources: research.sources.map(s => ({
        type: s.type,
        found: true, // Sources in array are already found
      })),
      needsWebSearch: research.needsWebSearch,
      warnings,
    };
  } catch (error) {
    return {
      answer: `Environment research failed: ${error instanceof Error ? error.message : String(error)}`,
      confidence: 0,
      sources: [],
      needsWebSearch: true,
      warnings: [
        'Failed to perform environment research - proceeding without environment validation',
      ],
    };
  }
}

/**
 * Perform full audit (all checks)
 */
async function performFullAudit(
  args: z.infer<typeof DeploymentReadinessSchema>,
  projectPath: string,
  historyPath: string
): Promise<DeploymentReadinessResult> {
  // Step 0: Research environment readiness
  const environmentResearch = await performEnvironmentResearch(args, projectPath);

  // Combine all validations
  const testResult = await performTestValidation(args, projectPath);
  const historyResult = await performDeploymentHistoryAnalysis(args, historyPath);

  // Smart Code Linking - Enhanced deployment readiness with ADR analysis
  let smartCodeAnalysis = '';
  let adrComplianceResult = testResult.adrComplianceResult;

  if (args.requireAdrCompliance) {
    try {
      // Discover ADRs in the project
      const { discoverAdrsInDirectory } = await import('../utils/adr-discovery.js');
      const adrDirectory = 'docs/adrs';
      const discoveryResult = await discoverAdrsInDirectory(adrDirectory, true, projectPath);

      if (discoveryResult.adrs.length > 0) {
        // Combine all ADR content for Smart Code Linking analysis
        const combinedAdrContent = discoveryResult.adrs
          .map(adr => `# ${adr.title}\n${adr.content || ''}`)
          .join('\n\n');

        const relatedCodeResult = await findRelatedCode(
          'deployment-readiness-analysis',
          combinedAdrContent,
          projectPath,
          {
            useAI: true,
            useRipgrep: true,
            maxFiles: 25,
            includeContent: false,
          }
        );

        // Enhanced ADR compliance analysis with related code context
        const deploymentCriticalFiles = relatedCodeResult.relatedFiles.filter(file => {
          const deploymentKeywords = [
            'deploy',
            'config',
            'env',
            'docker',
            'k8s',
            'terraform',
            'ci',
            'cd',
          ];
          return deploymentKeywords.some(
            keyword =>
              file.path.toLowerCase().includes(keyword) ||
              file.directory.toLowerCase().includes(keyword)
          );
        });

        adrComplianceResult = {
          score: Math.min(100, 70 + relatedCodeResult.confidence * 30),
          compliantAdrs: discoveryResult.adrs.length,
          totalAdrs: discoveryResult.adrs.length,
          missingImplementations:
            deploymentCriticalFiles.length === 0
              ? ['Deployment-specific implementations not found in related code']
              : [],
          recommendations: [
            ...(deploymentCriticalFiles.length > 0
              ? [`Found ${deploymentCriticalFiles.length} deployment-critical files linked to ADRs`]
              : ['Consider documenting deployment procedures in ADRs']),
            ...(relatedCodeResult.relatedFiles.length > 10
              ? ['High code-ADR linkage indicates good architectural documentation']
              : ['Consider improving ADR-to-code traceability']),
            ...(relatedCodeResult.confidence > 0.8
              ? ['Strong architectural alignment detected between ADRs and implementation']
              : ['Review ADR implementation alignment before deployment']),
          ],
        };

        smartCodeAnalysis = `

## 🔗 Smart Code Linking - Deployment Analysis

**ADR Discovery**: Found ${discoveryResult.adrs.length} architectural decision records
**Related Code Files**: ${relatedCodeResult.relatedFiles.length} files linked to ADRs
**Deployment-Critical Files**: ${deploymentCriticalFiles.length} files identified

### Deployment-Critical Code Analysis
${
  deploymentCriticalFiles.length > 0
    ? deploymentCriticalFiles
        .slice(0, 5)
        .map(
          (file, index) =>
            `${index + 1}. **${file.path}** - ${file.extension} file (${file.size} bytes)`
        )
        .join('\n')
    : '*No deployment-specific files found in ADR-related code*'
}

### Architectural Alignment
- **ADR-Code Confidence**: ${(relatedCodeResult.confidence * 100).toFixed(1)}%
- **Keywords Used**: ${relatedCodeResult.keywords.join(', ')}
- **Implementation Coverage**: ${relatedCodeResult.relatedFiles.length > 0 ? 'Adequate' : 'Needs Review'}

**Deployment Impact**: ${
          deploymentCriticalFiles.length > 0
            ? 'ADR-guided deployment files found - architectural decisions are implemented'
            : 'Limited deployment-specific code found - verify manual deployment procedures'
        }
`;
      } else {
        smartCodeAnalysis = `

## 🔗 Smart Code Linking - Deployment Analysis

**Status**: No ADRs found in project
**Recommendation**: Consider creating ADRs to document deployment architecture and decisions
**Impact**: Proceeding with deployment readiness check without architectural guidance
`;
      }
    } catch (error) {
      console.warn('[WARNING] Smart Code Linking for deployment analysis failed:', error);
      smartCodeAnalysis = `

## 🔗 Smart Code Linking - Deployment Analysis

**Status**: ⚠️ ADR analysis failed - continuing with standard deployment checks
**Error**: ${error instanceof Error ? error.message : 'Unknown error'}
`;
    }
  }

  // Create environment blockers based on research findings
  const environmentBlockers: DeploymentBlocker[] = [];

  if (environmentResearch.warnings.length > 0) {
    environmentResearch.warnings.forEach(warning => {
      if (warning.includes('threshold') || warning.includes('No container orchestration')) {
        environmentBlockers.push({
          category: 'environment',
          title: 'Environment Readiness Concern',
          description: warning,
          severity: warning.includes('No container orchestration') ? 'high' : 'medium',
          impact: 'May affect deployment execution',
          resolutionSteps: [
            'Verify environment tools are installed',
            'Check environment configurations',
            'Consult deployment documentation',
          ],
          estimatedResolutionTime: '30 minutes - 1 hour',
          blocksDeployment: args.strictMode && warning.includes('No container orchestration'),
        });
      }
    });
  }

  const allBlockers = [
    ...testResult.criticalBlockers,
    ...testResult.testFailureBlockers,
    ...historyResult.deploymentHistoryBlockers,
    ...environmentBlockers,
  ];

  // Adjust overall score based on environment research confidence
  const baseScore = (testResult.overallScore + historyResult.overallScore) / 2;
  const environmentScore = environmentResearch.confidence * 100;
  const overallScore = baseScore * 0.7 + environmentScore * 0.3;
  const isReady = allBlockers.filter(b => b.blocksDeployment).length === 0;

  const result = {
    isDeploymentReady: isReady,
    overallScore,
    confidence: Math.min(
      testResult.confidence,
      historyResult.confidence,
      environmentResearch.confidence * 100
    ),
    codeQualityAnalysis: testResult.codeQualityAnalysis,
    testValidationResult: testResult.testValidationResult,
    deploymentHistoryAnalysis: historyResult.deploymentHistoryAnalysis,
    adrComplianceResult,
    criticalBlockers: allBlockers.filter(b => b.severity === 'critical'),
    testFailureBlockers: testResult.testFailureBlockers,
    deploymentHistoryBlockers: historyResult.deploymentHistoryBlockers,
    warnings: [...testResult.warnings, ...historyResult.warnings, ...environmentResearch.warnings],
    todoTasksCreated: [],
    healthScoreUpdate: {},
    gitPushStatus: isReady ? ('allowed' as const) : ('blocked' as const),
    overrideStatus: {},
    smartCodeAnalysis, // Include Smart Code Linking analysis
    environmentResearch, // Include environment research results
  };

  return result;
}

/**
 * Perform emergency override
 */
async function performEmergencyOverride(
  args: z.infer<typeof DeploymentReadinessSchema>,
  projectPath: string
): Promise<DeploymentReadinessResult> {
  if (!args.businessJustification) {
    throw new McpAdrError('INVALID_ARGS', 'Business justification required for emergency override');
  }

  // Log override for audit trail
  const overrideRecord = {
    timestamp: new Date().toISOString(),
    justification: args.businessJustification || 'No justification provided',
    environment: args.targetEnvironment,
    overriddenBy: process.env['USER'] || 'unknown',
  };

  const projectName = basename(projectPath);
  const cacheDir = join(os.tmpdir(), projectName, 'cache');
  const overridePath = join(cacheDir, 'emergency-overrides.json');
  const overrides = existsSync(overridePath) ? JSON.parse(readFileSync(overridePath, 'utf8')) : [];
  overrides.push(overrideRecord);
  writeFileSync(overridePath, JSON.stringify(overrides, null, 2));

  return {
    isDeploymentReady: true,
    overallScore: 100,
    confidence: 50, // Lower confidence for overrides
    codeQualityAnalysis: createDefaultCodeQualityAnalysis(100, 0, 0),
    testValidationResult: {
      testSuitesExecuted: [],
      overallTestStatus: 'not_run',
      failureCount: 0,
      coveragePercentage: 0,
      requiredSuitesMissing: [],
      criticalTestFailures: [],
      testExecutionTime: 0,
      lastTestRun: '',
    },
    deploymentHistoryAnalysis: {
      recentDeployments: [],
      successRate: 100,
      rollbackRate: 0,
      averageDeploymentTime: 0,
      failurePatterns: [],
      environmentStability: {
        stabilityScore: 50,
        riskLevel: 'medium',
        recommendation: 'Monitor closely post-deployment',
      },
      recommendedAction: 'proceed',
    },
    adrComplianceResult: {
      score: 100,
      compliantAdrs: 0,
      totalAdrs: 0,
      missingImplementations: [],
      recommendations: [],
    },
    criticalBlockers: [],
    testFailureBlockers: [],
    deploymentHistoryBlockers: [],
    warnings: ['Emergency override active - all normal gates bypassed'],
    todoTasksCreated: [],
    healthScoreUpdate: {},
    gitPushStatus: 'allowed',
    overrideStatus: overrideRecord,
  };
}

/**
 * Helper functions
 */
function calculateTestScore(
  testResult: TestValidationResult,
  _args: z.infer<typeof DeploymentReadinessSchema>
): number {
  const failureScore = Math.max(0, 100 - testResult.failureCount * 20);
  const coverageScore = testResult.coveragePercentage;
  return Math.min(failureScore, coverageScore);
}

function calculateAverageDeploymentTime(deployments: DeploymentRecord[]): number {
  if (deployments.length === 0) return 0;
  const total = deployments.reduce((sum, d) => sum + d.duration, 0);
  return total / deployments.length;
}

function assessEnvironmentStability(
  successRate: number,
  rollbackRate: number
): EnvironmentStability {
  const stabilityScore = Math.max(0, successRate - rollbackRate);
  let riskLevel: 'low' | 'medium' | 'high' | 'critical';

  if (stabilityScore >= 90) riskLevel = 'low';
  else if (stabilityScore >= 70) riskLevel = 'medium';
  else if (stabilityScore >= 50) riskLevel = 'high';
  else riskLevel = 'critical';

  return {
    stabilityScore,
    riskLevel,
    recommendation:
      riskLevel === 'low' ? 'Proceed with deployment' : 'Investigate before deployment',
  };
}

function recommendAction(
  successRate: number,
  rollbackRate: number,
  failurePatternCount: number
): 'proceed' | 'block' | 'investigate' {
  if (successRate < 50 || rollbackRate > 40) return 'block';
  if (successRate < 80 || rollbackRate > 20 || failurePatternCount > 2) return 'investigate';
  return 'proceed';
}

function categorizeFailure(failureReason: string): string {
  const patterns = [
    { regex: /test.*fail/i, category: 'Test Failures' },
    { regex: /database.*connection/i, category: 'Database Connection Issues' },
    { regex: /environment.*variable/i, category: 'Environment Configuration' },
    { regex: /build.*fail/i, category: 'Build Failures' },
    { regex: /dependency.*error/i, category: 'Dependency Issues' },
    { regex: /timeout/i, category: 'Timeout Issues' },
    { regex: /permission.*denied/i, category: 'Permission Issues' },
    { regex: /out.*of.*memory/i, category: 'Resource Issues' },
  ];

  for (const pattern of patterns) {
    if (pattern.regex.test(failureReason)) {
      return pattern.category;
    }
  }

  return 'Unknown Failure';
}

function suggestResolution(category: string): string {
  const resolutions: Record<string, string> = {
    'Test Failures': 'Fix failing tests and improve test coverage',
    'Database Connection Issues': 'Check database connectivity and credentials',
    'Environment Configuration': 'Verify environment variables and configuration',
    'Build Failures': 'Fix build dependencies and compilation errors',
    'Dependency Issues': 'Update and verify package dependencies',
    'Timeout Issues': 'Optimize performance and increase timeout values',
    'Permission Issues': 'Check file and directory permissions',
    'Resource Issues': 'Increase available memory and resources',
  };

  return resolutions[category] || 'Investigate failure details and resolve underlying issue';
}

function isPreventable(category: string): boolean {
  const preventableCategories = [
    'Test Failures',
    'Environment Configuration',
    'Build Failures',
    'Dependency Issues',
  ];

  return preventableCategories.includes(category);
}

/**
 * Generate comprehensive response based on deployment readiness
 */
function generateDeploymentReadinessResponse(
  result: DeploymentReadinessResult,
  args: z.infer<typeof DeploymentReadinessSchema>
): any {
  if (result.isDeploymentReady) {
    return generateSuccessResponse(result, args);
  } else {
    return generateBlockedResponse(result, args);
  }
}

function generateSuccessResponse(
  result: DeploymentReadinessResult,
  args: z.infer<typeof DeploymentReadinessSchema>
): any {
  return validateMcpResponse({
    content: [
      {
        type: 'text',
        text: `✅ **DEPLOYMENT READY - All Gates Passed**

## 🎯 Overall Assessment
- **Deployment Ready**: ✅ **YES**
- **Readiness Score**: ${result.overallScore}%
- **Confidence**: ${result.confidence}%
- **Target Environment**: ${args.targetEnvironment}
- **Fast File Discovery**: ✅ Enhanced with fast-glob

## 🧪 Test Validation
- **Test Status**: ✅ ${result.testValidationResult.overallTestStatus.toUpperCase()}
- **Test Failures**: ${result.testValidationResult.failureCount}
- **Coverage**: ${result.testValidationResult.coveragePercentage}%
- **Execution Time**: ${result.testValidationResult.testExecutionTime}ms

## 📊 Deployment History
- **Success Rate**: ${result.deploymentHistoryAnalysis.successRate}%
- **Rollback Rate**: ${result.deploymentHistoryAnalysis.rollbackRate}%
- **Environment Stability**: ${result.deploymentHistoryAnalysis.environmentStability.riskLevel}

## 🏛️ ADR Compliance
- **Compliance Score**: ${result.adrComplianceResult.score}%
- **ADRs Analyzed**: ${result.adrComplianceResult.compliantAdrs}/${result.adrComplianceResult.totalAdrs}
- **Missing Implementations**: ${result.adrComplianceResult.missingImplementations.length} items

${
  result.environmentResearch
    ? `
## 🔍 Environment Research Analysis

**Research Confidence**: ${(result.environmentResearch.confidence * 100).toFixed(1)}%

### Infrastructure State
${result.environmentResearch.answer}

### Sources Consulted
${result.environmentResearch.sources.map(s => `- ${s.type}: ${s.found ? '✅ Available' : '❌ Not found'}`).join('\n')}

${
  result.environmentResearch.warnings.length > 0
    ? `### Environment Warnings
${result.environmentResearch.warnings.map(w => `- ⚠️ ${w}`).join('\n')}`
    : '### Environment Status\n✅ All environment checks passed'
}

${
  result.environmentResearch.needsWebSearch
    ? '⚠️ **Note**: Local environment data may be insufficient - consider external verification'
    : ''
}
`
    : ''
}

${(result as any).smartCodeAnalysis || ''}

## 🚀 Deployment Approved
${args.triggerSmartGitPush ? 'Triggering smart git push...' : 'Ready to proceed with deployment'}

${
  result.warnings.length > 0
    ? `
## ⚠️ Warnings
${result.warnings.map(w => `- ${w}`).join('\n')}
`
    : ''
}

**✅ DEPLOYMENT CAN PROCEED SAFELY**`,
      },
    ],
  });
}

function generateBlockedResponse(
  result: DeploymentReadinessResult,
  args: z.infer<typeof DeploymentReadinessSchema>
): any {
  return validateMcpResponse({
    content: [
      {
        type: 'text',
        text: `# 🚨 DEPLOYMENT BLOCKED - Critical Issues Detected

## ⚠️ Deployment Readiness: ${result.isDeploymentReady ? '✅ READY' : '❌ BLOCKED'}
- **Overall Score**: ${result.overallScore}/100
- **Confidence**: ${result.confidence}%
- **Target Environment**: ${args.targetEnvironment}
- **Tree-sitter Analysis**: ${args.enableTreeSitterAnalysis ? '✅ Enhanced' : '❌ Basic'}
- **Fast File Discovery**: ✅ Enhanced with fast-glob
- **Smart Code Linking**: ${args.requireAdrCompliance ? '✅ ADR Analysis Enabled' : '❌ Disabled'}

## 🧪 Test Validation Issues
${
  result.testFailureBlockers.length > 0
    ? `
**Test Failures**: ${result.testValidationResult.failureCount} failures detected
**Coverage**: ${result.testValidationResult.coveragePercentage}% (Required: ${args.requireTestCoverage}%)

### Critical Test Failures:
${result.testValidationResult.criticalTestFailures.map(f => `- ❌ ${f.testSuite}: ${f.testName}`).join('\n')}
`
    : '✅ Tests passing'
}

## 📊 Deployment History Issues
${
  result.deploymentHistoryBlockers.length > 0
    ? `
**Success Rate**: ${result.deploymentHistoryAnalysis.successRate}% (Required: ${args.deploymentSuccessThreshold}%)
**Rollback Rate**: ${result.deploymentHistoryAnalysis.rollbackRate}% (Threshold: ${args.rollbackFrequencyThreshold}%)

### Recent Failure Patterns:
${result.deploymentHistoryAnalysis.failurePatterns.map(p => `- **${p.pattern}**: ${p.frequency} occurrences`).join('\n')}
`
    : '✅ Deployment history stable'
}

${
  result.environmentResearch
    ? `
## 🔍 Environment Research Analysis

**Research Confidence**: ${(result.environmentResearch.confidence * 100).toFixed(1)}%

### Infrastructure State
${result.environmentResearch.answer}

### Sources Consulted
${result.environmentResearch.sources.map(s => `- ${s.type}: ${s.found ? '✅ Available' : '❌ Not found'}`).join('\n')}

${
  result.environmentResearch.warnings.length > 0
    ? `### Environment Warnings
${result.environmentResearch.warnings.map(w => `- ⚠️ ${w}`).join('\n')}`
    : '### Environment Status\n✅ All environment checks passed'
}

${
  result.environmentResearch.needsWebSearch
    ? '⚠️ **Note**: Local environment data may be insufficient - consider external verification'
    : ''
}
`
    : ''
}

${(result as any).smartCodeAnalysis || ''}

## 🚨 Critical Blockers (Must Fix Before Deployment)
${result.criticalBlockers
  .map(
    blocker => `
### ${blocker.category.toUpperCase()}: ${blocker.title}
- **Impact**: ${blocker.impact}
- **Resolution**: ${blocker.resolutionSteps.join(' → ')}
- **Estimated Time**: ${blocker.estimatedResolutionTime}
`
  )
  .join('\n')}

## 🛠️ Immediate Actions Required

### 1. Fix Test Issues
\`\`\`bash
# Run tests and fix failures
npm test

# Check detailed coverage
npm run test:coverage
\`\`\`

### 2. Address Deployment History
\`\`\`bash
# Review recent failures
# Fix infrastructure issues
# Improve deployment reliability
\`\`\`

### 3. Re-validate When Fixed
\`\`\`bash
# Run full audit again
deployment_readiness --operation full_audit --target-environment ${args.targetEnvironment}
\`\`\`

### 3. Emergency Override (If Justified)
\`\`\`bash
# Only if business critical and approved
npm run deploy:emergency -- --justification="Critical security fix"
\`\`\`

**⚠️ WARNING**: Emergency overrides bypass safety checks. Use only when absolutely necessary.
`,
      },
    ],
  });
}

/**
 * Create default CodeQualityAnalysis structure
 */
function createDefaultCodeQualityAnalysis(
  qualityScore: number = 75,
  productionIndicators: number = 10,
  mockIndicators: number = 2
): CodeQualityAnalysis {
  return {
    qualityScore,
    productionIndicators,
    mockIndicators,
    failingFiles: [],
    recommendations: [],
    securityIssues: [],
    architecturalViolations: [],
    codeComplexity: {
      averageComplexity: 0,
      highComplexityFiles: [],
      totalFunctions: 0,
    },
    dependencyAnalysis: {
      dangerousImports: [],
      frameworksDetected: [],
      securityLibraries: [],
    },
  };
}

/**
 * Perform tree-sitter enhanced code quality analysis
 */
async function analyzeCodeQualityWithTreeSitter(
  projectPath: string,
  enableTreeSitter: boolean,
  _languages: string[]
): Promise<CodeQualityAnalysis> {
  const baseAnalysis = createDefaultCodeQualityAnalysis();

  if (!enableTreeSitter) {
    return baseAnalysis;
  }

  try {
    const analyzer = new TreeSitterAnalyzer();

    // Use fast-glob based file discovery for enhanced performance
    const findResult = await findFiles(projectPath, ['**/*.{ts,js,py,yml,yaml,tf,hcl,sh}']);

    // Analyze files (limit to first 20 for performance)
    const sourceFiles = findResult.files.map(f => f.path);
    const filesToAnalyze = sourceFiles.slice(0, 20);
    let totalComplexity = 0;
    let totalFunctions = 0;
    const highComplexityFiles: string[] = [];

    for (const filePath of filesToAnalyze) {
      try {
        const analysis = await analyzer.analyzeFile(filePath);

        // Security issues
        if (analysis.hasSecrets && analysis.secrets.length > 0) {
          analysis.secrets.forEach(secret => {
            baseAnalysis.securityIssues.push({
              type: secret.type,
              severity:
                secret.confidence > 0.8 ? 'high' : secret.confidence > 0.6 ? 'medium' : 'low',
              message: `${secret.type} detected: ${secret.context}`,
              file: filePath,
              line: secret.location.line,
            });
          });
        }

        // Security issues from general analysis
        if (analysis.securityIssues && analysis.securityIssues.length > 0) {
          analysis.securityIssues.forEach(issue => {
            baseAnalysis.securityIssues.push({
              type: issue.type,
              severity: issue.severity,
              message: issue.message,
              file: filePath,
              line: issue.location.line,
            });
          });
        }

        // Dangerous imports
        if (analysis.imports) {
          analysis.imports.forEach(imp => {
            if (imp.isDangerous) {
              baseAnalysis.dependencyAnalysis.dangerousImports.push({
                module: imp.module,
                file: filePath,
                reason: imp.reason || 'Potentially dangerous import',
              });
            }

            // Detect frameworks
            const frameworks = ['express', 'react', 'vue', 'angular', 'fastapi', 'django', 'flask'];
            frameworks.forEach(framework => {
              if (
                imp.module.toLowerCase().includes(framework) &&
                !baseAnalysis.dependencyAnalysis.frameworksDetected.includes(framework)
              ) {
                baseAnalysis.dependencyAnalysis.frameworksDetected.push(framework);
              }
            });

            // Detect security libraries
            const securityLibs = ['bcrypt', 'crypto', 'jwt', 'passport', 'helmet'];
            securityLibs.forEach(lib => {
              if (
                imp.module.toLowerCase().includes(lib) &&
                !baseAnalysis.dependencyAnalysis.securityLibraries.includes(lib)
              ) {
                baseAnalysis.dependencyAnalysis.securityLibraries.push(lib);
              }
            });
          });
        }

        // Function complexity analysis
        if (analysis.functions) {
          analysis.functions.forEach(func => {
            totalFunctions++;
            totalComplexity += func.complexity;

            if (func.complexity > 10) {
              highComplexityFiles.push(`${filePath}:${func.name} (complexity: ${func.complexity})`);
            }
          });
        }

        // Architectural violations (basic detection)
        if (analysis.architecturalViolations && analysis.architecturalViolations.length > 0) {
          analysis.architecturalViolations.forEach(violation => {
            baseAnalysis.architecturalViolations.push(`${filePath}: ${violation.message}`);
          });
        }
      } catch (error) {
        // Skip files that can't be analyzed
        console.warn(`Could not analyze file ${filePath}:`, error);
      }
    }

    // Update complexity metrics
    baseAnalysis.codeComplexity = {
      averageComplexity: totalFunctions > 0 ? totalComplexity / totalFunctions : 0,
      highComplexityFiles: highComplexityFiles.slice(0, 10), // Limit to top 10
      totalFunctions,
    };

    // Calculate enhanced quality score
    let qualityScore = 85; // Base score

    // Deduct for security issues
    const criticalSecurity = baseAnalysis.securityIssues.filter(
      i => i.severity === 'critical'
    ).length;
    const highSecurity = baseAnalysis.securityIssues.filter(i => i.severity === 'high').length;
    qualityScore -= criticalSecurity * 20 + highSecurity * 10;

    // Deduct for dangerous imports
    qualityScore -= Math.min(baseAnalysis.dependencyAnalysis.dangerousImports.length * 5, 20);

    // Deduct for high complexity
    qualityScore -= Math.min(highComplexityFiles.length * 2, 15);

    // Bonus for security libraries
    qualityScore += Math.min(baseAnalysis.dependencyAnalysis.securityLibraries.length * 2, 10);

    baseAnalysis.qualityScore = Math.max(0, Math.min(100, qualityScore));

    // Update production/mock indicators based on analysis
    baseAnalysis.productionIndicators = Math.max(10, baseAnalysis.qualityScore - 20);
    baseAnalysis.mockIndicators = Math.max(0, 100 - baseAnalysis.qualityScore) / 10;

    return baseAnalysis;
  } catch (error) {
    console.warn('Tree-sitter analysis failed, using basic analysis:', error);
    return baseAnalysis;
  }
}

```
Page 323/326FirstPrevNextLast