From 9b4447a536c9754b7fed22d4d3bf2c86d6b99a32 Mon Sep 17 00:00:00 2001 From: Mufacoderz Date: Sat, 20 Jun 2026 19:58:13 +0800 Subject: [PATCH 1/3] update readme --- README.md | 278 +++++++++++++++++++++++------------------------- logo-devmap.png | Bin 0 -> 55980 bytes 2 files changed, 135 insertions(+), 143 deletions(-) create mode 100644 logo-devmap.png diff --git a/README.md b/README.md index e3f3f76..45cdf3a 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,101 @@ -# devmap +

+ DevMap Logo +

+ +

devmap

+ +

+ Understand Any Codebase — For Developers and AI Agents +

+ +

+ Analyze once. Reuse context everywhere. +

+ +

+ + License + + + npm version + + + downloads + + Node.js +

+ > The first command you run after git clone. -AI should spend tokens solving problems, not rediscovering your codebase. Built by [Fadil (@itsflaid)](https://github.com/itsflaid) --- -[Demo GIF placeholder — record with VHS before publishing] +[Demo GIF placeholder — record before publishing] --- ## The Problem -You ask AI for help. +Before doing real work, developers and AI agents need context. -It starts exploring the repository. Again. +They open files, trace dependencies, follow feature flows, and rebuild understanding of the project. -You switch tools. It starts again. +The process repeats every time you: -New session. Again. +* start a new session +* switch AI tools +* bring in a new agent +* revisit a project weeks later -You join a project halfway through — nobody has time to explain the architecture. +The code stays the same. -Every AI agent rebuilds context from scratch before real work begins. +The context gets rebuilt again and again. --- ## The Solution -DevMap analyzes your project using static analysis and AI to generate a reusable project snapshot. +DevMap turns project knowledge into reusable context. + +It analyzes your codebase and generates structured project intelligence that can be reused across developers, sessions, and AI agents. -The snapshot contains: +Instead of rediscovering the codebase every time, agents and developers start with: -* Architecture overview +* Project overview * Entry points +* Feature maps * Critical files -* File purpose, scope, top functions, search terms, and importance -* Routes and APIs -* External services -* Database information -* Detected features -* Minimal high-confidence feature and request flows -* Feature entry points and lightweight business flows -* Onboarding path and file-level change impact -* Index-first agent navigation policy with focused feature maps -* Project relationships - -One analysis. Reusable context. Any codebase. +* Architecture summaries +* Navigation paths +* Onboarding guidance + +Analyze once. + +Reuse everywhere. Without DevMap: ```txt Repository ↓ -AI explores files +Claude explores files + ↓ +Context rebuilt + +Repository ↓ -AI rebuilds context +Codex explores files ↓ -Task begins +Context rebuilt + +Repository + ↓ +New session + ↓ +Context rebuilt ``` With DevMap: @@ -69,11 +105,13 @@ Repository ↓ devmap analyze ↓ -snapshot.json - ↓ -Reusable context - ↓ -Task begins immediately +Shared Project Context + ├─ Claude Code + ├─ OpenAI Codex + ├─ Gemini CLI + ├─ Cursor + ├─ Windsurf + └─ Future Agents ``` --- @@ -87,140 +125,94 @@ devmap init → prepares project devmap analyze - → runs static analysis (80%) - → AI interprets structure (20%) - → generates snapshot.json - -snapshot.json - → reusable project context - → used by developers - → used by AI agents - → used by DevMap commands + → runs static analysis + → builds project intelligence + → generates navigation files + → generates reusable context + +Generated Context + → reusable across sessions + → reusable across agents + → reusable across developers ``` -### Generated Files - -| File | Role | -| ----------------------- | -------------------- | -| `DEVMAP.md` | DevMap instructions | -| `AGENTS.md` | AI agent entry point | -| `.devmap/index.json` | Lightweight agent navigation | -| `.devmap/features/*.json` | Focused feature maps | -| `.devmap/snapshot.json` | Full project context archive | -| `ONBOARDING.md` | Optional onboarding guide | - -The snapshot is the primary output of DevMap. - -Everything else builds on top of it. - -Human `analyze` and `ask` responses stream progressively while preserving -readable terminal Markdown. Agent-facing `--json` output stays buffered as one -complete JSON document. - -`devmap ask` behaves like a repository navigator: it extracts intent, ranks -snapshot files with a relevance threshold, uses optional retrieval-term -expansion for better recall, and reports low-confidence questions honestly -instead of inventing files. - --- -## Quick Start - -```bash -# Install -npm install -g devmap - -# Setup -devmap init - -# Generate project context -devmap analyze +## Generated Files -# Verify your setup -devmap doctor +| File | Role | +| ------------------------- | ------------------------------- | +| `DEVMAP.md` | Human-readable project guidance | +| `AGENTS.md` | Agent instructions | +| `.devmap/index.json` | Agent entry point | +| `.devmap/features/*.json` | Feature-level navigation | +| `.devmap/snapshot.json` | Complete project intelligence | +| `ONBOARDING.md` | Developer onboarding guide | -# Generate a reading guide from the snapshot -devmap onboarding -devmap onboarding --write -devmap onboarding --write --language id - -# Ask questions about your codebase -devmap ask "explain the main architecture" -devmap ask "where is the auth logic?" -devmap ask "what external services does this use?" - -# Machine-readable output for AI agents and scripts -devmap ask "where is the auth logic?" --json -devmap onboarding --json -``` - ---- - -## Example Output +Recommended navigation order for agents: ```txt -PROJECT devnote -FRAMEWORK Next.js -LANGUAGE TypeScript - -Entry Points -→ app/layout.tsx -→ middleware.ts - -Critical Files -→ lib/db.ts -→ lib/auth.ts - -External Services -→ Neon -→ Google OAuth - -Architecture -This is a full-stack Next.js application. Authentication is handled -server-side. Database access is centralized through the data layer. - -Snapshot saved: -.devmap/snapshot.json +index.json + ↓ +feature map + ↓ +relevant source files + ↓ +snapshot.json (last resort) ``` +The snapshot remains the complete project context and can also be copied into web-based AI tools when needed. + --- ## For AI Agents -Agents should read `.devmap/index.json` first, open the relevant feature map, -and inspect its `sourcePriority` files. `.devmap/snapshot.json` is the full -archive for cases where the lightweight navigation layer is insufficient. +DevMap provides reusable project context that works across tools. + +Instead of exploring a repository from scratch, agents start with generated project intelligence. -If you use Claude Code, OpenAI Codex, Gemini CLI, Cursor, Windsurf, Aider, GitHub Copilot, or Amazon Q — DevMap provides reusable project context that works across all of them. +Supported workflows include: + +* Claude Code +* OpenAI Codex +* Gemini CLI +* Cursor +* Windsurf +* Aider +* GitHub Copilot +* Amazon Q Without DevMap: -* AI explores repositories from scratch every session -* Tokens are spent on discovery before solving problems -* Context is lost when you switch tools +```txt +Agent + ↓ +Explore repository + ↓ +Trace dependencies + ↓ +Guess architecture + ↓ +Start task +``` With DevMap: ```txt -AI Agent +Agent ↓ -AGENTS.md +index.json ↓ -DEVMAP.md +feature map ↓ -snapshot.json +relevant files ↓ -work immediately +Start task ``` -One snapshot. Every tool. No repeated explanations. - -Use `--json` when an agent or script calls DevMap. Human terminal output streams -AI explanations progressively, while JSON mode returns one complete parseable -document without ANSI or terminal decoration. +One analysis. -> Benchmark results coming — with and without DevMap, same task, measured token usage. -> See [docs/benchmarking.md](./docs/benchmarking.md) for methodology. +Reusable across sessions, tools, and agents. --- @@ -228,15 +220,15 @@ document without ANSI or terminal decoration. DevMap is not an AI coding assistant. -AI coding assistants help developers write code. -DevMap helps developers understand code that already exists. +AI coding assistants help write code. + +DevMap helps developers and AI agents understand how codebases are organized, how features connect, and where work should begin. -They are complementary, not competitors. +Use DevMap to understand the project. -Use DevMap to understand the codebase. -Use AI coding assistants to modify it. +Use your preferred AI tool to change it. -> DevMap is the context layer between developers, AI agents, and unfamiliar codebases. +> DevMap is a shared project context layer for developers and AI agents. --- diff --git a/logo-devmap.png b/logo-devmap.png new file mode 100644 index 0000000000000000000000000000000000000000..7f465d88b69e4cd70c23dbb72df94717a7f0b5d0 GIT binary patch literal 55980 zcmeFZi9c1_|3ALYF;)_#XuwHjC`F-eGVBVKA*Vu8ms84AQKAfCH%~;-L^uti5K5B_ zr=&E$P6n8SeTu6UWaOj}V%; zZmrQqgvPP)|Kg(Xf+T`Knb!fZiE@a~Bymxy{+GR(CKC7%VT509O`c<9fKI`Z7 zlixJ7s#qfXFAGaZZTq$A$avAPjmtwe;_1z~RG+b&-sK|QU7xF;lbMYhib7%y5RAXpcVE-0jVWe(M zlfWq`Q<6f2;;bB9jquu_g$TWuVm7)HUpeX!@`a5Af&K%zy}SN=>-?Cr#YcFI%Hz~A zhLZNzFF9{+YaRBl9xxC?U+GSy)cx!a^}v!#$A+jc4Yft)b< zFo)8Tc%^wxpp_@E%rn$;8kg{(RUCboP5e74DASzT)E*GsvvaCA;@w(0 zmDR5x_OCb&)+&X?!D$7{1HIkHiKD7zZa~jDk$sy3)KZO z3(ECpQxx>bS*ZN@RQ^2K=zoSN{Jd@DJzZUpOVXWlWX3$s?sK3~#^fS<6T1i3pJbs_ zIcX`B8cNIgMnj%KLD{jXNZ^Rc3!t4-Tqm+i)4E{G1U4M31X_t5M>|KpE6D1{@72QE zlQ}GOfR_2H^54U0mV2c^UTW4~E`z>T^y&EQSlCutw&yPaE!(1C&)hs*J!Lu**5 zaRT#-)6#2$z0F7RKx(sFl=$B(e~KW!CBxvogCqZhVu3!#3}(~vKYlN?L1UzB8gP}p z-?PI8AH#$azR9HPl0rx>auFNi2865uQ<{-`?$IM`WE%m*uI12%(o@uw;^YR5^RYo~ zWW=HGHPCW{3(^n=-4K&0A_auCV|*?mw@(4lxE?3CU^N`eETY~K-j-Ve8VOrVALDW% zKmIZNRidmT@c=xRV$3wbP4?VjlZWeANbceyc4WX)Q1cm@$0N;ioO2Lz$9p%?kAxoQ zk6VmL;omu<^MJH}X#KIlJ46hBYRjRpwz|A6=E7xv{T@H&&~mBoAX-V?KS#y{4cIpC zhmcvqyk@PCfes0d}G-o_ip7u3@ehQV$T)>VRVvaS(A58bTvW&93b@MdPWNAb>FX)@(?i|L_pF8 zP-LR;4v`4#ku+rJ*fPLECs%>?+Etiy{0=`Y`l)x7g#wgeyFSM8xsQ0TZ_#G_t_Q458@0Aaf}*t|MP7b{*e&#qvko=C!w%ie?}ez2Mwelq!~-| zS4X9}Ux{FNfdTdi`CO%*bIi5$|8DN;xfuTnp~uERWGXFGfxvqG8E~|<_>msX|5dj= z-^5Vklkjs-Ft2ME=fC^r{lX#bQZSw>5I-FhnO6jYg)=2tXwO;D7Efmt2Mm+cEZFnx zgd&_rQcAInW(ZV=;Po8K)pindT=B(o#3S%7-YGB-)Iw(sepxbP=PCotv>z>P)$$8n zJR~>>K8PxqEOzJGqC+#1Hie!5!}@a?ez0^krF?=)MXB<&!<`Q?QL7ob-CL71SoR&_ z=AO?TiCs(jhbtj{I?7=*_@^=(Xi~x)}bpsa0Z(10_u1?{d zaum_4G0|WCB^vX=1Zwn{amStA`NsU_e7uSMShN=Wp%2{$dC@jeLz=7qSXUg<4JAB; zsi-i)I$1$WlLN>^?N_ot@>M|hRY43} z-n+{otQ!LP1mllK%N8UJ_*4m@RwY>2NE-=4=nxJQ-D4EGoLG}_LCgTvoxHdA{lmmV z_#g!uN+HyKX%V~mG8vPpw*aB;Q?v&d>ASz5A9>edP>Aw=0|sd%yg4O;cvJEFf%K#H zPcBXnP*0kJ_=*@hrB*4xqKA`mu0N>VC}jq$ zgfSj-b6N*Ny;2}diDQ&x$lV2dHX>3Ti{KmM>vCs&5V;j=J6DMc%yp4h#gQi_=H!?) zNMZZbG^Z6QRp8a56YF=_7K;(@eTCWE`^z-M&!Ki=^7V$~?FG)-TLY}Yy(fa=5wk;2 zRpcZjQBG$p`XL&zO4*Lr-5<+VOwvrfufs`Pg^DzQXyne|q11XIl#7#S-BOBw!~jX_eWO z!?L&MOr(tNe@@9*p_9PP*vD%*va^ZlVyfXvu4ec3%I-u|N(*ghFH^?P)VY z$P^nakwO#h$WwZAY~`t7#8tqI4$yd8PAH_pynbF`jx5rA`nLaI=HX#|tO0$-^7TXR z4Fqb;PFVgMdoM_Tv<;V@(+}7iNj4&%P3@iK# z-`!G87UVRoLV|PD22pe_k*J^Erft`6Yz(pAh(JhYB@?JLjWE+^X_dy>jYiqx4dj21Qwx;Hjx}(btlGgvbqy>Ss+kg80iY z#qW$L!3YkVwOuBPzGE*ZJ~1M2zgH@Wcu$Q8gd#35lCqsBiZpOS=O;1eEGzyH6tX$j zO%qjJ#$s7QpJBDl(P43^{|t-8Qb-SnB;pfo9#s{u3|d|w-Z{K@J{^J(`bFR+Ow~Ex z-7Q<*_$r72aSvfC@6l930TeR)^W#|(p#&K^>g8FaJKYoyvC%^O`%ab`CW9q;z~_8A zIaqDm@M8UjBho11@3W-tg7++htm&YOP~QY>vetB%;%&wDPekL8m!M1UeBz8Z;wTn` zt6=`EVrc&NTAU3=31{?AO~X%vMVO@)+EEY%7a0>`9^1~Dyw`_N*k3`RoT!H)ptAJ7;(_+!urE2?6XH=@ba{O zm(MmPTqhSrRKZz`>D0j6iY-C#6k7;ajJA;R3p@j^Tv9{96uaJZWI!C=HtbpnbP0tt zw3~`#$niLobC)si9Y`IAzEDrrP*1>IlPK{lpm>INbb>gDZ;Itmc8!t_|E03LCtKh^ zZM}k7HdmX?pN|*O!5pFa?l(Wlz)1vSWqaMStAq+o5~m}s6V`R#d0N!6Zs|^J^v-Po z`?J5#Y=jWKA>yvYt9)pMz>yQ|k1cU67?0-71*;@~(?*6!Q!H`8A6nvw*yVL!{Tzu< zoe2G8s*cX_M}KeXvN^`$DyXp|^&iSXBKUWC6Xt<;i00hh<$)u>xmy^^kTne1rniL% zc`Ohnwl(<`_elzWiodb}Wv-iMU8C{Pqfsu#t@{d!%z7b0Xo<|e_x zU@NGTw)KRByR(x;A0Cw;Z(`~=4m5R$*GO$KEd3r06Yb8R&bV|4Bv>p6f z>m^KRDF6IIEnCbivpD#9vAU!et11M`@!eRak=V0<9XVsiZ8&ES4X_0FmE~L6sT8t_ zpy4Y2=!}AE5NdHqC;AylCKQ8TYwF@dRO!MKJ&(lkjRJ@KOq!Uf+D+|KNonlA#4{#Z zTHh*{K+P6dc0W{vaU+zsc}ns%#Lvds<4#-!TOxA2r_=;NDrJ1S3}c`+(l63wsWDzQ zn^|Tm_As|Bb%q50AoaFB^Vsdzlm^7To-FRt_U#1hcaN^CfIEw0D1qY6ipF@r-D>-Z zqJ%zm)@O$9GM6pzY=qi#FSRE+sH5YdBPV#uq(CB%=4ZakO9*M65zzC}ItTICiq7t^ zZL*U@DUNsKe%yZ`I~YSDBe5U_K8&G!h-lJdjO;s&kOcQ%twG;+xi=lfx_TW(MGpw4 z|GJ%=A0V0}6pzU_u%+WZ;whu!DWovcPQHxK%qs+C6JLzsY}5tRc+z5=n@9}q#qsJi^9)Hi>yW6 z7;m5+#$e^beUZ-vCcE)pGaESS$e}OS^t0rCo5>16z^2PCr0)uOm}{rTZcb7c1NC~0 zarg_WzQ>pZa^e5zR8_=uwyRUd4I<}u)sLf|FzP>hEppj4F@EcxS$5d;P$4brqA9G& z#PZwXjddZri(Pc!__{4)=eQIIqaGY9&_P;=30F7Bk1PdF=V0xjgG`C6GDR|mW#Z(S zy^wm!@G2!HKt0(1k>A*pmS?DW7kF1QFo1Y;5<-6eNX?+}2a&@FWJ!~z9G^Sk+Mwm6-Y7Zj9f*#RpX}wmB}nC>$9X&p}Ht=ePK*qIvTH72{SO)n(8#& zNcA*kOpd7=Pnf4W?TDB$XXK}l)fwssbU{U&(1y4hXL2BY^e}nvDvd73+HC+?$3P{L zW7Zp+dw*W+7Cz5sBHD!!A~K=TFs!A_>K2W)5>B6S(t;?6N#csq$~o)uE9%UK-RUNy zGtfJXK~cnse^qp6GK&I`DB=wDjIT7qqSObFE440!dG_wX<=qcTCCLozxo8&ylSl)~ z86GgG>i9Z6bZZ%t$|C6gEtws$%XqpVHBLO?;e%Na{C3ec$=AT}KY{Wct_VZt)dw>q zcylScVz6rC``esx3DOid^Tt-WEEOWZeLCPmS(eq=F|r4p*yOjhRFMbb;hWMr>W(X3 za!p*$W2x{4Iys#E8A(+VBfc=@dn@{PRi zfe{Y*j!C|+cE-!^(o8Gdsl>~qq_Cd}sr<)}mH2lrzPb#|Zec>4AYwc@bcQ77f3}5s zaV#_@kS2+GEl=+>$X^vI2l#W(%`t1{zduEM8!U-`F{@zb8Og-=+R@^C2PF=8@pZ;F z-x~qAqmTu9O+y#Ju^3FDW_lu?%i7c>#wK4-RA$g{qDWS(iMT{P(Pd)40PoZ7Ov6X? zh;b;=WVbRvD{Q$5bLbEk5apFB8Bt{;oZj2M3YaWo42Nx=jvA?yo}k49Lq|$QWehT7 zmwY>T4Htu4Wy}E$If;4Ne=aS^bk#mV5YL9{O8{@dQTogVmnxn;nDx+knh+?om2tWv z)oQm?&nyKxN26MXe&Uw(ed}#g=K1Rr`WSWjXkm1&pI5Rb(q3j zsT0T8g6PPT0hIY_q_R*HHYlW39dX^2K$dahF78c-;b|&O8}U{Lb3zqRWHqCUFSpBi z0x9ZrKRQOME-#+Qb;j(HHS{8+IuDx{5yaSMa&hE1Qi*zJfQBHd&rBX3F1EP!iNTam zsZ!8Hb$RI_QWuc-uU{PlS%A`|8Oo=qu#6!H{Br-l_M`gjj7@*VzDpfCta2(~8zJmNa=_!pHB z>S=i*0hc2GEbResuv5Ryv3VgEvlsEd-U*e*wE~i%(KFXGB;d!kiAy(>REk7Y0v5$R z1h7?-LB&XQ8;wCjF1zl4Lyei3%vHrg6YQfM%JhD*`p*~rP{kn{MDl!SY0j&J+(}HO z$T>-0Pa~og0O(k&V(fMVh`hL7I1(~CZw1w}xU)?Kjyp+TE`f|(ku`2jAUPV`BJ_+3 zv%z#&L*xfaCbt-kr7cMjIZ!oe55;N(-IU?KngK{sRg2QLFHJa-qp|~k8$<5WV)Zs? z$eeMQ$;4@rAPK&}VW7#mze=+!KY=!9VCQiufv&ZF$nBsu_0IcQz_} zYxHoshC>kKLCqaAtNmH1U1=2uxFaXy<_EfUS&6Sb4uerrZ#d|Q!6d%n%obQsmq$~D zGQ-4A-~2k<=QLCpH1rc*WNIBA2baL#Erg9WY!pr(sQ6K3+vXk!KkuibN<k^8824=#j?nANRTKgUKsS{U+17;nITxOb zJ;^!!=zW`EZwu9&8CyUefegqBj+J2*#B7ns-*lGD9_rWF;g~h}wM`$JCgIMIzh^RQ z!|`Y(e*Kp(qtf7M28^(snk6-%HG4L7D;(Z>@PB8MM|2_!Fm5oC_B%sfJe9cn`G^j@ z=s~|Iv1bQ#8Ni8dif5S+TNP4j;W~ry5=2-OEc{yv$X=7UJHVKD`{YRub}Pn*&Ooih z;vNT@7e-IYFXc!VHN+13Ed*8kV)jldhNO3IEgTJL<5c4C8vRM`qtL$kKMQ2oE6Y!l zs;e%GtA3*L2XT;6Cn6)IfYT&tZfD&j2T1Eo>5BNGMug1lP;u3_13y`ajA!^?s#AM@ zNz|{1!5)_78Q9Mr^b^wK4*L7VSm*1j;-{7BQ)o0I=7enqtLvjrF@n0#g_^tZz?!_E~gax2#)g|oD18`IDze7&LAu{qTR@RgP z7FxkLc<>nto#$7lD)B>lz-G}-I_e=gp@;FZw*s1W5HTm0k8`179I=#^fauasu40;g zG*qu|>hP=7)r9mRM+HV=oyD0wqymWUrK%Dq@x{MtL4+|d^wLJS`}c2+9aj~$LfZ{p zW5V-%%$3Ph9J3g+)=a(Y+wz_#6RBc(n#`wi;XNkuacBEWE*yLKn(_PF$}8^tMzvRz z_{WyrH--u`-)sx$)?ri))Vk+iy+@AY{RMjZVOSebJC_5IX37{(v)7V0K(i6$%QW6p zTe<^rnhK1}=YbUhGq9SjyAXL1kjb0(m9{^big8Fq>fJ01y%qL)r_JW*1s)~zYEE!6J(@Hq5 zCjFf~1KiG##?h*G0khxZ7vFo`a(p}0XjVF;#aMBtUC}NQjM&y@~|H zzJ|*m#pok{(H$%l1|2Vq0-#yVw0-N1z>C!P zU%_w1VZ)ek7#Wg8|DVSa4GFP#8?xW8hDsen1yeZ1$ zBssyaraTvi47o769%PCQb4Z6|#yV-P^RDF_OYczfj;``I2-`Na*)MU0Hm^5mMLg7| z@}I02r;@TS1Ln#Aw_9^BRgODGA$r=KnX3xuUxEZE%*vFH&=QBX&AYM%o|GcbGKEhc zws;WYmc3rjVS;DOY_;gO>$f`&!@R&Rnsh>W$GF#LK=BmX-p+)(IdkSE53zT2;;aS*$h@^_q$o#g86wzR517IeZPnT^A? zimh(;D*9cM9G021o z17+*!inrdir@#T<3y>EWvwu`#pRLMPI+W;Pf4;{uXr{#d;&dmNZwok4CIH8t`wsnt&^{)xYq-U#`kcv*pgp-eA@0lm?Ru!*0HY*_AQn)~ zCskSiNV5WX-~PKg5r;v(7tNfY3Mc&)n}g(Q5BF_AP~tMVOU?|eH%y7YB4>b;AN%O) zzgd#}Fso+cQb;YvL_HogK@m*#B)5P`CzMB99ih!hZYFhEK`*tUO&ZBf7z_U{KG0%= zW0_1!zB8i=(c{APro!6WFl<`k|1<;IVq^L4($eL%fOe>m%{8WdYOhXoGTTvytk_%LCBy*bh2 zZ%NSHeA@nTuk5BcmK<*zo%Hi@heu}bKW}rOOzBi+&kw!pJGwX5oq{=JG_wdpAmRe- zcw?~1!pYX*|G6ZJfQ*;9*O-_Td-zVK@`|Gy z8}nXgfS#+EtCr)lPH$X8NdwYGGZSEguft1c$a`_c*Rea&2oGs)94w5U%DS*Xn%kpo zhlytHWRcvpPo?LIv%MB$+T9|d$5&PT-4L+jze4>mS4@;{^b__*MEMT`cGjmxz@=ki zU842&NZ{|~=~BPV%viqCEbFbg0br<}j08@CFyTtK!WW3TgOo-m=`%`}2i($iJ2b85%>w08^U$ z4TI|W)7;F2jcSaD?~c!VwFSMuyJKd;wIbyV;EZJrtATPraZAb#ywPyvm__DZ2&GC%eV`;8B{qig89sB`-v z%kK&CVnM@0ZI^fOWhCQrYu7l8I_vp#E|(A1>pPaqQ-x&cJB1Yz8+~Uw@SH^%Ki6N4 zShu*aCU-)V;YjPxlvl4Dl>51hwvHNFC>joYZHrTF{MH;~(BHRdXf&wryTj2NqgB@z z2}{IMdVd`r205FyKK`_lZzVOWCq!9BjTYS495ZXJqSQd}UHwzCOATWl4KzI8-y0q@ z;q07F-U^HZV%xGc*fX?hpe0WPQt>J{B>i5CYh73M&e*I|_P(9{q>wT>+pMzwN=l9j zTWK?ntIuPQtUOyHUD@>W=+<56Y4HXpx_iHOPmu=uvh*m@(=JSOYwOPJ4or9&{r|J zDX%`H-MTZ3$^d79r#8pK4I5dlZ}$iW!>Xw0PG;{tVdz>=+1+ugVmXT1DBMWi1J|p! z5Vo@11l{VfBJ!7MpO9eE84|kG3EAf1!iXHA0-?`(-C)<~p{9m=DHU(0yi`Ql&bX0s zdK;X!+f-Os-`}NE2^9%Zlr08u`k`Y^$CEebUuSPp(YrKJFoEuahRI5EvwUkIjL=P$ zva;^9Hk*LBNvO)gZmJqv$x?}f@45WCd?+MAMIi1J*XF|PO@<*k`hjH`8fXB@cqlML z>VLGpS!PUJ6&DVGdR!C<=sMU@T|Oy&{YdxQH;H#fkY?)J{y$E_bCu?4(9lv4f%WJ~ zMPE5B*B_g^>J!u2%EnpR3WZ&x#OG5HlRJUc?R0B5T$7|y;f~0QyW{{GG3qKCw;%`Q zm)i*M+#v>$sbh7>o!q2Y*f=)JFrdo)d6$i zqcsq@AsALuf}O9FXQ&a~f668Lu+E)O#fb>;|LIKqr^CjFdqPKNwX0VG9M7jFGx@Jx z86t_T8NE<<{jUo!vps2D<@CmDyHy$BO1wQCgmAL~;y_xs{;4F9WA=NKaQLOid`vm= znXM~&O0Vi?sgAJb?}l3_Js{|wE4~u1dZE`Z#Y&r5JiGg&zd8eYN$E&~gL47wo3zxQ zaY>J4p4kxm5-UqBP_m*?&izO za;@@dpFMSFbLu&hQvdCZ<+&+;Z(=c5-zPcATlp*}Ab32s(qM|va;_l|;zYxD0JYk*iD-I}U1dpP0Q{Awzm60RilAGjr zBJNabj~(29d>ad?gxXC_{uIS0HyI8(81C+oMVFS~3jia?NITPhLNzqd(KtE+W82Ki zIi*1;;eiax+vc)RCx@+c?rr~LzQRCiT1^NA{rsrhR`sHyI~J}m7ni$=A*&6MnX}nS z8lkbX)&}*whP!0Z$CY-Pjqm4FZbf`*8i3q;yUDO1Jms~Svwc_k5_Ddvd^qMIik0(S_BPHV-;>5yN4^G zC#)iFSte#_ruEUkM?upj@7A8ZcJ%IcM{VHGEfUYZG zA!$F07S#B!j#cbOO=>yW^9G9Z3j?hnN0Ow7-<`bnVSPmML$STRH= z?bf#B*z0yp0&+*c@nHLTY$XpGS(BOCmNDXd!%5~lg&2Zg+l?m!y;_~qMtdIGNC99j z(Qo_F(gxuStVrpX{*WokdN>X2h`M!_GjmmXIdZ`Hdz@CvI1=?0|R*V+3Dna$K{+y=j%XqTvk0m8Icb!^d)mH_H?QWx}3x+sikGKH?$z za#3I_g;?Cp(F@)e>-M-23LAyJer{G2mU-dt-H5%KCM7|eC55~z?6c)?&mZjLrc3FY zOy^U9`hB>!(n#f=gxjA=Q}WE>Wkm=y??G{vtc2zG?Y+3xm;}kT!bQh1bn3~XE6~}} z+lB*7APz93={goyx9>Xi_({)CwzBMrW*M>{aZ~P?`04Fy!}X4g*iH~d5|lkh)Ib9@ zd6VH(#3Df7S73!}jGi>rvKLSnql9Z5YFzU(@bR-hbCV|{d@ptZirw6uaT?uiBgutA z@J-Sxz=HgUKd~#G`xdDoHW?2SRA(s_Y=_b_>eo0SA6lMNpE}~*ucpc*Bt$B%UEqzU zseJny91JJ37F$7X6E1=V32w3p2n-(xHE|O0{OQ`GpgPp!_2(antlaLBYk6n@-~7^* zxQW|9)rG4L&*sA6d+D2In_U;r$*_{My_fT@mh|i%s49jRpr^;Ypd>=LvWvR+pMpLggwFTk`Aq?aMLC1eEJox?N}x9;BUW$;yD!Y$tPZhXPJlL{2$FR=NF(Sx6yP#L~MuiBDv2t<5N z{PdEm!yYLj|58jj(bwOGhn7O)WCDr!7~MlOREMna0>Ub@ou^j7ueBdiwt1c&hXR_D zGN<@Y(tw*|=#*qr;eC$tLOF@n5$7B%1!~U^8ATPBDeTUXf`a=+IaKG?wO69`IXgez)9hYqL2PDIUnAtn{&{OQcQ3S&}X zm&8v$=mimY!lXnYHWBKcW zth&6Cvjs5nMA)c-Gi|U5@A|FcVAeN-E$Tgb8HSMP(ylHgi6ul1#ZhAutS!*ReXiKA z%UX;0{!U32&%g1PFZ9wx zpnV`Dx2<>Cr~)8q+>Rn9S}3lV+_m7!to3Yy1*Q(IllMv-Q;olS?c%}M)UjBpX$5k| zx=k=P*{0X8Je8tz^AKQ zbrtbcCdUIhn>Smjv~6_hLrma8@RdW53TbLfQhx(*mxW|hEULf2upcM! z(V>*HWJ0hEYaC~G)L`te0n|14zL#9QwAb>d<7kVs1&d7{^}esZHEZ3X)@{Syhr7P5 zVOeiqD7Uk>?hlrW299oWt04rv0%O}W4!*9!H>XL*_IWbR7XJK_?&2m#<ycIjO9(HQ}QFCCwcrD$j1n03{>OY_}X$~Q2F2qJ> zF(x3-!u-K(JT~f)DI^Gs^WQgEvXQV+;@oSEgUPF%heq)|A&pn(?`)0z_~xteoIVz> z3i4k2>qi(oZh=Pd9r4qqQ3iq9a7j9mvjSVN5{|8Ww(`#}QJd&FYTnbwt+`5^2QU%R zy!DFEy*+<&vZfISDVetPf~c0^xEb*kGPt9AQ)ccOWQrq7@GWZc+{W`FM3ntu_s>)u zU1{4sKm*)%+SEllJ2k0Tg=4UMsYN!VvDZ|o*d6#CH(5Ib)}?}WzIChfD$=wyONWu zf?D^aYy1r#zor9}zUAFqPO2Lb!BNn-)JsLnn@1XIA@8bEmU*Ll=U(Ss{co35go+}o zPv3j|H+UZ~lig9#JadU(dd4(|td7Uxr_(Op4Ayk5vY@r&g@S?t-l&p z-m>PQ?j6IWweEr3>(GBv;w+iMTKo~>$WZm@FEAJGTx>2fALeT!)mU(^n=qCW241k= z2~^oO;vDO51*)Zz-{i8M~zjkeKKo8Qfhp* z3cs?|nke4+q@#Xh|7b-UD9{BfFu%AW;t1|2BGpM?m*9($)NLIbON=YA`vrU9=$9a-NT9P*oKAQM$$V&AatWwo=I5?S(c+_4RO}K`2}c!<4xMWnM*;Fa&ywC!il? zFrt#YDMfTA^gVyrj&?s`Vfm<@hp7>PCZ$ybEyC(;A^=T=KCC%N^wI)l#3PJpbFXe*;XzIYDRGE7UF;h;)(KJOY4>nJ#-nD^RmSwd)h zZ_7CrbfFUFfYNPy4RM7bw+LI?FM*#l*_Zf?Enu_zEO&9O7n;V~h6_zct|7 z6B!I1%WV86FSU@_cU7EgA6ogmV>EMgC6%3-(n`Pws;Z%u*nz?Q*qy4S(+TD5nAl?~R*5}I^isvcr0o9pq^?=zMhBsl9UDIcQeMon!tTYl zf%0c2o~|W3Gr$V>xuGU7|%GlCyMl`+yfkn;*7BVu{n8F@M(cwxIsl86v`hv(=7RrsDAJ|NqHzuS4&1U)xLNP&_q{fWtghv1T5?)W&z_ULql zPnD}R^;&ZJA$qVX?Q`uk ztiuUYBYKMj&xfM=B>*n;`ZeGJJUoH8_G3-uDkZiOpqj(ArI&cJY`GXOjR)YWs?_KE zj7*O1{IFlUppGvm+vp`8{@wRD>AA^Kbg>Hcw6>7S}!0 zom;~7|3{_1ao#-1=Kk5Vuzkb3_Ey@+N#nFZ)ihi+HMXwLce`IOA%G%aNTN0HAMQ?D zm|StucD`9`s#s7^xK(+ibN5z^zI}#kdPjy{hsVY{)ONPF7!LQmajiDC2L!2`pgiTs z>^&L*A#hEAX_-!0WpH=I?g7y!`+Lz3W%fIV@!R8d#g?wF%30q1t|2sD*YM0+mDt#j z!)O2Ok?C%~rWk+P<<_9~qR)L@Sw3HXkMvYNxp_-w?jw!iUUKEL$AUje!pDl!u!^V& z%uDbgTEa=Nr{8=7G1r%cAJTA(IrMeS>XcV87tLQr9d0ntYl`^*bBH{Do1-sWhI61H z1CzJ7(8oPKRL(&3Mu*70hizq+%W`9(6}CFMQ)t%{YUpE+z!Z9rErw*Cm1{^ZXn(LG-NWRaML z^2m`9u>ZW0N>dy{-0~Dy4FlO~f$imEE-@M+&x8L4u_Q;gi^SJpb_{ztj)#>ZA z-G0krX%34mkz&30xN%S99Tw}BcW-!9jhGOM z!;>+58N52}PiuMKpFgrkkT?{WN2~k&#=YA^6KS+T+rKExb@+&f|D z2+OX0hh==>mT{uH_KjA+2pE^T7d3&|Z?1e()6YkTYD0CS2IJ#dVT04^SHm$;5Zi{{ z#i4iKJ`O5ZvFMLss8Q_l4xg-CIRZ|6XLR>xN=nakHz@Us;X&GXqec&@KmakM`u?a;Ec4K@8o z+k%e0$$xfdmefLBg`{*Pc~24e64>eD)C{BqgR!nWe0omi1XE+_(sypt` z_OK-z=h{2jT-f^b&_|`Dx;?zr2hY3zwbAQo!(V&zUfz8v^d>>CGN^R@TA#!RvGWZz z@Mpm5580_M?y=GzZR;8oY4`kc(lB@=z@MFe>RE>d1Tt}Kd|p)3hGY4NEtC79G4H9N zfwXn_9TaD+et&aVGE`IJ91HyBkg{f#H}>YfVdsZx7f6o13S-ZFTLnvtHy=)zZO}Ou zZ+Vq1EYD#dt+-uip=Kh|>F9o#%08OZK_~EPFhI#)i92_B|JeQfpm11nccf=;pPIB( zIxc?4vYmWy?~`6)dN{NunG3WKdVTN5#+yVGsz?EvF zI5_#@xYdL6HPa+@;Ttr#z4*0Le_nmz*S_Ps;iJR9Wiq_mV*n7H_7Egz>UopGMcBjwFW??uo%+*~FaP8#ULH!Z4H(>r+$FXL377l=(d zP4bT!5k)b3a}{4-UMFI9>SFMLxVhtnB~$$VBDE&P$2Duo+Y}rPcWWq-b6b7d1o7OZMTdUe5CvN z;SHOIcP4wfgU*kyK>SpELei&-Ij7`P*)mq2HXntLq`F3a^eF;CCvO}Gl3}gH_ zaLX9uV4lTNMLphaePU%nu)TUu_(vs9W9HrPIg5izn`K~%-|Jw8pt9Ye_} zV7>{|33jy~J@wDB1%3{KQRU#ns#6^E3}+XSQ8nK^%vO zo;pA4i`e&qLc=pLN9+(+uQs54LxlBcP4!~0RxcDihkf*qp6}_GbFK5AJ7r0CJu%M^ zLTB-45b(VluKiFIC$Jvy4i!Hcu&(*tVxf*+Zm)*+z$Wy9(+kcT3vGwaKQPsy@PdB`d zzkcFgkuU7%5Gh>$SvXHKsOvFKFlyNLTt3w`P3ic2U!DaP=t}gOWqfpQ|B!mjrjY|) z1i;^Bm3Ip6TX5xe zNj9*^W?Wgen>H!`dHl^0zI2MS7TcxwwXyd37oG9C@atWEclD1u8=v$-4{k{*b(DB@M@!mkp0kLKOZ#VVGuAKPbK)2DWuH$nI1AQ7>^9$cVuycb zw}J0SMI~gQrC3mb4|?*qC)yy>+j~k$Ks6twSStbE0%g}>rX~y%VO#O!z#8mlC?a>L z;7eST=+1d^J2fm;KlLAi-}Ur4qCzd_@$NM!FXDbs?;Djd(kX`$tF9mE)QD# zZmvbLmN)CcCCQbgbNLU9j}^JDj*WS|e)@Q*%n|>-S$g=xqwz}sB$R(zI<$R{ z{(SQjH_fEOc5~n>Yv7X{Z?^0~NV=Hn6)%CqXtPO#ainN^UcE>@d^l{Q5^&IT`+V+U zTr=*%pARG?r0>WJ*+X`&v;1q>%n;RcFGiQnB9>xOlsKxP&pO6ct_0jh(HwDS!P5&9 zx$AfNy?ho_8zWcc;VHj!ds+?T;rS3Cx8ZKtJzTDE7pt-TTFw>TbmmV(G|?kXO{fAU z-4emEJ)w<&62?PuPUL0w_p7AscftLj!Obc+)gd+1_KaVWI+>+^J#z}t0{Su7<(DFX z+Lutgty}ic;me~ru)II&i6dxt!?dPIk)-OJS)=gFD?Wo%I@P}T??U7i>_%3vAn;Xx z5LHcsRC`Muj1`VvqUr6qv%hYN3k*}gb8Q&PgVKN^Mx@(a(MxM4{}s-q!yTPTy88-_ zK7v`gZD;Id`7?o(^-Wn1u*F`&#$pQNpdJAoTe>C6*raFV@*uT$H$8rSDb6`$i4vCu z9JCS^-aDDK()UtR))GW47=exn*X@||$>hx})wBl|LZAKW+k|Yht`(nK?7vH$te6my;SD;LdhN5%i(V2z>6{=7wCDtE5KHD zmRfulGEDGeG1X^l!Vj7D96vCcUCl~5PiKX5wE-icW|aypsyC7-P2u}>?kd-tFYB&N zftqMx#Z0qPGaN3v4_ij=6ibI|uHSGMu+`!4w3OeUr3v3_qQb}u-~IECmstD`S$&K} z_}*5DY^iit4}#w^0_X$`f9Jm6NB=;E(QmpjF7^t4h&sp|AG8E4`{~_@Ty|*ovngH6 zJl@=T>v1dacdV)G$k6A8+8jl~zv2FRFr$e|oCHbSl%$3RBk~)LwY{mhbxMfbvCdN6 z@TvETk-eSk^@bYOtEr4+nnNslJPTyj0ut%zSc{UIzC4>#Gc*LhNXd%Csw&6jfT@yx zwXRQt5ejoS*JGmobc9ivAIvW@h|9I3;v?$~CqZSDGtM`tsfHc(Y z=`%he_Wx`W^7N47Opaop{E+(BDEon)=pXUnz7>LzLqaYVk#bADJ1tr1PAwO56|R!w zv5ix{Fdi6}+dnCFeT;p}ygpZlv$kS2{wm~Vu&YCghpqb6b`;$MSg|NTegarlo;4Hiz|}_VjeVU{zN>fhu^34}6`Rz9>2J zFoa7zRn}CUfP>l)`|-s$mv9Yvhf|&)5lr#@roaY|KzTrWQGdec3=bX@Yd;K{sRn;e zHa|Ju>`2h?=Mea8nd0@u?ft#(ol_%_0bfj0q`r`dnf};Bq;7M`?bu6a44cmI&b~0>_+;aDJ4Ri57{Oe*Kkw$oga^+$ z&cqcW2ly)65clz9@*jVjiC# z>yG?TySrl}=Wng#VqxTi?{)Z`nt^{FqJ)bwqqiI5)4DHJ1YR51w8-X}K%>B3;oP+e zcV-CQOT-vRZw*zDBwt}|{-nqyGQREorOy>v&;j`PicR39ZM6Vj^e)`FZV?(R+J4wo zw;4cz(#AR!s3uV+{)Ka#pKgP-9c2r+exQgqU(3%VI1H+ESQ>Z#mSMj*+h)+GO8#uA zeZJyx?27L%#OqYl_&V4C^Du+UFUK5~*E^tu-l^sphNQT^8t%}@Gn`tg#oao>HrFPv zeDbSLEnF?oYIX4b4ZKaq#&aG-((raO->RfJMP{TdrTR34`D1R-A_{c6$(qjev zS*S4l4y#%*7N!a8@t2HYt5^SA@6Vp5nxs7(-%%d&V=C{?XuID1{Zj8!LR~GC+Ur-I z?w+1MU$bu4o%Jyj;VleZ!?d=B&N?VGOZ9qQj=W2JpYuq=Z}Q4wY4Ml0wfmyF`<4wad^1-wfX3cUHUqwvcm4fue`L^He;GZ z^q`{z#^sssKJ=Txy~J+%EpT7o$Ex@vqaoVhZ1(sbcF6OBrLNvK<6RS!(QO=V}+t)To-h+GNz!itp zDWN3$=;_Em9CcI&Jd7tCIbun|LY+{0D7A(L!PH59zGL{r1i4KlS-y7CY#btrU=9iq zlD9AMknclVk5`j6kIVv&l17!ZYGjRit7N#|1p~*(`3b*+RG`3`c7&a{go+|Ac$9}HkC&c7;`|lUTDR<9^(?M%xf*J& zeWHSF<|HfMcX$q!PCEX8D)oFx!G5ymvPo;<^_-o*42Uc0BQ8o(KOXhufBSJt9&TYP zlmg(IjpvPp*)q49(|cS!HAa{~Ew?^tdWUp2f#KKu)fMyxm(T*c55e}qC)7&25VFBD zHK~#%2}3e$R+1P?N-*G7VIh1|56X~^FW(%~dJ+nk2|h0jvU$dX4!OV%8*s(S8JBV} z5XxAGj1W!*nzb@i>SOu`_7NicJHDwE)n;H6nG+>X_h) zQB72#6!L!b+q>8+9v7Eg37oi#rvzppjaa_z)nbYw2u0({tTC*1*78|1Pl*cg9yPpH z*)j0Tmn9YFC?agFa?(*>oFp@^PS0u_<{&~0M=)KEg^=m8DwYiZ;om=WcmS)!pzfaS zC-M-<11X(5edkq;_8oxFsg`4rO8NjOXY>DdooE}0yuiQszao3Yif3~5l{rNV*&I%2 ziO?kF7&h|4iH74CH7VO;o?Ox6PwyQUA9!K0|K9iFWwjsl zoJG~*u~|!|ag8hHY_OitJM=3&xm)ukBzp+yy&?qR9w(kZXo$#G432irttM+d8wr$o zR)@#apIrXKIX0=gtvX9DBppMTe60m95X!(_7dxet~(Sx;4`ukP49Dl6w4SwA5iKY&?S{>{g{MX~ z?a}XaNKz6VpJxic{kRn;)}##?YOyi-B0e$N{oiWdIDfw}PO5#vOt&cZy~g5tL$UPv z0Tq1(7jiy;@`+R<+IK*8eERZyzxoV;SyIyIjH=Q5z?2?l zs)CB06O9N#3PuJ^7m85~OhYvvC-f{MM>c&Kb>FkRJG;k$P_rE;ic+)xzxKX7uBPpc zd!I@Y5<=!9Q|1hXG#r#6QHDrTnH!AVqB67%*N`b96m<-RW+{}?F+?JzC?Xl6Ng|~| z!~1>KKJNX!|GxjdpU*vi+^epc29WaB-yt%8-~tl9uiP9jmzvLy4(5app^Du z8P$EIUm+1VYj2`Ht5@5;Z{K%D0teZTypWy+;QI<5s0-V;7G~V!n$yjS3;w1>)|0!$ zalU@mTN2JM{inSvG~6+iNa=k&VnJiW`-cyn-7+({XT#N~xYP!KMxJkF9jK|4O2qk*Be_|T9y8lU7hAgXCY|WUEv-o9bzx_%GN)1`;kR=_YTppZj;H4 zV7zr)eWc5bHpqbssu9>gJq21T{4^pkYwJk*$NLBX+)xLNrNJ;AeR5C$sEc8u|;C&B_Ocai|y;?LTOc?d7PJaRB&+TG8d$dPfWBuvr1;Ei4|9wfx<+ zCVIV6K~438V2xp_-dyal(96$kZy^v>M5lD$x5^$TjhxiCo3)~%vX60>4udO|vQX70ZsgK6WqA>;To(Ck*IVzs!qad= zW#OH9-~B%JJ!T|pn9*U*Q@ieMk%2=l&hNdPdZ=64m2T8K9A9fPEDpw5#hDcMNgfMT zw|Y4TevDr_X@@F?>DxG@Q6#p{UUT`(&s=RqPUCUPo2=S~7B#rXj)#hxf?KLjA-?>) z=-lU-I7Lh@lKk3=Nh#6Q@n1Y$lFVyF+CgFVnfPiN0=&FEtlaeQO%-0|=NjjaD?iNH zTwhl=mAsD7Y}0!OtiST|V@+-IipIXbe?16I-fCVe(%uP&hZf#dAfhoC2tUZjn9gQS z-^xtPw;OaKLwVqu`A-)r>mv6QrtXjHY1Z5{=|oZ=j3?Qs+={M&~8&HTd6J((HH;VmCETj z7hcg>bhoT&(c=Mq7PI3R>BsUt+?y>8U2Z!{_0|#p|BV{G5?avm8bhI z!#`_^)Nwsf^6FtauMx!g+FY>rPF~9vl<#``W_Bt|fuq*!euXBZ`^px@~ z!&3`qH(FGl5t)_!$gU}GS(UH>gP=k~LKEL|J=*sMJ1nV+XFL}Z)AFgNw* zaoc}wySic_ve8~6kERQ9v`)aswh*<=Ue|r7vcB5EvXCrM=~={8rZFBVH2{y4guqpl ziVi6CS<{aL+QU8=NG3*Z^LHM(y)`G@MxPxx@ddw} z(7B%%FDbQIu=<`S?}~!3=>`-kgVg({%jDk(a)5QWgZukLgSyp(4wiFZbHg3w1s|Oq zFfMh4I=bnKsFfZw;@2VnksRhL`$sATlB3TYuNXl$UH)ZCLbN@{L4)U2$Fvvu48sv| z1;s4=j_NB%nMz%I+o?vcl|9rY z2`DQTxoCZEPg;5#jA@1q=Hs-wdO7WNsXI~_?Yb=71^8MT!S^$?X22wDT*?DnFil{j z{5++Vdko`%qjRHyzS0i!pz&&-8n?KH@XSf6grH;y zd*a~ZFphgk`($W8>`hX$Qb%ubM-6fU0=WYvH~P$eclCkp<8fj*yps*S{M0~A3pQKI zCL7rM)*QBx7ivk#5Axa*Mj|Hb6N^+ksXcwWO#fhiq~&h$5RM~=B-B*CsVH5o zy?@-Dce7m_m+B{BAFX+cm`P6mi*sA0Omuzqdlld5w9zD+14A}*ToNVMXzN;xpE~+d zVD2B5?KUUCa!YOBW_2rHyIIUa)>vY*Y9ccR#AH~9#Mi(79khP0!p58)`PVy%5*|+e zwJ>*qUislG5WkNU_~qg0LuYZ=kAT0~6C^qskB>ZWh#1`2lPXt+x(uB^E`_2-(p!Xr zr~h_!a%h>PHnU&x+qk``o-h3?tgC3?1y6qYl7!7jIEyCa%*!YLSN+NLHl$ARxvX0c zk*A?ZJ1Q(PR*91u5>nie@qqqJReNH>H+R`*2q71abjiTHSvw^)&ub&7X<+gzC$(nG; zD0=833j6Hh<4GqE@e~nms6BJGjpc&U^FI4#<>|mHNFE`}p@97aywo#z|CzR@6xd61 zKIPY#O_NwG+_hbk)5xiQJ-34uY@FlXeK~I6yseezxT?XC_GgT?8u5#Wtey(m@0AO2 zMtS9`2-rOiBmD?)CUwxPf297#TcUajw|bsm3Qlw^AZTh38`-Ej z@x*%Dyy&GJ-hU>;@=I~>E&s_6zicQV{b^|LOKRsPRm8WF^2`B_C{!0(xN4wx%MPv{ zs&&C(7stu$Oh?}43Kj9BP;G-Vr_b#2(tHz`rpdvvT)f#gT-w&59hS~5f)fpRuqhtGarQp>JC>GBWM;@-J`1`5(8q#Z}nX3 zscL!s-Tt9VJhzKjqJYsXt0sM%?93;G-+Qwy%SI>752~}4*aL+ERzA^?+BZ~uzxHYZ zt`gChp6Fj-xC4h#IavTv-4sNormCeOkaXZQ3_RJB1H5?B*y2$m?6>whYjo^g-wlRd z2pS*J5Sc^O7pt*nwbq1*;`i(`%C15$Sfzh%(|BqQm*-AklpEojYIfu zBxP_0Yu_+$J2l=sXzQKG>1y&I1rFcOvr&A#**hd-H0HDz z?Cpja;m?rA z#y`iWbZuGbfS9!18cvliwvc&|N&j~&v9(-_#AAlY9bh(OW_Hbm9Tn3I0vb1${x)9x z`{XeJZX2OD)0A>4`&j!Bh~YUo`>jVEoVD*3GR`owE3t0dJ?b*fd5rTczWmtuUhvnD z+It&zG|yzAx@}ZLCnkt?%(4j%f7jIH{XF$HZErE^o`hWPptg0N^2Id{Ij(ib?reB# zq}kK|PD@pEo_}*g&spBdKR3;2NY?Gy;p2y*n?E*SH+^_logH0iUGuV)5b}&jYo*Om zC5&=%_-afOAaq2}(ghRmaH>VDg6s6{qziEQq(@XqCu!A*AX#VikY zk2}9`NstoKHq+=f4bGGFHPvOr-;Ev4T{=0ccFqxm2$05lBK7XF+aJ_Zb=UDw8V#>m-WUrF;o#~ zc!Q5k%)7l^hsD!sLrOaVn4@q6ZXQ_A-4FLe6iqyAydqzd6!G2QbT}4D4R1hFEg=s^ z67G8`$Wq>M12J}FgyK-P)~>1i^3%8VI~F$C6TYfaae`l53wL6QQr32mMda0;m)9D3 zh?O(Xs-&TqMmLno(YO!K{pmj4;W1C6iYvY@P9vIultAwpuC`(HB=z zq|`N%97T!44&S;7*Z}j8MVUCfsJ$1Ajl!|8_cIBCa6CDF%5vZepq*wkcNl-8U&nts zr=_HNt?-PzTs{HGGlV8rm!Fk|9i+FBDTQhw{?(*iY0Y;!y#M~x9dJkZdQ&otUtf4K zkfEqR%Uc3Obe7a!QY`zec6HfA7ByFhJ+37sSr>$SsI-)EqjgOsef&92I)f%Ovi(=@ z!DN8DS-_WObrVX2@-ZAV&m3D_TKZ}m)HPoQZXeRGi?YA$R+}ab%$^+I^X-CjD*Gdl z*&E+J-lp-}Pj8ll#y5J6^IS7g!I^YU&h&ae#6<@6mLXZZz%R(n-E#IzP(Xmne*5wQ zqg##o08!e_gmADYj#JHm2`Jv;{JUiZSFmEBrWI;OxM+!YtQ)A1PqLuslnVgEl3!fc zJn83hSGoi~&5zC5-4|hJT`|7}%qVhT7n$k%RusA{ zRd74#Bw28#P4AWKepR7Hoc$}WqKzy`qbP5Aaz~imja5@o{)bhZ6;novnsie33!lHQ zmhwZ9g&&Xkjz&tEFOpF{-n{>4Ih@%d$qqxi1_QU+x~m=&JO=}~!wI-iNL?v7w%#MN z>GKoeT@BG}D6_s15xuri4w*P5d(8#Jz0&R@jBw)FUXW=UENm+d=8R9es)g;{S@a{W zIr;Xd%0bPSRaC^qB;~!EGh0w11##%d1hVlsiuY}X#hrJECsF<0#aqXDPFH$hp==Qx zquNf&!R55LxD6+{N&@t4OxJdaE6R#q^I@Poy3xa3%b|;=WRrPt@58T$tpL_mkpy(T zi&N=GNX#Ptj;gDs<(nzJh#0@i`3=AYKSftV#dyrW>#3;MEv}6nNGx!|%?-RQ`v!uO zxLtu!_e`&K-SxM4l^RC)_7+!WI~TcC*jYEgzO`axPM=B|*FG&{Lm1Aw0DPXQxVi*b6;hwXEmP z`KiSeH&?BabO8iFw|8>}Ba)-N|D6`BI1D>;8u#HnAl-=L zWK@LDVJXy~b1QnNTcJXMiljC^0h>v&o3yRyErNCYw zNq{p~2(0brhq8=B0eUpzCiBtR)<{);AHrTK zc~if6t=oHr-phKZuL55H>bSI&>h6zJD;P4RQdhtj6d6|T;*Lb-gdL?0V?thwTa2$U6FS7$9* zXhJ;nuuI;lMLQ4hP_ErcVk9DYivUK&eHIU!r}QFagGD=J?D)LD8~J9_hSK159oJn! zseIpV3wOfg%4hSLwa-R!14ADIryJ3GWLKw7mKN*gSF5$3*0Flq{I@kWhS4bh81pVd zK@sPN>1ZP50qb=wlCTI?#Ezi=@<%pXUbb-2ZqF4-0>f&{?!?YH=e(EcS6iA}I-TO=1VI`4i9WArxhnvnF*YhyP zFNAfqMZ0U%0GD&R-sPL$PMWy93ld-5 zs4QAZK=XF66o1H+w=*t(r+Kx*ycWgG^vS)=eK&AY&9cw5_Yqj68yRjTK6lP-cr?vo z$<)x*&$_ip1D)S&`_8NEH$OR0!3d9(qXXe)?WvIyI>w`4OM!-2{s z=b;ZU_2UF&xzCL#=WDX?yFPKd+Do;u^GDd9ntceUWO1RTOfOBFmv~Lh6xx>yQY+26 zhz6PlUa~IQ{Vqt9bBc>S9?Fq?p}-vqJ{qylp(4QRnd9?{H*D{1X##Ng!%g?zT5mg| z%$&x7Ard%_I}nsVLDF4w6^$A9*B#sWqpl#QdGRn8r4!XJlD3rjw{Kpo81We5asJ?z zxTHG(8VkbEOHdmYIa@A@#4!{o0DJQc;qF=04>hbKa^{#X$%pVndAl; zInLrnjxy@3>w5-fsDIwk6N@wXHo9EVBCiP_-aS4hI8en@nOZU(9aHvb@WO-yE#X?CD^LTzB|&Ni69LyJ1sHnTcdBxWA1RF`fSN zv4y1*gi!(68Gc>A5M-5z(Bf6DTwaY->UswRL^utKmz7*;PM#u8yZ1CZV~h4Kip9ZP z$7trN{lfLyfG(~3Sw6o!b*=U*;|=`!(KwdO`H*qsb_j=Q&$)H(QzcZ1M0PSie8Fgi z3%~aqXmJb)Chw7=fI6WGFQYEdtFXu+dD=;%>?rDn@ zEE4Vd4^6~r51Ya}i#!K`j;xOIUTuG^Dc!WQ#Sn1%ZsIi}n8h{&OjM!5k?Tl56wYie zcTj>R7woEQ07_StRuC_-mMHP=GGSlPI7>F(~*+Go0ItX1aCMvH^^sk?o`xG3bH9G z!}Uz)9fJ(AijwXzt3|n51y|U*f|!gisrUJ1Uar-sbx0ueTiT&&MeUmDpO}kOxFKa_ly_wim%IAg zD0}6i)V(&S9u?ZP{4mP{-tWFBu0&PZrBr_sT&!>V)^3Cnwt%kDN_*>a`<bXOtbKGfmX7#+vO(9e-9|2E%Od2Cc{$edAjO=mlM^=O@M-%_s+8zP zm#;KYS}@1dXzjb0>UUkF?NE3EJ{#Il<_JMll-U=kSZ@FYgC36JG@Q@3A1|t_dc=?m z0PKPFt0D3#19_QTUv|hC*F}=9^7)3NuBId}#0BN8h0Gfocn5`$R)!&YRTL5AB#FQc zrRQ|u)YFo78dfE8JNnW=B0`!8a7M}EKyxGcEYcRV7@=xje71EeZ0lX60sS!@}?KS~Epi$Vd`&O)hCay=4wZwT0FF9+!IljtRn1i{2D>OEZI!nLd?6 zbOqS}K`C)b$`B9lt%yihoBI-Nyj(W1e7c};Q6`dhSe#l%ar8W{nliUqOHA$VV=KB* zQK2+*^87~3v1zO4U0%-DFg;4_bD`KBQ`%;h_dHH{?XuFppr1)5u@5w$=9Ja-u7_$! zHZsRN7h_iX*JM;k+R#8{_ao@ysx)2URnD`jwkc+L|plM@7>mRSq z>&eaxqpq;xGp;SPjchIxK27Rd?+v6sSRbKC$gA^DzONfJF%#rYA z>1K;WZpVcg`UUNrE%F^G0(16lJq5aPMmG4z_S)zj~bHAcBJK8`zza ztpPQAvB*Ps4!2lmk^6HHtw!p-(=J}(#|*f zOdJj!Q+^6Uy4K6?W{-B(z1alT&;({vW_%4w8n4^{ClH>lLZJ6 zd|DXS_0ZZs8pD3xG4+!|S347RY89;t6D##aj>m4rF@4Aa!TUJ8W?}8;%incZ+pAC78#p zq2n9jq&#VfbHmb%C%tf)FF0c?_Gc`H~#47r> zL2WgpkrRBw!RF&G!<{H|Mv^~@h+G}l{lm8(^R=XBZK^9nhUvXX3Z2qDBrj`RQ*m?M z1J`OuQg&O5gH`sjI7KH%3ooti`7{xzeSUmb|2y|>bbF?rvwQKgA(Tt+pPaXToBN81 z3Y`+cRoKmg3sY@$94+)cYE8ye*c{;Xpv1z$GRch?t(ZF>HSI#zht@r67=;N^uC*)- zo(CLG*pEw*0UQ-RcE--_s{HEcLuZ;5k*++9XwRyb`P8kH1ClkAnUT+j95n8_MJwxJ zh24ttGvK=&S3kIw1PMBbPf_-+b(iqFQo}(C&*j}`X6&8WOR^@U_W9xHpoo?+P0%@6 zf~hR5`URNOm*+({)!sXy#sO_CZ7o#GgV3SOs0g0}lB~q(g>TzP5C8P!O`ru!9+>|Np&d!`r~ z6P$K&56efo+532BzX)!K?}=0&$N(yX?ijcm2Rxi4Noj)Y&K8BM>|bvacdxZas~^z8 zB(+2~H)<-zbX2j?^?tImHS(5d!1D8pM}1ShUajBGZCc`>CXb3~IK-8Z^ecQw4=9=? zLqYIaH~O?5oHeHN&N`@UCAxD5b_col8QJ@WLS(7u_W9iFjs%b*GC3Rr0k{B6dfN35 z>U)Ca$gNpkL7*^VQ?Op47>N|3-JUy0xkI60=Vt3eCzmW=bS3D~{G2Brj@AK9;uHeg z60g4{Sz}!8dI;<`-Q}8i=j`itha5^hks;Eb&!x?YRO{i<&1RS7%XBj^@0KH*-^dSv-#jY{rJRq_ddP5rY&ayJY8Nw+%Wy zD9D5*#*n;%rKOPjX8GiWrwudrBC=~dOSCm$b$!w8(_r+{G+~Cl0wlBg?D)A3b`_{7 z&2Kezw}9fw4;@>Bm9Pu(BumiECA;&>1%U#wSx0I#)0vKOcM>~xSYL2tdhRS>p0NVQ zCwl_`M4#y>Q(}eUpcqxWq-W&q5QQMS+LQPC&L=7jBMl}lq}aXlPH7h$7E}tOGZm=D z_Tp)YX-CV{apfH@sQ6U<-V>1Ux{qytCGn5xPv>er%(EO}Ix%UK z>q>|8fu=WO%bq;wi{3lPp&z&E(`FZq_f}oM&2IgY5xBUd*Zh$~0)VO??{h2aZa$v$ zq;P&6_AHl4VNd?h#M4)inu0wuSLxuw-IJ$BnE#$xIV2}8c;BqT`7{A8k|H3Ihh2NU zSRe>BZ6B@Zeq%l#Pnz*O^Imf03MA8fu8AE+QizM7)J(@&mA+Fudvvi_yJ(*P!1P(w z_@-n$#2^wkGxk~y5!^@OApg(`ggtgWQ@@$xG^Cw(UB=B>g(>z&cJz7MU^5&pJ;@^B zoue%&mAg@Sfi^+P4Qp@T-|92!R5O*0ozg8D+>b57Np8+^Es@8nAhUgoX6-Y|*t`EL$6X;)g@1fR&0V?pnMZ{C3NyhfBGaa;DJOO53T1fGe*C1!55 z2^ySg)VB7{(S3e}%^JTiU0nnhopmY5P;#ElX{wq}I_a&jtfBSxzT~(Cr?pDn#INww z2h-dA9LC^@C0hG;N*J7&2o(ZjwFfnqv zXVKs?WgW(3H`T_iotp8Xb&{F>o(r}h7C7<#k^l8obypoOHNQN(runyqQjJ>jkNKJ> z?rhL}RsEuNaLSzQ6XzdXI{z!e#L&q#(>3kqP4B)(Te{X=O8K=iEVH_*WzKs>G$gG? zloJ~nb+hi%ZmEHw3xv1&ysww}>U%63wwWV>uaIfcu zzjF$I?rLLN8g1OvQma+ka`EJl>CryxcJ!V+%Ah92{=k+UP342nXBOTI3aPZ9gd-uS z%ZaCE?424BD}+H-Y2{<|$%kj^;ko4UTIi4Bv2E3UnUVBD+CfLr+@VfBuuZ{Uh{8D! zGr<>dQcFrFLg)df&o;~2Prt@1cuWj8@);o}UyJp13Up z{Dt}zcNT4EV~=L8ikLpv-C3_{`^F~-=`oGLW^LVTdMMovGUU=Mua8t3O8)a%e)Gts zhv*J|iR5$Ty4yUhAKGol)h)lJV0kEMgR@RCdQdOO^T>!e845;{ZO+hB_k?v@#cs^Z zoQUTV(hG6d8koACYOlxa&Ln(|l~rDesB=3eur73NG@!Y#I6o&HBcRD@M01@Oty~(b zgS~R)wRb92g6Xwj@%0Y@*btoWboPC6$J<3L9^boPG<%mg0arv;q~l_;)3s@3?79yG z0V&&&KVkKDJ43iC=Ya}d2#xT#LfCrL?9N10oHe^W+0sKxtiPx}FFlkP`>9MJ!{904AX(611TL z03k`-|6pi;<}$^(N#Bz!DZ%w({Y4k3ZyZ-4aGt9#6+EsXht`c)B~G=I<|y*K_A0Gb z_cPpm)YI2kj*>tHhhz{NfJMd`J>oCWDBRynu@qB_)SS(y-`bwdmf$V&`LH@L;{IS~ z9rXK~O5W@}+G-_g1-{cQ@1PakH54J%Kd9mon4lN?NRewo1IDo$tVR9;C#Qa_ILC-L zIx#~Kt;e=Ak@y}q&GDhmuGBd$f=<>JkYS6k37#HX-87k=`dVNiTv{6PARQ_|R_neY ztrD5B8i&gTkPv&}5@<2-7Q<^qFA0Zsxgx}1AzYf;`10fs7|1Z9n31SEB>Wmqu4&@%ml)SsG<@5AR3Y8r!#f6Q!Q`GrR&mm4 z-60i-DNttJV(hj(o>_~JURE-ruP}xF$Mdzs=@Io8kX>1HmUKRdB@N;5ZzU z2a&8M=_;%R2?&6bM7e9^KrgD|Bj1Jw0`X==7^_e`9h0*5K1fCgKuSB5(??-0AZx*F zJMY{;`Bq}`dL~6m;=)kHfsO*gamubp1@DC81dzVU$|d$}wFhn=MiN;)SbO(>H#AcJ zj;;RmKS&lM2ur?U;jkj&J-I)-zb&e%h4|!nY+o)-P{H0m4kp?Ya+f%39E|<59Ol*F ztRcPyZ;v?b8q^rjhoG9mX6q<=-Ujg&+b0fUh9m zBz%Nkk7MHx)-*N+(Zf1+y@m(Sc@C+cA8{gU2xB>P5|sNsWomIV?vw!mQD6QU0BSj9suPF~uIvN2c8-N=~G9E}{d?b^-3%i}+JFp&(zJ zHt%{fN)vBLA%#~+Eake$)!ehI``dd*HBKZEmd46{E&yW(!=SFh`3tTKF_xp3LqCye zEv9z{=x-BUVJ*%#3Y2>L!>xC>q7o(ukwri$#y2L(>-E8`-XY zjHDQWS6Cb4)H=N+wVEP^(nuLb03T(q;b+;4H69T1ys6#|vQ$*+;#2$nj1MEh#M`s+ z+CaMI!$-q1Z|>^5K~pU!M$QU9QDp;JgPC_9>LLGh3?dC+ z3vwMsn^i8<03idu{3)k^IW!~Rt(cH>V0pqX6^~pqrMTz8vrz^@!7lUb|b2Nq_4QPejx00`Jq_JG%w}+;Il7Nw$xS)kiKk8{;tJjujEU>t^w%8 zza>RMGA;kyS!DU{#8JDJk^j09x!BdF-O)?Z-1Hm&8}t0lL+5Duv46_23N`A(lv6H@ zQbf3tF~Z8LY;KJgxQi;4uwyIVrj> z6lGTc#LNLshjkSQn5VE0(j9lIsAwPmd+Wk(Bvmxn#b6G-aqfoQI|uSJXOl@>TUIoK z!i@Yv_&lhqFe5uB%3||9jEigzTPR7waZ)ehW@_Km8PtO%uW==vI;vYP$avWBh&8el zcTU>YL_%GJG*z6MMLL2H&+AfBKQ(_JN*k3|!`T32y@)JV;%qjxi(44Xd*k}6^b2x5 zx1K_iTnS5$M3(|$`CJ;ZV$<@$2&^sO9uYORd@UHgp;z&_M?Z?6J^tV`U{TNS!*Y7= z=UyJq4*cfy^7zuWzGe%f-YyL|(Qf1LJ)Qj*@7l?^u2yVw+vCf#Pp7Y$9DDou+taTG zE%n=a^w1jNe!K0{Q!S8Yl8(ZBfb@=MlnGPX?7~cGe>qBiF@rNp)KNX_@;0XcvTyks z_Rb`{v)#ox#}-Xo1Y5%^Amj9|&!vkAzz&V9+mb{NcW`6sx_tXAQ6RDD% zgJRz!7TIr%n}>+L?sghUef21f9cM`o^Y08iPPkeP=C3aH@uerit;n}%YC%MVa}^)$VF07jCGrom-Ja&>G!?c0c&)JpGD+y%!l{p9U+ zsJf%^XcbwhTrMebF57>!?x(IkwWlcl6pxI%0i2#+xG7Cu%Bm?lbixAPJT^|=L2Z`G zB&F1m7f%E5Lzs`^JY=x8|K*>w6mARC49_=Jly5MVaFeVvl-PPgSkGk{efnNHm^WQu z<)Ms&?7{ReY&yf%=uWej;It`?#Dy}hvj_#8t$1n(9fJWAEvRwb);pj?voq@x09MFl2V6@^R zr&Qj8xCZ|b@Z5XN?Qe!amXVI;C-2U46OG^}2zBssAljL|PN| zI_WQNE%V+SLMcv%7T2Y$M>?DFwBo+r&A6TKeSqzV?5tluHW0dm>(F(E{<9;#U$sqm zridr90)mgsF|K1)VC$m>UzIfve91Ny;|YJ9foU#C_K-zX@*wJcf~n$PaoW*gY`7f2 z>(~Hx@g3rUXZi^@OT~=W67!p${O_V-x-IIMmHo86?BQOuzxD)B-&KrCcEfI5J2>wi zQ#95y&Y_HLuRVPQiA=zlAnl-o0Sk&|3Fvvt*53{yCFb@+B+=rxg+Vk~Zi7k~W0k;X z#C=Y$iJ8BWx_o7KbX8ANQp$>i#QuxX45xj7_(h57{FicEYEopxy4?6q!x+(9l#ZfT zxxH*&`tDss$;L)AIX9P*t5GMVgiB$5Qb<64M||{k>b#MXvXSK_$JSS-ewRG>`h%b% zi7lT>ol@E2Cj}ZB&3M_tco5eRZ(ulU>SH;`y3zy+G@zp_1zn!~K9`dV`U&_2QD z()psqIrQ=gp&61p#yg?M$Y;Pv9Qf%+FFcQ6a!^;tcLkp|jpofgU~+cx4Z;&2Jre&vvW< zE#kC}94QZIzX(!B9Ms{_U|>e!vokX--w$FvrFsfpKi|()kQyX}<*2)km_VS=W_Okj z`Z83ZN7>{t+$vYk{~22yl{V{@^wEub%V@1LWXS&WKlI6uA{#*<(h*_j2n<;EFu#@_ zaOtcp`TP9V2^9mSA*~asjZ>%O5l#WvesCRxK}{RkCALb~8xBiCnIfCc?iJtx&#!Vx zCGn)MsH2LV_{PaR=4M<^E9E8Vg5QjcF{jv!K@AU`< z+Bn+oU=#bA$r)jsUAo4G?Ybf|7H@lynGR-b4pRW=(D2G|$(Kj}j;FBHR8o1=q7#>s zqvB4@x0phvDtGH}>)FD0frK4v3=87NOd_1hZ$DW1s}8qaa6|Ik3G941Ez5HM>rcBE zG<{z|O&E>sT-B^;l5WvQJ8^MUt5R|twp$!!B*ZLt+y|<{mj?u0zU#Wmi!l=uT9zhC zKC%&Fh7ceQy$}S+*5{{{716FueqCInk?LVxez35`NYn((#ay*2%yFm@I6D!0Ol~*tx}^#YghF%SVn5i^^tE5uifl+X zCi1sJ@;LN-l5_pVakp7 z+Q^I@Ww$?~=FrP|E9q^^;WYPlmk#3=4>hKEagx3SWgSvIm%7HcMkhXyxQuiSK4BKy zsXIYdgE@B$8#ZpE%f9KS%m^$<5F(wp>bswrViCnGy$(@YQrnlpW_3`Z8J0ko<&TfB zSlWYaD5k;b(|WZNYzEMHbrhE8^kYfc;@S<$d$)nLvfB{#aXLlp^UJV3n)opcB-2T* z?4Hjl4?tC9P_90$>nn;X&|BOgrd8d*_~Hw41#=ZKQW-fhzb>)AJ144)0rL#4eWL|d z`cM+1h&N^KG}~LaY=C>ND{K=V5*d7Z(7L9dl||+Bk?rY=Cm2L}(y=c3tsqgs>jvO- zsnBqdHB17TYlhp7nAg{}AhVD(XF*79JQ%K0()44d0)MS^*sIcEIs_Fd6+OUqkxL(e z>qNnwW4X)9;`+&qkb@HR;zHO;bTQ}9;lf6dG6Jnj`}*UbcNsPBcrM>1C&Y^eCDFTe z44zOS_^P6?-)*8nG`n-Mkh)=xhT}Bm0S!)DjOld*wsLtGX zi+fslmyaccoW7)|pzr-lOIW-K5r=~-fNgS2&?xy~w6;MgDJnkhhgM=S(ONZ?Wc2mW9(DK*ElNET>d|^Daj*{|t z9jtrl;gastNshvE31--F~wvZ*Rj;232Suw3h1AyaF(oYIY+Cda4 z)%-`Oa497XhS#=7lN(rS%O;g&bb9S5(FjASupw>{zu}()!Lkb5bVc-gPbW|Kxzth+ z;Cw9ceKJm2pj-gGJq-n;@dtE~iL|XQVjuAtMMngnTQW!YMX+-|<8$JirPiK>^j&SL z=)}*JJ0H2V6k(7#g8bh%+g1^>Vbg&O#GXZspiRNnDE!(QgtrHZ^ANUi=lOp}tl z*o!lxZAURy%n+Y75#Kp6coE?NhscTMO5kzh_MQr7b_*Ny8Q|(*9H16e|Ibz+< zVH1Hf24$1DhwJj3qCa0fIEC67)47$i?~~s+<2pSN_vz&VrUkIT)=lUB((xVogna!# zEC;)yguZg?7zRndRzB{P^J?}bF`XRbf-!f=V%Ov)014*Vj^=6f+)fFkCs|w-0<7Ri z9s5$pGXY*VYrieMoJy^lFo;pZ^0p7}Z;Y#0Lrs-Pflz1u5a31QnJELK4Tj_o5Y*~7 zCzo8Wnn>@8mGG`?599>(doi6;o0a8T4y4K46NpMV z&V<}wr=e4F58@4Knn_jEA(6x%_{WClwuL6Rb)-eG<;s-eI$CaR!=wqf+@?bP_ZPWd zPw8puP=?SGN<?`GN4zT`M+{GDC_l1j zgd(Gjhs1d-#em?(0$0I*WKQ0HDU3-@Ix9iguIi*ANX3G&!L2_T{yTHqx}Pny8l5?8 zP}?MZv!A=~D{&hGAG#CP`I$tx8d5pIOY$B}rS6+(uG5GetR1?cBdWbBqLHm$XE}^- zn(;%|5oIE@o*qLaFascj;oXUog;s@}8HIL!2#tIw%Svfwm?C%U=<0(9C35I6>gA6C zw&(|jOuDCRf5hsa)xSQ>#~Nc!ezpi6_$_?&U}Zd3Cp*w#K)%YAWTm(aMFWms_t}PL zBuwjdP{M2^-CRE>(%u&Y8q-1DLK2FTu1uVVR^ED#gyTpR<$gVG)$iXHQv4Ec$gL7{ zQWzXM(Bd>Bwsob+sSu-%_$-=xQ&57EzbCXuvqL_OrzkfDxh#rx$RyAYaZIoc=g>~> z$zZ#s9kJwgAMPw_{g>bhWA>V+tnd!5FBK$`gk@(Kk^#;1f0_Ei+FPn|iN$QH+(YuE zXW<+gzKq{gvInbIHrJfTF3_}zk7PsHa$_|bmDCDdbWJcW;UdRJP-U4 z;D|A3hrU&EwQD{J-4a}lz`eTprBAn=J;pAlPq1_>eFBb|UwFnv0vPv@b{_dlIi0Sr zPcqthOy6Xj_t1f1#?&c?#(Q;FP~7>s37Mu+xf4lD{vetENW0!4^>>#kK<#{JD#jb| z0Ai4}=l>AkfezUZAgSqgaB8m?;mZ2hog11%%Dn(ATI7-uBC~4d|eV*Y}gn9dRUY4m50rSBTpa`}jqvMwF2P z9+;D%e>(0TzIQsnR`7_kub40FDO#Fjgd~jT5qh`qSuh~-FE|{3)*<*HPYj|ht>^*y zvIkw3Taw&dxrgC2K~-mn7G6+w9f2-j2wK$CotlPLeQr>9^z`yaGq<1ik~u=E-09 z!kYCk`;qh7U90WowSQO#eJ|Ci zue0D`!3g;ErAAYy{?cEavVMQ^g9=#z75%2Sg(Wd1HhbJ;4<0u5kANXSS{{1+Ns%VK zHz4s&&DLSvcG6f=Xxo`Wa548aG~sk%J6@%4TpZuhUOhf zjI60ZPxOa(GV+)f{)as13o$H)Hkq=|ild?zIj=Y3a1i_Q@0 zyFl_;-@pG{Xio0-6^2S6P~%xbe&T5m%A5xdN1kC@ddY<*)&GbG$QZx5l5~j zhrHw{;5)ui@DQt$gYFe>q=dO!71CXYzCVOkvYRxku_=euxU9>e%?62f_3f1Lkj+4o zbR~xge@NJj*5W`Qxu58?*Qys$usVqyO_QHFQ?&_8-=i#c7HBXI$TSvf7wn(SFbTL< z!R6if9s>IA5&Du7aR7rt98jdoEk<#2DyH#Da7hs7&|(y*9KIB&!|tQ{5Y<$HMMo{~ z^4(Zwbn!7XADjBB9UTtRq&{uht{Rb`fuW(a5i8GiF7x^sOuXq(dU1|Jp!W>|lXN)1 zM1Eq9|55Lu`nADbj8<-W{cK=V@;mU$I;FUzUpHExvscy6yg$;9C3tX>jZa=T7Q0Bog>V|f zJa~gbb8`hVpe1WtepR;A+qay;5bVca5Rl6L5Rq0U{KQPx7yhlpqRZ^xJcn7yf9fnN zO!z~A#T3}TB^;0^|EaKumGH-ZgZ~E>Ia&NiEfP5-xc@d0lO6<)|9A@oi~RQ=%l%Ih z$w}cq8Oqc}g2w;)q^h#iHUX*$OwYKp_I{{x&jqm%#u literal 0 HcmV?d00001 From 048a9cb4f02c0d86fac8df1e860dde8fd26ccf1a Mon Sep 17 00:00:00 2001 From: Mufacoderz Date: Sat, 20 Jun 2026 20:04:30 +0800 Subject: [PATCH 2/3] update readme --- README.md | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 45cdf3a..b6f53bf 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ DevMap Logo

-

devmap

+

DevMap

Understand Any Codebase — For Developers and AI Agents @@ -13,16 +13,10 @@

- - License - - - npm version - - - downloads - - Node.js + Stars + License + Node.js + Status

From 9e9785cc718ed9edba71330a58d194980802eaa7 Mon Sep 17 00:00:00 2001 From: Mufacoderz Date: Sat, 20 Jun 2026 20:18:01 +0800 Subject: [PATCH 3/3] update readme --- README.md | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index b6f53bf..50a4dd0 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,6 @@ Understand Any Codebase — For Developers and AI Agents

-

- Analyze once. Reuse context everywhere. -

Stars @@ -22,8 +19,9 @@ > The first command you run after git clone. + Analyze once. Reuse context everywhere. -Built by [Fadil (@itsflaid)](https://github.com/itsflaid) +Built by [Muhammad Fadil (@itsflaid)](https://github.com/itsflaid) --- @@ -141,7 +139,6 @@ Generated Context | `.devmap/index.json` | Agent entry point | | `.devmap/features/*.json` | Feature-level navigation | | `.devmap/snapshot.json` | Complete project intelligence | -| `ONBOARDING.md` | Developer onboarding guide | Recommended navigation order for agents: @@ -171,10 +168,8 @@ Supported workflows include: * OpenAI Codex * Gemini CLI * Cursor -* Windsurf -* Aider * GitHub Copilot -* Amazon Q +* etc. Without DevMap: @@ -230,15 +225,18 @@ Use your preferred AI tool to change it. ### MVP +* React.js * Next.js +* Node.js * Express ### Planned -* React -* NestJS -* Laravel -* Nuxt +* Vue.js +* Nest.js +* Nuxt.js +* Php - Laravel +* All JS/TS ecosystem --- @@ -248,11 +246,12 @@ DevMap is free and open source. AI features require a provider API key. DevMap uses Groq by default — analysis runs on free-tier infrastructure. -| Provider | Status | -| -------- | ------- | -| Groq | MVP | -| OpenAI | Planned | -| Gemini | Planned | +| Provider | Status | +| ---------- | --------- | +| Groq | MVP | +| OpenRouter | MVP | +| OpenAI | Planned | +| Gemini | Planned | API keys are stored locally: @@ -299,6 +298,7 @@ Node.js 18+ ### Next +* [ ] `devmap enhance onboarding` * [ ] `devmap features` * [ ] `devmap flow` * [ ] OpenAI provider @@ -309,7 +309,6 @@ Node.js 18+ * [ ] `devmap explain` * [ ] `devmap docs` * [ ] Local AI mode -* [ ] VS Code Extension See [docs/roadmap.md](./docs/roadmap.md) for details.