From db4d8d8df38d440f5de8d2cb87b2d9fa5d9dcff5 Mon Sep 17 00:00:00 2001 From: marcsello Date: Sat, 22 May 2021 20:41:44 +0200 Subject: [PATCH] did more stuff --- drawio/services_plan.drawio | 2 +- src/content/appendices.tex | 11 ++++++++ src/content/birbnetes_impl.tex | 4 +-- src/content/overview.tex | 12 ++++----- src/content/ursim_impl.tex | 29 +++++++++++++++++---- src/figures/ursim_services_plan-blocks.pdf | Bin 0 -> 23204 bytes src/include/packages.tex | 5 +++- 7 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 src/figures/ursim_services_plan-blocks.pdf diff --git a/drawio/services_plan.drawio b/drawio/services_plan.drawio index ecb72fb..e91b66e 100644 --- a/drawio/services_plan.drawio +++ b/drawio/services_plan.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/content/appendices.tex b/src/content/appendices.tex index 071eb12..47936e0 100644 --- a/src/content/appendices.tex +++ b/src/content/appendices.tex @@ -12,3 +12,14 @@ %---------------------------------------------------------------------------- +\section{Forráskódok} + +\begin{itemize} + \item \Aref{chapter:birbnetes}.\ fejezetben felhasznált és implementált kódok emellett a futtatókörnyezet leíró fájljai megtalálhatóak a \url{https://git.kmlabz.com/birbnetes} címen. + + \item \Aref{chapter:ursim}.\ fejezetben implementált kód, és a futtatókörnyezet leíró fájljai megtalálhatóak a \url{https://git.kmlabz.com/universalrobots} címen. + +\end{itemize} + + + diff --git a/src/content/birbnetes_impl.tex b/src/content/birbnetes_impl.tex index d14c460..51ce569 100644 --- a/src/content/birbnetes_impl.tex +++ b/src/content/birbnetes_impl.tex @@ -95,7 +95,7 @@ Az \textbf{üzleti logika} lényegében minden egyéb, ami nem platform specifik Jelenleg az üzleti logikában lévő csővezeték második fázisaként van implementálva az \acrshort{svm} alapú algoritmus. Így csak akkor továbbítja a hangmintát a felhő felé, ha madárhangot észlelt. -Emellett az üzleti logikában van implementálva a felhőből érkező parancsok feldolgozása és végrehajtása is. Jelenleg ez demó jelleggel egy "alvó mód" parancs van implementálva, amellyel az eszközt alacsony energia felhasználású módba lehet kapcsolni amelynek során nem rögzít vagy küld hangmintákat. Illetve egy "riasztás" parancs, amelyre előre felvett hangmintákat játszik le a hangszórón. +Emellett az üzleti logikában van implementálva a felhőből érkező parancsok feldolgozása és végrehajtása is. Jelenleg ez demó jelleggel egy \enquote{alvó mód} parancs van implementálva, amellyel az eszközt alacsony energia felhasználású módba lehet kapcsolni amelynek során nem rögzít vagy küld hangmintákat. Illetve egy \enquote{riasztás} parancs, amelyre előre felvett hangmintákat játszik le a hangszórón. A szoftver \gls{python} nyelven került implementálásra. A telepítése közvetlenül Git használatával történik ezzel is megkönnyítve a fejlesztési és tesztelési folyamatokat. @@ -158,7 +158,7 @@ Az általunk tervezett és implementált mikroszolgáltatások működéséről \subsubsection{Használt külső fejlesztésű szoftverek} -Az alkalmazás több "off-the-self" komponenst is használ ahhoz, hogy megvalósítsa a tervezett működést. Ezeket mi választottunk ki a tervezés során. A következőkben csak röviden bemutatom ezeket a komponenseket és a kiválasztásának okát. +Az alkalmazás több \enquote{off-the-self} komponenst is használ ahhoz, hogy megvalósítsa a tervezett működést. Ezeket mi választottunk ki a tervezés során. A következőkben csak röviden bemutatom ezeket a komponenseket és a kiválasztásának okát. \begin{itemize} \item \textbf{PostgreSQL} (Relációs Adatbázis): Második legnépszerűbb nyílt forráskódú relációs adatbázis kezelő rendszer, kifejezetten alacsony erőforrás igényekkel, valamint igen fejlett képességekkel rendelkezik. Rendkívül jó a közösségi támogatása. A fejlesztés előtt volt már vele korábbi tapasztalatunk. diff --git a/src/content/overview.tex b/src/content/overview.tex index 4e46eb2..d6b5679 100644 --- a/src/content/overview.tex +++ b/src/content/overview.tex @@ -83,7 +83,7 @@ A fent vázolt problémákra megoldást ígér a peremhálózati rendszerek alka A peremhálózat pontos definiálása egyelőre nem teljesen tisztázott mivel nem is egy egyszerű kérdés\cite{cureforedge, cloudflare_whatisedge}. Egyes források szerint a peremhálózati számítástechnika az magukon a \gls{vegeszkoz}ökön futtatott alkalmazások\cite{verge_whatisedge}, míg más források a felhő és a \gls{vegeszkoz}ök között elhelyezkedő számítási környezetre hivatkoznak így\cite{ibm_whatisedge}, illetve vannak források amelyek a határokat teljesen elmosva mindkettőt értelmezik\cite{cb_whatisedge, dataplace_whatisedge} -A fogalom -- és a kapcsolódó fogalmak -- tisztázására és egységesítésére a \textit{Linux Foundation} egy nyitott szójegyzéket hozott létre "\textit{Open Glossary of Edge Computing}" néven\footnote{\url{https://www.lfedge.org/openglossary/}}. Ezt a szabadon elérhető szójegyzéket egyre több gyártó ismeri el és használja\cite{openglossary}. +A fogalom -- és a kapcsolódó fogalmak -- tisztázására és egységesítésére a \textit{Linux Foundation} egy nyitott szójegyzéket hozott létre \enquote{\textit{Open Glossary of Edge Computing}} néven\footnote{\url{https://www.lfedge.org/openglossary/}}. Ezt a szabadon elérhető szójegyzéket egyre több gyártó ismeri el és használja\cite{openglossary}. A szójegyzék jelenlegi (2.0-ás verzió) kiadása alapján néhány fontosabb fogalmat az alábbiak szerint definiálhatunk: \begin{itemize} @@ -103,9 +103,9 @@ A szójegyzék jelenlegi (2.0-ás verzió) kiadása alapján néhány fontosabb \subsection{Architekturális előnyök} % TODO: cite -Az előbbiek alapján ez a dolgozat peremhálózati \gls{adatkozpont}oknak azokat tekinti, amelyek logikailag -- és valamilyen szinten fizikailag is -- a felhő és a \gls{vegeszkoz}ök között helyezkednek el. Ezen a tartományon értelmezve "közel" áll a \gls{vegeszkoz}höz. +Az előbbiek alapján ez a dolgozat peremhálózati \gls{adatkozpont}oknak azokat tekinti, amelyek logikailag -- és valamilyen szinten fizikailag is -- a felhő és a \gls{vegeszkoz}ök között helyezkednek el. Ezen a tartományon értelmezve \enquote{közel} áll a \gls{vegeszkoz}höz. -Ezt a fajta logikai "közelség" úgy valósul meg, hogy az úton, amelyet egy hálózati üzenetnek be kell járnia a \gls{vegeszkoz}től a felhőig, a peremhálózati \gls{adatkozpont}ot a lehető legközelebb igyekszünk helyezni a \gls{vegeszkoz}höz. Következésképp egy hálózati csomagnak jelentősen rövidebb utat kell bejárnia a peremhálózati \gls{adatkozpont}ig, mint a központi megfelelőjéig. Egy ilyen architektúra vázlatát mutatja be \aref{fig:overview_with_edge}.\ ábra. Az \gls{adatkozpont} "közelebb" helyezése a végeszközökhöz számos előnnyel jár. +Ezt a fajta logikai \enquote{közelség} úgy valósul meg, hogy az úton, amelyet egy hálózati üzenetnek be kell járnia a \gls{vegeszkoz}től a felhőig, a peremhálózati \gls{adatkozpont}ot a lehető legközelebb igyekszünk helyezni a \gls{vegeszkoz}höz. Következésképp egy hálózati csomagnak jelentősen rövidebb utat kell bejárnia a peremhálózati \gls{adatkozpont}ig, mint a központi megfelelőjéig. Egy ilyen architektúra vázlatát mutatja be \aref{fig:overview_with_edge}.\ ábra. Az \gls{adatkozpont} \enquote{közelebb} helyezése a végeszközökhöz számos előnnyel jár. \begin{figure}[h!] \centering @@ -129,7 +129,7 @@ Az adatforgalomért sok esetben az interneten szolgáltatók között is fizetni Ugyan a peremhálózati adatközpontok alkalmazása önmagában sok előnnyel kecsegtet, fontos megjegyezni, hogy a peremhálózati rendszerek nem fogják és nem is tervezik kiváltani a tradicionális megközelítést. Sokkal inkább azt kiegészítve szimbiózisban tudnak igazán érvényesülni. % Itt le kell írni hogy van ez a két dolog -Egy ilyen "szimbiózisban" a peremhálózati rendszerekre mint a felhős szolgáltatások kiterjesztéseként tekinthetünk\cite{7807196}. A peremhálózati rendszerek korábban említett két előnye, amelyek az alacsony késleltetés és csökkentett hálózati költségek, kiegészítik a felhős alkalmazásokat. A késleltetés érzékeny, vagy nagy adatot fogadó komponenseket kiszervezhetjük a peremre, ott akár még előfeldolgozást is végezhetünk az adatokon, így csökkentett mennyiségű és kevésbé késleltetés érzékeny adatokat kell csak eljuttatnunk a felhőbe, ezzel akár még a felhasználói élményt is javítva. +Egy ilyen \enquote{szimbiózisban} a peremhálózati rendszerekre mint a felhős szolgáltatások kiterjesztéseként tekinthetünk\cite{7807196}. A peremhálózati rendszerek korábban említett két előnye, amelyek az alacsony késleltetés és csökkentett hálózati költségek, kiegészítik a felhős alkalmazásokat. A késleltetés érzékeny, vagy nagy adatot fogadó komponenseket kiszervezhetjük a peremre, ott akár még előfeldolgozást is végezhetünk az adatokon, így csökkentett mennyiségű és kevésbé késleltetés érzékeny adatokat kell csak eljuttatnunk a felhőbe, ezzel akár még a felhasználói élményt is javítva. A gyakorlatban a technológia adott arra, hogy szinte bármit a kiszervezzünk a központi felhőből a peremhálózati rendszerekre. Viszont a fent említett előnyök általában véve csak az alkalmazás valamely részegységében adnak értelmezhető hasznot. Fontos ezért a megfelelő architekturális tervezése az alkalmazásnak, illetve az alapos felmérése az igényeknek és a hasznoknak. @@ -159,7 +159,7 @@ A keretrendszert felépítő mikroszolgáltatások négy rétegbe sorolhatóak: \item \textit{Supporting Services Layer} (Támogató szolgáltatások rétege): Ez a réteg fogja össze a peremhálózaton működő analitikát, naplózást, ütemezést és tisztítási munkálatokat ellátó szolgáltatásokat. Ezek a szolgáltatásoknak valamilyen formában mindig szüksége lesz a központi réteg szolgáltatásaira hogy működjenek. Ezek a szolgáltatások teljesen opcionálisnak tekinthetőek. - \item \textit{Application Services Layer} (Alkalmazás szolgáltatások rétege): Ebben a rétegben található szolgáltatások felelnek a az információ külső szolgáltatásba való továbbításáért: a gyűjtött adatok feldolgozásáért átalakításáért és továbbküldéséért. Az itt elhelyezkedő szolgáltatások "funkcionális csővezetéket" valósítanak meg. Ami azt jelenti, hogy minden feldolgozandó adat egy folyamatot indít el, amelynek során az funkciókon keresztül jut el végül a küldésig. + \item \textit{Application Services Layer} (Alkalmazás szolgáltatások rétege): Ebben a rétegben található szolgáltatások felelnek a az információ külső szolgáltatásba való továbbításáért: a gyűjtött adatok feldolgozásáért átalakításáért és továbbküldéséért. Az itt elhelyezkedő szolgáltatások \enquote{funkcionális csővezetéket} valósítanak meg. Ami azt jelenti, hogy minden feldolgozandó adat egy folyamatot indít el, amelynek során az funkciókon keresztül jut el végül a küldésig. \item \textit{Device Services Layer} (Eszköz szolgáltatások rétege): A rétegben elhelyezkedő szolgáltatások feladata a többi eszközzel szenzorral való interfész megvalósítása. Egy szolgáltatás egy vagy több eszközt vagy szenzort kiszolgálhat annak natív protokollját használva. A natív protokollon érkező, vagy arra küldendő adatokat ezeknek a szolgáltatások a felelőssége átalakítani az \textit{EdgeX} többi rétegében használt közös formátumra alakítani. \end{itemize} @@ -205,7 +205,7 @@ Mindennek köszönhetően a \textit{KubeEdge} platformon futtatható alkalmazás Az \textit{\acrshort{aws} \acrshort{iot} Greengrass} egy az \textit{Amazon} által fejlesztett menedzselt (\acrshort{paas}) \acrshort{iot} platform. Segítségével a fejlesztés során lehetőség van az alkalmazáskomponensek helyi tesztelésére, valamint azok üzemeltetési folyamatainak felügyeletére is lehetőséget kínál. Az egyes telepített komponensek távoli frissítése is megoldott. -A rendszer két fő részből áll. Az egyik az \acrshort{aws} felhőben futó szolgáltatások halmaza, a másik pedig a peremhálózati rendszerre telepíthető\footnote{Az \textit{\acrshort{aws} \acrshort{iot} Greengrass} támogatja azt a megközelítést is ahol a peremhálózat maga a végeszközök rendszere. Ennek megfelelően a "kliens" alkalmazást oda is lehet telepíteni.} (itt átjáróként hivatkozott) "kliens" szoftver. Az \acrshort{iot} eszközök ezen az átjárón futó szoftverrel kommunikálnak. Az itt futó peremhálózati szolgáltatások pedig az interneten keresztül kommunikálnak az \acrshort{aws} felhőben futtatott többi komponenssel. +A rendszer két fő részből áll. Az egyik az \acrshort{aws} felhőben futó szolgáltatások halmaza, a másik pedig a peremhálózati rendszerre telepíthető\footnote{Az \textit{\acrshort{aws} \acrshort{iot} Greengrass} támogatja azt a megközelítést is ahol a peremhálózat maga a végeszközök rendszere. Ennek megfelelően a \enquote{kliens} alkalmazást oda is lehet telepíteni.} (itt átjáróként hivatkozott) \enquote{kliens} szoftver. Az \acrshort{iot} eszközök ezen az átjárón futó szoftverrel kommunikálnak. Az itt futó peremhálózati szolgáltatások pedig az interneten keresztül kommunikálnak az \acrshort{aws} felhőben futtatott többi komponenssel. A két fő rész képes bizonyos ideig egymástól teljesen függetlenül üzemelni. Ha megszakad az összeköttetés a perem és a felhő rendszer között, akkor azok a peremhálózati rendszer képes továbbra is zavartalanul kiszolgálni az \acrshort{iot} eszközöket. diff --git a/src/content/ursim_impl.tex b/src/content/ursim_impl.tex index 1708e4a..68b8f76 100644 --- a/src/content/ursim_impl.tex +++ b/src/content/ursim_impl.tex @@ -4,11 +4,11 @@ \label{chapter:ursim} %---------------------------------------------------------------------------- -A negyedik ipari forradalom az "okos" gyártásról szól. A korábban helyileg telepített számítási erőforrásokat felhasználó előre meghatározott, kötött gyártás irányítást leváltja a felhő alapú folyamat irányítás és optimalizálás. Itt már nem csak a gyártás a lényeg, a folyamatok elemzésével és mély megértésével a hangsúly a precíz optimalizációra és produktivitás növelésre hegyeződik ki. Ehhez felhasználják az ipar legújabb vívmányait: Egyre nagyobb teret hódít az Ipari \acrshort{iot} (\acrshort{iiot}), a mesterséges intelligencia és gépi tanulás, a gép-gép kommunikáció, valósidejű adatgyűjtés, \textit{Big Data} és még sok minden más\cite{whatisindustry4}. +A negyedik ipari forradalom az \enquote{okos} gyártásról szól. A korábban helyileg telepített számítási erőforrásokat felhasználó előre meghatározott, kötött gyártás irányítást leváltja a felhő alapú folyamat irányítás és optimalizálás. Itt már nem csak a gyártás a lényeg, a folyamatok elemzésével és mély megértésével a hangsúly a precíz optimalizációra és produktivitás növelésre hegyeződik ki. Ehhez felhasználják az ipar legújabb vívmányait: Egyre nagyobb teret hódít az Ipari \acrshort{iot} (\acrshort{iiot}), a mesterséges intelligencia és gépi tanulás, a gép-gép kommunikáció, valósidejű adatgyűjtés, \textit{Big Data} és még sok minden más\cite{whatisindustry4}. A robotvezérlés precíz időzítést igényel, hiszen itt pár-tíz milliszekundumos eltérések akár katasztrofális következményekkel járhatnak. Éppen ezért sokáig a robotok közvetlen vezérlésének kiszervezése a felhőbe nem volt megoldható. A peremhálózati rendszerekkel viszont ez megváltozhat. -Ez az alkalmazás a peremhálózati rendszerek alacsony késleltetését aknázza ki. Hiszen a robotika vezérlésnél fontos a precíz irányítás, úgy vélem itt különösen jól alkalmazható ez a technológia. A peremhálózati rendszereknek hála tovább csökkenthetővé válik a gyárakban helyben telepített informatikai infrastruktúra mértéke, hiszen több alkalmazás válik felhőbe "költöztethetővé" és ezáltal annak előnyeit is nagyobb mértékben lesznek képesek kihasználni a gyártósorok. +Ez az alkalmazás a peremhálózati rendszerek alacsony késleltetését aknázza ki. Hiszen a robotika vezérlésnél fontos a precíz irányítás, úgy vélem itt különösen jól alkalmazható ez a technológia. A peremhálózati rendszereknek hála tovább csökkenthetővé válik a gyárakban helyben telepített informatikai infrastruktúra mértéke, hiszen több alkalmazás válik felhőbe \enquote{költöztethetővé} és ezáltal annak előnyeit is nagyobb mértékben lesznek képesek kihasználni a gyártósorok. , Ebben a feladatban egy már rendelkezésre álló demót alakítottam át úgy, hogy az kihasználja a peremhálózati rendszerek adta lehetőségeket. @@ -28,7 +28,7 @@ A demóhoz használt két robotkar típusa \textit{UR3} és \textit{UR3e}. Jellemzően többfajta felépítésű robotkar létezik. A demó során használt mindkettő robotkar csuklós felépítésű, azaz a az emberi karhoz hasonlóan hajlatokkal (joint) rendelkezik a merev tagok között. -A használt robotkarok hat darab ilyen hajlattal rendelkeznek, amely kellő szabadságot nyújt nekik a mozgás terén. A hat jointból ötöt +/- 360$\deg$ lehet elforgatni, az utolsót amely a robotkar "csuklóját" adja pedig végtelenszer lehet körbeforgatni. Egy ilyen robotkar képes fél méteres (500mm) körön belül mozgásokat végezni, és három kilogramm hasznos terhet mozgatni. Maga a robotkar saját súlya 11 kilogramm\cite{ur3_specs}. +A használt robotkarok hat darab ilyen hajlattal rendelkeznek, amely kellő szabadságot nyújt nekik a mozgás terén. A hat jointból ötöt +/- 360$\deg$ lehet elforgatni, az utolsót amely a robotkar \enquote{csuklóját} adja pedig végtelenszer lehet körbeforgatni. Egy ilyen robotkar képes fél méteres (500mm) körön belül mozgásokat végezni, és három kilogramm hasznos terhet mozgatni. Maga a robotkar saját súlya 11 kilogramm\cite{ur3_specs}. A két robotkar végére két különböző gripper van telepítve, mindkettő \textit{OnRobot} gyártmány, viszont az egyik egy \textit{rg2} a másik pedig \textit{rg2-ft}. Fizikai jellemzőit tekintve a két gripper hasonló: mindkettő képes legalább 100mm-re kinyílni és 2 kilogramm erővel vízszintesen tömeget megemelni. A szorításra maximum 40 Newton erőt képesek kifejteni\cite{rg2datasheet,rg2tftdatasheet}. A fő különbséget a gripperek kommunikációs interfésze nyújtja. @@ -101,17 +101,36 @@ gripper vezérlését \acrshort{rest} apin keresztül végzi. A két robotkar vezérlése két külön szálon valósítja meg. Mindkettő szálon egymás után következnek az utasítások, a kritikus szinkronizációs részek egyszerű szál-szinkronizációs primitívekkel vannak megoldva. -A programban több futtatási mód is implementálva van. Egyrészt választani lehet a végrehajtás sebességét gyors és lassú között. Ez a robotkarok mozgási sebességét befolyásolja. Emellett lehetőség van "Jogging" módban futtatni. Ebben a módban a program minden mozdulat végrehajtása előtt várakozik egy gomb lenyomására a további parancsok kiadása előtt. Így lehetőség adódik az esetleges hibás mozgások hibakeresésére illetve a program teljesen automatikus lefuttatása előtt manuális tesztelésre. +A programban több futtatási mód is implementálva van. Egyrészt választani lehet a végrehajtás sebességét gyors és lassú között. Ez a robotkarok mozgási sebességét befolyásolja. Emellett lehetőség van \enquote{Jogging} módban futtatni. Ebben a módban a program minden mozdulat végrehajtása előtt várakozik egy gomb lenyomására a további parancsok kiadása előtt. Így lehetőség adódik az esetleges hibás mozgások hibakeresésére illetve a program teljesen automatikus lefuttatása előtt manuális tesztelésre. A program a konfigurációs beállításait egy \gls{ini} fájlban tárolja. Ezek a konfigurációs beállítások elsősorban a robotkarok és a hozzá tartozó Gripperek hálózati címeit adja meg illetve a konkrét sebesség módokhoz tartozó konfigurációs értékeket. Az \gls{ini} fájl mellett a program a konkrét lépésekhez tartozó koordinátákat egy \textit{Microsoft Excel} \gls{xlsx} fájlból olvassa ki. Ebben a fájlban mindkét robotkarhoz tartozóan fel vannak sorolva a koordináták mind tool- és joint térben. %TODO verify naming - \section{Tervezés} % Itt foglalom össze, hogy hogy terveztem meg ezt a fost +A fenti monolit demó felhő és perem számítástechnikai rendszerbe való átültetése úgy, hogy annak előnyeit megfelelően ki tudja használni alapos tervezést igényelt. + +\subsection{Keretrendszer} + +% Itt nagyon hosszan részletezem, hogy miért választottam a kube-edget + + +\subsection{Architektúra} + % funkcionális felbontás +\begin{figure}[h!] + \centering + \includegraphics[width=0.9\textwidth]{figures/ursim_services_plan-blocks} + \caption{} + \label{fig:usrsim_services_plan-blocks} +\end{figure} + +\subsection{\textit{Single Robot Controller}} + +\subsection{Kiegészítő szolgáltatások} + % külön lehet írni a magas szintű tervezésről és egyes szoftverek architektúrájáról % Itt le lehet írni a controller magas szintű terveit, plugin architektúrát diff --git a/src/figures/ursim_services_plan-blocks.pdf b/src/figures/ursim_services_plan-blocks.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6e9b7fb342a7dc334d47c2ff4a10af5dbec1a20e GIT binary patch literal 23204 zcmagE1CS`qmMwhRwr$(CZQHi(?$fqy+qTWqwr%(6*WaD{$DRMhiI@8A_|g`(F7Ej5?5ujM%-R(A0`~USCTb>zQWnm1EKF>)OsqeOQsT-o($x6Y7FH(s zVkSmbc0Y>7js|YD7It(DjI=)&zL2@2os9_{8#^sMEfWVlGc5-*zKFGnk+Y+nEgc&z z!;e8F15*P>i+`h1K+?%O+8MhTnf$n=WMyGM_v1aj4IBH!bgJLCUZg_jr7#MbzqBryFa8Ab;943Kn!GWc||c8)d% z*8fpr{*RK7z&}d=r7A6iPY+2aE%~or?H{>}G(IyVoss~)v!jd2{~L?-f5G}ek^cX% z7=GaYM=-Yk1?(U9)bJVq<=FoU#{M5LQ44G5pZwE_TK{BP*u==r_$L}^6I(N9b9@eV z23}r#C+DA~V*}})wXC*bi_He@lUqCI6hMwFqKGJuY|iSMvq(J$N1lNkqLX*_4aBo# z&fTc%HCl5~u(n~(g6!fxL{L7~{-lQAwKFuWXBw$INY}cUo48|)7|n8moguFrpEUSK zuQaz8%8x(D$SQ-zip}{Qj#TmXMGkL(+WU*K`zvlRwYS5hlH-ur_Uhpg;ieI!QFxj9 z3<9czyjopGq=gWFsA56TdWq84$|TH*w@uI~PkN~rM-zDjkl!#(k$x6t6Yt{TDBvx( z!zi}jly<&I9X7Aq;wS<8(f|IMy}LUUG33B(^~x(5yY3J$Rf~OFb_dCUC?Vp8rRRpc z_+5zoFRu;`9j#A5eU%46={u~;$TeI|RDG6HiB3IyPzCR|vA)TL^|eWlKOn30D~Gp3 zW5*HINjlxKL-7ojMkWV!+qu_Rpp^$kYBl|Sk)p#oCqgL^Rixsq26Yzo(3H$=rsEmt z45%9GthKf&Q@S`Zip^|(V;ZL2*^p+&?^^Dq?z4-yz)|s>v2mYe9LY99_3^e4 zVvZC=;g_JHID-v|gb8LOd_Gu0Yi{E(4o`kXL#;87Rmw#~?}RW7oc3866wKMjr?{)- zHrY?-20549Dc2ef$n<;KwW>Q`;066+Xi-=x;A?p6F>)syv`6YeU@ z?3$$KHXgNY3f%Pqjmc}Xn03X<54hHnMeEVLdTdsJ)Nc)HqWMoeLk^65!u+R3`MFmT zaT5L=c0?~^kOyCQ#IVe8hOAYVt!aiNqQsY&nlku`Sk=dfej@b_kw1lV^2VpOx)Do) z%_>I%)NG4(u|xhoOs{-8;I9jFv-$3!NeGEdb6Rj$Yy5H@oL+$_zbXY(oUGj{3%o=K zV!K0bB>6+-<=0P>Fr}`Jy_1J0gNLn#5fR5JYdQmyU_{i0}I~{LR8A%I;AdCV;9oc5mcJ-;{{8A`5qlIphAb zx*99UQ=HP?F6LTu4ete071K}BLc4cOZJ>5LwR_0Htkd!4R*x#!L^6aI~xWNk00 zV;@1ou9GqUwgpmp2x8XT+yAC6nIaeuW%OZR#s5(x;~EL8W1ERM+ib{D`$#!kXxp^a zFxZZV_XpFjIVsH{xTE!a&f@9bb$7N65_aQ&gBZIN0$S z8ChxR*?+7F{Y*2lb#}u4hvR-Am45iy$XVXN@n6Cpmi(_FKF7c9{5$M_9{*h_{}Z;; zKX5KTZu~H{l!dVqzSck4QPlZQxnTImi~rv|Ap>UvYdf=l?3n#z>;E#t@ZT!(e~~N$ zJ`+1D8{<#B{{s;-aIi42{dX$9>~_;n8eXCIHO=v8d9ik7bIFxyz!C?9px_rImV(F= zry~_7CIAL!i7p}EqZ9!a=_XVcP(Xl^0!N1@p=71jr^C|a?DxFSWL&pD=7v>p4d7JsBx$u zFsgA9Rn=mLbrXWW4m(N1X>xM6edO)eUxHuH(~D+*Xt;0XtMMkij64q>&rnQS)>f+3 zU!VmMNlUTEcsfzfy1{u$r!|?I-?Jfl0iwQe@z;2pE!QtW#$&$$=Uh1bvB`7wN~8jdm z-f3-?Z9KH787e}(KvDqMIq$I<}6|;w_3=t2WTz07A$AuFy29eIwGGG9sfc?CbDC_UgV%UPa!`()` zh!tWFjfTb*!@Z`?kwrm|Iq!DWx$!mnrqdGo}i z5eVONGzHBy((A8Lt;!(>LK48{a}B70!x2mgj|sVh=0nB6u-6bjqPT=!l+3{`!Mv#) z63ob)TARbbfqR5nn<}-@@y3Wf5l=w}g}sblga z%ev?{@jT-|A3MRb{_a?gY2Vt*YUimcJkTfE_mYpbJLH@^`4hvT*H#0OlP44G;9J^k z3XUZ}4L}^~@-^bRITH!Xjl*h`TU;@Is>C_~uL>qqv|+%=1p`!EGp94t$E^*w0yB4` z-&BIpAfG}+-@QlJl@s(1#3*Dt;=&v7`T6TwEJw8w&K&T=f9xKq-_97nc2aH*3-}An zn<4I49%B@nGxbaE;TtOtZ$d6_)|>FP`cr`Z_eFcqM({gVLO@=V(Ucv3nV9%|QNmM3 zdXWSVEH&lk2K+H2-{H9L>2QVuZ~W=WJSx3k)+fhh;!5B2Wza5J5$^dJSe-Twgo!iG zJ2Q5qFF2dy?iW$bd65{}>E>|9Qq0EFli`$)uX^d`ZxwStyRbcB^clj>K+i{di0Jvq z53_o{yjW3n+=V~8H#qNaoZNx0DXw2#;&NuXMY*AoPxpq@&!~?#SFRBcZS6i^n|zLV zqdvqhPMfn$e|pi~EPEqtMR<;VUun|dTP}j>wF8_!39Ua)!xXmFK!Pd+`bU+c`)Lwr z+C-AWA4kC*ZyB^-24Z-c$yZUgga&PhR>gwZ)Q}0Iv`p5J(+!z%_ogz4r9I2%pg&GVMgJ z^hGZiM4`EFP}fC#75u6hXz!)Hx0gFgI~iB&7pl0yPmC7Q+kjSTt9s>p^=`XldFU$( z7v{SIc+`(I$`+q9=#CBq^L3X#1+n8oIv_j@>A+qpYaFbHy|GI)KLFE8!^;Gr6ZVP{ zY4df^)z7UEN2l2jzu6V=z}607ZIaM|%Tzv?J0>)MdcFg1!5TdYyeb&>^+D5)er`te zS(JR_z<=};tP}AB{L={k#Tlp^%k2rM?Z|U)U!wlOk9uEE)%GQ>)j#SY?1J`gfGf8N zQmIafTwywZIi*EZm^>=eo2V>a7mCW6xJW{$(G*Gnl`~4t($&{x`Q2I8v-}z=en} zYL`^2r00@WPuR7oRDMEqm~=UqFawpd(M?|UU(gpx)3hPjzV0dr)d%KCe_F*~e|CP? zlg#pg6M69ZpePC4~V`~K*xpl6E=Y0O!?6N_71VvL(d5$0JIZB5ApJb z)rgwQKI&rvmx`Aa`s5yHk;gP@#b%GHgZ}UZxP$ej-R1ufl8a%u0SJBqw`)pu0p(rE zJ#qu(0Hu|_3HF3Nl&(u29Da(Q<#FiBxnw*f13cf?gsmW<7vRA=N{xEETRjo6z$Qz) z3dZ=h<^6^o6BvW%h7Ra`z}z?rSiQsRiv!7PbrNevW*sjjY&d2A4 zWdL}MVkZQ;&+z-B`2h9{_9GI?*;iS7hihRo)!RiO`+?PAn-%uH`*`-_^BXDe3Y*^@ zWiR==c647i^aC8~1xbt^mZFdS9w2qbKFsO# zoAd9(!>C^bgDJ(RN5@+>+Ws(FF2P@;P1;$%AUa;FrpfP}Jy|zUv^{vd+o?y85ubn= zvs^!y5sOjs*_N5U5fCkg66Ra>jL`;eU(`Dz^vH+I-$oAFzr47P>zQKpJT9jW)P^$Q zYn8_hc@JJWa%Z82QV8)?(Sgmyj36m=5a?~>e8nbf1@hT8`BUOH#&C?0AmWIK#Usxu zA6?$lg^48=B*PbA7AP&6nA@<7Eup8amg$E)80OcqVxbcE&o7QV;Epm?(oN zMUPaE%0(+pD@-dZRM^T=Dpx95D{<9ql)B5``Jc2t8(w#i8xhNgs30Qb&T5RwH6(Kq zY9CcVDV>r@CQOeQjwE6)!*AKSA#ig`JI$(2FlTjgXdsvclJ#ZlNQ6m+$=Z-QNQ+3J zCCH`9#EZgHgk#aVmaJ|yyIgB0u`XopOFSC8-?lZjJ#S>Tled?*xw;nFmTSe&gT>@2hv>rM8hAkYlc z{At}>a8#4J-8@_gT*=*-0ht8}`UJ&hg`BY=-Wbz5bUWOn8f%XwIo;iq8Ee-n4#O}Y zWsT4oTxoE*#C?YM%3!IFU6bIz=cB?)kPG8DQFv1+_M2#5ynDLCLJ305XGa0yNDa)I zRCXN9$_&WzLg#3G0-TAy)4tN!=;xqvq@^U_ooZhQrU-PJ;M?0AgPo~= z+#DTi?}D9Cc{R-<4s<$Xwjvm7PfFPy@)+? zD?HpqWnKz)>ZIs-3+{tNGZ2O80j9xknvmgy#h^3p(n8ZrQ(SGOg|>?)pbhn4fGQnE zm4DMdJA=dFcDjjm5|iuovMHeZuo>!fG0Wp&i^S`eqvd#A;^fDn=0OX!JBjE|7ZYsz z6iX-6cJWXdyW{-XI@^k^=U;9HKUa&Z=kobJdxDecU_F1wqgR5{`?Q*3bP-d-^*%SR z^(%&VVguI+x0*L1=goXX;d{QSP(ln8hk`r7kN8D=mPkX4F~*rE!Jhc|_ZK+F=iuHA zY%cfb@*bUgcYv<+@91-ELbmpO-LhMcz#E`6Jc+g;$qvfZfnJ9u-x6X6 z;OzmdLi&Z}?m=?{%MDoFLUMy7=3}o6AhZ8MxuxuawHw5`CG7&y8&q}&gB>7n$1LfG zv*+r9yBY8*tK8{xvuB#}mrR3bRPZ|K6HS9!mIq;xhkD3^b@2qq3JxjTirnRF!+rY1 zSOu2a1uY9JzNPVo>m28FWXl&Oj2fE*JQ?$B2-p<54pB8HqAVcA1W))F`#J=;$A2%7 z5tecmmV-VdxTntw(Hl3t2lq(g7Hx?e9ap^v_DJ9s$q~&(!QYSoS_Am@ha01Ggt8#! z8mGO7wjdNWBCQe`B}_7U%q?VZae|AaWZC>6S`6JC4C z^cmbMiD#sxZgfrc8Q3d=iR5}#{m+u)|*W%c6{=$YUH+^t-0we*snYk=2C zY>mM+%V(xXU#|h_lIof5nT2b-$6%-7X7%L~`6J+KOtvw1b@uY+68a;=TSB(3@lx#> z?iuSNySdNRJg-um^)guJ7BMHrm7nM`thW!U4$x;F+@gtD5tAf3aYRZ@LSzBmg8Eai zr)2sPbQKC~7g_U|$R3Qse?y#)F?TcOV>sIwfH{8n5cw@Yr4h3wX<2f30r%RMvH_8IHZ_Jcuqp!vc zt|8hQ>3RuHibGNE>;{pKsN&Z;A2}(q-XmdaPzYk8ieoj>0@c zy~CaDaAI8A;S-75Sw=#}O0}1#XzWzgWmZnN=gINYcyE! ztM|~DLg8o>4%^>~f_(@zIqG&(MGFjR+FV5jm-WX93?{Sb9H!Qaj*=GJ?N1OWG##(4 z{R=yF#ok9cw(TbCw}@o6+76Sa3@tk?uMZrzzfUzTZnZo1v)wOS-+e(?Y&?&*$6~lX z){_TXxp6t(=VvwnS1??dZr7eA7B4wwFT5|GJ;!Le-WK1JwO#M)7hv1&57n)3xPfll zJ~v-*yq~8Ba=bj=hmD1!w8Jr}hNDvT2gR#*ikI#bu3gAnx)C^Z!!h3)m!~&>X7%P? z8a{bF+Pl4ujLl4*$HZ^8X=qrAtx}D1*(ezL3)>D342=p3wPnSMcm_jBgaidyrHisW4r11d0avKc_VhU#gcC-aI%PMs+dzL zzdfu_p-So-Q4q%A&u!M*0#!P2-jtVTCHyIWIXn+n=ewBQ!5WJ`q zr#|E;W=isBt@qo1RAG`-V4kl8r1y+3CE#4|<#NX^fJ#;|ibUiI2uvH=ZwRR0xT>>! zEWlClB{?5Ru(jBrS%Eid&73kA(7%*cc20tjR6bdno5#r_@fHnFEffS!as)9`O!{qg zKCOq+ZJ^>|R~4!^46FrGk|#_Fv<^^QN$tU%+X^?P8-<|u71-0we7E$1cAOOAq^vth z*C$a!hEoxGbmffC!V;G-pd!rk%Ot|-l4^ltYvGt}erSj?G7x+Xj3~aNSOwPkKZ+&sSN2yt?l&4fM9O6cx;zg3iL0E*yJQ>U=|rGb5F>fRrslNza)7;Nq24 z3mYM1@d0q?jxK^q@JMKs7#4>mUz|c)1@ri7t{$yO@Ti+>Vn7++kUt(-Xb?F%UYLUN zXeefaTfrEdp3b*2SW(VG(Mq051XckQgt}Nr@WwEE^Z}365;Etw8klp3ntPgG_dMi` z7p;gcEyo}^7|E2E)A=%3rP3KKDZe5Fw2M1R{=mRGUJL`?-@!ax_tO@V_2pO|8|jv4 z67&|b%rC#n{ys2*!Jq@Zx6Rd63M)9qcDX_zd?HV!xN;&R@F@`qMQXod>rv!=zoKGb z!FAXI^17Xbl-}Hh;og#S{9=U;VJZR1R~Vd7e0Ri+a{xS80=$)g`*$AVllzQzFbVhv zylf<5@1b=Y(d16>DQbZ0R9Z4cf=T}25MunMgNg$<92Uv|5FMP#B$UcUJkG@RHeYb! zqTuTBbk&Kv*_8G5N#EQTJYWc=H&O@QRIoo5t7JSpe_jG*)3(rtD!Yr_uQ2Lh`n*w7s!hJYS< zPO40l&VY>00L;`I4PRQ&T=W%z;CJ4@It2UO#?VI8jdL*I&+?Xn_Z5~8Kl}X6Z(!>l zu`x8XFqnwjuk=Xbjd*(}AImp`XeH4M9d8>+a_r7X$crxL6%dqrZ=)KGB4^d<%kuX? zjmZ4N;;j0S^|z2f70kf~rf;MZTl^DDkJ;82;rJH(to(&I?dxwe2fH$qGwk2X_E|9X zj}SxYF!cxZ>Fxcg$J;{EUCXpDcJ*YNJ437r#Bw9N7k|Yq42$}|0FJrqC%=3zr?3Ak zW-_NW{`n&ef2AP2yj9=5C5HpAl4{t`19OeVzJAoh>sse!T18$4j-ss;NzuE;v(DDf z1N?!7&b4+`JIw3W4rN&Da1v&Dbj#YgiNPMS1fL$5c!fy?Diei<6LYaFT=KEFbg?9I zj&PoHF71-BUg%nRu*6{5IZ{$@E{z!^S~_p8j9HS8Ik%b_IQmuo3AkF*U_az%>i-L= zDde85m+IIz+MHY)AOPHg9EY=n4+GPjHY`6exo?djTt+wyt1N3Z7uZ_J;B@tGz;?M% z=2HKBfNr@E(0RNXnhn|Eis2N@T(S(XTQ4c%p~j@4dszn-cs;Ea(x5}CiB&{o|52LW zE@jIEPtZJq6DT0!4R+de-jS)jwP5Rluwx+_~wt{fWdX0(`v z@UTc{anIq&z&y9!IaghqyEzgD-FbkZ?|^3+17EmjhP%8wk392TzUNEuxko+Eiqt;% zg+=o&%2StSb=fF*ZEH7cx&7{Q5wXH(Ie>(uFeTACBE&PTktFgR(H7f*AlYo?4_+ zs*0fz!{k?Wg%Dw(sxm~W0+Hmqlggs7%FRuMBU6S1;h8_-Fv|?McC|*_F)oVVi?tDd z%gc?$a`*4UKe6RA)YSvzG22Z3I;-XRHWXOX(ZS-udlx58mO5#xB9O~gp`(+_VV7Co zFx|;TklpX|h6A+@4h__cY>>TEfwDf{y--L~W2tu;-Hu)AqD8qljjFE^eHS&xcQsn` zuI%diDQ-rh!5tet?f=tYp5ai90_N`GMK)OGdeH}E1Ki}hVV|0rN0c^q49d@`l3HU& zU4*7^NBrvKVino|$xPwa5NR9qTUhG(idLp8 zv%zWxCIa$rG(QKbIy|!W^4%=2_&x?21i4#bs;Ys|F~u>MnC1N)u3eikouu9p06nfe zJbeg4GxMje)6z$oNXiQdXD3fQG;P}U@s9ZDqQLB_%1URi@&CFjf;A5-;`^SeN7U$B zvsY{f?IG^qT1GkqG!rK;wY(6Nzz|@*dT!*~>ZU`&rH)};$b{|OBMu1$H8XW<81)j8EjSVg02F=?nC+lN$ICQ;{j=41!nFctkQI&T7&Qi3vuw;f%wJo!Quwk zuI|&W{u&*_S>;IXP{;J| z=EjBwele<6Cl5HYhr1-;Fs6SRLkb!Uv>>kqmbB8S8cmWvqV&DqA`j#+>Y zLp%D!Jg`xuVQHnauG)tYt$hyJuFi;-6Q;HYFF{N<*WMs7lk|1p-2c)K%cGAy^UPrV z#&%ED4UkK+KxHjo$CnmI*Xm?DIC;wvPI_hxj3L*#(EbQe4$91K2LJ*7ql>V39(WTVa0{ZoGzMn!GA*#~7h4Q<6Ar4AP!$jc*q(bVz(9HoB1hC}z>2Ov5w!e!vvE+<wc~Ke>1~T| zH72wV+kqg)A>4z%vkUtOWs%=juZR-8*IM;TynqQ!{w;Y^2zJLI+*{f!Axj}3ne15P zU9O%H*{DfSJ#1F`$PsA@rUCz!MNylGm()5YH%50qySU`nPxCeH^mBBi3D+j5CE4a; z9djKsC|8Jh0-gQEE#7O4 z$naV&v3smIb}W|Nj3^q#=~~vw+>aA5*UB8EdSvwic3qsWs8`BTf-b#SoI(VXI$0b= zF}q1zlMJMYt$4PGuBdT=!#hxVbdx&ZO`Q^JinQM265yHTLoRVDTA8w(sDV8}3n#4#S^jk*dZ*c?D-^`u2OA_|s z=l%8VksP!N=tI!=!iirn!k^pB9vTz+~s5$tPus%JGLTn&YbT;0xeMJTrc|>BI;UErT*e!X08yL|?$i{Q@OH zg$s%7A3={67U*0wv80RhfHh%9@;KU%k%xrOwCSLT7;w6-*xeh36p0@2bON=E2tMny zP1ii9VDA!x^rImeP9*2U?2qs-yN$SCz(Oz;!dShK-K!gOWtdW#`We=Qr!K!%v1|$r z1aB2q;j=)U0^Ru89>J&rBkMWm^ZJklRf@AV8 zXp`t1H>9+0X?W!Z@lUDvpek3z=s_U^D}(UzT-^lVIsr(HygdQc-hg80g)Kv?TK1g1 z?BkR}E_gr-17kt9guxbr8ufuML&TOClggC_fu`PjgG1rtg1>R{{N9k*Kg9H-3FK8m z_;~>M2LfvpvMOHT|xzz;P|_s;P!U_37`HVg!u$S=yO2sdt>59J{CC% z*>m%6qxf});VwD@Ccn)K2eIn5@cB)^{YJMN=?AB)M%K3P2e1u%`_u*e&BFco4e$NA zBhc`Ls2wO}4?){c(gvKm``;eEV}FtC1EHmVEB9i)vne_X7TXqJeInpDA|akGT>=M? zM@#Yw6n8g)nU8}m;AoepG`>~84bqt1hczDy0W73Ay`IPK)q7UydL!uD%f@HSzP-V% zQB|e;t?a}y&to{V#v~udRurfp;)sSSNFoM^PO7LAM5t6d6vMV=k=K91EQDpB#{(=E z5fhFgt;M>M$Z)wu?-sc&UR}NDtpSWlPXy7!gGBW zGY397FG%E(Ng#P(bLn%{44<87&15xX4Wy$T*2Z;~rfA!(?GObe6_to4Pz&PfZKxuX z_sB zi%vm}n$lDDF&y8(a1KRzj9{M~8Z9U1gyT7K8{~bV+|SQSYu13>4B%m3#5HZq@8y(C ztLbSSgSFnBCcke;j^KDcA)t2#A)vcLQe+m!#v+9qh#XOe&q6j|l*Ekl1Yu*{g2Q-1 z?gToG;uP~0uBOvQGR>Qurf+Rihg8hma=H1WkdWMYDRb_rA5Welb>nkp zk#T>^R}#*Z$iI}zp5NX!bsru$@LSssWwaj|Cvph#SJdxW-pDP`BsoDzy0O%654MNN zzaH==KdRS(wIwu_X%FJy6R8f)T{+^M4=Y{;pIWqK0(ny3uG+o#xVptfk6qv8yVLyG z>gh|aTu9>ouW$DDH3-i+eVMyEWq4E<%$)OXHU*4m zpAe*$asFhA(5Cz|nXoC`dRg~O;aV)3pCzBGb1D%MLWr{!&#n;o9D&&A>{&1$(f+8a zO?Qck;5qpK`i_krNRtQQ`y2OC$RJk;2$cGQP}masuTiJOsM9c<271uV&HZ7<0(bie zDY4g42BQ~*qZ!-O6>5qWgC@IVWKy0DLRh02-F`i(rUYSq4VlE@IkcEEY`XBF*~W;S z6;;AZ)2H`GT>OjVi7(#Jw)wchs21|ykN%_n+N0USmwsS|x*uodeQ2`N8^hJ4x=He&jWdj!?3 zdzJXh)c7;W2OKleNO4n)Mmg?pwiSR02 z#=8-5q8Vo-&%sjr5?XP5wfAY(?(kL55m|e=F^(^ZlB_hWr9m&U?(XpACQ)DuF znKYz90`(bJs+DV&tmZZhOGsC9<<_c^^Z1=jnqf?wl-p;(a)G<)lP0X0%y+ztJ{5>0 z<&@>T5|WbkAs(q?JbE9X0S&R7d;6I@t(o*t3|xF{TgOu*s%F=aN-xUoM8M#F0uV3G zoY6a3RxO7bHXfV6;?4BvNF8mbW!hAp0$73Lc$roLZe|kpM9#16hP1e0L<=>FTv@PY z!Uap&1Jej8zUv|1)yWIvlBRUw|5BqH#YAz4ZUs=|gEw-;)aIGd|UZPzs zr#)~7T@r&Q%_@nwY}MD*YOOPg4W2ZZ+&&zC8mI!vG^j72bn?)`A9gBOER_nP<|%Zd zDJV{_2)%|6i?wqU4XGv44XUImrqxZfx1VrFyXRxEi14D<*G<%x8g-tli+ zICU=6)Ss0AF4~lU$p|EV=2>K(i6t5{4ol9Eb}Zl6Z<)kKs|Xo1&@!nmxY0Bw1^h`| z60UvLO8DAsd_~p^wab)yei|FDUbu;oo0=K3nJLC{lBij{kQA3&FXb#NuvH0&sPKFg zjr=)DmQ-BC`D8s_&h%ET=QBM0F5F+ff~4B>t(IFMI%R|oZJgD9iXsK>rmdSy$znw8B zsI)nb7qt0X&E#jQ+2UBtb0R&DaFX5Raxpl$9zBM6JFvxIJq|VONri35jGPkJ+RC<0 zMpWu7w?aRq>dgD>ou!zhK9T0Sgf}~5r0^C!o+G5v@I%mwL3F&?f;!yhe@hTzO-VS$ zXp>KZT>EEsY@xFbKgU)(*1A;Q6W-&z&8uyHTgl$9yc<7J@NO4*KC#aqcW&-L@09518Y-^8|uZ^w<_8?Z|)U#ri1U&dQK4y|2JBl&9EfrD-18A*nAsS_T{Z3XGs$x=r}NpX~sT04FfUgI*XeT1Bh_+MB{$h`gubOqY$4RfkE zo+`(zhs&?gbXue#A-m0Ngp}i49vV+Ze!<6boZM6XU=I@PAV0E;{kS`m+wiS^J3cOr zX=@dsNw0IfIL`9J}hPJv@`%JcVlI5zQaCJZYa>uH_8qY206W4ge4gDHEn*}LyitUdK=hgI?& zl>-Bg!hT(^;?LwWbN3(L;-0yhg%OeA;xnJ;rXg(~xet_gf#pq5ar#)lwmp zHQ`n^*YIe0sO%>4I0EJd+>AYVdtAMn8?w=n43`jydeCel#>vd$hYszqtfBo!E~)G% z+2blEBs$`@#OHLljM(%b(_>b&G_kxKvEq_tj|Q<0MWwL9E7*e?WEeC!8M2xE@m=JX zLJ~6e88|S>W!cS6!EJgB4{4`hM^2}PD%U*)qRSH-k8@U^WB-l|wGL@x-`(3Yj+?4A zud70oFgD)rt5C68y{@BjD>Pe*2;8ITEXI7bUDSl{HBUj++FCxg13WM^UV`GT#jcy_ zR9z1U8Y>Y0A-{qZ*bTQJpr>K>~i^aBV$B9e-e(uhHT8re#=y2z+-g{n?D!O zy48G@X0Gy58O_36oBb-&>03-(yX;qaDlyS9{zRwxu$C`~yC(7KZ_K?)@^Ou$0sXgQ z{X{}7nGIDNB^fyBUA$ zwZYbzx@MJUtXYT#P+Y>7pkvio=o!fH_IB=3L1n)pw2fI+5IHswl4uW4jEsmrZ}kV! z#83UXr|5<9D6>HxM{;WF2mPie^*Z9EmeQr2l#QmY#3+=G`DM7IG;XV}s!@CVuu!>F zulk_LRnL_@4;nOIxmdl7)Y`+(CrEczNO&pd0oqDMydy=wO;d&b+GtV+3j}5(!FIeVkgTr?n#iw%kXX;;qYvAoiu}YN#6{MzwwO6;dDoIQ-nmL6` z$#D45k3}x)@iq5NzOCP@q><3EW4AlO9F!x*CFjLBQJV@bizsKP;t$Tbl6nFAR`DPhN@MRifC4~W|4<5>uSn34R9)C$~$F#DqkhxO=r#x#0(R)5KWlU z<}8?Yr;hxFQ&=7JbNPqqpo0c?YAMW~Jg4a2B19Yjv4y671%$3er_HDSPr7-!o8tk< zec(&2a=4gcMLg98Xq(Oy|nU$z|3z6?u9eI`86_8 zQ!AH;hL0Yg{6pD&;ck6{2_y%9 z(o&oXVTTP5m7G(l!s_CoLhmgy9t|l5Z=efS@bD}TpiN-Y_=Z7J=ncQ2q%kV z!3s*DISB;=uPO>gr5F-%#n35vvN@33m(x>B@w8VwIK@CfOWN}~|rAGFE>Bd%ZKki;5 zRu#jLX_U2Fs`t%tW#lDA0nT5@H)(_?=jWVEM!al>Z`&6bFx=G+A_v2rie6S!nRZ7D z+=nd|?}ftxo(s*q~e(v=}qxRDTNFM9YnEP8mYr#x#ME?dW5O91MC3#y|n#%DOc!O{gY zTa&DunzwQSS!jw=E6spH>Mb;j(wVct>~(G-+<*!<<3;1FBpy}AXkv<>IhJ8(YXh<} z)I@hjQz~^fed{KMP3xs#1!k!1hqMiY$=&<)43#blpo3I|m=9EjGb}13qe(Xs%qE=< z+aPI#Y=m$^YQpb@ugs;wtA`lYS+sJhvklX2GOyD1HTemfDc9VanN@KsJJ;!@D&nY| z8=*PPsFk!7jxHrEXCi(R+qs5j_^%hJ()V3BL{VWLi`~J)TPPvE)L-G`OyoOat z@`U8;jjtsnEX8PH`TjmQuEimWotI4^v%*++4=zS?1SAxp2Fx~!56HCheWQ2Ke%YcK zU6;MGRj=Ms zono6ZNi9TE#ScNgRPD?{JYphhI`R}-sklO!!EL5Hg)&2B7{Q{3MaoGwGBr2FtgLCu zWj4Z0b+g9j?tYPgJYp9Hgi*#|bWfNvK!$1W~U=e|5 zz5JX-XVo&iOdz5Fp?Tm_?ubE4{|DDTJvTvi`5xP+x5j581Ol}G(Gv=(!-a<8;0>`5 z)esXB-%=q9wO5&)N&oVn$E%&*S(az_;|*mV;+y)zevo38>YInJo?o+Z8xDUl4w1fH zsQYu`O1lNQ=q*6@x{PJhXoNW9 zWw2Gnj*g60Zd|?gbYl*ejkp(UYbeY(U4}U?Laus~w!Y3sPC(2a*Lu5MQq5S)l7M2o zV6rFynQfEEBTh$(aS4XwS%OY2IxuTyD&HfrWx@TUIIp)1zFftD(2)wE zH<{P?K;{-HH&mE3Ygw;BNS#30UpD0563H1lwsnhQH(E5BgboA|E*exq1?s7j(9Eeq z841uz64NR2S3%eJl!P}=TtcTKX>@OyJB}v&^a$L-qk*oSD@Xel8tFdsip$^tpeBhL3o);!QqNpNOYzE+!-DBS7hE`_T}FZ_0sM_9mSEn6(FwbL*MQz012} zRk*wFMF?x6d9xF$g4AR3TcTOy#!Dopa>|vxhO^2bK^d{kGuQ+-uvy&nVB;) z=gxe%$^H9zIh<7;QIMd%+?uT%Qak4k>YMeH>=0PFJfJnl!6n-N%q54ApNrA|*12@k z1DvKfPf^y!^J!VB*q(OQI1Ce}?8(uuRkNA3#MU058`#Z9o)~G%{FLCB$4XNSuOz## zV;lZkZYR4GS6-foVph2CTo3Rq#!duZux>$wgqX^?s2g<)v-HdXxgVwM#tKXi;2*~& ztarjQOnjABV-YfBkJ+(PYH3kjJf{hV36YJ%ard6}wA``}Mi_RLPTCK=vpf}7I(v=C zbm(>7lA+UR-l|#r<5L>c7OwDVplIjQPj6XX%6{Km8$^yTRfaxe2pfVsN#1I z6~4Bg@{)h`@WNjH(*%Y@ll;U7-OFT_D#Lq6fzpY0oERe}m%H93_p0pIP=0@U_NaE# zJuWjc)!?@w_o+{0st(-qsxYJsx+pD>sBj~*~Y2nc(nSVg3&TVWlYSq{9n#WO!6e+-P3 zc=U9?-byAuuaS%vGp&@JeB!unP-3>y13ZdgK ztE^fb!KO5K@q=aKtGtflA#&yMmbv|O_aa^_R~%Sk92rF?FtJ-xhdTmN@5`^f+IRAZ zcgl((rm38uY~xSiAX0a&VZy%6<`8RECDy#SN6#O!zv_(jfQcnB!#jnd2p26fW_oXI zC?{<{rbQ*e1am|L!4lzK##$7VX45jRY_7-mq_Wme*;Kb$_Y94%akGPC*w|fT(r$kf zVGS0P*dO4Mt}iw$69ay`pm^tPXI+LkoK%Le+g&}eU>Tb0$u8#eAEct+ zwX1I8-;u@a-^wt^Dsf3anzJjU*ciKZY0CDydaseRY=aYVK1oa!0vm8EQD1%Jqs}sv z4>P?x^}gAgIvLAS-MFhWC{Q`#QjH*tBgT}VPFjJ|K~v?5!QWz7!oIT{8G;CjUWAvX z?y6-Q?$GcHBW7is=v0-?k%}}5VqB7OUPjWqKp@_8GS-yD>rCRC;3U5Cn6Vp~S^EE3AFL)s7DrvgOQ>f$ur=g}R(owtjWiz%- zrKDZmvTJgt`fB}g$4A0$qg=0fqA)=YOITm(#5V4Cn`>(R>|FGr6FIXQtz%I`t~;(= z5s`WIDGB7M4qMYs3&m8qPlwt+NlwvY*_vnUU4JhL+VhMxi(GVJUtii&X_gQ^Pn+_L zL;JGMZvXEJUfJpQqKHZ=x+dl+4fbUF8y8e_>#gKg5#yLm8nRniCOy~gaGx}DC; z5IhzBHQnAfD_FK#TZCHmMc$Be+9}kVsj|V}9Qik@6pMLg4T5NEr8Xqjv$-)$Mk)YR|j(r4Sd-o z{`{Itj+K`@)4^v5y*14}nGkswQTpV{Jsij5@b36nv4dmsDK#@E!F|#1Hfti8e9f1g z>B9CH2?531HmSjCqOfD-(y{$Dxhp{oMH5bQ^E7N}_9GWGm+Z<06R7XWOc9Sq&rQp1 zTQn$>HEZEC;UN z&|^YgdgfLKjNe~$e}BKtRc61Aw<%sEv{7-UX}2@Joc58yWrOd6zaLP`Dyz2t&}6`i zK5MTUiwf0=e;QJ%kilzm5oe096xKeYme$w$z)dZ~v-gRfeBlTIju1>g8QcJ2BtnmM zsc)L@xqNgl&*ckfgP(iq&qO@Q?MJv{Q*1L=xqLj}-A1h0)2_8y!vU((J^O@><8^D;m1D zr+(lt6eCWl=rqqFzK|9#pA-Z1Q6;$aQP1mTw8 zRkXZ^iV~01c%5({i%@H(oLf*z0uLK*>B-+$FZ2j0g#BEet1cV${cb55a?WWf z!G+;ov)V9o6Z0ZmP8sBc9b~M=>mI3m)K2m8=zYxKWJoTh6n$|8R;J5&UroF^sXrCB-oS^r{WRV{iTawdt`bAvPDm4ORjOiL&6D-c~-`iXm?p zlVi)&HrL|KG*(=4LPT6|TRqS!WE;3eGC$FPNYP#_(rG{ zW=7j`4MSH4F9zT`orkjcf0R*S^Eh;Q2F=XMFC3K6nH4He@S#?24-PwPQ0uqGG8*28NoQl+8an=kTD2S7=Y8oISb35XQur4o)TZoIFj<7$5VFq2_9>zw)*NN@l{ghu5$Ls zq&%;UYpFeV8e+57EaBOB_3)DJ+1jGeM3EIE#e<2)qtiNf1tfGBxk9FHhevtl1RO+9 z`IR$B!Ah@Y*BcAh$;eEb-e-;d-Z{4cAxEDo3m@eJC)aX^ZVD>~@+?HRAZs7Cba%-6 zKZ=;HusECfphEuMy%UA}#Mr~(=v(o{lzlsmqK9!evSnPvet)iH-{qmx5FoSutQnOh z5H+G`6m+*M9_)SwbC4 zD)-Lh)9YUN;S|r4VAy(n&GR-YgHX|ioHj3q(5xb=gP1}z{sb0SV|snjNHPEJpkLID zSR{XmxmmIx6)i{F_s_4a7ef7xVHEsP`l#;0CyOV!28V8+y|{bvHmTwEy{==%Xy@@q z0q<^HYG@cflFU5Z&$-c^!^<(?@j7EzOh>?0k6)s1w^R-7a&mV;&4^{ujS=#* z-2z4I_Hq9G5viXOC&|+De1SJGYcsXnrEKd^w>8kSDZGXG=AzKXjCwP^`H7}Ms8tNr{m(nc z$3k6nwS&r?Uvh?S5ZxNud&TCykDU-4hp_vP`OH`i%_MRoU8~K)u3P)j`X?`kz4`E9 zGX~Fd$#*ue;8Vl-m-Vwge3y96?4@EksA4Na!OIdUus4D5ai=RCSv17c@xVy|N zP}ur)`o}^U)1gE6;9|%tQZweKw}sCOWQ&&gR%bd6sW~UMt$UD$sY-A!(Km>|RV}{P z6B=C{5KGrJHqB4azE*rixV(+5#xwCtjoOEAm6DW6qIVXw^sl-l6s1L8x%lN`O%3** zLt>?*ZUS^I=;H}y&BSX;Jg0yL!+7QxXKCPcS|VXxD$(gV6`%fTo*FYF_lISX^ggOu zn(is7*=!5C^{Zu3A|p0bOh-v#2P`tXk?~(%mg6qFdz&v#!wmUcI2L=qWox{U*Nt<~ z?4H#!s-f`P_RNkubIjgRGA^&K4?erf$`Z56%bzfD-JN|an2%FU+A^%}H-({|MopcU z2~WfoAF3B#Tvm^|{8Ejb`)m;{N^VNS6)SDWW0B# zx1cv>(O%R)9mlGYTyyni*j0*YeSt@B%I=+x(brI^%$WikM}9n|p{khwU?8{WT$hk0 z&$mZ+kxfG^ZC0v9UlU3u^2TXcrrP_P)kHyjyf<+cMbX*U-1?GhO*&l?wV3%C{S~I&r{(z?J(O}WawY95{dYM=x`ZY6H1KU$zvn`@ z5kBq*ne&@R9&7QnT+(eJmMNu4{3`b1ZudDlej}>190j1Jz0%`S!bQXb?FE^d9Z$>W zYDA&x&Mh%Ei&4(a+^%r5#T8vg!F?(89ccBP{FGN-GGyMr$Mkj#dEQiB*j(4~4r5Tb z*~1PsrrstgRq9>VUN>mn1@B3US}6VT9X+&K+k+g@f!DQ55ZTmwE>u3@K`D5`z!3Q#e1 zw4bUtrBqYcdyb5zEfkEQ(eth|R%9;^ibk7hh521Lei#$Z%X4uKPJXft%zjqXl`l9i z=-}`1eon5b|KQiVu zxz^i=y*j7E#EY8Z_gbQc^;y2<-V*Q>5H}g9S)+OEQZhOp6fV(YKnSkblHVfrg??Yu)!7f;A1@Mlozdt+b-^e$}znE_%_L_nX*2*2@3NSdLBqSx^FbM#xhIUo4!Pwb*fRGSC3I)Re$eJp^PQzHqIomnfkVu=PFyw#2-bBU4 z;bI5`7%2e~g+bwBNH7u%0|8J_2{9O83W9(EPALQ|2_qrkNM-;{%?1kkiCZJl;f&UPT7 zKg|H4t|tk>>O?9cm_)rZB;oE%kq9sf1Q7?B!eB5lFi;B;Ob&`fib;@afC2%WR#S0t zaWP3rC`1wkfNsuI<4EO>-uplVFmi=p2;LH^ae^%u2hE>MlA^6YyK>m+VS#WK2!{hfnum6p!B(LO-;( zB9R5`0`I+)uCsPPuOp3uJQi`}&o0bB1gW2q$x9@oU7Q@=noZf7Qo1dwRSb3M_d>APTJn z#uo~9If8kiMdU^CDwo;#B9!y=cvXwybrKVnGz6{nzGN`!ti{uDM%?a_eE*rjQ(7wy z8k=P3l0Ld_%K%NjJSObJG&g=xTs0>A4BPX5cPwt{}i18 zLM^FX{^~MOl|LtrH5%x9peF%Nj?bDT9cEfqD6N88C+c@Bfg&pg@2AO$I