From 67ff552e28bb6536746b5a59f9792ad934d72db9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 6 Jan 2026 11:49:42 +0000 Subject: [PATCH 1/7] Add full-stack-no-backend sample with Dev Proxy configuration Co-authored-by: waldekmastykarz <11164679+waldekmastykarz@users.noreply.github.com> --- .../.devproxy/devproxyrc.json | 60 ++ .../.devproxy/tasks-api.json | 28 + .../.devproxy/tasks-data.json | 47 ++ samples/full-stack-no-backend/README.md | 147 +++++ .../full-stack-no-backend/assets/sample.json | 87 +++ samples/full-stack-no-backend/index.html | 604 ++++++++++++++++++ samples/full-stack-no-backend/package.json | 12 + 7 files changed, 985 insertions(+) create mode 100644 samples/full-stack-no-backend/.devproxy/devproxyrc.json create mode 100644 samples/full-stack-no-backend/.devproxy/tasks-api.json create mode 100644 samples/full-stack-no-backend/.devproxy/tasks-data.json create mode 100644 samples/full-stack-no-backend/README.md create mode 100644 samples/full-stack-no-backend/assets/sample.json create mode 100644 samples/full-stack-no-backend/index.html create mode 100644 samples/full-stack-no-backend/package.json diff --git a/samples/full-stack-no-backend/.devproxy/devproxyrc.json b/samples/full-stack-no-backend/.devproxy/devproxyrc.json new file mode 100644 index 0000000..a463877 --- /dev/null +++ b/samples/full-stack-no-backend/.devproxy/devproxyrc.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.0.0/rc.schema.json", + "plugins": [ + { + "name": "LatencyPlugin", + "enabled": true, + "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll", + "configSection": "latencyPlugin" + }, + { + "name": "AuthPlugin", + "enabled": true, + "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll", + "configSection": "authPlugin" + }, + { + "name": "CrudApiPlugin", + "enabled": true, + "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll", + "configSection": "tasksApi" + }, + { + "name": "DevToolsPlugin", + "enabled": true, + "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll", + "configSection": "devToolsPlugin" + } + ], + "urlsToWatch": [ + "https://api.tasks.local/*" + ], + "latencyPlugin": { + "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.0.0/latencyplugin.schema.json", + "minMs": 200, + "maxMs": 800 + }, + "authPlugin": { + "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.0.0/authplugin.schema.json", + "type": "apiKey", + "apiKey": { + "parameters": [ + { + "in": "header", + "name": "x-api-key" + } + ], + "allowedKeys": [ + "dev-proxy-demo-key" + ] + } + }, + "tasksApi": { + "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.0.0/crudapiplugin.schema.json", + "apiFile": "tasks-api.json" + }, + "devToolsPlugin": { + "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.0.0/devtoolsplugin.schema.json", + "preferredBrowser": "Edge" + } +} diff --git a/samples/full-stack-no-backend/.devproxy/tasks-api.json b/samples/full-stack-no-backend/.devproxy/tasks-api.json new file mode 100644 index 0000000..7a6264a --- /dev/null +++ b/samples/full-stack-no-backend/.devproxy/tasks-api.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.0.0/crudapiplugin.apifile.schema.json", + "baseUrl": "https://api.tasks.local/tasks", + "dataFile": "tasks-data.json", + "actions": [ + { + "action": "getAll" + }, + { + "action": "getOne", + "url": "/{task-id}", + "query": "$.[?(@.id == {task-id})]" + }, + { + "action": "create" + }, + { + "action": "merge", + "url": "/{task-id}", + "query": "$.[?(@.id == {task-id})]" + }, + { + "action": "delete", + "url": "/{task-id}", + "query": "$.[?(@.id == {task-id})]" + } + ] +} diff --git a/samples/full-stack-no-backend/.devproxy/tasks-data.json b/samples/full-stack-no-backend/.devproxy/tasks-data.json new file mode 100644 index 0000000..9c58b1d --- /dev/null +++ b/samples/full-stack-no-backend/.devproxy/tasks-data.json @@ -0,0 +1,47 @@ +[ + { + "id": 1, + "title": "Set up Dev Proxy", + "description": "Install and configure Dev Proxy for the project", + "status": "completed", + "priority": "high", + "dueDate": "2026-01-05", + "createdAt": "2026-01-01" + }, + { + "id": 2, + "title": "Create task manager UI", + "description": "Build the frontend interface for managing tasks", + "status": "in-progress", + "priority": "high", + "dueDate": "2026-01-10", + "createdAt": "2026-01-02" + }, + { + "id": 3, + "title": "Add authentication", + "description": "Implement API key authentication using AuthPlugin", + "status": "pending", + "priority": "medium", + "dueDate": "2026-01-15", + "createdAt": "2026-01-03" + }, + { + "id": 4, + "title": "Write documentation", + "description": "Document the sample and how to use it", + "status": "pending", + "priority": "low", + "dueDate": "2026-01-20", + "createdAt": "2026-01-04" + }, + { + "id": 5, + "title": "Test offline functionality", + "description": "Verify the app works completely offline with Dev Proxy", + "status": "pending", + "priority": "medium", + "dueDate": "2026-01-18", + "createdAt": "2026-01-05" + } +] diff --git a/samples/full-stack-no-backend/README.md b/samples/full-stack-no-backend/README.md new file mode 100644 index 0000000..7e0bb48 --- /dev/null +++ b/samples/full-stack-no-backend/README.md @@ -0,0 +1,147 @@ +# Build complete app with zero backend + +## Summary + +This sample demonstrates how to build a complete task manager application with zero backend using Dev Proxy. It showcases Dev Proxy's full value proposition by combining multiple plugins to create a realistic development environment that runs entirely offline. + +The sample includes: +- **CrudApiPlugin** - Full CRUD API with in-memory data store for tasks +- **AuthPlugin** - API key authentication to secure the API +- **LatencyPlugin** - Realistic response time simulation (200-800ms) +- **DevToolsPlugin** - Chrome DevTools integration for debugging + + + +## Compatibility + + + +## Contributors + +- [GitHub Copilot](https://github.com/copilot) + +## Version history + +Version|Date|Comments +-------|----|-------- +1.0|January 6, 2026|Initial release + +## Prerequisites + +- [Dev Proxy](https://aka.ms/devproxy) +- [Node.js LTS](https://nodejs.org) (for http-server) + +## Minimal path to awesome + +- Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/proxy-samples/tree/main/samples/full-stack-no-backend) and unzip it) +- Navigate to the sample folder: `cd samples/full-stack-no-backend` +- Run `npm install` to install dependencies +- Run `npm start` to start Dev Proxy and the web server +- Open http://localhost:3000 in your browser +- The app auto-connects using the default API key (`dev-proxy-demo-key`) + +### Testing the API with curl + +You can also test the API directly using curl: + +```bash +# Get all tasks +curl -ikx http://127.0.0.1:8000 https://api.tasks.local/tasks -H "x-api-key: dev-proxy-demo-key" + +# Get a single task +curl -ikx http://127.0.0.1:8000 https://api.tasks.local/tasks/1 -H "x-api-key: dev-proxy-demo-key" + +# Create a new task +curl -ikx http://127.0.0.1:8000 https://api.tasks.local/tasks -H "x-api-key: dev-proxy-demo-key" -H "Content-Type: application/json" -d '{"id": 6, "title": "New task", "description": "Task description", "status": "pending", "priority": "high"}' + +# Update a task +curl -ikx http://127.0.0.1:8000 https://api.tasks.local/tasks/1 -X PATCH -H "x-api-key: dev-proxy-demo-key" -H "Content-Type: application/json" -d '{"status": "completed"}' + +# Delete a task +curl -ikx http://127.0.0.1:8000 https://api.tasks.local/tasks/1 -X DELETE -H "x-api-key: dev-proxy-demo-key" + +# Test with invalid API key (should return 401) +curl -ikx http://127.0.0.1:8000 https://api.tasks.local/tasks -H "x-api-key: invalid-key" +``` + +## Architecture + +``` +┌─────────────────┐ ┌─────────────────────────────────────┐ +│ │ │ Dev Proxy │ +│ Frontend │ │ ┌─────────────────────────────┐ │ +│ (Browser) │────▶│ │ LatencyPlugin │ │ +│ │ │ │ (200-800ms delay) │ │ +│ index.html │ │ └─────────────┬───────────────┘ │ +│ │ │ │ │ +└─────────────────┘ │ ┌─────────────▼───────────────┐ │ + │ │ AuthPlugin │ │ + │ │ (API key validation) │ │ + │ └─────────────┬───────────────┘ │ + │ │ │ + │ ┌─────────────▼───────────────┐ │ + │ │ CrudApiPlugin │ │ + │ │ (in-memory data store) │ │ + │ └─────────────┬───────────────┘ │ + │ │ │ + │ ┌─────────────▼───────────────┐ │ + │ │ DevToolsPlugin │ │ + │ │ (Chrome DevTools) │ │ + │ └─────────────────────────────┘ │ + └─────────────────────────────────────┘ +``` + +## Features + +This sample illustrates the following concepts: + +### Complete CRUD API +- **GET /tasks** - Retrieve all tasks +- **GET /tasks/{id}** - Retrieve a single task +- **POST /tasks** - Create a new task +- **PATCH /tasks/{id}** - Update a task +- **DELETE /tasks/{id}** - Delete a task + +### API Key Authentication +- Requests must include `x-api-key: dev-proxy-demo-key` header +- Invalid keys return 401 Unauthorized + +### Realistic Latency +- All responses are delayed by 200-800ms +- Simulates real-world network conditions +- Latency is displayed in the UI + +### DevTools Integration +- Opens Chrome DevTools automatically +- View all intercepted requests and responses +- Debug API calls in real-time + +### Vanilla JavaScript Frontend +- No framework dependencies +- Full task management UI +- Real-time status updates +- Responsive design + +## Why this approach? + +1. **Ship MVPs without backend team** - Start building your frontend immediately +2. **Complete offline development** - No internet required, works anywhere +3. **Realistic testing** - Latency and authentication behave like production +4. **Easy debugging** - DevTools integration shows exactly what's happening +5. **Single tool solution** - Everything runs through Dev Proxy + +## Help + +We do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues. + +You can try looking at [issues related to this sample](https://github.com/pnp/proxy-samples/issues?q=label%3A%22sample%3A%20full-stack-no-backend%22) to see if anybody else is having the same issues. + +If you encounter any issues using this sample, [create a new issue](https://github.com/pnp/proxy-samples/issues/new). + +Finally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/proxy-samples/issues/new). + +## Disclaimer + +**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + + diff --git a/samples/full-stack-no-backend/assets/sample.json b/samples/full-stack-no-backend/assets/sample.json new file mode 100644 index 0000000..01037e7 --- /dev/null +++ b/samples/full-stack-no-backend/assets/sample.json @@ -0,0 +1,87 @@ +[ + { + "name": "pnp-devproxy-full-stack-no-backend", + "source": "pnp", + "title": "Build complete app with zero backend", + "shortDescription": "Demonstrates building a complete task manager application with zero backend using Dev Proxy. Features a vanilla JavaScript frontend with full CRUD operations, API key authentication, realistic latency simulation, and Chrome DevTools integration.", + "url": "https://github.com/pnp/proxy-samples/tree/main/samples/full-stack-no-backend", + "downloadUrl": "https://pnp.github.io/download-partial/?url=https://github.com/pnp/proxy-samples/tree/main/samples/full-stack-no-backend", + "longDescription": [ + "Demonstrates building a complete task manager application with zero backend using Dev Proxy. Features a vanilla JavaScript frontend with full CRUD operations, API key authentication, realistic latency simulation, and Chrome DevTools integration." + ], + "creationDateTime": "2026-01-06", + "updateDateTime": "2026-01-06", + "products": [ + "Dev Proxy" + ], + "metadata": [ + { + "key": "SAMPLE ID", + "value": "full-stack-no-backend" + }, + { + "key": "PRESET", + "value": "Yes" + }, + { + "key": "MOCKS", + "value": "Yes" + }, + { + "key": "PLUGIN", + "value": "No" + }, + { + "key": "PROXY VERSION", + "value": "v2.0.0" + } + ], + "thumbnails": [ + { + "type": "image", + "order": 100, + "url": "https://github.com/pnp/proxy-samples/raw/main/samples/full-stack-no-backend/assets/screenshot.png", + "alt": "Task Manager app running with Dev Proxy" + } + ], + "authors": [ + { + "gitHubAccount": "copilot", + "pictureUrl": "https://github.com/copilot.png", + "name": "GitHub Copilot" + } + ], + "references": [ + { + "name": "Simulate a CRUD API", + "description": "Learn how to use the Dev Proxy to simulate a CRUD API.", + "url": "https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/how-to/simulate-crud-api" + }, + { + "name": "CrudApiPlugin documentation", + "description": "Technical reference for the CrudApiPlugin.", + "url": "https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/technical-reference/crudapiplugin" + }, + { + "name": "AuthPlugin documentation", + "description": "Technical reference for the AuthPlugin.", + "url": "https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/technical-reference/authplugin" + }, + { + "name": "LatencyPlugin documentation", + "description": "Technical reference for the LatencyPlugin.", + "url": "https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/technical-reference/latencyplugin" + }, + { + "name": "DevToolsPlugin documentation", + "description": "Technical reference for the DevToolsPlugin.", + "url": "https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/technical-reference/devtoolsplugin" + }, + { + "name": "Get started with the Dev Proxy", + "description": "The tutorial will introduce you to the Dev Proxy and show you how to use its features.", + "url": "https://learn.microsoft.com/microsoft-cloud/dev/dev-proxy/get-started" + } + ] + } +] diff --git a/samples/full-stack-no-backend/index.html b/samples/full-stack-no-backend/index.html new file mode 100644 index 0000000..78b542d --- /dev/null +++ b/samples/full-stack-no-backend/index.html @@ -0,0 +1,604 @@ + + +
+ + +A complete app with zero backend - powered by Dev Proxy
+EqO8Z`;XQ!pQ%p^2rR-zM-k`E5dbbg@I=N}Q=nw`?yl-Km z`OK2iO(@pb(z*^*HSfg09@rRhT}PhSMYoci@$NH(fG4nH743=;==bb-w76;>WnH6R zamBG$t!&i(WJ2}X1gAs(x>CJl=2)MF{`lJ6F}d~PWzJ{^Di3gGU7`$Ok~cd*uJNi1HY*R0KX{*y5u96{o3687_j;jjmBK*8*Pc=HtSpH^If zoFXRi0YaGFsLxXcZb6LZsqci3@p;F%<;^L2ZjTEfICGB_AM~MBFxJzI*xM;CjIY*W z|C2i}{QKncSu_2M^vB B!eq9Lu) 0{Qi;0Hv|IRBw%x-VNYtDFGuW6-eFk)h7v*Cb8N(la`_Qug(V#ErQ7CpS zU+hjJZz8m% G)G<< z59~}@j+lX$&WdX@rQF8?{VlP-v#xU3!RN;b)Xpa7(??}8xD9vQ27JY#R } yeiN;fpd;{qO{pGN?D>Egxv*!HDi$X>+9& z_-%2Ozrhb1QAwNFDJ7TlHt8!;huMaUk%6>V!>-u 2g_mTtQqf$cKQQj;9qjl?+CFtqJN2*FyZNYcG7* z^Vqgf_1Eh(46Gp|AT;5<5p77W7K1mq!| n~R0vEZ-0vEqr(&AWB%A9tI&i4N) zp$DN^&Eq_?L|WJX*iyMaJgM(Uwx_CFsjAep{EAr{wj5@W4rehNn?6Gt8;!9@z|jx6 zFi{S2p_|#at+Z;$a}O#?&Gy7VwSPZ!Lv;Dwx7_7IDT?TSKeCMc^x?qhUHO-&fVaa> zfE^Sqh}eJexZUHzL7|^>Ar;l{$}F{OEL}gxi!i$mi_`UF!_}Hg27?;nAN64lQT{Z& z!4UcM`qP#;@al4KrLnDsbB1_x!bKjDOmbC*DC`h-H6TbmkRFQ?cU!#(09_p{$3ia$ zWW7pfy|04xVY`FS%V6rcCL;4s+4@neq~=k6&7`u&HC^hk lCC zp6W8QMvv`Q!3ICy _n~6zNc? zr6H@=4Kr|7PULaS7Q z@PaLqfTf ni9 z_XPO>d0tFS(E7hS&MlebO?~nmc1^kMraGV{^^^e}MOODB$e2p}^7l3x`iI@~WZ!kk zf wxmgr5I*6LZWgD z4XMdo@c _=&9N~u`m}h#{8GpOFwJFO(}^btUaXN$e%E8IASgCOE{b4 zV!l#)_86A*BsS9PjJ7dlTcr!#^(l~|_`i0X?am)tAd(LI>%+zA1O|GQq<55zqdgPU z9iz+5x7)ZLj9ff( s#0y~r~sxrpuUQbN8?t}{|ye8P04=+!l7u`O=6lamldy&%xCntoikG0 z8a~G7u%jK=xg&duhscCom|y54O8Wz?Hv5i&K-VSp)pYDdH0(Hro#}da(6dqjP`b|y zZkc^Y)?SZj5Guytujbhz+ll0hN0{SA4vtlR8>7{w-Og{tFiPS&h-Sdh gUQ~GSVh oNg;wrG(?1NXQLdQngVYIEY9qPioqsS9d( za(Zrhn#=wLO5Dl+q`whH-`~dmuK|&0{#O}nG QDWKk+x$@7hD7LJ_q6|GyW0HN$n!~^k= zNJi`~O*~PwE1cZ*u$tTj!D#$XM%~SB1VIgkec54*Gs!x`Eo|9=N)h-~#Sq*dC33%c z_T;neYKC`yW16Zb0!9OX8oL)LbU5F@-X=-`Y+pOrXaxs|ixy($`273A$CMs4P?e&T zXJ$5+nzQ&NCiFKm6r=LEev{Qnd=_^wls7OetIKXLBKt1v8dH3(Pd;olv*%hj;N6V5 zRx6Beq>?SXdZdqF`!$lkdaK82lR@MwK&@j4v9z-hy8A6#QE20vrFKh0EGOPe*Rmf+ zF~AD>dyUEoiVuPHdNd)w|79h=3;nNFvPkLh9@F5dblB=FTt=d#xK@7XHesAX!#$Tg zix2M+`7Il!a5X-iVY}OHFTJ)XmdNf{f67zWIzfQ_9Es*kKK@-QW$#p))F&>EqSY66 zxI<>=DN_74`h}-Yex=cr @x!WCnFtNH4!$NCexVEqBA31V#bRX^nJdx_$ zvGv-yq9U1*Mm3-zcZ|DgYMCW%8}osWmE%R>Wp@=_0(D2+nmKg$j>h|}mZIESJ`o=H zNIVmgF9jW+{kJD)m`{VveGpi_QY5xIpwz#lRjuwDQI_NN<^TdeNiW>A*iF`{dY=>7 z$Ntx==E}}*SP7^;W+? ku z{cYsJW%hT(fMWB%6;gHlbp^NL7s@g5#jr!D$Xcv|-v{6mU{qj+wb!I8ULv(U-#(Q- z+6}G%tICOLu(EsfdEVN3YRCK#=;A@L4i%$*10nH0bHqbfqf`2!_n_FuJ)Vf|;SNm0 zEv{=LVh6|@kk!kJ GUsr;j`E{Kzfb>Q{c=_)Anp4v_cqUmdQw=pe^|Y1 zcN1w>Vc_~Zo)}XS=C`w5+S)6rmPra}G?+#HBec~o8ybfUgmou;hKXd!vs~~17P=L1 z#|H?7bBOkh-F#Q6ab!^P c0};^-oZk$^k%kh3G}slpHNLGlP&J60%7F%M+vwNT_s-T2 z41+G$BxUyNW_FSF`^dqI9T3#*EV`Hv_P EU!g7;@JMf$=*-zuIHnZPr?%&kl1) z{dG_s2mXhHN=LC-{N7mAljBkS%q}afeXKll^JoBWa?Ep!<)SE-eFNXLh#n@>JsRoG zvJ_j*F)0~bjLl=YEHY)5QQ;jdQ^uN~qLx=JGcteoQeY-9#f%_pWcK>0tD!0WfXgqu zf4uK~5ooJ>AC%)bYhb9~c;i>AXNWY+B4n`doaz0HHA<+%3)8cP8MrYMpu-gsYJs=? zhbjy)0NyeRvsQ8&o1c2pe`*=?&$>Bed+n4p4_#yXWXxIg!_3?LqdAN;qie*61QLRF zG1-O~=6Jk)QVX&G@Sx)OOQ*Q$-8VH_PDb2uzT~dkfjF6==<`=IWx}AoO=BAv!J?|A z%KJX9nCd0kz5`9B*aR9(1$Mg+p*-*5*VMFILg6U>Yd?Csn^1vTqAzQ}oLa+2tBS;5 zFt+cg7)Dy-)5G!N;9F*fj@uB-wI r<9t8EauCI3{)=v#QnwpPcCZM z9-|Q7zk{A<`OPTqro_Ds=qfSXCRD#h ALPMys8{*Hg@L?Ae|0r~qjryVw(g`1P7DoX@h>rqA6~ zXhO5KN3mn{#OS>b-K!@yZSg#gq(Ab$EAhB74LC7bPU-Z1R7`bV>pd@aXb2qlUpszY z16}I|L7wmBas%%ge4_>~w&m_Cmi8P+SG%um@n}iU$%-oetp(`JI%Rh}m&iTp-0D8x zio@zt*;hAOw$4m#&-(MvykW_X=G(Uihlz5HL!+4udS$hw!oDJRrWEBu-aDXcL% 9e4B| 7G6`>Z!MO9;}ywR>XKaq zr#{vE0mwqmQUna#7Dzs!|Lc|+LC_$yPekV5=H=l0)PiRWM~&&fbE-Ta?-#QAEdSHH z 1h8b(@5PrElpMB$Xh zWP@tFg78Z5V!yQ{fBi*;aE6o~^Q9$Dbg9uc(Sjj7q`E{N8^{Wk1J!^3GEl7B9pEH1 zx4CCW(hdxPgHqFSb)rdk`S3uLq(ANrrZ~|&%q$a9+<257WBg<4bVFG)(&0@eC-Qn_ zD9|$Ff__#P2|?-RuRIVMi>WH3RSZ`z=}vbosdT>xUtZ{f4vR*`JYzXQAx@aN9=4Lf zE2ONlWXSInvDZJfN^0QtYS$}8vzlJ-mK9ffh?e6!_nS7N?+wmeE3<@i>b6fbD}TX^ zI%~6BNCMJp$tf*1PP=KUu=@G@|K4g|$=p^up2o(MWRfJ%$5Z*=8+0l^#{MUnF>t-R zzTCpS1XOz;Q4P|k`@`hav*mg)?N`o*d~_o*6mGOjYmtgh>21s$HU37z@fG|qS-D G#j`^@F^ 3SBfnO-Cdi?`gZfCC|lXXA=4 z?fdj=Pq&Z1?(sn#AQ(mR@hwgo&dJ``FWai+^Rcz(5&y>J@WX5Ts&>~=lE%!XBR4~O zupnURQ!TjdVMw=X#oJ$E_u$au#?!xk!=R142vW7x#)A6GPHe>=+N=Kzkf=2BJH15f zWcT)DHlJHju55oO1ft4~n}~EM$Aw45X9Zfpw1Trgj+_$fuA>H%Kg^{2H^irRbmbF& z5yL}@sEtoSk<{lrBKSa7^!t>9h_1xr-e$iUhI^D;EG{`E-gCVGZ=N*Yr;dB1Nm=<@ zL@B_Iz-ZX3CFsM#09^2+Doq(&EsO+iS$`HijjZ~x5y%?fC-RyW^dEG{Jrp<77
QHSXDmc;nvVLsap=zedTZr!{^^wO1 zT9zZA6qh3RKl;_%%UM^g|5@b&>7YwNuo%`zcpBg|(SD!&`fr=hbWETRyGIkEsbe-* zvGAG2?yC7`rSUc;=C=wp+ksL=D|9h1-~=<}J<-j_iUdk)1V& m$wX=`4|@;)eU}5ys%3yah<}1&$O52Y+?fD{o{3}g;Ic{K^L)lhD#f->1r45 zThTbkTwQVscT|UkDbd~v9Ho8_s=o?hbTL<+;r(JFn%RxV(+76bJTg#taldO|NPxuH zVUIns@;c=_4p6s5w4;Qp=tWm)Nzz~-*IsR ^kq r4MLG|XrDN(tWcchctd(@e=>E~V0fN0(#G ztFV0(7c1fODEklGR}+LbA>R8%Ff>jE<_VHiSBQPcEZT?vuu~Va*tgc^+xmG`DNVmz z@uuHr i%L|7uew$;`BUjQ-jbJC5-q_Sc->jO7xr-v}x`V zaz_DSu7;>W QD}q`_>Ol)y`x2wxvl8JE}9B@AT^(j|;iJ=l#zS=uZRL z%6eXekgDv=@#pDO@!&<{onGh<%Or`x?|}I1)K1vpxDg=O;Qj;wzH~ gXN&D;da7|m|Gqq-0A@N eWc!#ALgx+AJC z$tR2O5L8wAUfH?BOa-%(5J#C0dV#%nL|p$RnOyD!;{DrjkbsL!ngij5{MfTT7p7hz z$L-ddok1C`DH6Tll{WoN72|*chwTV~sGTE|H`gXZTivp5Pnq7T;d1`b9vvE(%x`T* zzJzm+j?>`(_LYhbPknke{ _L7|7CqHbc%p+GcziVk}wH$m5-}4kvw=z)sz0?TG(wcwZwy8pvc1*%T{u_ zjt%>>TaglhZ+}6?oSj|M9Z?3r2h??vnCVEz1D(~R`#+6OW|ezj?|flyLO-qs_vH^b z{qQ< E_= z{i?W4u9woQLV --3{kE52h9F15rXRTj~=I=0UHi F*z-?JSps**1k1<9$}4=3=%!8<#3r{w{y0#uRRdQ$|8fF{OBZvjs1 z5pm>YD>d~G*MJq{t)r}4(oM;a#%`M2X-k){XkCzp_T2yM_9XSZTt1m1#EM~{$pP@I zb=&{Ngsxy;PVTkIlIGiXdN$R@{OQPcIn?L-4@{`oKQN(f0UH0pgc8{k)xC9#iMN>L z`M)Wll3pTya7d^S301S6uI^_Cl $pq;Y z$Zx#^)_}J%SLwk|L1&zhdds4-=Z)v9k-O@u7O$Ndx9o2~L)FLK=;!{<$J^)4U`S6e zoS^YIVj8e7_p}0Su$F=2_oOP ipucN`O`)U47JHDC#W>K~s_KMO;1)gC0(1`b76E-cJzYS9Z^ENOb zSy?cx4$D`js69L5U_>3hBizyX4L{m7Hx4 `cwZdMn9`TcMFjrJl&*2#>w^3BkoffA>sb?q>>4R|r4|Q_*0fOaY|mm+ zMIV>NY@Ksf>4o)IRXmy!_78|}hNo;_DIjIO5mJ&v(Q~XGa={{nc^8HWr3+gpjm&2i zY4K{p1IgEN{|1=awDmL+jcO8s1>-u9&XQYHnw!`LuLs`GGbpeGrb;gaSP4{!VG9j? zVu`WWn r@J2o5DnLB3o3X^PP2C;65iaAJZFa0vS*Z1Od)^N-Qm4+|M5DlQdEL zyYr|hq)@%o9jscAJFLDE{9FqAQvB|FZ*bJF |9==M)QN%{yq|J4&qP=To)I(0|#LfgM|CJsPT z!@;&~H^deMK&oiOENcsVtrX*N-~USuGzoC541KeUaLm<2zVX*}J|*eSx5E5p94phy z-7(-MxkWo(!%hnQ6$0sGQQ5{|cQ}1GV`V+UAl>%BoSB9%G-%5A=6Ik2CtBHkYcZ;= zl~q2Kg1O+AWrb)y<07v~Rf?TyQopgzO##(vQ*s_BCApwKWEy8+ZVG){0m@~_7~mHd zV{ThS@Vc;3Wx6#KVP57BixXpc7h^t=NiAgYLZ94uz|LQ}DKFsh>LZO5j?P~_pjL4| z(^hPk&ZnW#^F~Y+5$HMl U|jQWf4YaTuU`$~M6jHOm %NdX_VuQ<*sc3tj^n2FTuj1A7sUKkYv hB!d1Iy@x>f<&ycmjQw>Wf5H)Im1!$skndgZ z_I}XezKUsE4~y&3k2m6%!{DJb(V)%lcKVD~WB*ggc(|O< (?Z6Y1&l7TM{ttSOJChMPJ_o7dL1$Eti{Dw> z{@#l%<*uD28dOxuYH&vqgjWP{SUcjr4xN!%WcFnVw6&`7Y){bUHCyA1VZgi*4L(Sa zfW1~3ZPL{!cL*nlHi!^3z-zBcUYRdMITd-2ETC};Pk&gmjR|DvU~YV6)lvV$W$xZM z!TeGlAR#%@#^S-xHn=z$)w5?eEMy%f+RJqbKa1u#=e5I~^hs@2NzcECdk=sErxsQR zhK*!?)(d4{;N$))C7qecf%FPYG?}fyW xM$@+C$^%s7K=Dt z**`E~8Yq$3wbJ=R0vQ=z|4d1rSoKT|B@85c<^&o>eL=>bG#8>VtC(Z@&y;iuidVxU zJSM%rx?Cw|GQ((F!(@2otfu_V|8tz%6wgk!JJF`Ay)6#E+%Zsyhzd%IUCjVZTGk_I zok y{4rlg@Bh M7_v zugqDDt$0zm5YI|j -gC3ebKQy*)?>kmYSb_I|KTTm0X1+Yc8IPl?9Ra`Vq+qB%1pZ4$&`> zSP#e$-VwrqPGqW)Ms+QvF^-|OzXLZ;_TTnQQy2(-utIlec<3-kJ=Pwps(pQ@W}AKP z)L~s(&q24OVVuRuBUOlwr9(Q6dT}d3V4BYz-DY{>s6GuHg%h#9-S3I0u!b%I(!bx& z7_>>4(^ay*X|u4K ANr-AY1Y5N|QPueFk~~-^Xro89?h}YQKH$JOx9N5%nb;-Zi98Up82nTr zeme;Z8sSR?``+(A#}++zXRiDFLIY+A`L8_7Yzfb|U49+TLRtK7K07=cd{+_t@GzL$ zZ1)WGErLJz2;iV=&F6PweOUaoaf4;G$&Gi=V zN9I(Yr8M?zOPj#hakbE%c^w(~kShakA%$H)k%teYY+kxwpsY0oO+rin+cQ)8p%B zVEEG<#Lz0<4%02F>hw7+(;dqa?GYFCdpd;V`rM1;wp^Yl<|apoJ&;*Id&D2g@J-wO zwy(u+D~93P|7leaG}F}gD1r>&;lA^bxG#3GBPize*f;N-)d`Lv_cDY5xKHm=gCRGn zk3+dd;u^K}k0YIr3!37Pz1d>{-@V(&rij2}=1$19ZI#0^4{PU{Z&7Z_uJ$O>C&KdD z*UZk!xa#jg^Uz(l2#rP;D30!?lD(u}>@WCk*Mw!F+cToW>tQ^#uqsp}T&LozY@{w@ z)d3YPT?TN!%%JShHJHTyRBT1i|1q2{fB0ppOb^MyWtXnlw57F2P;otCF+Lk{*|!hz zZ8t%_ @ B8{D^?3Ff zjpvkt5Dgj%1}a~qGD1xx8ec35mOO|n;k(siazTO?t# _hrNlVO&l0+TbOz` zIyAcMP;=3Hg{8G|8)9S@UxC9aP>i_gc;5}rTB?a*fH}Q|;1z?hGK&~v(s&=Hk7{gJ zvME5gP=0T6o-CBv1Ca)J9@UzJ3JVIPBpwRepcsH un>tw*ZLvi~omY1y z%*DccswTG!{p_c~j8EXnPpyut#PGro=NC;}kLluq{sQ;Ao4jQWP9~?%>}!D??gv-o z4}Hlcc(#(x1ITMNSH#of&)Qdpb!9<2tHgkK&l_H50gqdfKi!LE>jB!&yHR(J>n9J7 zXq%$kDyA}ZdpFP5y_1f`!j;P6& qN7zB*83{9z}kGS6#K>QX9aJL$9J6X&sn5MMkNDA6BHK8t9C`k1~aRu zEKt7#e4v&mFko>hCh9CXWBfa*@Ly4q9QjYkwfIu)`Ik5cCXCm-Ao#H{`H!>60M-l4 zZgp+oJ+&haFig{wI{Ax0b{d;g%%bMef^N3@`&PfE&+UNE3vvyb-fJIXm``R#l1Nym zX?IsDCTJI1R0Izb!XE3ynXW!YR{dOIR`5*!Y*ci@!y2 a|rd*Zz0tW+3H19ct_f>^3#I4HaYQhubnDNYLE=8KCAXND6Vo7BY zYn!iADK=S&gNbUH);9~BBsv`QkL>aH 27N)~jAG^ga zS2?%80lHemU%e&6pNa9K-L65i73rK Ktuu~<$&q8H%@jHY?g zme>pUkJsC7MxUv 9jp-7oHtNk&qHv!P zF|b-4wUlS?l@lO;7|!;+X0CcVE2=b-cxv)K>6Qz6KKXgr#|;|?ccwiKOnHt3xNNOI z9&f9j<{s8+E{g3{!CM^Q$O5pj03T3u$cCLoVJ0Uc9k`z>ln3D8U%xyL?CI$huyEp; zi@@f~#jR-8g^pi}9X*ukng}`q1LQ%3rN|>BVmIVL;E~O#4sh~ee-OBLADtb3C3m41 zu{WJd+z=?LRB{`;B}(+RcN-6mC%css^KBkDnT(7N*tz;??+?w~ho*|vUAad0=RB?j z`;@k&!b8^mVwZ4_1OJW37xlh_lat@U4?}WGhO@<@mBx>m&px+};)1-hQGINrr0;4d z6;*^4s0oN*<~Aqqw=CRdawI!aj&px#38*a`NRGgNHm0{yCz%`66sm4(n0_)ByjK3d zWcxy)ylTN#JhFe9O;BPU%{{fTIf*R{&Jgi6)7n_#qvLF-PJZ Rs)pYWzWj X)H1n1$Fz7(hZs^U3O(rOR{0JY%6&NVpsy*P8?GL zlwru`2k?Tx^ANX!4)}@RB`>l0z9YukPs7*^#;(3gfs6VAai%+>e3QY#Nqc+^IS3qx z8N~E%I)jp&hYF-VB9w8KrWE#5*t$4PVQOIVvr}rp0zgQoH{Y_5CYNvVF|lLtx5)Q$ zTl`07e# R02$N=-Lojf?z5u-3pum+_|Xd@Wq z*kcQEe&(~vC>VdVmtu1AtV4;@B3rfW$T0&%t_&O~eShpHVBQ~=v84*zmKT0U*FBS6 z$Y~=^4B1iR={xAx>t>1_;{QBKgDKf;u0T#ot7A@@SUMKl#aO>Znr=ssY2jI4G7Tuv zc};!ft3>dH76gf=sA%r1;hJ &{{Mf6ffo2Ka7VNoA}+ht!klYm`&^jN;8@RsXBTwhhu z*C=rT%9zd;ER)G(b@);+E}1t9^!Te5Zk{X($T?g6HVXYtM9h`u>L0b;v3CMlu>;@G zX6SH^HAN;7S!#_488C)A)C!Tn&j4m<1f+>q&@MI?=>s7S4d?B)Di59SV^?l0EnNae zC-z3m=Fu#IY@WIY9bui`n~J8n=|>N*s?#%qPS901i}==B{k3h&+%AT`HYc(h3kmJI z=XrS_ad(Per*C$(o{_El&rhTn>a4mCZ-je2RiT=;23;i|KE7cCi@RQ*pmNzK5!e2r zG3b6*@tB({aC^Ue$S!$xdLL;B4m`YF&oa8o{_-;}l$s?PAFV5)KihYAXz-4=b;agr zYw%Hbyl&+U8htBK(d7^3sw`OJGh}A J`9OVvW|SW4m$=v zvcHi#gI!#-3rFy~kQrD&mmd0bi*Ce&pA=0y`DT52xJ9qi#RVeeT(n2X+I*ab*yrx% zm~%z%#YH>MLLwU5AZwcrXQ`DQ(50?@`ltKjX?)v}^Re4;g+?1Znes2bb(Q3|Bg|C+ zfhXDEr6#~l#^~{_VYKd89lOs{Rj1$G?0LVT1|T|DH*6t+#Bh?QeT^IQj$xZ`mmvdB zW>w}5DX>GaFG~g%$F^^0|D1cxi;HPqWm6nIHtDVo%Q)O~9NI1&oYhtyVzFZgefKrB zUL$V#o&b+qOPhK@K^3I`YWtU6o-oi400&L0>ydmS%&zVJ0iRyp@7NJKB?hV*o+VqX z{n%iTH7N{;O^$6x?HZOi@ff)@iIP+x>QlzSgQ~}gHAkh!-&4o&VV7vin(1%T%!&B@ zwB)i6PWp?@#$x*cTws^kwbKD8#C%A{s7^o&<90iu$E4|HkSR|4h|(6#>7H&zaBQc3 zkn~~IjgG3DL1tT<%@vKMN^?wRo;*2_^(;QjQSrTnVmnqwZ=Q`k50ir&LWzEqx_AW^ z_K>x74A2wNy(8r?ElO~LS3y}Ys_-?4SGGYnlqDlWMer!zy?v_caV|YzZ?T#^$6`WT zgG2_L7upK77u)`=$HY3|vw?z@wZ<=wbc<`^(eXJuWl>FCdmf mvU~1 NTB`Cx<;uOk$yCS7?y@$>lF52si!I4H%BX ;s1BZnSUf$@mTe+$mT4Y&;cH?-YZ#>Fyt2Dt|%r(+HlS^>t>!bAC;vMrit~>Co zy>3?I!D*8VISZzZw*AlNnT-?cpG_8?->lya%vag2#%6Hm+N%uw!F_Fa$7|jRU=ivm zi@8>|3931af`3nwWq*yd9MQAFnbR!vJ4lD!faTBZHYM}YunL(kdRr|UEcV`v0L?hO z=H)1_q2cs9r1ZSfZ~0Y^{H4po+3w{8=}PjoRD<7RQYrTtMH!U71Wb_8cYr*`ZdxeU zqVLqs>zk4k7fd?}dCl6`mLX@L^goUjA9Q%it^Cf?(k_fvnX_v*98?Qun0K#B)!MH( z_GQPPqjWGuSMd1@++#)9%AAnBUa!~qlP+@?{?fLKH -Z$_^tm-c5_T`W#zmP({Lf?N&Fk9*I8x8L}p@bHtGpSVKQ`$ zO+Iuh%j)7&J4nXj&QYeZZmR?>M#Wc6?j43=p4GzxN95&uAG@Nj6Qh37ABG3^VY{oY z3|Cln59gSRIe+iANsVM9G?mqynhtb1$)jwFif~m+(9>Q8IEJ;0_$6Alz4@xpD`CEG zUTzk87a}-KlrXcbJ`$oe`VdiUqv5@YB ;O}VE807z}J@ImP{W0|nWxpYBO5sXheE%`!VC<1l o?We z)=K+t-m**|P%PbxdXH7Rp(B^MwBk$i%tOP*cf9Gy(Mz?|iFhMo i&2CqH_Z#@6mco^A#9%arIZ1^7F zOB?4$X>!<-O}LM8RLOmPT@CM$Q1~rrq0tJ0aYbFoMwhJ3-;$$|Q)D+M3pynlP?<*jQ+MVNJOkZe5XpKju&6q@tR1bsP^W);I& z-`Y_ud{-O~(BJlu0T}X%pK`*aA=EfX+k#I-t crux380E_{Fw_z`E~P zDbS BzGjOEWo~CO)4k)Q PLy9GPSjQ!{5as536G;sRoMMr)jSwtpS)#B#_qk)(ty zxetNfp*X-x6lsl*4x5x{6vik>!RHVX^S)MiZ;Cn%zT(kaHP#Oc%#oK|#DW=qc9~|W z2z=N*ts2Ja1SM3+{s3y!Y!v-;de9Fy{_nsKo-x!6*e|B|!#;*9NX5)b?*MH&(`18C zzen)ErIu~d9LL<*jKD;*egVrekuiv~(kVj^FnUN| xvJ`Ipu51vV*a4G*N3yo(bbwJmPV?`~`2Z$>27}*8xBMv3VwKxJ}7GV2NlXs&p;@c9aO? zJvHO6K^dbhzN{7Tj$Xu&HOsBRCj#cb{7r62N-ZZfB*w|62T; %jg+ArunaExBFg~v(WY(*p4X90)YUG)S}Au4 zb5m{!uc181_qY ZBI6U5%Ql+zz*=6yb7!c1w8-BWct z&P+s>I55sR(!^mzHJt;i4|La`XhOeQmvD#Bd>KVRDeRG6KpWUJ(mEL?#GV~oVeHun zQ1*?| !G|9TpTD*V-9Lw%CWTFM-Dyulc9BN7*gw!%!CU8`=KaF*so^ocH`PLayV z>fo3CZ2EUKHfjr{o`f+5cb-h|A&eNKA|sWlhcj{qVe29@LY9tj0%8M=+RsiCjZQ`I zq`?jG1adllSxV;Gh`u6GDh9sXH>^8eGY4SW>mh+H5r46pNgITAeYr9GgvD6#wP{_C zRQrIRXL5&^UH2b8BJy_46n(H9^{>MGTJ$m4!n(g#JmPxzM%K2;(=+=Hw?)Z5()+Gk zSu}|>J!VLbFd==9_?s~ dS)tvk@~$45iQ!LYgJWo05QZYsx)rD^hMUa z!rlxv?3q(Lo}NHq^1#*S^D* *~@Tqd{bTjZp9m}djZ~;jy6nne8Oe|T5C|;m1z5nR)+al8zNXHKd^bX`Pl^;$D ztJIvn;`+tark0_ {)sWC%`^_n7Q2Ell53BfWldF*l{^80m z+<}a-wfzfbs^LPw0JQQ54SR#%D28;}Uiim;n|kG~apryTR(Zn}%ZfmjQ8Sk|;2hrf zo2J{4t$^>$wEkTD9%GrPkA=FJ4h&v1(5yjaI@Q36M&osB>(E%}3;Ub#M _RUlCem{pLFdi)o4Z*;MQ(#@|5?Haj~_vDj8U^#lVC_7 zQo#Z?R;lV&% iC-pV&i^Z%h_D&E;h;bL4H}Ap|q{3Z87m16Z}iI)b(SXNp3cQD6 a3;vvNPC064Z4L^n2KX6_z^|uxdvLI6y4rg8%2;Sj+a^@)Mw(0SrSFC$~#Rb70 z`dV)CR9Ff;Y_)#S@~!$-$p=pD6+nx0!>U*#{Z_5X-QQXqMXvDm=i0gO+9MqQJG1m1 z1&4G#rtA&&Ns=;z%u+8wL@}Y?<+>ted*SV$1?3vcmGOoZL-T5S#*=BSZN2G)Z Elk0%DRD4E-sZ1mHI5-I`#Z*z=pK>HE*uJTu zEnhpDcD8JTop8UTiwq(vF5Of*U)vnli{vv)G?RiaD4pq)s*@+!a~&xcO$+ngS(MYC zTYSCa!v^HOx%p}Bo5oO^VxQ CKiK9N^G8^wHx8*fni3RE-w^;k#{biwVVoIs+IaSq`@D<(09p5Y z{Ku<*y|Z2sEN1z%)4QLOYfpG;cj;lizWdY6t&u}5(V~ *^lxmV0m%So3 z>lIg=y=p+L*82j>JBBtXOX&slAxC*v9uV&ETjE{k0YLxQFd~AEWsfoU!sHYi3WaJ& z#c9%y!-PDyBS$iX0r-hxFt!i>T@axgVp5gwW|5Lar6wML8oDaay 6F9mO(7jy3Umv9WeUyHe*|pzzDC*sfP^Tl;y%M&X;^rvwxoxS6npyiSP8 z_pMsG${wDSli}cV>qlIr)dwYL&=8M^ZLu*z1^z}IqflTI@Tg;m8;B27Q 9v3N^Fr+x=S$*kwql>WZ#`^7fJy`O&J`_L_uiR3WZ1 zFMj@T_o6K5k8NAS?Izs<1Ibw>M>mdt24MuTE;;HNX1ILJzL0fyF<#7B%;gy!Q7B?h z=>b e;Q0vsm2v2=N4{28_PnTsZL`DY!IGMOd}!8|Pii}M0K?`}Sg`G-y`l~J6c z>vSMhc0cksu7u^2jOlR6m=2G8ibsrFtKZcP{sgJ~z#{}VU3NNQYo?to3kci4fYBI< z9jhZPqT@aawjwYxfa;V*xco`%g^j+JaQ#EP{L@U&1j21_`3vw7ygrn6YO}y#{wi*8 z6_U!9dpgJ1I{q6jn$jeWw$K=EE$oz#zy;Gy74OBis$}wx`5vf^mhmAMT8SYNcvy4@ zktVx#zkP<;E3kZNMczx+@jYiwzZs!(El;MhobFPJXiq!)Fs`j>?C<@SRhCY12erW& z#+XWn0lW-U@rZZ+Ts5iI0TmHaRaGtCl|}Z(Pm>hOio=DQTLbaG`#;iwR(H9Lm5|iY z$^n6a3Rb%=5{7GcmHxTtEza-D0HlH>ovU9_T-?ey?Uh`_QQHwpayUTF;vE`;M`%ia z=(_G>&!&{AP*Y2~h=s7NC Hl0i(D+nQqg})E zBdk3fV;j^d!)|t2+q y zS-m^?B!mwNNvVAug=GKoGHw>631Se2Wl)C@spLk1%GK7W?mYid5m_+&+8r+`{aYGY zchsX3ydiR>KepSQP->XHPouqe!46e$n*&u+$CLC|l}P|D<_t@`vMU}9LAVe9;#M4I zsNaq+y75bMps31SM%2$7x5SLC4W0Lm!Cco<>A}y>f>3_B{mIiNcb_fl=e+~dT!V5< zOhKp6_CL*f7#30~PV& ZafuFU8qO$%stVV^eIz;Iq5t7UgeZKxlu^dqLZ z8|OYX3evzf*L0+TX_*$S51}Pu)^YNm1#-~BtJ5f-%#DCrZ&S&Vs+yt!LUvJEnVu7R z__p&u?1Z*f{Yjo(M@lNQ;RWt7fora>GV2=uvJ>*BE1mwQoq)N}NNCE<_}-{Yh49W~ zFeTr!|8 K2WktFzH;DU+@Lf;i)MIKI!!DI+JLu0RA7;%42zJ>$4iB4j;#*H>T=FD zV7lpZ#qS_fB?qGkNu jQb}mL<${onl-YB#5)qVIrxClF^~RCI zhUv~85YAz(xW6&EB0 <(hzGohg21VaL3JJB<|~GOmHa)jN-}<7zpUCE zvf4(@@;_g<6up}Rbf%qoDvr6s+{!uThEy<4DR|1ljxC%&7W*|{2)fAUZFCrd4LWUa zGM4$#KdrSn^n`04KY*pjP16JeZigVj+%?a7j=RrizcWHRJ-qx)Y+InxXgld#XsZDg zj(a?6X~f2E%t1IvGn%U=q{D xilM52t22{|o>Yot)EA3XB zTA%0C^5pc{B_Aps9BGRB=x29(rnGAk %-vHMwIFR3 7E# zT_NkP*&L-3-JxUcpMHntW57GpNv8Y=*jBh!Wkidpfi<$1OeDawDmK&XDBox&k_^o#P#K`Xs-i*_nvTyD(HB>RjcJNVr%t}Y=Yy0QaYUI{JI<-Ca9tVP}K2gJ$ z`wpo{Y3Nn@XXM{F(6x54xtbb*K?Q?oEkP?dokZI$oSw~Uhi b*VZ;U1i`Mz@Cw?;N%5$Aq*bX^4i1YnNtg=#= zb8L00oQr$RO&&)i0mDfas*rx|J6)~{N`-dPJ`(xak>GC*g J&|8J5~OjfIH`8m;pr0TIgrG z9n2H(*>g{4uUgq5(g$UcSiPb0l@{PoD3WP&MEWR>aS{LghRIvuSKlgvN?^qh+i|;6 zl>prbRq3jTQ)P4KZ zA@a#7v8US8Gn288N8HN7g$^R>bV+0HwrAJs`WK&yT@GRAU?9~=XRcYNgw=j4#EHx> z-uyuTV+@e<`{=;vG{;Qb6vg}Sr)zz@zG!^hht>)(7H;K?xEV!Oh?!idwZ-9imJH_( zr#Z2!mtZ$tR%EqR4kZGo^U>>wyCOS_7zV0tlXn~3FOgZ^f#G*;mQr^VU{(~VwGf{* z6j%gb2H 6>;7fB6Dtb_LvmFDrM)_A7fcj_