From 99b762328e148dc9958e06d84af96c4542332194 Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 11:24:26 -0500 Subject: [PATCH 01/11] #1 Community artifacts --- .github/CODEOWNERS | 3 + .github/ISSUE_TEMPLATE/bug_report.md | 38 ++ .../ISSUE_TEMPLATE/documentation_request.md | 26 ++ .github/ISSUE_TEMPLATE/feature_request.md | 17 + .github/dependabot.yml | 13 + ...orporate-contributor-license-agreement.pdf | Bin 0 -> 59801 bytes ...dividual-contributor-license-agreement.pdf | Bin 0 -> 70004 bytes ...-dependabot-request-to-project-t-comm.yaml | 24 ++ .../add-issue-to-project-t-comm.yaml | 21 + .github/workflows/add-triage-label.yaml | 19 + .github/workflows/go-proxy-pull.yaml | 22 ++ .github/workflows/go-test.yaml | 23 ++ .github/workflows/identify-customer.yaml | 21 + .gitignore | 1 + .project | 4 + CHANGELOG.md | 29 ++ CODE_OF_CONDUCT.md | 46 +++ CONTRIBUTING.md | 124 ++++++ Makefile | 114 ++++++ PULL_REQUEST_TEMPLATE.md | 13 + docs/README.md | 5 + docs/errors.md | 1 + main.go | 363 ++++++++++++++++++ main_test.go | 12 + 24 files changed, 939 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/documentation_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/dependabot.yml create mode 100644 .github/senzing-corporate-contributor-license-agreement.pdf create mode 100644 .github/senzing-individual-contributor-license-agreement.pdf create mode 100644 .github/workflows/add-dependabot-request-to-project-t-comm.yaml create mode 100644 .github/workflows/add-issue-to-project-t-comm.yaml create mode 100644 .github/workflows/add-triage-label.yaml create mode 100644 .github/workflows/go-proxy-pull.yaml create mode 100644 .github/workflows/go-test.yaml create mode 100644 .github/workflows/identify-customer.yaml create mode 100644 .project create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Makefile create mode 100644 PULL_REQUEST_TEMPLATE.md create mode 100644 docs/README.md create mode 100644 docs/errors.md create mode 100644 main.go create mode 100644 main_test.go diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..50c112b --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +# Default code owner + +* @Senzing/go-developers diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..d3a80d7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] + +**Smartphone (please complete the following information):** + +- Device: [e.g. iPhone6] +- OS: [e.g. iOS8.1] +- Browser [e.g. stock browser, safari] +- Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/documentation_request.md b/.github/ISSUE_TEMPLATE/documentation_request.md new file mode 100644 index 0000000..c18a3fa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation_request.md @@ -0,0 +1,26 @@ +--- +name: Documentation request +about: Identify an area for improvement in documentation + +--- + +**What is the URL of the documentation?** + +- **Example:** https://github.com/Senzing/template-docker#external-database + - *Note:* This URL includes the web page and the section of the documentation. + +**What can be improved?** + +A clear and concise description of what can be improved. +Examples: + +- "I don't understand where the ${XYZ} variable is set." +- "There seems to be a step missing between 'X' and 'Z'. I don't know how to get to 'Z'." +- "When I run `command sub-command ...` I get the following error:" +- "I don't know what is meant by 'gerble barb gazoink` in the instructions". + +**Additional context** + +Add any other context or screenshots to help describe the documentation improvement. +If you think the documentation improvement is operating system specific, +please indicate which operating system is being used. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..066b2d9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..e2a98a1 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + - package-ecosystem: gomod + directory: / + schedule: + interval: daily diff --git a/.github/senzing-corporate-contributor-license-agreement.pdf b/.github/senzing-corporate-contributor-license-agreement.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dac5edb0fc9ac291d4e33810f8f843602b5d300c GIT binary patch literal 59801 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%0A?Oe#Q^D*1RZFgLQMVsB$o#K_83 zc*+0SHgo3Eoh-w+1!QceS|xi&g3AZ3d7;`MOm#Ef)647Q*Xx7}hn*!1&msHSs$XoD zeo|9ZaE}(^iUA*~Qa^ee?#Fz)Yg}0T^h?9qUxcA1w;d*2OvyHKrBN(1%B_%%$$4{4 z!XR3m$dEoYGuB&wPpI7%JGS9dGj98m8YH-!$WEqep)Om_1trILwT_MKouFqGQAJ4d<#v&UqGR%2Bs4 zOEgt`0)%*uut)CEV}<>X*~XU|d${g~@oy%tk~Y9GF1Ri}InU&9H#@JDPtEDQ&0WT; zvcg6?%?h?3qkCPSUkuFg2zNDJ!Z0rQ?m9U54ZB>@5+JoEq~+l!u8^5967vl6mj*s# zLs=rED%i)iM{v>5S;o<;V>Lr&Odf4a*YS2;u)DMgmr7--U~hsf&2vdanZ}8 z|0eJw4%s@aS}lbMl+y*ZEu-y$hOwVvdbp|Fr%~_m#vn^Be||NJ;w3yg660V;{}qd; z*H;IO{Mc9Q{8t6JdX`YD;s*QkIJH+&)E7y7GVEO@7g(oKd{WQrp?C-Y9H$`x369y| zoYs=o3YXl;&s)f)L2S>Tefjab(#^0Sg9`I!wUUE59!mwaM?u$V@n(3z%ESY= zn7-MH`zyMD?K}%a-TUJThfUJfCt?-F1zwT~i7g?vX06FP7BQ;$aCw7WV_w~C^c&^b z9Si}U`jnDQ(}>AYT`1d#-*%WbBx@;mGyPJU0n1o1o$i7G-jTi1`EZPx3EFWys+0V{ zQm7Ctd>+*j3gMAU`sKDe6w7dtF^xW05Xsb>nYD*U*TK^iZN zR0??Gs%m11A;p*qpSlM=+uU9_ysXczdpxMseThGjR+PJ%?`F^E8qBEtla~UWWl;9>S^2d zOxw1nZQHhO+wN)Bv~AnA?P}Yc?lRd zlYC0{pT~KiQ`L}7Vm*}ZO7sF)?49vsZAz2*m}bhG&r@htKah7eTJ4iI+&rwAkZH=k zjX~aFcgyFci(9Z&<*}^7FAvxmKG&xgb*QRWRQFBVkTWO301Ewo`}bPt z((C4gNN2y?c2^a~X8-iM>DFdau8GnkB1KEdhpMm;=*sj1*p>hsxK=<&`Ux zICf2O%!Yn~7ACNQ3>ZybFPK2Bg&u#wN6|lYMGfEjt<%dR2UHFF@K5>; zZ5#QgVM@zOGDz7=+Lz&%dzO=FgvOWUs-ZQhE)>3Bu0X{Lu-x_z3QMNZ$~_e}QpsCM zS*e|6EKZaKm-z=c|0zU2cjEUrqh=0KWr@o00;6#d;JoY^71t29s^p-d`)$Y_pDSB4 zB(W1x_X+X`rd!_NkXKmz))!@`>tV%3K{dhhGn=%biAaYb2^&^iS@>Cji=tDD!ZTb}_j-;Vm^ zmCP+f<8)saH!F67d-*j~JAX}v^xL~b0_0Wm%o~XHpmTHEuqfy!_$f1;5Lf0@YmKjZ zShk@=>q*a*pe3jmKA2R5G-`7v?u7>&wz=bXO}H*uE-J6XeJ*OBo535!tryv}llVa%0c|wYQ0WHc-f8Ys&I~PK9N^*7 zJY%{f|BL|=gd{SeYXzpr{EHUGc5ZyrczJG-OZloj;Z@u%bH4+u{UXqMyc0WOo64%n zDVIOM&r943r=@ZsGTg}4iryITACV7Zs*B9&H9IZ#f~MnMFP--nvT#e-7FT4e%BssN zBSa@Aq)5nyL__x!eliN|K6~C5du-C1SCfq7+BS@*(Kd`(%$_&mHc1(!q%=dAKfR*u zb%#*nXY+N$90yM*)_$Y}b%zj%vdG&f-`pRk6`VDu!D>~%iAj@fDRIpujem;GYp9*s z!@Z%sn}Po+a9InYFTDPRa`8klEb5gjQPEFqEJlvpi}uNWoQd-ZetF+QW@e|=P*i0v zrb$J>j;j@1MT1~kWU^`?G9RHr%)!Yh<6NSgXwYVhFc5Px=`j+*!&yML2fMHMJ5k7X zLYGW5x`1W@lb@7@G+G_QWg$Er$vef~)2{5ZD7rfm(d+Wq@H z#hec$F0TWR^M)2~>SBW#thXQ7}iK6MB48OiUk-A7&0;+ zT?=id#FGP;#2PA^E!OcT2q+T)VvVH22Do@v4iToKz;A%14KWNSdgjPJ2;I|8K=wJ# z4=MB~%<}^_ZwhOtw42Pnu}rl1XNWoB)FfnY@Mcw``2=Yl)15{_HK< zT5&=|CxV|VBQi+nSIK3ms$`A$s|5ISMhK+bh@M`9;e|CXdIkkv&8fih_TT@4UdHM# zeSdF$_<^rJk%*2To{JeM82tR$1c?4PJOF2IIOR=zBGq9 z$Z~rtO#?WDe?OMeS0=D;@JPW=pWDu>p(s)j$8w_iPQ?UE4t=5sN)>a7Lg#>vz*Ws@drq& z*iX=wOcdGSebXmP+xWKQ(`XU0V17GC!Wxmnq?-UEdsF!(51?JuX1)-{8zXm10*mGS zGZrd)L2PHjTibEp8Xoi_lBypPqO$Kz)i|ZIE;VDWKOl#%`fTyAPS!5ewZ%Ae(|n7t zuyK@LzumY=17$mBqx!`6#Nnhj-L-V;>bJ|}$sh7G(R8`wp$W76$~sgrM;Q8)uSSp> z@w0%RT5_^#r94h)e}1ZK9w&o=$U2*2j#K|L-!YeWPGUb6Ef$~JNOd`Y4ZRjptzy)% zr}4QppIrX{ac#TN|AXliVu=TvjK)&&u3-@>;%80C&2PM1Ml}tv+yvH41HaZA6CrWesk4BM1N8+A-qYvrWnL7g z(B54?-YmJprjpVJLy26Gjn^u%YZMf#*jCJHiCSWcpROD<_tO-g3XKloNW{?Rp;%;u zb-IT-PN0&vG9vH?v`6M53AOl|+^lSERmoHYtHKUfZFO)&Mqmd%Chl;FCo)UIrSWpk zr+Msi8tPbCi%N?)I8*(eCgbq@I_rw-NNX%OU*DQ9$5z7Oy2xUucQFRAgk?*B4M4po zxVZ`3p=|4=^^33rOw)S*VoDXDUOg1t5&}ex?F%BmivGhS&l<;rI89h7q;KPrN<+Vc zESp#6`L6y`^jDkt%=XRA@cJ;S{T^f0R(I?&BGzG^`Kvmj{WmbhH-|e#G`1N1{lLDRBjnQLb0ePDVwZS4(_o39M{^Ly$;4L1>7cFQdeY^?h@BiPuSg@I zuD;%NEQ3{pUBydvyWpg?t2Hz&t5!#!nv!Kn**EJQxBqZ5J`E;&PR(3WYmnB@r>|;| zbERsXUa+!DGuNIm(N%MfM0=^qhDMC#SE%PzEiy?PT6HTk?SQEZ@zkr(YKBhDrD&XW~ z&eEKtAs?zl07AhD?e*sy&C`}_80yYQUXs}fV()@*ek12KWww^fq`+y6!tkJr%E)On zCbyp4<|5Vq#YNb%;aZQEsAL^dr|1@Flu+gNFpEJ&f27&7VJa?dT~@I^W<&NmsFo>D z>(F@X7)eZMiWa2^AcDr8MOxuMr#x4Cpyo{1BqatDZ87?8x2C&$YaUXkesx)`X(WNz?o8|TZq0%dps!3r5@ZK zaU8bbn5a8Qg6*`&d6l*>lTrwv8sjA~`j0YjkUTRefZwC3OW5{$roW|g1w^S^E|KqV zoMml{jUB-4#^J}KVwzYYokws)In@NXsXRYCBs}t=;LgI1<-tG>8ci2vh*lLFDASA2 zAF8T~k<-bWsj4-P99)j|w2Wv^|EA-(h4&5QXXI(|X{U^BQQv+TEol66_I6kQ_I7s% zNq$IDUNTbU^g9hJb!oxPOaIP?-Y{iRU!|q=6Z&gRTWYtyY;h!gm%Bc#no>v6=W~(f zw1^82jv=dkqKRb&dnz1&v8^kVh3@QT7;ExUG{_r@!dI>3N`ooON|U>kxRkX7XyTGi zegvJKW)qpH-a&C%IsOD~gWX3rq-}C98B)6pws%PJ>nym+7Z1&jU=>mj^qb;Y=G+EL zL?JrfK{9oC+YEt#ih3Ax@XJG#_uR7zf;Mp!kEuoT2$G9WyG65STnVQSJkYWFr7a_-`Vne z63*J*Xviz*T-Q&~=ItshyIv={=(Juacvjlt+uBjz+IN$;_iyLR&B9|CqpP^|c`C=d z_8c;=xHXq&po*NLEzjAID1x%zkaNDGIV#wWQT!qk>q?|ozDvtcPwlbu<9pb+@os;v z-;TzoUa@Xy%&R@Ba#DS=I5Qq1fLCA1G|%j)L^>f{xn#YDw|*oqIW>qw7h}6pQ4jZM zpe2>KTx@>}vyA;-pY1JY`@BL6fW zPfi;n@e%JR*7)E!OVZ3#!}f8G@J7k_U@%-locQGc9uq`8u%R^d+9&kTN3CQTlA55+ zD0-R}(q>WvZWW&;I?pWW{Dr<+QP*K(;@sb3VSPef_YWrmZMVOeqoJm*uV&!JRh^fe zuG0{+=~nI^cbku{-EP;*Tj(xUE`E2b#@+m9yH4|+f$QVr@Zy%8RYG?SwT-)RYT<(O zD^K89W(Ne(aw^uM5dv>q7gb2tm^iav4B<~D#bc4z{dc=u*be}g(b2YG?_2AlQ;Nk*{U7?5v!~stAyN+vQn4T8i&rlc5vkb{s-cCh~e3mzIEqO@L;-pg|mFG1g$)`MXBQ(o|Q;4t~CgF z@_r2!yu@vNT>Wa6aDOa@fsaOIym6Fy?y*9F`zRl^qI%2 zi8An$J3VEVx0c~fp3)Yh5DQTTq>gA=MVQ(ta7;Gj8Z{l)Cc6zWRT!JwK!Q*SP7|1}qi zl|Z6SOPu+L_cT|#~6JIv41@OhcclI-0( zHwVu2GM(-t(ClyY_6^^5sOa#E?I&iES>`_LIu42+LR@GieQ$_G5U;*FTJ>IJl`Yi7kQphHc z4F&&cpLFioq2GT;ymd3g`<)MR!kT)uyjVom_)tanycA)1Sb9Iv!%}%IR8!sbbmrZ<+Tg~gvvQO!2KIUgKnmJ7}iTU$%o!N*~@e!JrG7}wrhL&wT&I`6^Ue&09k;C2Z zKpfDnqQ-)hv^30()cSF&cd0D=8>?u9;H5_H-^`hL#q_@Hvsv=@uLE9LOu0x?4@aw% z+WD)E*$ci}J?zD)jn(Zh(~YCClUcjmR6C=s>Bc_3ywg+QL&P+u6Z^~nS@8al6T*1G zADTUeK7Ya@YWZsoF9b=pRqcEuG@eZM@lgPcq-VB|kIP=K*9NOzxx?^@xsNWs^1sQA zdxe>%Ai|xB$hyqsxCzKxR3sMr#reKuTGK4PwHz@5#! zB-S5SeFu~js8_dnY37tTS-!(L8x0N3WcyzNE-(%eAdV~#uN(@5a zwBrpBxYUNq{+YPSTP4l?{j_<)QlXirkC4fY%Fj_(BwIa?)I`a$-Jo3frhdwey+og^ zAC_Z|Q;z=Sy*j^7=p0KcvAs!Q(Sz%>fY}lr=&Ie~RLmi+;7|1IHr{b0?oJ>Mcq!SO z=2^6%^+r!w(X_#}RH}N|WziA~ex!Dvdc>vO>~GeM~FnR|7{zfA7{`&sr3iOS{S0-i5@!jgaoScjA`mPB!Ueo{^lI|mhakeTEo$`; z-m79o7G8E9Pev(LAAN8JVGChF>YpD*b+ir=DV&2@0pc;wQC`?y`L*(Cg0SQ@Xjk;S z=`tE#oJ0|^aAggZ6%|x1;2|Q%;Ke;cM98g!A!MixUVpkGkMMD#^C?bnwTJg-7pmFa zCgAh*p;Aqbov2Zy(2l1gVeM;tcNyBecJCC9P6`*$dg-k!xO6m?Q>cWq92;#4CfT@d zKR0Y*)6`W=^zr|)PXeT)tHTcWq=b(Ut!GQ6!#03VB+mIIeU>tAc?dTt-=x!M?6SG0#KHBBf!}~pcOdOa} zxj~}5hLO>rT8nc`TfI@3A$tUhb%&`#{`Chux-TiUf-5?A*l60oFpbUv?p4ANGYFIh zo7RRav~T`HRmX@m6}wM=h+IDb7lDFP!T}&)Fmrnx&;#nWc*H5UnA@+9b5BND$Sf&u zcU5@%%NN$aEHlU%U1BW*iT;Dq^A~2!_tvX%)8jc77l$fly263|(}IJj zXnA+#2l`dNCY;&3kApfP)$bj3_=0A|_xs!(50%*tBr4}(j|%l#*QXte?FIZ=A_w2X z*VWIu^PaWi%&%sGmamCt)mf#Aj3UG4rl+Rq`>o@5HHd4&4IkmY5+4DC&kfVbg>o`u zx4`r>#%vxb+;Y##UplW#!R>#z-O#5W6wf@Sk5uohz*{u$YWKX#_6Z*9tMtwYisXvI zD4PwkDM3h!7kj@o^?H7h_sMtf=>{z$nbP&PNP<6keBYfd2d$su8GjQSEfT}$y@Z~Q ziN=;=AN);3Tgq=zDCXX}t5nMB8^xy$v;0yIRj=7>)U0COA>_PVRK(2bxi8#p!1(h% z4kiyCV?>K6G~vkWt~H`}dd3q&{rmKeVR#oMLBRqsQDdYBcsC#aRN|Gt0~7)8-vt-J zHqO=1*lSx+`>EJ>DU{w2Pj7H0`)LS}5c}^{LeYnLOQk`t$<|=7&T%(v7LDaiBY@{G zU^9XM;F_-b9+OOe=S}qPd+c@3+p}sz!Do*ckw(W+AU0pg{U)rpu;pBe0*z~@V}MqB z`8ory@lbJfk#q-R@w1WOHRPB2oTrrF`Pd`6SFx80QW#akXft)c?asBs!I9uQTOpnC zlH^wFnhSM2T=cK=_S&dC|8l8`@q)UjacZIG>}6VAge}**xCvm~=0%S3@5ZTedW9o8 zA%%s2Z&4b3uXmeThQf{j8O5D6u`*n!?A?eWf zBP&ClNQr^ymMJ3#=ZfroXb1fcN6xVey6F1`K{f#$(DcOglRcIq>ZUP;F~5)TEaZx* zv?bwMsZ-t5bsXvC0q^U%WX8Ac`xiGy&gxSIv7IrOl4g!_$ASU}dmmY0zOF@cmRjn{ zYd(74#(8e?tKYf-1k-zjZFdS*l=wsHM=r{Y?b{#p}l~R7%ZrAWEvNW`JR2O$;XQ0q^Vj3 zLsq}Cdjj0!_&97DcsA#F#mkB~kr(&HLsifafH-uTd(vfa3rt44pHW3pv$e8cF@Eu% zvRzh!J?j1v46hH0zTtZF9TnWRzU*e+MJkj={QluRD?8UjHxWjm@|=8uK70M5-| zO)Ws$Gw1w3GrZ#tw6q%GNEmIiNohaM;rJApfICqx{j2nN*DKj;5x>%vC^8KCyF~_r zmr|3I^ruFsxl||xuF6nxNbuqT|BsC};0!e-H9Q8?k|;zeTwgz`7M4qcWK+4B(!~Jt zJUGQt`S^OKa!a6cQ4cE~u4*Tr$8vNQ|50R5c7xe4!DY{g*zV__51##aU8gZ){K7bL z{#Ud(S0sC2zW>q(Mo|%~`_8q6oudkf&t9TWuSMW+Aav zSi!mQqAo7zM-JQvZx(17n`3xTv3uED6T5B99$ zH%9ea+yiic_waZ)TRagJYV<>cgWu1FmoBXBHMl@EZ>E38U@AK_A`hUIWnG2&miDB5 zn9-K!PP5XI`*jj}pHp{w>7Rub-*$u{GLu`^+(FVpy!|QZ-PzBje=$7kcpN6&(9=WJ zwzgk!OsjRAOx4voKvZ@rg_x^E4zq;i!yVD~E4nSg0r!j9k2zF!$Rc-|bK~&)Tv^HH z-1OjBPOXU?7NCFS#DJm(CYKwg94#G&LVC|JcHdorpf#i;i*Bg9U7g8%X~fYrS7z>) zEaW2`Wz#`~%_(%3%ux77Qu0B|$c3-l*wwi9lX9QUY$-6(7)Rg6htEx{(v}m%s}&>( zt@4%VPd%+;%((sy881_GxIS-x6K>PvZXYleZOZ4?Ndk`T@1jL3>HM#~96% zf=r70Tw32B_UX@|^S++;DQ7mD&>MS*ur!h|K=2CNKi!{qQ{7XC+P>NoEw9a~@vp<< z2pH{k?Mxr(pxasiRoxMB4m_Bwpa7MXLL}~Dw$E(a18IKW-LWQ>Q3pq)g`}lySF0S( zZ%sz-4Im~4ESihS?wr2c*A~{2EhHXdOlynD$7F}59Sas1hH1^LG#_CW2aPhP5$j;A8emX6rjSU?Fql;V(0|&lWca!KqU3nIK z%7RT8^f~~5xi|0cWfdA9zdeyC;EhEpWzlJ{#ch(=;J39|&$ARSDceDZkyJ^er-_zV z&fH&GNI6P7vkb0kNXX>FDr3R?vDAj$r^&appi^}l!##XR#*gRl8Kf=8^Hwrv*`blt zxS!Ij{cA>FF!wHWgsq;@-R^e!+5uS91!{&2?+j)C>)i;v-0rIW%<>~hV0RZOVsCs1 z4RL$650CrhKT4E1@m3IcvzN^WG8HnlWA{x}|8RwUR$%ol%=&T~WqsoT%J|9JuM-PjXKVQ#`a~7ZGV{ti=@9)I}YQ9>Zm>@rTn(hGVGv zdm%Pr9C*yhN`>Bsj`f3utgMm)^rNS+CAf7PF6PW}c6Q;NJk_w54mxC`;GzgGLm`S>>vot>Z#IB=ziO%D&}>@N+H zS1KRd?Ny5y%-((ZughA0$3|~#%-zN4KmhuEJca7!XZThJtypL0OxKJ?T^*JePYv%* zxT05g4J7Q%G5MA{O1xl>`N%3deHf*D6>(jca=VLe`4Hfdxm?u`HZp$!$JoO7jKQsG zeM!Cvak8YBOd6SGc6(=4WM+52pW9undVU)5vl+#~<{wYC8|(oIv7FrsDXQo&wRXu(w_B}7&Ql~ZNugC7ooNV`; z>(=dO{9kv9%jp+1v9A~_G=ye&GoOsdwdcz5XTHZB%KU~zmWX)#Q*VRCx_i9-<0NMz z5AnGEW`3Lbx)W-aYPj^H+&j(vd38`SS{yp{t&?@&Eqo5=Q}T#=xC?ME`doTR6KTBH z3qvko+>$MDWS$DB!(7lM2s@28ASIMy^4+3H;@m;_)1(oO6Gy=)gO=obxZsG+!LJGN zOWCq2h_+rL3;c{rsVfu|SFL=acI{-Y8<#5WhC7vq0`0cX(JgkKiTo|6@+VOst17K432w^ae2e{T-7dC*gtQacgB;;D-Q{+};t!}l>Dt6cyx*;b}9TX~R zhvvQY#UW$(IFM%X0I9;pR0l8K(Kh>?$52U}SIYD!m7k&Ce(SRfA4u9SBW9oQjG^Zo zd%$G7Bl9^a2Zji!=hcjE`k`e`=C~k;98Cl4D#V1;vCHRAU}Y}$&(V6l!^9t$gGzu6eP##_dgEE78~Vb9}j1q(am28ZG? zf2=!(g8Bjc)QT;g$(%E!M>SQfRFB}Hy$?qEU#}Lb$UhSq_JaZ4PD+l)%&Z3(v8o}v z6BY2~)IxLLAwOBSw$!w)GL$f>pGAVs=BY{nirpVPxMHdraYBGvJ^q9Qp?UnYV3l@n@MdZDA>cYmbEtk0%%5 zm>+?de9kNP1V~KpF+5&GI?E4}O)Gp|{29od(5d=wDDqR45oBN7Z^H;!sSDSlb{E~P z#?$@R0^n_tUk;RN+Du&+o&rTk7NxS;4dI(?kZrnVGov#ad03@#T<=Qe)u6i}=Xg(i z@XyI5TZl_7Go>M7_f_{;oa?e?Ia6m0(Q4YMN1D)}c~;hG+7}8;I+%T}S2tmzoeNjx z#Y39IikT(g^{t-29XsGfj-iCz&)#|$Gk?6KZldUr)vvcwHXS8@<9Ou(^9>9PAm63t z8p_480&6)$vhOY9Xuk72*km3wDH3+n3EH#_V&kFH2;DPp7?nxVR8z1`to%u=9lGH& zUxlcSghlF>VU4Cn2+a_jT7iy(QqSKtRa|3q=uA=bo9+F{Gzt^}sG0J8@L1iP1sj z_BVmi;Y?bO&S&+f?LY@c_#=@jK8r6(6K<(m)snS!v{BQX<`7FkJ81VXR1BsE5E*Dtb5=CuoK(*+kwYv-bz9&lb+f$qipV93D?dQW43JQTzOcfgwvN}dma~M1VA&r;2 zp{sC#2{X3X8g~($nqB^j>P>3G*;#^h^GQ!655^KYeHq>mUAORE!nIo z>~1Qn*Zt9Z`G;y9br~!}{s~y$8THCVTq6Zf5Zpw@yG=s;$Z#kPUidwc*zaT^tbjOt zq8_daUZ25m61s0VIjIO;&o}+LpE5bicbNRW}emv)I z!xw^Tk~tRu+;U@qn^)K>PLxzS<>HVlEeFMS2>u!_n(ggnLWXKuYI;}B=uNw<4&P}A ztSQaCjHJ-=aW!*KuHzx^-sle1o&ozP0IuUHXn~8!ZRm~hjRR#$$((;RqDCwj{h8C+ zL{#)?z-dC{ZED3y-Tu~LUQlBeZT9ih4>!Ab_kLocT8azr%kT^FOGup1PJ`L%=8kc< z1LOvB-!2?)n*wC-1h21%hu*B%N0iWq;F>Hv)*C}V$~X*DZFXfz1v(2t!?iQseg=X5 zo89Y)8jjot(E}O(dGl1lr)0uOEBUc@qHT>-b=E2UM0_6m8NweW>uo0aMm)jSPNvdw zzn8YKsm7z-c%5*3Gt`B)LZ-)*v8fou&VHV{Dap7>b^j2c!8135hS$8RYzk}oWcWDS zuWYZh?l*o2I5dt9i$|q>l>A~MOYTO5>s<7F0Cu~yI|1y~@TKC6)ax;_j8tEW;;E!^ zjhJ%0OuyUm_gbRfV0N%-ffZlE4E_Gv#AC#9eSN(Vf7~;%`X=zeFGA+$auElvXW+%T z$_sDRwZv^v!0&fn4s>bytetgz>4Xkv-c-32t3xVs&oy^Eg*PYI4`W#L^t&ZD_JcwC zAqOQd7pR)uBbSqnnwmv(%HVDb=(@{|VDM!nvd`^ywKW_0WpR}0*;r~Zwz&?W0{=P~ zpP5CC{$|Ydanrv0govf<5j9riiQ z-|U;>%tJnaoqTxMP zHWh7gW&gE6&X5<+!5FNl(9=nsj`S+E4ZEjNm~d)4^*d={2#7qs(~2fb09p^h;G>K7 z5pPJx={$#h8+&SZQvl0cHavB!Je&|GoNfuW6aEwaH<)nowV$E@WASDBTj|HrM$Jq1 zEVith_dBRmVx5TEwR$)q(I1))*L`)# zMVW)JxxL=>e9Z7r!g2;OQt@WoGOIq)(QAbHo`)N(Q40Ol6~o$n!2ACMN204=GA0u7 z+B*+tp!JQ>mErNwttGTM0jS6=S7Z>?7)B$OqBUILm82{G4r@GN1g}xz$Z6gv38v?R zBoKu}pcSl3=s(`cQ3awzKdlk}odHIP;`&4P5uSd78Z!+8V%2+o=L@oV;P$^ic4Q*} zT_)f@j65CGJlZ;JrBzZyDi%fGweP#qbIU8@TdpnRu{^ks?6aVC}x4p1>+N53vPH!c#PJ8-4j};h#*MR#Y8R5DbM2#k75^%yR(+!Kv4oxULwIc zN{M{zLHHhnO$w5{VC%}lSZb{3E2VAOL6m=h&2d zVd$YYdy7f+QLx5}rhOlO?c@jy$WI>)9you-&>Y4@$TLTLmGzomX92#!lID|(eLT$x zRTh3ba)DvZrYsw>7c|@T-<%x$+WEU4z1!10IpnW@LJD{D#f`c5Mf{gR+VA0}9r&8v z^RUI)#PwrdYBT8D7nLTi`jc*>(cv`kk(%yCPi=jw-(s}A{{?pGQeXEk9HBd4Jyuc;~~_1`#+eHnuWgQhH{Sn}<@k%B(6Mv={cV3=FflSS{eNURIGFww%kfud`G3oD z{3FNMKV~}fKXNeqQ+fsF|4J>!@DG-Qg@gI8-tm8BIa0b{4A2j^1U`9L8lLUkp1QAT zybrqrLS&#pAQFEEfJeZ5cZvWFYQb3a0)c&0Q?cMXvy~78EB(DxE(*7;X4}{8fmMWA zrdI#{&f9?ZU1R6@YvyiqW|H@wcjwq!VBqea;g|G-3E5sG>+z{|g8La= zKgYZaROq~-Xv`U^<_^uTjhP%*$JhGjY@1a@kF|j)pY*w%P z@5aeM$F556`|i#&f%6c+q9v;Z@Us%CTA82O0qaLUo~P<3-Cjun-Q8ovuq{dQJyO{c<6E(3NI*R?T_;SrunoQ>6HZ`L}c6_Cm8ix8#C#JuYuGcf6P`sB$}TZbBrydVXd zTBvIain0Jf+5%)Fc&}rlHK_;mT)C7ZG{9vHC%?LEecI!!Lmy|RnQFT9`%upB$Fa0W z@(1!1lDxjC0&;R2uk5J8p2Xv{e5nGOauhelhY#qBJcLl5w+^ofB!;ILk>`e=fV$*53O74 zJ#B~35N`>KMCcjm7q$bAB%;VP@=jSaqe%O~cSz)P5>^r!krScS$XckMLmb42cTI($ zKZPvBPs9{<`Ehj8`&yYjgu-T$D6cT~myv1a4VVxdDk6zY1zOryh!V6|H_hhbW@Br? z4ar*C)D792HRj?U>BN6U%!by28iMsJLtD+qVACbVSs!J-MsAAeeRH9B$Hl7vHnvwM zc=?8^TvszUXU|YD$x7CP1db#mV>_YNaBIMR9|3VeHG%543+aNk=|}q&15Qp7h$XZ8 z7P2W#_56-m#0x5qNun3%;6udD2Gi*TI>YUTrKTN~skGUEzLK)PzZA)-XeeK61}DKflUt?vLetcQika{T9fcB@Kjg zL7>Iyf<%c%9HCOj)Z`IchE`t($PP1bo@p^&3~ML%g2Rf;fGrEcf*Gz{jwLqBf&%}-th~8&T;pCrqoM9PBb#lhG@jK$ z*jeL`4EDxf7EpY_*rWGOyi#!$Ku+2belM|_K#SZW76}Q2h?2;uJQ^@S*c-$;UMu%v zjhK^a9&15Dj6teA6t&PjXoiq%XM%|E3`{Fnh7b`2b!HlK`HG4zwIrL2YVmlvlq!s> z2!?{@l37zJz2f1nZK{c!wh?$p?S+IY<+Gj?#r`Tb>~vDV!d(=PxRpie}73m;q8xc&sAE}3sfPnhU+mMFR$#MGo zYxu*)BDxjc-+hv$vn7&O3#^SZoq4`TW4=ci?>BcZhuZMl;!W`(K>i;~{GJyh&$n2) zk3CP3e^&TMWREu$M=<=-inRN7I$O#f=bPISo3A7`bV9Cjm$0VYpDMEn;O)q&9{85g zFZK?$8jdH;Pb=I0Jamn2&hb?x&h^P20Hwp5pLNDFM?}T!iPM{9bDK|sMyYrkfH{Wb4Pp5x<{EbET!Yd!z3Ns4ZbIpPLIOoX`!( zS}+|E1~rVwzYAB(Bo7VPpz8=Qg15oOLa#2Epu}~=(`oP2fXXKEiF07N{r-60@Uu?R z&z|Xn&s{W+k0W8m`MTg9Xe3B{OrE@<5Kfe%ATg#1ByggCMQ8(aU3!=Sq7b8ytZ)C| zCEH!a8>0gf-_d6zeNk8m1O4vk#u5xo{P@LXOd!VQ^b_ByM$DpE6I#Y}>f@||3;ipC zaa3A;0%A49nwzG~Z8@BycAHG8EBTuvudQM_Y#A5(9g7)0qMtnN${v67Xnn-7J6*%b zC#{Tu;9^Q#oqe2rynXN$hT!k}g87fCAI%J@Dob#*1?a?~RFXa?a#%pE3|@}z1Te`C zV5=pVkJ4vC3c3at@E~;g%U+RckKLPayaxD4QL)V{wI_AU?kFY%raLhl%1_TsGmzT? zRp#Z?@|VPo8$+|E<&OcoJ47#l&F)U3=Uf?jQmo{OQLXwoUa@To{~tt(xeHFoZB!p< zgTk4kF3flho^Znt(4MguMOIqE;mVPE(nQDf=r4ikf_o4~1Ms;a9XX-h=S(F?NhPDw zCP_`5+C;7_}g{3ZP9>gjualdV=MNTC@-H>_p@mwV5=Cf`lEbATg- z+p8g;e{kFFzW?cciV~2V*%9QOJrVq_JJLhm8p7jTax^`)m2p0?0;KrX?7^r@uN1uF zAh>`&ALy+gy4DHcjY>TQd*~GJ&XYSU!FVv?PL(Uza^csNNuMoxVD{oNdqio^uq(Nq zi$CGW?xo_wJEEGJ+N<8T+hccTaJ+VW_v{BC;+RqS`#eDKPK~tOU+U0sfOgKg3BI-smTT3(Qwe9MMwHvRp_S=^OEz}+D>9Ym4zdZI&^-H|*1EaBi!!phe6oxj= zCTeuFj44$rr1?v|uyhm%O%W+(PvG3GzyN4CKk0V+$j5K}^A}D*)~DB)v`JdCB*0A* z2?f2F-FEfAy=wQlu|vPVux)Z)ku1^?x6ESQ#BGcb+wuG%SS|v2zx7#{yWXQ2!*HQ8 zGr`sz-ID6xM5TxK$QAk&t;uJ<*aXzFD_+?U-$2?SdWN6(mS5+YRmbRoaPp;B7FS4w zAhbM_(E@=L!Ya;%rdT4rJ_kYmL=AlMam0^&b1RMs@FD8+R zpcYw?A)vSr-^=j4w+4OX8ICa%As*yDrQg1<2$3hXeK6a>ckw-U&GxGs4>yBkHByI{ zMdmB+p;^`L1CkR1hCOE!Cb6EVtBpKAZ9f&dNr=W>sid5UlBJn=C_p-@hV{53eIza) zWVj_qoex5N{HQ%+yro_^uYY^t65Aiu4LE6Aki;GZyIAUpQ-Ji(n6zUVHaWyP1Uhh? zEXem}{+)AUTR>5TWGKNF)L$dYj9Dy!-k1SmDuTue(JgqAVjwg*G0kqw7%z=@8h18M zgqpCE-VC1EHlU%n@vod{D><^5`F=Q*i>5%>i?8!h+}(hUF=3$Wm7*P($>w=mdK+9D z1W@?y#}_QaTp5sH57H2Vi-7rt)T%G}yiN*4r-l5BJvWV%(BKRALP^l?^Zdj6H5|(A zzz@mrf`djpu_m>uFh!;?9D+ktf-bq}C{Z?+Bn-*AwB|n}t|=KN%;w8XEQtxD#rpFM zdav)jHtGMyv^Ho>lFw-v{a3Jc8L~%Ql8m;AjC(D`_7=$?2}Mqd>ES4?$|QGneg{QF zIg{}F1NfS2!z^oINl30aU{;y>Atml_6kly3s~JmQvqbH2>|COOKo0-^13y5(ziArs zH;#^U1bYt1`3Z7%vSbr=jHGggbF>ZL#1XXtuh`>`jBe|3MQ|x@!^hfYoz>GmXHc6VBTR^+T%GpF_N zvv7~L9#b069o^%&bieah5jO|FdEN1?9)4Aub3u@GUbX7FV9&-$(~i5=6JmGh=)gU2 zEf*Wpy=n{|y#^~ao=HkQ+%+B3dgwKHBzWeS{8okcD{%C&?uEe~O=MJL{;GxDSQ_`L z9&*|xpClcz;OJ$dZE{ZT&T`{VJ36zJjWKd^j|7OC6U0cSMet4yESlRuR?TU^0^qNM;;Npr zup$e3G_BpM#Nn(SuSk0oF)Lq%0PWqze)|Llxt{kOpn-oQX%fphC;y!mxWr z3@Hy8o_-ZSelk!FH-7T;Rjaf^+QtBxty(oE5*)Ltd)2J|{L0yppcq-T6%0sx)si-# zp~8yx=eMo)^o&{4fmfMNhXZaoGHO$VUO#D*M6W-6`n0Xkv;?o8Jgpb3O>6h4j*hJG z2APKdZ9df^-H!AV;SH`6DcZp6zd^PkeFN#I2>THpL-+&2dk8O~&5ZPIgwK(;6#CKz zl;1}%A)JA*0^vS{X$Tt-RwA5(!0y>mEIW~wAi3Opux^ z&<@+=J}k0BdUJx~cFVGck77}5cDZ(r<%sQ1tC_^Yms34V~ z@YUdiYDpcaZUgB5a54haw+S@A8C1Oml)qJ$NXC${;5tsmRqU@Gztxa}`Z*(b+uOm{ zzQ_MtxLh$o8CAZZTB2T~KBzgOJ*cbJ-JrkEu(RZO;}zl8nt{qmdZ+K?d--cg`QE`la66Pt`jH<|(O-fZi)o%t#R|qV_ z6RlE#%+oy2xiu zfgB0)JC8^T@)HRPJHbn9x!?0I2ybD%Or(2LiK3soR?uENBgR%)K|{P!841S|$1-@<7-i7q3M%P5IqP%>6~bFNcRUb?)6WVi;A(sR3&AS< z1bA`)4(g%Z8YPW?)kT$IdXBol41qz?1cIS(BpQn+G^Kv$gg|6(go{LK`S1kMwa3M| zT>Oao+I&lWxvieh8|yXtdL!O5Z?0GN)6XSww11?sbYw%lF+(%?k@Z#m+`pa~ts&*Q zIgdHhq`8@jhYt*N9@sDLFJy>#VBi1?=3(WX2TXEIO=ib1$FRzZ)=Q+x*;eXktQlEK zhSxQeQmF#DQDw-9YI7+m(dtX7RY1Q&a_Ac_kFY_S47r#6UYF%_#41uiabXZEVrx_mk%QKZt}>M6l-fHw^xD zkfoi}%2uPcrmnimuBwSg!b+RfUR_nEP!#Ix>*`~y&1O|8`CsVEeRju!g}2|naN+HZ z%O*`)#sWR%$l(%|&ZJV9d2NYWi%j5-g$wRLr#qSkJMlj(y7SIOi|)8%(do;VpN_C+ zKrrjITBWj>=EOyJ+<6Y`G+Y< zoztY%|0&o1z=OH|*YsMGOBbf&a+rZ^?g+P{INGF!)3^cEZh?(hV^%usqC$z$YPA?N z#%lyR<%rw&z&1KzaJ+}vc=uz#@^FWY*2;0J!G$;1)^LdeXgKUh}Ck@f!aG;nl<=*$iT@jv^4SY})acSX}K*=^vC0Mu>z?E)E zPj=#66`V_8yY*D;(a%Wv1a>1^s8+BX`8~Jd;)^k+H}Zdn67rv*N?u^PUbRm6K<6qs zcPsVd`B={hm>FCZli^+&DQpmKO0=PUQay|QIk92*sVrb>KgGSiP%xcQIentf%xNRr z^4}3Yf2cRBPGb9gM@sXDNFx7lVn?v$|NXSLL{p+J;kM;}z>fT`*H@BdSETaaNs*+& zTM{SB?wRiL2tb+o%#tnvp?p!U5nT z;3q&KP|+}epNT~UBs85X6XQ;o!)15bTvnGt>Gk+Leow$7C=>D0cru=f3rd|{tJmn& zdX-+GFn3vsy%Umh)L%A$F60NDgF-R!4wc6=>$PqG_aqMTODHLp&O>VRulQD8qUp9tW7$ zit;vf*zFF62ov~4!ki7*(1BldmARJx;>x*qkGs0e*JgAeH~y+J|7g)Zxi#e~9X9sH zjjd^C>9CX5Y~()Lll$j=myf6o-P|;F*&ZsgeE8TH}#C?dEompfPUa9wBFd_~#fucF7`2C@mh7>9*NGDrZY6>yhpp1kHL?mQ7 zMmM;1H0XD`{R4|wOoO>^tQwHF*}`Ri$kcGs&tu*1~ub09>Yw$kG+(p z!A(l8b@H@lJi4?(u)^Di&e)>WTbsfP?9Ao?Mqn!|V868I|0ZQT(VCNtmzG?cxVH4# zU6e)e`c1MCNfdi5u!rdW%CTMSmzfm%QM>$r2FhWpLn zt`rZ00Xhu!hauVn2bwXz`^5vaIH!cosmvmH15vZn9t*~8A*Vzv5tBq60josKQAEYv zb>)?X`Nou!rF3b!qdrui**0LdX#Gg8R;Jx5Wf6PV6-bU!sUoTY?iwd%`^Y<#e7AIR z;K|F*d(@@W=tYxb!PZ&#{yje9!rTYjCWqJ}U2yql-z=U#v2@WxS9Cg6T8CKiz?mPe z8a`{;^4!P2Ww82({NDvk6v4vxEoz{oA6Tops;bsBJbH3;T&%U>e4<8Es9~#Rn`4({m-P+DN0z@j{$cr#BVTS}*KM(ev2dn-te_W}q}r%Umzwx;48%zk z5ifE1gQf9|3rpV@44O0j^v1q;Q*{Z_E#@X=q^Yi-8YHc)iT8Sk@$TW}+pq*)?#gF$ zu3^;*rQsjj=*j|cGq#Ok_5J%#6+Z(!PY@YT%2s1wKZ=ZNW9U)_c>tEFfHb`|wb7Wx zDkx$#5s5Kh5{=fzCC08vj03~cT!}v<4V_CHNW)TUFOYVIO&CALutpu$1$acRaL6Ta zSSpzVuB|EZ1xnts{L=6H7kyD?bcmvL{S!C8JnQLBzuV=v%#!izPG@_Gu9|V?y2cu-#vztAP1*75$+v?xy~p+w zI0YZ1sW&A9Xk?J{hZMem*N$oZ>}j9xdAreO?x)?7xuoQITQC%w$MN6+crFxx>Tbp} zJTE9heuE$RUWjo09O#wL%eH}?7*S`p@%`M@l94J(=J|X9V)RpN1^+hgJQAWaBpvn; zb%h1NrU$ip3(FC`M&_ci97`uaI9S>U$zY%noRioHX`xa425bpr1tu;GG@6Dft}9Fb zN_@!)HXBIjoyNh`SXr@@hH7cGX^=(_W{QZY+GL7Qo*#IdzWvmgfZH7yBgeT{S^nNk z?hM*Bi%%SRoy}eD`$23(ySTjrA;9@d49+og8S*zNtn+BRVNKFC+^NVWPf2zq&r9B! ze9iTd^J}Nt#emq(fY^eJCm2y%#bDGPaMOSG5IGyfXN=<{Pg7Ks$KyD;lKqrGpo~{^o zebasK9^8DjoBykP7;!q%R9wqcvfF+8^@Ax8)B*ssDGWq*fTAZWYF> zrwG&4$`~fN5Az!=rXctzM{1(|`FA8O!ydRgsy6iF$`yhjsI7uk9T(#2lx4VOyk&-E zq2&_G^_FX*+bvt7AL>3de{Hbns6wp@D&sC=G#Crb4bBN&61t>xS^1KRzVPB=wrILmR6K=Wf@SBq$-_KIFu!ZXeIW@gIlsq zJg@Qe)4xgfK$BIGXwn#*pD3G1N=yY)6)7S09QOuv7Eu}{dhVfT!c7$=w8T}poi@-b z3ph)bDj4k;=#+&R5D>Q3``Icp>Q|tE5HP*5OfV!^M5D=QHu6fnL1*BU86hRnpe5W- zAD3(-t_3d_iDDy*eG*y46iMf2|Qz&iliq^kAaE| zDIhxx%N6CBNSN5HV4n&|kAV(dbn1h1uif+f@6Ua%uC=*h%Qw3Y?vE1y37u(HMi;W(3?-+^VFKFA3wbw zyYlUPj(-ok(neNp((sH0QUZ0QIHi*3p4aFNhIuw(wb_Ub%!J;dv*`&hQf{73Ych&j zLDcKEVJA}V;mr<>%MSW*lzrYmL1uiKWyAx#jK9^;N7^$S!Nu$lb z5C4gLL%z`qZoy|uXU|B_iWkiIAT2)#eCh1;Rsrr(x+ zL;I(+1Gn2v{`qR$v}Cc~+WgDSF>o`A_FsQu=kM7&nup)wU@h6)A9Xut%Fj zs>>x(2?67nFu@4x&m{@cNjsO4rI01Il63xyK1c(2kuUlnB(PMffQ+DUqNH#lM_G=t zoWg0lK7eEf+OE1uw1SO32IwhuqNt?TzSwZkUOUbTDo zs@d(szg)Ebo`th-xh1Ds{J;a}o&WH|z>5~(MF-#_MyhGMlvSyPlqyZi9*u5`D&q`E zMly&>oQMo1{;C>%7*UnII+MuQ7$;_&QTeI)$H>1@hsqQ?2(4sTl3mr$7Tu2Z|B6&$ zp0c<~Y28x!Qsvu~!kKDAl*CK)30*wU3~?nAW#Ncm zGnD8{IHd{fj77AHf>IGnX#gXoI>1OG9=3rVJ}y~knZSfibrO{&h$3PL^;<|*39uQ2 zn`6j}bf&>6rbrFHu zx9D^(m-m=L0@~by6d`M~23a1Nt+Wg&9jBy_H5GEi&u*_DaViS~YmaFzXhS{)KNL0! zCz&Rhc9!fZ`9R!P@}+pN9*fV0^}Zi7(iNerlHtx|))=jCN}O z&_$HRQ4**|4|N`56bsDU0c635K!G!4cs$fOm~t#aJvTYlFtNQJ(WIGFo%_`0GC70F zNu5r02_1tdcgH2Py{=T_)VcJ_JwHRk^OPDx|-*BB&3%_#LDwG>mQ zoH}b-Sucm#S+h<3ti+kcazjMq=c|K0+Eh2JpO#44y1J?+DvTXD+Sku3B#o;wQ}Xf1 z8QP|Po|jBQX7p&6RvFE>bipTwjjRJ-JVr9uwIgfmq9eyf;cfvzWJ7OD25S0pNoTi3 zv-W7V9s1*E>E|#uyuuWPOdSpe7xLi1q0Rxu#DV7(4>9#*Gj<3QMKE*wu|dqkWL8&f zB%Lx6J*~MlR-R7V|T4HC+-bIWRwk~3*(v{Ly z1?nXA$WrP^ySj+AtfY(TYf4J#DCOuu_3PYMJ@)X}GM*B3Ie%Q_Xg}#q4vL zO<^yqIw?Q`D+B8S{GI>}Bt3xuv~OXL+nq_J{2sT}<8hl!CO?;j+?9<+BJklL)Sot% z1>ks9rg3F6aknK7C9iuMoE$TBq-0ISJ(5w=Oia`WCEh;IL5~1tGxKx>7dK_&=52H& zF<~#5w9OE&cS<7q8cmd#Cc<`;Hwh;6?JI9v9)7Sk95}Ep_a_FC(OUt1jI%V)Y~c9_&tEq1!P4I{*(3Ky7Pru4Kd_Ykp5EOeSHHr9zKyqh5%`2&mwRJS*yF!) zSS*g8UK}jb>$o`s_d;Zb*CG)*07G8b9joZs(sNIx9!vjG`?BtRtzvCzRr=oG`q+l_ zlQHFG(G{^}=?k)JwQH@bqibX8DdJplg?5R!#I(e`#G)D(oDe!WIzD}EiK5ClA~-xW zJl32Vk!~}N71f$@SI`^s#5^fadBm7Xt1l6sjlNROj|rX}yD)fda8<=^!3Tp|g6fPK z;yMhUK0BvYq$%~OD}p6_q_m_enD8az_C#Fm_xUTUs_bgcu8zcv`hdP%->jdg@6s=Z zI=7!*EhV!tg3ZSnP3ufMO?yoHOb1O$le;ES3W1%OG!BBjc2$qNqyQ64`dC`DBzDSz zI@2u!8f5WPEND!MD#D?Hxs0>?(Tv%u)mh@{Sjw8s(wH`qr5SS)=Yw?dEG;NcWc3NN zKrLOmv=e_Z)8Hb@)}|stDK4}n1nk3wm&#)U=1t3 zOp{#`n?~PyQLc|ZGU?)x9rvxyy*0V8+*>ZayQ}=3GbgW}&9skPUBtVve&RJp>?bW8 zCS5!dldvMcS2#s@0#@X`(#2UTEr$hpBHo-iCq)g^XEeN`~xH$wAb)ivSw3S1S4 zEg9dVg9R`O3*c7bg*0HY62|iT^8eTZt+v-`XBu1lbucy>JAF`tD4X>P3U7w(RZ3{R z3B#V6#d{n|q#m$QzYd6`<_Vj6QESPcT zNoU?rbzJ6y&{76HIAsB}Ri$Z`2tD zWjvOMmBx}WL1{5t&73k6OKGEJG-!*I(U>t^M#JVn8RKXfd4@%$sQ866e*FGmCJ8JO zmTFM(UM=qm#=n9xV`uorvT3I;EqtnMV$yg1HFK`YHL{xZv~uCrPFHkPbj_sP?&7AH z*3h+Z!h+>jem8v-+ZC%`IP=a^n>yMvCu2Y0Y^_j^^{Az0$=wxLtX!ewO}dh_+3eGW zy@A?D#OLKTO2%s${mm?uGDcUkaw^C9G*-7GZL#>=HDwIIxyp2Ht*&<&PZwnk$HMCu`QL{(0PjgVC(A37` zWh5(RxokfuqCFOif@o?^vy_{^H6JwdW>?*~#j-80vvIApntmU;pSc83v zHFOGhE!#s!X0a7nD&sJI8LJt1h{`%Ltb&uP%>`sSmfOr0rGUP2d)Xy#ZgH1`dQ zyRb?duu99ZN;Tx4(wW@~YSie{qUh6vJpS5n*ypLv8Y==7Tt&L3#+L;dsbgfs?6Rdz zCZ8*wAxSaGCDXB(FB6W$T{X}a#R+j?RWvS6qppc%V{wuZGwm53diar2CK`wKel>Iv2KfVd z1q|B%z64l&UQmWY{p`tE(+%2&>vyMXTz{s;bJ%e6?D2AR%Tg)bDVDJZ0-r0iVc+ zJdN?X@_60ZwJ>XkVkJD-zXejzYPE2wn4s~WT~?O$Q%c+;6LF(D0M7_l({+oF(RP`v z$Sy+6XMvfffX^7WxBnPiG=ac$6>b4f-$gQ7!+Z|I*#(RXd#^agD7D0&OqIe zL@3RFwIyl~+arVY2LxzoCnG>6CTf&%MZ)5!Dd-mqdNqc|n5hJ4PGGcXaDypid!te) z@7~dM-5WPeyy2TQyVj_fuFYvSIjHi@%a(7SR7c4tr(AVLVX5e?ez$0)y}3JU>)O}# z-f;ISs#vwS(rR@3pAWbkzA205-qd;FU2h%^meP9cLML@t40aV(^c?J}#n@G?^hHT; z{;mDV@;>{Ha-kq9=nUzigy0UcRVxvF)RzwVe8G^*baT43xp`EpudyIU=#=TA7*P-+boOLXhDgWc`@s9BG#xE1jYWOw5w)zU75e*z zbWKA;ZH;e4Bx3+a} zE7#i3ZI?W4W`8JT@>g&Yj`!kB^&Sq+a9!MD*npnJVTIA`h#`|-4|QVa0!|obm}a6Z zWCRGY@OL?Ygb5Fb83-{fd(>=P1Qk>>Bl6JF2`1&A1K5AP>co4<0)wm)EN999qqW&C zAu0zUdZxsJ0wN~bcF@qzOhiS7b5KPA7r7H_PLMqdd0)zw3uTIk zK4=J9gSK*SxqqahT3=zUur+&|{iiBg^^#SxjrUIUP4wH?`ET$(`a0P~z^8EqRegc53BI&3}+~wx~T}PvwH}g34QKp2|K__eJ=}?2mQY zs!@bg4$gCW$UK)2FZEUjG1WnzD^x7(hZ!dHCBvbX8mUfb9u=-6X5tTpt)Wnuget>AkXFP~ zk$5VZbXA7KL98T}(#bW{$453dtJPv0>N}`$FWnppIW<-NblNk)QKKr!sCX5Qzv8&j zrIJHxuk5Z|QprOdS=nC6@2flrZmp$$J2VbKX!hzP)96r;K?Hn94l+zo864wi%gv$;}N;QtiG~513NGC5pog9-w2mo zZ#^Pc6(UC#k+rm0R`RAhu2cN#CEV9B%z2!;p_AzwegPU8zBsOHdFRq0eNRLusuCz6 z3eG26NjSd`UrwoEGDa^_455Pouq-_N5;7_J!$eGjI*UQ<0`mgc_Q4Vd57?>e8M4T2 zl<|j*R%kb?S z#tlBtZ!x>V4_+c8fr1?LStt0mf>K&G%gfx^QKoE=XTw|prOK|Qw!uAKJ&0n9^F-g} z%4F}9ZuYXTzRF_yDT~=wr>8O$nmh9t11xWM3XL@pcH(^+xP&zP@4nCc+!!*hVJA+y zzD+;yzUezm4%5RvZHy#*34gp{toID>!~U)QcgQ>R9p6{<3!h<{pXy~4XxYF7zyJim zq{V17TYUO}OmsyOZVz+eWIP;>#eIQtne6JS@QsnG+B#pk4t~e*+;< zu#Oa(B}}qARgD@l;|*LXm(+YfVBj*BTRR6MGW-5(iP&&wV1QtCSkv(GI7(55?#mN4?T{Tj zr11000EFj*+gyr+#*tszv(|0G*J(+q~o!eKOT)jRdVUm9%~#sA6n~6;TNmZYAO8c{S<0q$%Atj zQmodPnV9LyEY7UW?9C`M?lKPUm>$;MV(zjmwyd=rv`nh)6zxsMerlUjW>w?=WJdZixfG25-&dWE`PS+B0vH0pxt~tIyqfsZ3Fz zo`E|Pa~zPBnar`1sf3GKVeH(_PH+ZW>{|E-!{B$g52*+z**>$g8ID&!NF`QJv)yU; zH9J|P0kQ6b0t!uEu~gBYfA45nXJ+LW`;elaoWff8VxPg(3a!lkH`d46J(jCwmSvknP(8oi` zYB#HDIOb@~G_Gc0{`KG9uq(HV*6zCDn;WKl^W3JNsOrJzzTw6^ocm-W&g+-p4Dqy$ zxxYX11|5@o?c=X<@6$F0TYbPJGk{4VBufrTPPmbHR5(dx@t6ZKPpzlTvo)aNB4TJpbf0q*~kFuv3SxSfyf6Q!*Hb=Q=)CplB8H29Q z>n_iNMHF3ShmWbS2NkExr=IC~I@y;{Bx6*<8bl$lA<`L{gx0}0!y&@sFYju$kC|C|9oWZDXC&5YW!D=(c`sYfe!$KMUS9o!p#H~Vee1c9rvEifi@aps!9s?2W! zzY9E;c{TW2=(DuJza7T}H26x)e_NxWBE*PeYZM5k(jjFyn~6Y~TvwC_vcz9r#-<&S zvAL{F?My;wNHJM2u#LNvWVwx!0f*wKU#yOKNu0*}Y3G&|-nCG`_R~_dg=u?uV|Y*a zU|0wKq^L|P6#A1AsR#ue>}gSMm2rTaVgcQPpvbf29~kjcJmQ^Zyn6a!@alDzSc zBmV!#!Z$$QWG-4ddIS34HYl4y`9qu2`dWJc7^1f(2-lad3dRn2<`&dV*pk19^9%5! z0*8Jae~#lHMUxYq@^eo8$i44hbI1#)RC5wO(Wb+qrysPeMwbCgfFXM z7AKR=6>n^;F~wS8b1GY%sELJIVRlNWL$cwiKGx-5?C1RMG1iz=8IQ!Jmc_{x$+gK1 z$)}Qvq^s@TZ8UI9z?-oD03vqdJ!^fM$tcqzokG+%?_%#|JSP@C_AP5?8jQp==kgpA6?C+ z6#*^V@4N4rF>MuhzBzN|+fVceBfV^O-h)TEXY#dcXH}h69WZ%)iB)H=+jT<)Yx;uO zrDoo7-=b0T{5ChflW@(ipJ$xeTHw=08K2%HrJzi&Wy*AzJL;IZ1N!q?ra!m1>~)Z% zToE%^Kd8yoaH?MXv?!Wj!2r{=SPF{Xa&NbHw^uNFo4pggUEU?wO;36Edez=9V~nL{ z7Iz#S1EX9xJ2p@>KOB{%hDugUqAEh@QDyg_k{hB{!MPMriXum zP2W)UN$#(Vo1quwZje(*dgOG#Q3i7;;q}$9aPBEb^U&oUH2x92Z#5|1ZqsQ2r4m#+@*)G5|L% zOgP+NWVInPI21Hk5tHl#Q&(&_TF(#s}&YW0h!+&4$Aku`=`DG?CLC{LPpNM4-sa8{60oa55nzMI88 zz8{@GrnL`~hkcx076(d1vD${S1va1FW)G*>)C0jUiE|__#=GNt;3^$Y!XB4O`@(6W zlbu_fi&d1J&ReX4WRc`lDxUM{I2v-Xt55d%s+~Tc%jpX_9X801e(YoHWt@>EuvAzb z4t$s-6%V`OA!}UE$8}+RWkIjw2y8(xZN@8{?am(OL8kyAVWgyUaPe|mmu-iQx1rpJ z55PFK(W`MNc28eM_ER|vekzAP>x8E%^v?&NeE_R4C`U4VWO@0ZH2GiLQ%>|ok)_F> z>4c82C@wRk1gtD`8I+fhp(>mP#OKWZOD*@{1-XtEht*)PI_NN`#ZY2#{FYv;q*rcq zT2XM)hC(U{BQ-X?-li$UN9_Dp$CnxQ0ky# zbVzo|AvigY!|w|C{G~}p9am?sbd2G~*jpSObcTJJ<9f%#j@P(X?H}T`WbY=E*be1i ztyL5)R-eIY3qh0cfaH$`qf4S3iHgzo=+5Y#s3N+qG#X8m`a-2duavuJjGBOkGir8d z_G-S>x93QtR^h+%8|xg>wRSN3cKlAF0MB@Ik9W5d1bP zyt}P%VDmd&P_Mu~$???hbRh45y@K+7n;kvuT-?#mT`2jTahOG*FX07sA|7(Hf5D(7 zZcxSzdK{Xg>`MYpP$(BBy;G{%?Vh1 zSCp2~fCFo6!p#|}F#vrFX&xYRDWYmN4AW#{Q>n>i_73-S7rUPaLM z93E#SJRU93tYiyV=}s%P#zh5=_fJ%;RqR#>IDrO(ENPSVs|@f#BMty&zj2BCpoDgBVLk%4ZQs=P@t0?Rj-0yfT zsjN^vZbSUc!RzN0*knMB<9p&@%u;Ycd4^lbxgBo1TgH_gXmKBPPT}C3!l@njWXLAF zSZtS-s-2x3AvknJcp0G{#hVd}rP^XSp^kt5*WY~k>&pX-)X@e;!CqSYKUaQv?#psT z9jgfN%}4M}u>#`&J4=`^Kk_F3x4|-Y+8pe(`PgYy^d6?}{k#uHM{&61bEy{c-qT^K ziD;@^5m(iM$bu^6bn}_^F5mQ!pbniCzBT+{SonA7hX{N)G!a|K6~Q@82FE%u3+$Ap zPgAf98jczTL*aBKdi059w5*?dQPNeFl~q>x(p5#XfDUX$!8qfxu&*xIS)ZfMgsCXI zdvzimNhG2XUn&v~Q!#8Jyh~FRu~f#>(Rex)jHlcovsv~R1Va*ux5Jd&&+XU(2#=fK z;J4&n6IxRlvKxkAWYAdwuT3+ii&wb>0vl+9o4>`hyw?4|t4GOT_Z(e6Z%IzzN zsKU+v*}+Dj_)0!F1!UHk8{lr0$1qX~o;U_kXVz$=v>9+c`1B*-dziKj%9Z1f&sA0^ zjw-nZHS=8aF7|Ak)0ORQPbpfMGsJ&n+a&Ht2Jm&5Tm;%H!)DbCsuRk~iF`(Xi1ALi z?WgmFiN+qfbiiSa~QG3x~p`W}n58tP7F4B;~91nhadD_es;~^`%5x9pZJG5c6hP z0&kY&2)(}4dXE_LsaS)71cM=XcQ+eDv^>-tni%Q|Z3sOT+7a3tQit3PjNL!eCD7NH75coU@^R$pp${dxH;J7zL?v;Hh z*e+mRd^?B=Y|t8?UTBT()V*^Cpy-B-`#Y03 zal~n-%s-=xX-TqJ`!fKwUQ$YsRqq7mVvW zb^UbCmUu`L3_+TjBc*sRY~w18&KELb<~gN16`4%*L7SC1LmRD&t$VG!)s;N+rsJ1` zEdo1^(#aH1Fj_G(35@32?_}Qg%!%?B#Q=FR^u@)HCNI>`3SC8XZ0Xd}vq~QcKNx+6 zZq+^Oe>(A!Vwd_I;bZlF#aC*RU8tm0iY8qvov1t6Kb1~VbgDXaXVJ42i*y%omuWBa zUlO>%zb)`wcuUL<&EmmcomdKO#U{V(9wR%%cHmTIbrp`&5jbAjitBh(t3{7Hfkabx zzTZ!kxqol@_!gP)6}`#s`|#$QKV$))IeGh!x$j?mDR=OX4>AlVjFio7uWtD3UpF9N zXFrD38IPTrA_upGv``H}6?$08AoGgtmsG_!neROa_Y(ip6uroG2 zvCz2CwIFtbOAlS^chWM8wZk&ic24Z<#9_BW2^*2k4Yx9L%)LrnFW&CF&HbS5LG+D4 zoHM$t9@#_I<#iNv736wTD5=u*2}TO-2fwfhWP!Kv zWg&)<`bzLsdxm1h_YCfft@v`uKYD}K1XB^j!9hjTQP)u%b(F+KWPDT*rK%i*#OL_K zbOKjEF*kp5{+pLv^5(LSZ#`pmfyd6$-av&-h1h*^uq!q zZ~XYyrC4@{m{bcuujf5`24(g|$N{(=F1Rb%_N*7yqSa$;z3HUNe>hWW!Xz2uK&=@N( zd)zUSz_=}ZX6Crb?6q6rL3?ns#~Sd%%J7e)s2)xSG-S7*;FMi}Orl~aT&WVWM;^9+ z`pB7oZn2c$yiCRSSALM&OO3DonQG5)y?e_o@3`r`_rEf-+UPQw#Hur>=e1{mIsSF! z>L(w+5fFs$%o1TbAhU+-l46p+U9nPewf@S=jrv~w=Jbo{chXu1Tmtm3iegw(Q-*`9 zU}gn;fC(OaYDGVlBsZmDb+j~0Vx7s55C7#u&{dXoDm7{?4kE9?F)J84gYMljXx=6n z%59QuiEWQfu(@h4*h*h7I*Cq@9d#S==^iHJH!?->fPCy3l=65k2Clk;6|$psNh}tE&?BE@X+Ex_!Hjex%cZF~TATxoJ zoqnmZ&APz$C>JRdP~wGx3g~hX+OE1wT)U#h8%3&U-Lj9jtzgguDiSK%}Lo>mlU>Enaql4 zg!FYyh0J8D)eXw@(-xh}LJ-+*%TeUrk+#NUfBN3^j`Y)M{h{>H^ojK8v_2iq*IqSl zvhpB?I392q6hL;LB9}^GEa&-+@fh4mjG4s;0TrGRB9K6;HMgKbHy8)~2+!)xO?1lI zTj^#)035wCNMD-h6uGdrG6wIFOipOGX<-c1GukJ$kr#p137XNyx(?kf+S*qcTC-#p z=R|)t^V`*dO>aMS?%Y#vZ~FONcm3>Vcir`K@zn>p$JjrATK(lUh)qN6;;+?C{d_-T zd-pP-c+q{Yzp?ecH{O6PEPyRs4_hd(b!x-*$T?ZmGe28q++e(y-6!r~kBU#TA<_Dn z@p020!(P+NreB$kM@$j32fzdTwo6J#qO>F=p$?StWWnl1z*E1ZslGnfl*+n+eUiUN zli3muf2Q18{A$ZADaEe^By9s~x-Hk-*4EOTDllqw&}VCEFx&+}Z*p7B7CC%8#IR00 zqS_`4NxAt@(@`+I_pv_?bzD#yO86TsrNgo0@_7};^Q8`dTOUkH z5X+nxL`xCUHL#?hOyG`04JKnIYCw%VVv1=d37f=BDOYdy3&xQ%du4k<(xM-9rceN+ zX;PezQAe?EihNMcE61**_e*nx&6~URvZZ${xg5zyqWCGT#h2f@Vae3obz|xB+_DiD zom+UpjCdr92K?)yp1=&)M_D8dt9Eg}tZ>h%DE<^c8y zS6s63e2xgDniC_s&%(mSrEBN?9L&R?Zu6D%#d7XdUQfk)Z{Eme(&ruyk$Yk@|4ghD zgXi6Mis{>dtYAE|Y2(ECu#(_Q9T97A*$Tkq-@`dPo& zuiNHw&Nkm;{*ifS>_E&AGe@cD7K1e#Z03FJsh{ZeDVz3zRj17unID$DK4)Mnc**&_ocLxMMR=)ZCbvcG(X1HdvYyDaG z2=dx2)$~XxkwL_RN81G<8|GElq_4JFH)_1`HXln40ca8Xb1Kj~$9`W85K_p$Xp%enp^gG-dI11})lZo&I)E+x@_{NJa zvmE!hEZ@C-$Q0ivvUvzy{;IBfjF!y&01%8uIpAi=;c}-zm~c{W3o6;0H%enmT>3iL zc;)3cB0Fajz7NfBOj)QX;+6HL_wI~#PTXCwYoy`tbK*Qv>dvN3d<>698 zNu<+3>1v5r`WKF_lj-`XdD=vwvzYP36JQ8OfQFIL!J{d)aPxCwto@DokeunFm6T)T z_Wb&tZF5r@Fk{{;SxR~z=`%-w8V3^)M47tbl7DCAq2VWzh#nv5sI!(1qJU!j_k45b zr|9pdg6{BhdbYX!rE{MvVEszHQjew?%VZToVanw@<-o>4nF zy5O#mIrQoKC$fQToJqrGdzbxhBHS|BW9lhu6O{exZYfju678BFOdN?{4)-L6d^o)R~f{~q!hhcOw!kN*a!+9vvitb2eXsHMK)&3Qr zwYvpFdT6QkguOp?HIQs=kuC<#SSBbE38^=n__Rv_B9oDPm=xC+BtO#$P8)8M@fBmy zNQ?a7*RbAHtdtl=%VG*!!=5WX8rqn^{D0>lp-U86)R-HfNZRV3;AFcs#BJ={`CxAD zW?xqd$rf`y#g^`;K|QhWRIPI(nCmEBDEmr{8Y#(v`YSuROe6J8%reFf>SK@@U5wp~ z);rgBAG-{d8QQN4py#375Z>r@K$Ms@B~tNfwP+sCBfT_)G8zN3uFmGE_ENak=X9A|!Y+QqFT_(t0p; zEx!<6PGNm_+Bn5n#IRxYOPB5dyHR&hx9@Vk@A=ws<$QyO1FGM2lzX7 z`AWbybjH}j8;62()>=E+;rmf3UsPPM^&B(yT5aPQI$jKH7hUO*+^(hq+NhL!-3ds5pq&UPwz|CVU&No zY!oH_#;-YwOtB2_jX&FD0oVGpFl>{;~}Su0vI-K81NB zwZ=r8E9bNUpn*%QA|EVGx@qw3H&l{5q0Tiq($>)Rw~Vd+PlQB;R{UOp?Vy~DJ~x9_ z5qC~6C(=NmWe0i2v`%Mnv{9Xdt)4|X5lh=@1R8;d<@nEU3qLRq%3I(1W^YQ%$+&7?a?2FC8>?LfdLAA_<3Y8HWd_dfSFfna z;PW+kcU+H0bj-`@uvCZWFB`_x6MD)z*}pg0?>s)C4K%7NJ=>8R%(pvG_b6(Hl#YJI zCuZeomqYczDcP(@qrxSsFg(g+vyO;n> zJBnLSf3)n@W&Y%34gIzU;I%+~8d>RBbWH?*paqtY8g=QRCwB|}fe z(}Mq{);C8l-&T&<4Xgb}f)mMet>5N8oCfWf=b&v+CEPpr*nOjqNh5LOJ+#I(6#Jg$ zdP-zzLNYvepR7BmqLJ^cK!R0vNy{ihPDqrxO|8d^YHEfX`AJ;&+|yL0Swu&G@~(xP zq5|buUPYtbsD^;UFS|qxxK8L>{7OohAP%Ef5#6%UQ$vU|=KBMa}T6jEc=ogDe#OR7zZm77znK2-yiA-s-)Rf)ovc)q7 z`=>OQo|+O>o|t4D2+s=#c{T+=Hse|}k4TIBzX&Iue}-1RwYf^GDT7T7j_J?pt( z9e3am!f^FPZB<^CMq~AMTpwMSa8gf!WUo(sjR3ugMFoy&lYZ7n8veTpyRYwrLq%4f zA9pM86dBuGUV@b=rv*Dr0LJWQ4py!5ysK_Mtu9gMEqI(tg<|^j3XLkoS$pmsV9a*JVvQ7L@ItL_Vhk#jb}>9)-S^cE?k+F?O#zsvRqlw>k)bOv3`{J|k1LIe`WSLhkjOKKm^DpKnnHuFXs%Hg2%T{s6(K@xs@!3BF_{xRzpOFLkeAurbqAV z_mn!@st3m0CQJJCtI8QFW@O$;!bC+E82e4+sTNteuM9ao@)LWUH8t=Q*I8~h zO1nspySo-!&#my@E?RM5baQ%h*xWupIXF&V%T}?5W$WG+i3HqdYu7BNq)GdZ~vIrdCi;fBQ$qW-Yh&|k!?P6__946LW zZAkkFDU0XKt5z+En`qE%P!3)!eiYU&i9@ox)|k1buQ=QLGa7Jd<&G{s(Q)v()M?mR*m2kh z!+G9zUV7;?$7$V}eeh&xWpSgzIo&x<&~4n?H$2zR-?lO~=!!g@{}d>6=x{ilK8an4 z8%P1C`YyeoRW(2ri8sVW_ms$q5Lq&P9Zu~vy6tTRxMqns{+KZp`#?Rw^vnhjH+~4tVp0ik!Y8ACvu5*8xoL{v(vL$=7ZDT zEV*Crh#RKQ#PaM4)vf})FouixAoou5-eKxgpTCTCw`Hnk+DV_*N)yBkma|SFMYAk_ zmn6=5m<8uKp<~_tITJ*!s^%6jwJuaVw(G!UD_TJ5!3y7ERekp@*k^R55uxo=Q-MNJ zDNkZ@ze2BGjq6eNmjnB6TQ59-N*+hPLS-|sT8DX2PJ*nn`@wTGEZq`r)Rwur(IeY; z7%KHr%29&fHx>2l;tu`Y4LcIIqvnEba_>AK?@o|6?ydM%p<1D8I=#!_JA6vC#hXxB zWQz2rKbMLlA~fp2VW;yNm;=Psvu>(NO5Qx_tFdZfCf-EcH0XX@z2e(!QknTi+JK2S zcwkXufz3ZkSAnC3+)l?JNs+mHOjXk-3C3K>c27;sGj}LURaXF}N*%= zJJj_cme0D1H4*E@EKq_AuHFtn-PEzXCu1!Uw){%{xc%OSXwWz2+hryjC9jjsaHVCv zn#O6WCupuO;p3+gz_8Osz(L!^+i62R4`~QoFB!Eq&x z-xtspy2)H=6z{g|2=Yi<7%ui)wvlFI%6)q{MMkIq-=dMCN7vK&j-tc_ao-bunkSYM zeo;HEoV6yC&zj1TbX_5E#y7IWS&tux5hpp(2@>R5(!x}+Il?@%v}_hTEQxVni0JXX@OdINn>n0Y zM0Yy;fJAh2N*O(z8{wfP)i^z#Rjc#b*!u$%hWG^A^Y9q5$ zOWacuqXJd#ALDNGqG};e!V1ZE=CHU9FuY@-s@Z7%Vbp) zmj;BQDsA;xYnvaYn%J&Xn!V%<=o6U{vL%)HC_jalxq_vqP2@|`9!mB#T*E!qsw$?= zdj&qWAUGdb1c5 zPfKi_SL`JYlbOzr!qJX?GBSn*sw%2Re+qBcAd)Dl=&~7>zmM1H5rb_TIQFt(`K`*$%#$grEsaRSkV;nH1jG~*7V)63uo#293>FGbS*->O&DvUCd>gq8al5g z0j_X4%s1@SzTr*54rv$grH8%kED~IV%useL3&m02W!eYB`*O@+m&3%L>TGOXp@0gP zFYZoFzQPJG&>phfb9izq<+Hp#j>y&QFa3>vQ=N?0o%x12`$$-iUsvVUuUcV6*xIP3 zaN$<>hCNW3(aSM$(SK21N>E9Jf2{K^P4w1`dI!;!ybSF{VNIptN9ZKIDmn?=g>~w0 z?hJmn{I1)ENAynaKt!kpT4_RC8J1SkX_sIv)ZcJTg_#epno%Dt4!gQgz&_rby(#@| zVB5O7?TD%~xWVbL?9qE;s0c#Tzq-mw z&qjUxY|VRq@V;^|o%cKG=JYl9{~+ACAQwSe+#}@U$8e$iq#*%=|3-f$UIFs{Um154 zRaFh-?s7`H+L=527uC)MjgJO~$OWnGWM_%ALI5Ebq&OHv&d${hC2ec&3WQ*&Q!+Gy)jk4BnN4vL7rcq^9 zn%jU79#^T|Mb;nU9)RTpbteBa#y_UzM~wL(KO@Zd-<(SSO|A1sV1IDxTyW4JolsIz zNH3rvHw?xPW z7Y%McFdvXt+T2+lVP|8Dxfl)%!=xDs;iz+=p^PxMvU9Q_yvPf^za{v=g8$;zfkMGR zUKMk%ABpmp@gHu<**PHifDpbP8G#8t!pZ7l3Vr~;rw!zBH)$^rg;N(=6Kb{@KiRZfY&VJpn@@Fb4Dg7 zH%1>dw@29&=ecz<>o&O5UaG@G1aii|@vy#}2%dYZ`YKhwE^ES;zI0)*`}ZE(XL5=T z@}h5qjA}~xdr!*bjzs2%k+0Jo$CppN81Vl@9C8kW~wf;2M}w+C7zM72SyT zr;!e46!m)${wlZeL};ia@P-PtzJ=PPQV!s}7l_EyMjB_Va>V8+j8AFglW=J4ONFFl z0ULJ-#lKq^JdTKNeeBkDV=o58?wn8O%s)dw+Ct_m0Pj*C;ytDD3EEU!t z#|ml5{y(LkL}F|hJ};n}CQuKPlRRJu4-9zM-P{%B15}rhlg6Yk!VC3}(oeoAwu}D% zfq#-RvB?PWfxvK(AfF%@0)>J23_u`O%;z7;pVgG@AL!>oGXxs{bnchxYKOus4#>qA zF_lZ*6=~&eiK$(X3;!{IG^S*skeK#`Yd_m|NGBQ0fPs(;$1tD@((0m3__M8q@b<(E zzzqobn>tETQe9c-AM~$6{LiBBaz$7Zf`CvEA!hCV{QzP7{1_*!fq!BAaF`%Q?cxDC z{f&VjFc`+IU$BdL!MOelhG}4EwtmAPFzD~PAc%kfW=Hr{7Y5_|T@DO^VQR*&au5(4 zipiZ{b$_&e#rOpv81k%NF%SeU_#bvLRq9tcFi23~cV9r5DfrzNj2!Xu1U@%zlKjbcW!G4v4K>oA=!R+C`%Rw=f_z#Q^{`)vE^T&rt%U^6jFv0xY zE(FXE|GhuVoPvJ0%P#;2{ceL_01E%TKYjs$KYZbbgZO`s5kDLX`@=3A`ll~&e&`>* z!1)D#j|V27!N1Qv27~>c2N+D?Uv^Qh=9qoO^~a$@(+)%Z3dL+v8b~Axc#+{3Yf-_; z8VUUS9HJnDIk5_ixPdonS=p`( zVLeyrv2e(DfzvaDpoU3zvOCwWfobXEaA;yO%TLV?8Is3of;6k|7VcKJVtWTA@xm=5 z1yQN*+)s^8wO@KZnRYUt)^Xo0qWh>>#q9b&M-(2n4*J)B(T{$jHGC2=+j^KY^9cBf z9eC8gY;s|6n@qjedgxAhHU@ySZ5 zyT^kR*cPOV#S7Y@0g@kXy?hqDzIeWLy&N!Rpw?@i)C+g}7vy61@2+atZ4eK!wwf(R zlJEO95YN7aFVL)Sk{F1)RL!lM!YbG^_Po?t4T${CDC7(?M4z~p?V|9I*ltGM6x4i? zR!_ko#u$!n3#89owcZ&f;#9X|uEfPqwHo+|c5o*3@X*y!a3PH6C0@c$451V1z~l?5 zW(8?&iV9c1xQ<{L@-{9@g;X`-*-P&fsbmT;x7rBF~>DNKFRQ3)NugVXoYK*Hn$L!^b3T-i$#*Y(2nouRrx_y*l zcPx|9WK0`Nx#@WyeNTElg14n%SI<1sQZR@0@D`HOmq{1Rl@X2WSV?Fx)Q912P!*Sh5j@ z(mwB`yp{Em8lEQlT4BK0TFmCWpV#m~`pA5>VJ@LTp~XN-qejWE;EKArLj*O-&n6394Ob2dFl_ghmu%CBDCUAe#Ora zu4Tk{-y;x>#&LfNW59+g4`X7hI~c_!3jZyTh;xPR`w*DWF<=d-6HyNH0%Yib6HLAY zqSavk#P@SHqJ=s9@yz)BAg+AX;JkOQO~0;cxMLC4CBvO~ubIL{bDl@X%y*8OW~k zJiQ%kzw{VO8>|7v>1!^jZ$}St7_C+7YFCGcK34C-FeeBk~672kWC|ni$4p$M|diUVK`tGu6=%a*?z$_PA@1)A}klfa7g`TIW3o# zsd%<5BsBh@S)HQ6uEb?HUB3kx#99%G46BJJ96AaOu3bgFtIMa%d9(pIE@W4S_8WYh z>AxKyYeuIbE=mmYhH9FD*O{IQ;yJ6y25*kTZ~X!)l@+QDWN7N&iiTWm@m}qE1%Z!{m?1y=^$~o<`>m7Ig^dR_OKPViC&ht zgN}i6=+9-)ddH$ikgD!77>7ga9_`YZ%^{Kefx){RPX`pUD;lqU?bW8g;YySmnz!t% zVxyuO#UuNJ0gy`+-V0L%%&gI2pb^RinGB3sqjo+L$p+}lIw$P;%;J=7(`)N?HmplA<`<&`Is}Rms4%IQ&&RU* z?_A<@JbP-VAGjkwTn?**0<%j@EahQ5JkfV2tpQBpj+LTVWb2*^-1wDKmckyRQqR{ zvBjCsZa*V8=&orPd*w#mW-y+O(?NC)qf1k#GXz`Jw#7p#7n< z0i&w-5pu4TDu6`vbckHCt!{ZVQ9I!Q%1ZW_VYCwjTh1f%F_-_&%?I?UEyzckp7`1d zEXf~riE3%Y*#qAW{KIrnmJ8|FbVBHcoeUXsT&QxrJcaxNZ8Q}URRO{IlN!H#g__d= zt{=6K`5dBFdjBw)HZ1joszOqX|4?BBfN4%-;fk>Ug$Hmmx%(Y83kM@G18c^jzsr8n zLOmvIXIuK3FCpwy*>=C8D9}cNC5nv#6H)q7if$(Cc69P5zMT)^h4R*&V+{8X$5~)$#J!w z_B^PuvGo1(!jjpU_d*Mp{F6UakCQsMFMF;!=IK$lHaf;=-yH-l8aRqNc-NMxDU`&$ zD8%ejJAZ0wiR3{2?J1+Laq9|wr#zM8{7;`aGENZ+7%&8}IRM`$Dx6)21f}|ZJl3C3 zBiD(vtidd-*tzg|6=d6e)xg{0y?3p{Dalkjx%e6rcx~)ik*)IUX_Q;}kx;qXDU_RL z`ChOl?aESVV7qrTGc)%YGGNS@sd{7Isd9l~tYVmWr(u^6U~mb2+-(jh5kI)iv%uVn z%yz8sh*9}O~%s9T)wn<{(lp5Bl=5Z&L zgeNB&^Lyq$I+r%yeo}hoAM$uqxu80p%o2*s(%1kVS1`3>gWXbSrW4h7B&vWlSi=bJ zZdJ&gk$_!7gEg#YT)hnj>Vo>dAyFen93KN6!LzLx-|cfgX8YTYbOv+ZrH-CHs`3`$ zy!RuQ!eTQK+bt?C`XD+shJ=zlY5aVL_H(<7+hTmUmp&uA3+EzeUqxX*0X{Iyyfui= zPd%2=7$MMSZp#N3Kn;ucDbotm+*uFIJBVBUixljTEkBqDIV6S6dk+ZjBP}!*grSZ$ z^UAnt#~4kNyBV7;PxEE@V4I zBwq2cr+t>xqXG9D;+K7FUNOxDXYNRi^-dLuwUARsc~dmKKXrK+qf| z8E3x(2@{fQkb;XnfVUl@5xHfkYA|mo%{-T4l%gtwvj;FmWApprUuZa2Tcl21@!ka< z@FqQqp-)vmMqjHYxfXKK;Fy;XWv~nH8=>8&FSy#QHXKz@pHUYgTYZmuk+-NW+}h~Y zG0*%_yB*IBy+}I{d0wv!E0J>| z3r2JA(>A27jb0RLlOm-07>_9xOo5|FL7Up(rz~YjrbER~)lM2e%wsI!fU6;>D_2F4 zO`=DM3VJV}KtqKoCrv0Oy!4S?X&&|RcZ5xK->R=q5xB~w$bUDR9Jn@J*`E%_>W zd$=;bJkBcdDA|)zE@2_rHCc}_n_7?5NBX7c=?jEHw_vxDUw(~huJ~3%4}Xx9SXy49 zVW?r6VVGgSH;#S<$~KT6=rg)pso+7)SIRr&SB1FmRXm{%`#h3SsGX_Sw7A&mPbt%Pr7DJX6mv3+<6K) ztZ51J`0`+R(|gE&7>}QZ-+_;ZuY#YgkxWDP?^GcW!0XNioB;K*3r$f2C1Ly}DWc$NC8j9T1}yr_g8Z&q}Vsavzw~ne?g^ z&T<75vMaL-Iwd-_d`7yaNS5^@gwnf9a>H{w4YCaKw~WZk;>xG#@-_2$2e^!y?87ev zwza5g!ZM{mQc=UQN{h4W%K9yn4U(QUkD={3=6Kl|FK&x9f9M(MaF88Hb=@@wr23u|$)lU?y?KM`GGHkeX zo_O=7>C~)Yw|;D$yhXVsd!%|~f#nZz3u#BWTXb@vX$|zAdvmnE^=0BBavPS~le%_B zs(2$)V}f=9c_JSX3FjPVmI2pc+J5T`p+g*_F=M2jn_cd#%1Yw4=F!8L>_XIcmp<#h zwMG7==P!@%P(Pr?Nkj}L6vuzZpG4FRO|DjpQ>*?Ax-&epJS!I95eO5A62Rzi=_vPR zx;J=+cy@VMyIMH^{;=>U2gL03{Bk3M+uf3Xcx$4At8W-red?%=A@{LVFe) zLikCjI}mllyeSjHIfhu%xyjG)~%aKm}HMAjJ?^r z-bvfB86_IN8h-r5Vanm^Y}VoO68zN7acYH988ly|z0&;ARj0dU>!#x<#+t-ha_M|j zd^F00V8bSSeO4hyp{7IMy#8!&K)6|0VXK{CLJI}h55xkVteMtVTCOCM=}zAmj(!XO zCP%pnI@-|iR{OCwb{lxoUU*yh=(_0w=eoLf&~l}oYN(;RG*z{!Q@J~KnRofQRqeP# z)j-Q$AJrnpIHrNMq^@1M+EQY!_^{y64?iYtul>;T^GW9N;L1YhhPBTOcobwmtiW4L z!Zx3wJ9(>0A?tpF)vb!&$)mi(mQFJtJs;5%$&0v2i6Du>!JZiBIo{a?&JxZ9Ku;8C zpmy7S(Dr%rM#K}N{6L;9zxf`Di&V;GwE7XV50h~dSQ+Wu*{+{1g$IHzBEoP&c+{K( zS{in~W>(cyt&jR8SLmzz~_>+pJKdbghhKS#~KZOuy3JN{&G(0FFu zeqdMsoU~mT-2v_W{XyrEY5lgvdpG)LCIMsw%)=>Thv!e-RsI9-_2+5WQdHgdV;)@3 z=FdjQ+j-Ooa&%c`?<=3@?iWl;+pmvv7W60UL(O7>zlbpXO#D$T*9$#aI{8k#LHtmn zQeralN93AE?REe8Xk_xtc2FnnOVeHAbb0nC*T;4Rvj5C!S%0U>|2c7O z)LL=a2B3Q{sOdlNl!7q*(Vg9$GK?1*X(vsOXO+vIgyUn!k;E+FzT!W7e}ruF#Tjns zt5jxnIksSbaCmUazsY>=?qIX2htIBse$lBiqknV!E@DycGl)%&^}{nc|5F}E7L? zYX1|^;$)k0of|QHc0c?|OWdPBQ#R@$jzCoS2VxcY+x$o8vc3hBiqo#yd53}%jeTbV zTi2jGdB6LSg)k+3+TV4hnPTnn4Mmpa7689xvS2TE(Ms>NJgijxP z@a->84i9D$o?&ok291XqlOUo=C7>18tP1kZ_<5bzBPQ(tuJb>p$)Q~A8<+q>nDS1M zONnDypM}y8eui5I5ga%=&l2#rWC)rR7Zxu=rLa(Q^hwUsO4`PNq z2F`{)4C;YLvh2b;v!l(&Kbe;OUE2fg+K)DqEK zHw=d{{~<)S_o2Frj!AViA2o1EzJS}<$^7g(yhhyWi>yYNiE@f683fyGLa+g|n(EbY zXF24HCqFM*)lGr@PD1>Zp;xfzOH*WhAI4aO_k&#EDgskGgWk6BiUKufkM3Jzx+bos zjorh#gyoo%H*ep(=lytlNNSE7BOJ?g z^km`0@ClPfanc6Mhh|KYr5Uk}e!|#IkeO?=;GNp-}%k~ophqc99p z+y`@P(K1aCLHF`YINP4Ii!*AQ;}Qe7AlQ?Ld$w-o?jmIz14`4>l;2HRQKg{5aSO=; zG;A}wsIq}MHmj${gm)N?2KLZyMeOI1?Ztht=z)b&E>(_vG|kngjWEO_U*onY*ANOf zciE*gKWZ}CqGM9e7lIwht5C!+E|l!cewmGt0-vEAWeTlQ60q*$cXaC1Svcrj@D87& zk2sma&}I`ORocjupoH(lmi*Occ1y;s>5{;72-m@u5OZ1!lB`R;h3}2amE}j9%ptyK ziC)rtv8O{eALKcH6Tsu%&FIUUu;OVf`%IRvO28vjtZ?@wlJg*Igd;p!oFadip7-c1 zpUp1au?0W7ez}y~a+%5A8BcJc<&7XttA{wkBu;^yNW-WL*-{vLKERxqI=2(miv`9r z%HvBRbQ7h0d8+t08`bl!bDe^4J-lrcfpT*K$!0;leIIXh<>H$}f>EK$1GFlqjvPeY zywo~EC#7Z}25h?;r@P<0l$Txabwx8&aWj;Jn&3Br=o6z;57oI4-V7xrD~zm0V_UEy zb61dPTYuIgA^I6pxKv3*n5BCeJFj@m`a3<0(*#kj>hM{YX*78JoS)03m^f1BMJ>z- zTeeVi_Xf8}I)ZUvV69X9xIfLn`~_+&>s*KMc+kU4k<3G9hm{pAZg&abMEj{({I7}X zm4!wk94xbVG1oGcFd336M4F_&JM|}}-tmZr1o#=(r{56R9E%idj!%Stb@!uvM>I7Q zhPr8P;_)p8!}BDAsT^Y>ROqAW)t<7M%Y5Mn6bs2GxClOICD)tVUltS?ZgV z9_)f#-`#l4Rm?&v);FDRm82$F?*-f~=Zk0ejA7k3HQI5d3%ZeG!Ww&9Z+Y{%OJ9WF zG@5+Y*uX$8??Z7U9;O)B^Z?BEx}3qpv%OnVK`B2}kT&G;>;5`J-87>zsGqKNM{qx1 z{wR*2X=%XvP4B{#oH-;i6_b=FgES?(p5Al3ZPR=S*K7bD1}U&;jv2*qN0N?cWO^%W z098MXL^0?^WWTYiphJMo#kG|=hqE1yT|J8XyiYA<0&xvY3AfUZ?BWM=HK9{HIa3K& z83cXOu9mhf%*^pzL2h$#Kw)7`d4BcZVp>H2ayj9p}@EPLsZ>z!mMZ`jfyBg;`jaNwU z{Vx}`3%w#U>spb&-FI~z`zJ)wUYI43C5`lb2*9ysxa%*>F7L(%atB(z(~V}hDpBBt zV&7s^_GqcfTG8I4tUbn1KJgRdc4nCvBP~Wv$r7$BYx!(aew;sb^^N{@CJCqWufx0fuT^4?vy>AAe+ycN#tbG*(_zkDhL9JH*S1 zF*=U0WDi#4W5t{(*FiqidN_X8$OyBXx?wzuE#_&83;?7==f)Ng!*56(p5`{8*sUFbLH!7B*mRV5Ny7YM51HHqItt7c9b973yz={Z zd7Av4QeSC970;D&-t3(>P=siZjoA3*(b)Qv`M{xlyNv|{N7$W8-S>nU0&icA5e1NUxc1Pm5l7zC0o2O6v$3!qep!(m)%}4-1hI0fnmt zeN{&lOTC}mG8EnW)w{dHp`T)sZJnVQZB>1B5e145BW`~neLM0uXdtT=q`Jybrow(7 z2pfGAKqKX$o|DiTRf|*F`S2W^DC!+6ld-}M&dGMs>ry!|y9=6xikTWGv&T+KZspfO ze;*r{7~K-Qwf5u5UmY5xK;Vq*cx?J^Kf~EJKUjq?MV$K!{Jv9O_VWY zB-H?{>r4~S?qL#m$_pj%fkaeLYAN(B}D92#4NIKzed<{Kqd7jpYcdw zt$DAt)ULu<|n%`~FONR$7j^lQwqg!gfl(Q;q(N)H>6YRlaI{LU&Dqonan$*#l?oO_!CI!L~SQ> zP*}x1e6?FFCj$pQ;jHWMnv}X|jDgKk&y-dr)Z);ns4#qOH_F3q(KMh#ygw3}Dyv~r zPo3|p7$N>*K&jCCGD6q7ak=$S2TP3n_^x=VnK9h69Cac?_q?=$U7wij3W0Rc|<=IGK|hY(VZ?-B*`-@;hhiBVwU_ph4I!vt63lB-AMNIXlEZr8h&iR+n?#Ano>>hA(doue z6n~mE-_oR9R=a&covVX`Z>C`z4qPH>yDtc`DeuQ-RTQXA9K+L`@*vjadGUkNVBv~ zYehoyN7KS5Fr^cxK-rZ~fcb{nw`{gmEn%*60>Uu*R{ubt z4ZRu)2IGo(@(*(}CV~)U15qEnEO#2N4ecvLcmz=L-y&a!KqzopK&tU8l#*7|B5L<{ z6aNH*VcFICcRKZ(0sUe{Y^94v-)bL!i5dS*`}mjM@n19!)?XUPUzY#kgMTVE|EapHQf$sECuNRJVqtG-aN-Jt@8!*?;2bqg1JUzQ04lhbZoA}eFNAw@CdAG=Y{?uc3 z4?pHFP~Y9F_r8HN`5d+2{8IrQ9J1+;DF`NZ*ra+NIi_QKjEwzl9z1`l?l{#<=Ro$r zObKlEK>hSauLb)PS96xAo@eZ?9Y} zc?KS4I~k@2azNffF`EOXhcDSJCe)Uwbh{RSkXnUm^2Rxwu3>cg>AR@%6>i|tB57Do zve7sBrz#^xXw5r8BVToYtg$6TkNf9;mAbE@3h;{6s0GhTq%#a!?Tp0bF6(wLv+=$&!vs`N#Y~kEScNt>0%rm6nf%2*(uNQ40RDwaQ@)}&@Oh_$BdHae7$PC_e zXw*3fEYJDq?g1&V<@$b{aJ{h})79W>Y$xIL=dgaVL1r2pE^9)cYj;ZgRPPR8@9*Y_ z?=ehhnF_*LM$)_DZ`FcbOCe`^ugHqYe|it(iI@Op4RVP#lXgE7-G}jH|Ah4qh>iFk z;PtNxRu*P%ZXjH+KE6;Po$A`0%{Dwv)er$nx7t72pEyCj+Qk0HO7D?2zkiI^KWkg&a~=Q0NWI8n1Ob~69{ zlAK(xLjT`G{N4Az2dF;<{r?o8bYi=0dP&ek&%FBI#*0AR;*qM9lKq$hl*OZV)ilLg z3R-!cZ{UQ+OY`VQuK$B8+7^6!0KRV&mpdg{jWhUiX!h%o9n6&aM{ zCqEC*;z{>TZc-|GLI2D^wj-Wu{x(sj=8LFxY(sXe6lp@6Hl~Q}PYqt?NY6U!1bTAO zca|>)m+W%k$JE-NeBzgF2_o5H_b z|L+<8d%FIZzK;ghuSE?1HnBhhvtRWazbh+*f7fm>000~$3~aA!k(HU5`L)V|javtS zN$Sw3i?6>jX!+P}r6IK$o zKen*{cAMV~|IKaK{>;z*NOM?7*a5#@?LU;zi^a))fKb2;-oSGmWky}_lU^{L=$hC%fMg@F+5N{gReBW5;X%Cs2-55f#K`Cx+mJF+~2v+xI+*> zAL%tS+r_}iUt}N#7Gdy z=TptBGH14P0YOA30~DMM>>naq&C~6+XCdeR)U=I_p3ZGcU4Oq@JY*vQ{`&=CFc1uTt{U+mxg^!Ggcnj5yi{q!%_ z{jYBN>LLGkKqM_DFRZ5ePUO}33>_@~4T#wOs`dF75WTwB?+pEa1w^cX{{lq6`~G*2 z`d?Wc>B{{u2=W+r<74K*Yh!_6kI=HC!yL?7x7B74UxsB92$+ z`5TA;uekCz5CL9C_BRmy2|ftFvEg6f!|_Vc{stcww%4HaPw@GxcI+?EW&3AX{gYI& z{R+;n$;w~g!@|ML{fdD934Z3%UA5!CFAttk8w9?Ag9{axJ%3Y%%ymc;Ee(Y(L`Wiv zp$-2*S>E`ILRsT-gUf=ARk8JfTWC`r(Q>=B)m;-me|~XeD?fkJ&|_Ro}6?_UESHZx_0x2~mx6estmeOjGualJXTpFTu0(oYlE*ZO2{8pY!U9y}Vey zg+6qpWt~Lay;(_yJuEMM3H)rbI;Fm*RHg4JB2bMTWmuC!a_mM-|4x2aZv#tRWD#mw zjRiiQ87=~svW|0K55i}q#qu~J5()OwrCS=kGh|weNR!w5uw*Oe zRp+?tey_4{tHefNhu^*PzSUIzlv-{`PK+?Ip8!1{+1Pm&F64-B?Scwv3vwGuPe1E* zK`3s6nkZ-f6GVvi|Xy5mwq?NXm9dAcfq zV6noiK6+deV6|9bS|2Wpm~IM?1*+Cr=-2y?I{p`VxLQo8zo@;aOC2>uAwW%M1r!2J>uC*?#!Ru(Q-P*6sS`z^ z|V^q^e8pGUZDL0?g|122JVHS%Bj8 z+!5n60P>|seYOl)>~t9b3c#!mZ@`o$oo&&$M#_vWFlxk}9w=jKN3ZMi0WN^injsbib-lGQm)W0H6CtmcL+~Wmo)cpt^UjTL(UQwoR13UDu zxYIl9e?*RNEIuWU>n%Q|ju!)8`t~pY#P!?*d*lG(x*xvdkHB@KE5>x!#kTQ127qmy zd%*Y+P}j&YVZ0ouYjDMyP7c&Hydq1-S>&7C;|5IDxd)HW0J99QDAK7H`6l*Q03l0+ zhF3J{5{rCed!zu^B|`m~Vbk~NuuFVhro`#(Kw%)yqB-!?%#k?Vb7{4=D06%bcxvcK zoz4$D)pz7gUs+ro*~12K)-R3kQ2|;PSBLgs01Nfa(c_K4Dg#H3^h{utp(ADbyG8AZ zJyt++U31`gKhUM7IdnV-=nrJnug@F@0KV5RjqLFOv=)J;j*RI5K>8xkcxJ>DGW`ZP zU#l@{ikvDYylO<121mZ7N=+|e+@~86vMi=Q#>H}pN())pyi^}z-hDyUl z{<6MN+2dpY#3g!tw(M~}z%I}W*aqCIOYI%#EsB(-O!cmfs!i1ubqFzc` zGF-|uZj2&Th&8hy)L3&!Gn5+>gc(>dgCER*ErEHrM4Nh|rQV zb%zinrR+#H3}q>hMUlP(1ldy2SXVoN9jN{`slc^m8FkjU^PS$+GYzrLUKp~5aFma;7QNiXUxrAU)10}>q; zpa`RYS2iULD>fz!OQlE}F_g@c$}1TYMVCTOV&hB;hJ*T9>i2~ z>qx?}@&#yutOFe&d&VtPwYXVW|c?ihiLlyBb*ha^1t?s$XlB-ab+&g8EF!&62D7k74EQ6$i?%CT~Z8V zC|}u!za{6EaR?oGOX(g6LXGDWb%@;olcJtmm75NrK#e^nUm}nm?k*6?O>mDzL66$` z1bUP_rECr<$lN)VN2q!j(U~31r0^^`Mggrz*^oCU?qGw`rCj1yMKe$GbZsb_{YI*& zo1=F$K~^Q*bC@R-&EY%Jbglj#%^5qabgc560-4eituY8>U#|cN0u2fQKn;pl$g?*5!!7a-SY;K3dsdRF z@fBniq!v^bc~u0ZKcqpy@(z?98bX;2#c4Mb&J?4PNg(=Mmshv6Fy@$TODhPsR0S!= zLPd_AW>TTjlofx2o)(Ml7TF8DZFCk5oqa1Ql+I_X)MS`v~vrrW1r-|Qc3F4lp=!& zq@6^HV!5OoB&kBsFPa6pL-M3@p@{RsC@_TKFZuB0Kt$3h;rqw({y40R3Gyg-A54rS z#Y50ps zN|C@!2^;T?AvvDt2@D8{q!x5deSlL(FPL3QIw~x=5o_{>BItE3gcYDlk#R`oz+g)c z#P`LeNEw!zBF#k>8DoZpQGh7?ErXTDnWgcikSGws>|6%b7AdH=-&yNis5I$q`oK_k zy^ni@Z}#ye?nd48-06he$U7$J(+jBXO5WtU)bpKGxOMHz_UrWP^zZCrXnN+Zn!lyJ z$GC^`id<#cm)I0J2mf}Ld*H7qY1 z0hUi;T>W^v-`c@`;inpPA-GnxLtI`(S|h3-bHR9GyeH^JK3~YMKAKu++&{wKse<9{ zR@s!cgZ@Hz!YJaCEI!$wgU&zdVt;M861~4-jU#qeYt2!#GQnoL(nPb=G@b>RY(BBh zlFd?`9Jp1LlPO1^v9xBe)Y({Gf6y&wVs1;c|o+U1)gqzgzG6UvP!A3obOdN zGW7D%^69O)|0KO$@o6OdQ~HC>*Gb&$2ZyrmR37>nqK&)V4&s~VGFx?GvkimZHL`w? zp&Sd7-vVnbp&N} zNjf@;E#lRNPP{>6Yd2tYeqrCl72tIg&Bn7Wo_P|@xiSXxW8NB2#5F!NRLDo(^ks~Q z*eHU<&B4&LA2)-A+ug=YW?u5HbIh?igW7s&x~*myeC2pbFVssq0_j2!URQQJbQi;4 zeF(JSBhN9bH5(YRj_myNQT7E4t!Cdr>N2b&&-BL`pEPg))vq6-zb5_Jz9)Pl@`8DRc|mxActH|? z_JPRujp=4Ne{+xK1-1_RC-9tOyJ56}>%zX`&8EsZf*T$oIFlbvH{z!IIiVXiA7mDc zoF8>J#-{x_E*BDtpF}tLrolNH7aWT3#~NZjxVK=BUAkxxM1qia0gqknn{TI3{>BiZ zRTvxS&%Wv1Hg*_`&^AzhG2x@?GoD*MuWof zJ<%uNA_iiqC@m*kZ8rIiZ)#7$0Q{nIuz+Ak-8?ne72xIFbW;#%LKx;y?}Q-L!IJ_! zA!v#k$EUhcehLgs*)=u}_}rGy2ATF>g`%64O20xOGD||3yzU zR6y7%dtczwCCU`uTUY5l1X1sv<4)5ShBdtxs=M9ccP$LmyyWO&4eRqjuJH8^rIr@C z%_IWSv9)bu;35ohwe3OrkPh|P`{wTr@R$+k3XFSUKMeiOBf$3bC@uTZE5=wAs1N%c z_%);J`p-E+v2(E*nOc4}&Ld2dsBXrrrHMtT2bn>7Dalccsvg=$s7HOruT`zUIO>O) zUcTzkoCFFE^YFLAP!jZ09j7|>o37O=nnrNR0sD1VsG1@WYX(2PZ^`+rDz8n$*z>7F zU7PIFlUA|TFR+t(&!y4QXBc;fo*yxY$S7{Zy%*zA!=Lk%CVv*!J=&k#Tc@}4dk1-V za+9Ehhu8)3(V=WhUvXt+xI;CI@Gnu{yz+L&EHt^pM&pBRuBNPRtV8z;e>a6T`Yd55 zQ6C@d>382s++^DdQ?_)mvbWklw4uM0hGHn4f3AbA<+MRVym<2Q3cSM^Hgvs{TPtt% zVZ{!`FGM0HIqTM4re^Hn#2EEiYcRx^HpmX8sI7jK*!J3=s&ehMl3V}!oLK+#R5>mi z^^QQ5zPehg$w}(uTiRh+xELbNShm{fmB)y*Su*Bi8n={8dk~I@DFWOURIiEa+6_v?Mw`0auKtS zbxhODruMn*XXUn?0s!fq{6sGnOU_M*Gqgbb;RU>QNS7#S#uq^?B1R&U_dR|6 zx}(l`>=cdwrKuH`Y}i^-6CCIm*jtSERJX&NOyOxPMUZ?AxGPuJNIty0Yg3&ovb4s! zt&lm^cuuSeD$HN4!ee{FN^DewoD9eEPq3@hu)2jgG}%)rCf(Jbh@jJ zW^p-MpEisR8t*ZSUIPhgaF>W$HVS<#aGn@7{SA z%B+@wO=szNB8xQx>zeT$eua4Us+Q#9nwyd%b#7Olm^{s$`6)%KS}j6VaOL%E>}kU% zG~AghgelzcB6sL{cEZ(%?e|E-(imOL>`G@TJt; z9lj4W&fnQ8l+tzT&fU38Dk!>Wita8c7lr*_oP7gyq+7Rb&`CN;#~s_Yt&VNmwr$(C zZKH#ZZQHh!mp=bF_ndq0f8TxMjrwZVS97nu3cE6@M%J8b*XPnvgI%W)kDX0El&w~{ zawtT(_4;mnN4BM{WY1+mDL;n&W$!|w_9;X4KhQXwF=TZwRos%E*=4DtV;9F`su;}* zs#}O4FFJ-Ub_`p?{ATair0|73eO%jbM2j8pKtP(Z9HO*fU1YK4IUswkRWg!L<~yl? zLCfJVjxD>qftyH>+>)m1Ij1&UPiMy{I^AZQp;u*<-q+!Fuv0#kyK-Jb16jqI5uSSn zbRUr_E6&aDxf0Y+GYGEgOC?`9g%YCWei#(_*dldk3I%rJ62D*kFfc+%U}*`W*%gmB z%UkAmGfk7$jUfaBu_SoBhS4ho^FTNZhjvO$ml;>~TkAIK1%T^T5V%i%=UW2WVGD_ zPKusY#n5Y>YCcuCeq7lsgL?M3KE{=`F5fON4rNm@26dnl#DFUkD4T0h4NoP%VWrFB zfBKpdC2z+_DDZRqyib7nP{{`O7wcaC1SS{8JCchl`t(`G+M2<7eNy>=hY8EUfuC&^ z(q4B26^94fu|&dSOlE0=0_ZM_KiC4D%Moe$?Uw!lv`m3?7$1xbCueq`nic*8Gec=# zO(3wW)kYwX*^LQT&}y+$2u94B<rnv(N;Z$Qc#?35 zcvn(Af#8U(NIawOs9`Zmr6i@dD>cU~f}%E5Gh=wFSV4pGJE_=-G8G6GXQbb4Re#;0 z*wrI3Vqk6)dW>4z2P@^ngy9ia39Y!2X|Etrg5nRe7?8T5X*)>ElMMJSFn!Zh^bmKH znkLqvTiJe^P5Yiy0 zws{>Kmfu^G!t&~I1t2cH1o29n+-I$&ljs^ty|bq=ru%pSt=A;7s~Xm%i4k>C^BV@1 zlO*35JO;nZ@9iAT{3;9d>7y^6Zu{DPTqDk~Yr{ zqe?U^MM%fjf`!{nUQEfwS$+n!M&h{BtNm=9-9=Zex9i|lqEOZw6QbJ@x{80Fy_PE} zy@y_C+P4Jox+v9A1On}a;c%UAQdaLqZe6YCvihFQ9vrbq4s1*m^)r*wWCXLwA>@Yd zr%NzMOj&jV;>sIW8#cB?0=$)KDxwkotR})_x+%{(L}-mid#H_=?-$=|SY$5q*;0Y+ zU-AgWiZj-|yyHbxWu0Et4r~_wj41Mcsh+sjd33E4-6l#TAXT72XvK-xIW?Sa*{W72 zzpU@(Vs`3U<Cp(XJ9aS@u5UJSmnRUF-`er^7zBYI5CTyX4e7z7r#*&ZogWChg(s_gqCN$6b+h za?*tg(`t^w()Z6TD+WF2tg;)1eW&Gh+4R|cb(d4z%@f74q;hm;Ht(7EeuUIWJ-4jzypI^UT-i1|2&Uv$!2iI3mP#gWP4*=J+W2ZrtSShJUg556N5{{DCu zCA6h2OHEI571QyfgT901m9xCLCi= z4t^TmK6d+COpFNJ@#a=wjgfvhI_GowP+*N7-Rw^rP)=sU)up(Iya_aYnp`3SB6R(7 zl&E)E%k()!oyFq)QB+K>VlVetR=iaj97b9*+13Jk&FB0rVEl*}xL?+CyOVWxV90YV zpk3%GG&HOR+POpVEHs2J+I;#8Zd*3QolsFPtkmV_2jmfO2nPq>Xf+Wm===qK*h7n+ zIqmn=_pn}hQ0UNlP=J#b4)*yk<~-fBjZ0zSyr4vA{_ zu{&V7267N1LrZ#vLD#sj|2K8ozw{(b%uIi)B7axf|9c(pf2q`pD@({LDv*CFT5L@W zY$Xkxq~$32tjzWQjeLauPx**|<)?P!QxovJ@TMngWuasFH}jAB?Pu}sKZGQ-pV}De zKLi55l_X3wG!UPSCO%aPe_wvz`zQ0S^MB&svH$7pKQjGu_TRbwGyB)ff6M-v>G#+_ zuYcwGYtBE%{s#`?H~&wq%pY&ve_xw_FZTGqF3BJD*56``--@5#$`1%NN?KMr97^WT zz8cIlbe~06I=at(9RFVU!SZ|Nf7Dy)KcD44>aC2dbP)fo-ufx;_?+?|_151n?C*N( zANPJgkw3K_|56kEL+kNRq3&Ph);}def0bM5Xqi|(bN+AT)(UqQ?b*48kB$fSm)NIq zeYzp>!BHneIt02n{n+R)@IW^bd|wH8dWgW`5x#u+E}`6qsjDG9>#MrZ2xG2cmL&;f z%0pTIT;5P1t5iO>={CQo0`c6fh)dr!(Lt|M<1vEWm6G1(HPJG{dXVXM?o_L@wnrWu z@C`Pkc!Wx0S*nki19FOdgvnBR+GPQa@0$wpT~#|n#)GC$w8-O7R2!AXqEqnI;N3t=%7;@6!cJhKF(7xK-+nx6_D6 z_mGx9)TcL^Jo$;Zv94m@9mwg@0 zGZ)Ojbv~Ylda%^q!2PChGT)ARIzclZnQt-;hR8cJ%HC?OHYVpumTw?9irjQ>0r?of zVwLiT8@RbNdd;4Sw5?;RbV37TQL-^`LgX<@9C=`}kuTY_zgU0Q#)05lcSP3)^Ik9x zkrIvh9TLORgVjBFw91t42;c}530VIlA+~K)C80AAi8MqgE+4xZIQwUwk*$!xP^0*o zWFLHuNj-|#Hyw;>DC_UpxS{qCd$snlw}6g#PAJ)c_f}Jc(8MC_+nRvHa9MaS(vGm! z-?T-~lHNPb&R<2RrKvrDe{5tYZA3%!aBBlZ17Lt^W5NE)mkEDF$H79ZaE)1qUJQEm z>;nUAZ$Nc+4wH$-Ad~`T$*fUq@2B;K+wDS4b+_8Xim6@}*zT)reIE9Ml05qIt5L(B z$)A=7V-k81)EO-sIAw=lFwFVCz%ty$HE)aJFoo5%$J_I;Ld8m&I&Wn}7tLHvY z_ee}!tLm0j@!Ia&gI%=@SWlf;BYqb`G{7ks#uto&sdJ>nFTwG= zNA+QwRguGI3iM25EsFp;>(5Ifi%(?2-O~#I8fp5&0$-XbR{%e7Rk&U@>^q?jhswk_ z{#-CI{=^Pj$&bE<6zACQn5Cc@-ty2Cdz)jnl?eHGyP?tK@GX415HaKgvGS4Cu*spY zQatJ;ATC&8#or9tK(NXA-=&FU6jh#bca0#2^r!l|%32C)n|@M6@N*C3JP62gxgd96 zy1z>c6gX3O8M}%R0lrOXC)qBc@sbB+;BZaa<53BwXM}k0uM2KqEqAlkK;+|U)oM3V zCX+!LuK1SJXlGC+V?hq;o&cMJoqizzcmV_>9I2!T;>R@XLM2PD)}wYyz%ZyPg-qEl zVy_o!Fb~=<4m^vF6g3B9A712I_UmPhxZS`6n?ZGJDEFt$K5yl!|9@_Mm& zv1oPW0kyHQ`9elCOSH*ITe=bbcFIfu(hVJSt@-&E%dXAM6Sm|6rMEKV8AKB(4RQRS_I1**5zv}d8-Ei*W;$wC zwVSQmRi+lSL<}$q@cG9OS-v7L6{xyzEZ3wmuJNspAog#_%ANv4^Y{aN1+hi}|F%|75zg2A)9~9iT{Ii-CREV2csH==$<} z`=W~j3+$8p8&JOX@!$~s22dbc*kJJA;PX2|7l3v%3efA@qaM&la5p#5EB+q<^zrpF z3g9<<{gdhD#`}{2_|Jicjqu^O1e>JQ%Z82Lsxhj8tl^M!>6yI8%8{$TTj!9lVwVtl zTXuuw>ch!qcvE%j%Ftn#fOrRZ-$+k`u_617L+}>C*gy09hA$ahlSjb60m1%x@ky8x z&>om2gUh_gBYOsn&BIp`J1uG!sGAR3F^?ZFAO$c5SUJGuR39%sG@8w1FywFW6U1QH_Wcdna9|P5zk$X0 zGlI&vj|U&`H-MtiP6mVj1|Pw147$F*AsY@jBKbF<{Ei^{M;Lzgl@PDq7Y0F|-|!^@ zZW0CXH^BYL@aX;clli3o4rGCHr1Xf_;OC5vjf+mS!exZvWpd;bbmUP?SLbvf+3>wIxoC4?;P={KleeI&| zA^*W5=1+-NE@#JHPVK1Na1zv$V=!5rRR;I5+E&zKVo?}! zK^_qn=SkYO*R)b96{$!P#VC^@dK1hH=kb@fd##hEhvTNClP00N75wKjows|wH^(eb zH=lJAYZQI{#Gkq}sNX;{c=fbFb*-U`pvwqf?ayY1IHrF(X8*vSrW3b@sM*KWne7%P zKUy0p>=sX^8zdsCEnu2w>WXP3yr;&uKqd>RIsgkQF*)D%XId0Sh-8{>%%*MSs-oP= z+(=C3cCtC3NsC2Eo-f>tvz|a$dYfs5*NMR>{Bkrbt}4(<6^F&sN*E{jQrXvMyi(1@ zNKH$+oJixCzQHPd^w1V9R;}i3zp)p!{RW5siD!=K%0r| zB;K$fnRPGat0}X{PU*TI=R`DQ;-p@n>MnKUG3L7QrGvWopuyrsrumKZ?cVUsk>W=y zO%;xf)ynJmk5T~O5rXCF$eRSh3^(O;36spmAc;L0r30)7NhGVxfsr+K+QFGKoOGLd zKXW|zGvVMS{G5w=$m)`I4Y;W3GoW0J&2&dU%J+Q}KhG~mOq972BP|w=nJb1x#&z^F zg79z1B)=~8rSLqber0ir+`gSM`7l&`)JRNmTi6*ccg3krJ!bfNWfr&%a=yMSaf+pPRja0&5&L^Oa&5f^e!h>h;)K&Ddb-zgvuJQB9*HaFLtWNntwptUg0WUFFrwpU%Kyid4dJcw>{2w&B9-{XcCE8iX5PFHMm zK4-6=zdUx7G=nN?2%IrhS^=rppHqKkV*`WAuPHMTVO#GXC9?Lg>g+0;B7BfS#G_ft zY9jTbj(m?ou&XE60cRpA2cW_%fGU7$hwz;!tCcn%k>9gOJ)PJP!=8{IB54Fe2mi5& z%{4aj{^7+OJn{U|d+;$GYd(mx9KF!)y1e8yMS?vQcFAM0YCfz^=J0p>Z(a!n*1X&gR}rp~Tj z-C$BoH@!HoJ>10oBwkTJhFo^J+`D+kc{O?8d}fpK;iwuwa^IZe*MeS0ZrK#O-4{)v zjrn#ZQm5T{F{knM@z=yZ#Et>qU%YXL?h6cKU3Q7C@%crLN#TjeTH@8k&Iz~+nb3qa z5?x^;36PDMi?BpGL=$rzqrc5~C9p9p6gX}UJ?+xjA}>jdFm$ADgue@22g++5Lpg6- z5k|?<-_hIipo>uA?F7kb=RZHUl4TRfej_uqj|_7 z%*PT)Jjr%Ryu}=D9jo!3=fHQ;K}{ariX@VEKvP#F?#3W-boiI!kc(ie2x0X;931Y+ zs0x%FF)&3q)Tu3Uo)R8ejya@CD5s3=x`-AB3Kom59J)Ufc=&btEVYWZQh_J2$k414 zO^X}GScW^HD;_IMojeSZ6de8(sE^VV@)CBM2EN6=udU~y=f4p+&Yg`wq3A7b4$k@> zL)u*paPsnfN#K6-DT-$*qEjl{Cj7$99BG9_K?HO9X}V$B@d)mSatv=wZm4uuOOCk! zOSB`}mH5u{`0M48h9y%Pv{D(y2V+f<qPI_~qfZZ$H)(wj(BYd}yf>`Z9Q%7TPmrv< z5woIo#(+$Qe%?x#nkUs;WOfsk8D>Rt1OhC{)rivk$Ljb;dMT}N-nl25RwvbJBo zupF4Mg)x!sy;_6a*b*9f?5f8|WbMMlh~4DxC#60x5I0aRFD;YXJFcCzTKGb?yr$pf zjFm$?qMrG__96;r>Qq(B3j0UbeN1ds+*<7_EDOJj3;o<{+IHi7`es`n%s3_0EyA6H zaHMgIOSH9XPrfGQ7#ozIHRH4hwd*MCh57`9Yfxs4+7S@p$J8EohW7zD&H~`_6x)E~ z0YIK11T73^%>Bgv7P`(GsY}s85mcUU6)kd$#1>Jm(@!AGGzq*(<6d7HXgU$psWIeG zwU2e5b&BQs-KY*z_qJ)KK%bZrvr?BWA z;xRnIZ{`B`A+C~D}F+wjD$igm^keVP!)^5mb zQn~gPH-&e-sEOBV6vr!{>biF}RUWbVil-Fvtv#k353&JDmAd{)HeJ)JWTWIoTB)jR zQs!)Kd2iWenaLu~F}IOVt^CexO*L))3-tw9s$Z&>G1k00Os!hs(3EmMOb$0#0a*S@ zK9@=3_oU(OIFQ&tkIy~?TtUDOuqzXp+G!?09q!zBrpG?=LZ+gox@7Dr;+evo@$O_# zy}O)47sOz(Z$s--Nm3rx$76DSMOZmnQCPn3&x9V7F7R&MdnNrPDkW98R^zj4C8R@6 zM@-?gKLl~Ly8JXd&`+*u_8Sqvqd4?WX>KQhYwe$t!v28IIoN7Tp%XXm*y0;_MlJH^nY{Ks*s7 z*%o*@^@^&*`6FYl<*+>fa(^OiWs0lF!O;CU{&~ouA&y8`&sHRpM|x>6+licXS+ielK3KEt7dYD6CisR^{?g#!H6x<3&{I&EJ3fuER6 z^=-NDy1#Gk(LtjK$!kkNFTcB4q%el=gA7T-7Cl3~P|c5#5x+UgBFQ9F6N zUNOV_>_~w)7M5ez{^Cw@#9I)>m$M$0;7_}VqTX<~tw|AVWac~CHq5mLaZ|axr-=B_!dO7)SIfzn=BLsq-lNOOUIRp*QHel0m0q;G zpOGm!{DP96BK=cnYT-mgVyAW&-%eA}AwVp>XAYcHkZ)%f7Q3$^!HdDTWwrxCrGU;kFtNXbH+ zRC$09>cX!N@ld1 zQGPE~+(s5${Kr|&)-3INeDF9&BC236RqBy(>q^Mb!S2LSra{?kBS2_i1Eq4iL)lS! zYhSu?54pb1a$ z&LE&#&f38oc~@-M#BoI4bHLhxZQnlD!C-r|EJ?PY_uyLAtwZ&n@oxEj3zf=&-~9?E z3sAt{>vIA!z%!CH2fw2g9zf>te@yAT7EDojuM#ciJ^IBvYD^GHyVD35d3p0f$hqwA zPRHWN{>YEFhV>%Z5-+*s`^K+Eya)EC(OdFe-~XTnww&2tMai}49uHM~H0pA>Iu^!Z z68*eK4}Mv4pt9cKMrGo~=$PVJk^k6pWVTZIi(P6iH1SC4An3r#6{c1M(b%JNa zMHIu3Maq&Uag=0b?XgGKTMQ($cHkMeA_h;%(pk3|Au zO!S+0Pcc!MX2v^8IYPyL@(*#gGg=W{tUOJ-aQLR2v()xOj3?)})6bUv*9&)bdsD9P zRoE2=(lT5>&zpi?9X~{&SPO(-q)Jq6;V**Eq+YtP<1!c8Ba#YE^JSp)O<>^Sri8a} znK^YTtGRXDGq`?|eUs|bexcoVEZ^YQ`vH5B>EV9+xG*5Z4N92e#Y%ddWZ$Zdqi#>6 zlN|_Ju@P5gd}Ny`e;qU1o?#!*u@3u&hq)sz8{G%Vxr{UJ4^{eP3N^Q4he>omx?*km zLDfWQiEb!Wn(P!1kC1S?om_x#x#7!s+go!UE*PaZYh$0ArYKRKqAW+B15cExIbfR( zZF!obC!q6g0OBy!4<*-2c;{l4NU0X5qy>-0+*w1+661MyTZ!&fo72iAOXErNv>cf+ zv;Z2`9`oG3Ip=qx6DW7BV9WgyaA?qAI@WN4DLF%$#x~C__KnCIW(n-qZMU}>R=c0n z+`?Mj#4Xg@R2XTgAU5WlLOF@LMnL9%>toW}cGtzyIXd>Tv>f&o64Z2R2D|at<|EK8 zh4t7bTk?E-XC_(W_G2}>Xo-o?bp12=-( zg6rBet-wwfIh-b{n?3l~F%0Z@fUW7aYCVBrfoO%zd@8s?EZpUgPkgNV?Ic5u!!m4= zCy_lx2T{}NarB~ROkc1(c)ve5eQj>D9t8~9y<->{qJdV_(Aeu%WxrJr*wW^y8X2jhEB(P?))^dxB#$1nbZSIuGKEet z-@#)0VlrR%##Vasoi%7lbnftJnrAjQkSx|ky^sC?KT7p$(?m7Yg8uoXX0r^{;8z$e ziqT^CbZQg=^bwG`E2HoIQ5ZD~^Rh1Xq88uWPQafGY8^Eg*ot@5K(msa9MSj4;>35s zr>F+kmn~}>+0m{cw??j%5X$)yloMzhCk6@o0NyLK0$*!Fije9CpIgzXI?N4On9Fi$ z=n5{*PCV}(5-E|fFC{J7E;*mm&{L0B=F5Bvg>~K@pV!Pfoz1s0fXOc%7todS+ogsmJaCn%dsN&A(n{LUW_W}yQud!%0+8vL%^Qw z#J=ReVCKqSZ4_()d@{f+I~(Jo2OW^>syVlzUHJO9gc~@9Is};Jgoxs+g}e8|4yG6f6za6q(h%=V&mr+HI>L^5%3N#$Q`Dp8qs55jXGYlR% zPR7#9y@Y_lg6;yV13+fhDmxfK*P+&zVme!tCSY4#qU(#oNR;`wGxte5AURaW%mQ9PX-=`soCJEy$=?qPG-*h+v6M2ZLdc+ z*J!JJ9;g!Bw{M`|HA+LA^`&x(2J)^rCOZ95lxhiJ>ZqL(EVJUl3{Saw ze#)FgIvikbQIOuJ?3m@P-3e)@Uf>eK!m<);_ON2k3albY4(w#$VfDoOMdVFUvA&5D zd>%L9!B?Nhx2OpYgpbETBnuV$5eI53(vcmwnuWp(iMwjCySqCR)bK^Iemy$#@DXzZ`=GEV|F4s;kFW1(x5rM$YP0KkhY4wJQnwgMyFuTxhRLLJ+ zsWDviuG|+MciH0I*&wO&E6(f*jD%5VIzx5f8SzggAUrf@QPK_|XjPSv4*HXmEfyM-3_VcX!uY` z%Nquhx~6$EU&tT9>euyL!>o|H0IQ2yz&;u`|9XXwJyPTpz$20{BZovDL8~EY%(o~P zi;O#7y86{-;2OVAAqCUt8u^*q_U*2o{d4Or)ui->2L74D=6B@dk8tqp0nZ?hEUWJU z%1}pFr?N1GrS*$vjfZxj7nT~=o4=eMD$JtZSO-V9U~HTm&E zZ?vkS=X;Js)*aEA?{*zk+P#}GWUy>ZvzTRc@Y6G4$z>uI>v0Zs?|JaB_E*V(*M(Mq z3@~mw<^A3B<3RdW&db>W&9guFJ+0({V=~nsbo+RV%PkgGC)M;Rd}d-~<}=OMSV04- zVdj^}eR@_XdKYfPX{ks(A_?hW!%Fx$3JpPrWz3}wnNaurYApnM0EignCkn%(X}jV_ z+OR@9L##VpuO^fNFZpy!D{|vhNjc6P7K}8dEGHsz+5;t*+&(@?Sx`ABX|i3_ z&>F1ww3JtCA`LSg?&p#UH!1Dg5Lna5zYOn`IAYXC(9=0<818~b$5FGLE_~dc_#37& z(Fa0%TN6(;^UZ3_fXa3gmYN2cjkph-6W-Y_Ss7DGrYgaAm&{Bm)b*=-tB zJL{m`&*|00ZKD;R*mg5Dg8+s`H>qd}L0%hH@>^#y#*I~2O)Jm8fpt0G+x~1UI1;cn zG-9VC$pnEQTdA4TZo~V|4V3F+9^_|K(}s)wm8G@>6HF@)ziU`|?+OKFeI3uXWtAFc z5d5jyU3{LLE(zjx5GBa$w$;c|TCk8gt{%~Mkq&x&tQF4I7S*un z8MhzLUl8(nA>R5`c+(OKaMmNqBSZSfEhCZ+8VM#ons#GRTlSRSFr2&9Moi*6DDDG9 z3=j~X;x*XFUWjzkgvF5XHCX&Ms5u2ghkhKs90w;RCdpVtlo2T-MD^ue#gY~z8ET{% z%#yJVdjuxgcgd_zdz8Plf*Kvpbl%dUTDux8*NxyK0Q;}2i-+MOluTY#?LF4Rbf9QM{pZ6!MO z2o%&+39opCTmm=Np~`OF_jRpO(KuzwxK?-qO_SE$^l`rUigs!HbE6#ELS@|m(Z{e$ zWv94Z$02lKg^hxZkr>Z}}rW$+!n?Hb&lpoA(Hv3X$G~1By zSWHg)uEP}q%CF8SDD77D&00n8z6*Wtnm=54cCTLy=9vOaF>?ThXx7hhZrD+F4SxI$w!1(%Oj2M?}nYEU1Zk6c2P+4wIpMOf?zM?c;KTWHVF)2+TQujO3U=kEUm8M)*}}RD@%^Mj^z91Hk&LZ;##`o_#6erY1)|6K zW8ag=)`0+V2C*NJ-wcXAV_!oCjoX>|pslTjlReX_s5MHT5O-n?s-qoc>U?2K zgZgQ+_Xz0RacG*e_AW1%mVEJ7t~re(I}(X3zLusul5YbOi?f-u-`@Bt;4Klj(8$Pq z?l4FPhse{~j>e0yy-c(%pIm+p#-CRVRYk4Wry+UPTvC}B&~V-SnlEvQ?0mh>^0*jY z;kf?%GBc4I*K(XGx{%B2@gSDN^~y5ZtsWP-Xssn}E?OH?8xWyKrnP8u>ult!WRzR(0 z<$bF%)= z{<;4MTz-JWJ_PbJk}T23UVZRS)!4G;;7oj7m!G*5LX&XUF}W090vx|8FFGcA7wna> z=r;ZsjjqxSqZS@3oPj6Em%3uNi^mvD+6Y<3SU6g)+a=fY2Mtgpnp1GMu`8qZP4q}~ zH!1vLR61EZgPr_fa*e?DeijL~;_nVJv+ZyoRev8xZEaFY5h;CB1v70eAW+&^Uw%Jp za^!1;S>{2TU*`RN8oRVmXQ29~rGTLUnwe#jC;Vo4Ol7YH!!GEl=QOR*}L%GG9-COlR8B0-aFYj_DzG8_E~oEn_1IbHeZ|E z=NJ^F2t9wO@zn)z&+V|AoPI?RxygwpkuT%T8yC}NueD3;qpm@Nh=%G6rx21+VJHLo zec9L)ElmyLT&HEQH$1~+Qj?E-nI_a zVCWlarErO5RbP0mS?=axb=NVVNg?)5oI?0>v|&0V5x#|AfxcFN2~nnpm}$D?{dbT5q%{tm^1iNl<&8Z#*8*Z*W%j+1N{ z03@1{KXrUt-8*ov(dAS~&wOg#%25NP6jHH>J-bsRD35%DoNS@8MP7_P&HaTxh1@6G zBDG>#ADj8ddL?W1jx4_~)-Aw&a}z_!^Cuc*g>vBe`e9Gp+!#^WhZo z0r{Ro;x*-+29pZ!FaQ!Ol7Q!^9Tpru3!~A^@R>_gm<5>CbS@?CAH(fF!r6U7!|h*l z-*vGm@A}8hyG`DtHDkCd@wky@v3pmXT4N?&&` z8;JK?15dLszo{rM;ZjpcufWeoU3A*1_<5tX_=qa?`T|l`xHk0+Rt!0Ty}t_Qb$UI5 zy@S&rwdJZi+pwPlrOvC)VB{hKKE`?Jma3MT-f}-Bv{31`3)ji~jc0MWnpwCR*A<-l z!f$PCz9gL50U91ta2TdZ+!-VwqT%ASSL&JKMAt}D8CA{J(%VF`YyR__4Z-7^)o#;{ zLv@Ea9D!$-=~!vR4xuESq)|h1{Y2g@_`^yru4{pyIXEk8Xx-}4NqqXbZ$C^JNML1> zP?XX5^HoE%iZCKFyCvG*m$Hu)J8m(IqU#0sWkEIP$2)xW4b!uWj-+utI>TYM^e@|x(VfyDRz382zrk5nh`Q+gxcf!K17UX z*S(BdLC3ZM(61JF&@gxETCXsX-yAoy!ihQrE@_2(ZhLY)gPpdEZ&^&@6H6=M&^_cI z^nbXspHT#5BO~jG>bY z(9xg%>iIOHhF(`nWWzNi*pq{YqcF#aKs+}uk*WTHxAJpsz@(|#)F&X_rD-T}F51B{ z!x~}52F(dTU%PIxUhhKSsr@6rf^sc#6LoHTGO|NfL9vxNLJ_ghOV4k3qqQ_EofPwW zy#9>W4{Xk6eOj1tj@k9KFj&hjKxCu1tg;j$z*gMa-ESvz$e|=*t|xl}MyXBSN@Fg$ zpz6rst_@UuMFTC!EE&rWLG3ExB{`}pH>!#_5-u#0($?RH2SW~`cTUF#hXbAqO)`M7 zgN7QcXGKT%+NkIC(>(zdGfl_ACQmK3kC2L7xlWt1OmvaXLHBgIs~6W$73NPsCWe&s zi?~c~TOn>P@K@;&umq*>m@z*DGhN(VB*@qCi^|kf%TS|6j%wJCazA7+-DxJYgLS+JmC02bfENS?sC10B!51vOB?#8&IpUxnza7|kAj*^@u-mH-M7CvM8szcvF!^DJg<+D#*xmV>kDr6&EwbylG zcuGq0FpmKk&>iNR+J ziT6g-n%zl)_zKLS{4F`&SYTQ9~6jhuZ#$$VXX2=@}?LJi@%1P*{?mNVegr5qc z6Xzj`)_V=GmSQYgh_)zI&>T@8+*^b#=391L{4F^fIH>p8`2d2q zaL_4f_MtC?HqcB5VCKJ?{lG3WJ)0qE&+)i1_|lQ!leuPxpfnE$$f$_Wl%5MYc8n&~ z?f7kPBUj{h_tj*Z)+7tiVd^Q~l2-0Jtxx8W59!glo41}}s#^C4DVscO)@q;L_>&&E z?on7!KL$kXVD^iWHJ{S?j^5agVV%C47~a+z?~C@&23hb7u1loEl>J(W0%$%x%iKhRDB;dOJb(jHp)0B zQ%yI(Dg-IzhHTd?ziF1}%hnEM|JIRgxaOE%$RVTdv$VyknZFF&SM@mZhWW1P)unad zBos)BIm$xjkC)Wa>xs#6FI`z@BXwTf?_b2fMexH?JOe^;Lb9%vMjw+YMTBky!qg&` zQ&_*v8YzM`&br$NUOt0v;ldH?>q`H4g1e#2LLs7-Djv}Gt?oln!iG~7g!0?n0|P}D zPX;^`^`%f2Ms`3C5yAtFQqy(4{R_{-?EG+PENR_*xybu{y??$0effh&bdYPg6XZ*Q zs)hYw=^C`soxmP*(uUf*_0oB5((pQMr-5tHHo{I3;sB-Az$sDb!g0iN>eU`&P2%IYGmhSkAeAz8-7GV^AsxKv|=um zOD3d)H!Yldk*#T?O$l8(p4^FdB4{`27Z)!SjksD>ZAA#e2;omen=)DX6LAUJ6x0D)y9-nHkxJcQrZe-MQxvC}5$!=Y+1`Jhh=qI z@z*%}d}W9ExK3(lMi)s&Yt}@95uPEVF6+{5rOv&5tJJ$|EokysbkJHwvX0lI23Iib zx8%5pWX(A~7W!cF@_Z=VXjqlbI-3X;k4*^45jhp&(u%>vjJDYM6>y&FrgB2aRmDiY zzPyS?U5TNkzCDb7amB(>K~LRczJL8{qf%UIK1@!&qu2+76XwR)H9%eD$+gS$7<3eU z47o*YwIyB5W5khjw=(u-dF;q878YjGwO1WrGp-P^=`5vEOyhA1gY0Y<9G7*+X1#pk zM3nxL5tK2IPJ|lJuH9YY&?@%OED#3l70&P8FDNK2Ij{K| ze%yX3W{g2rc_$mh-@pt~c-cqt$@wWi^QzmwY`~J9IKPOKm^iOTS;13(EXpcXn#QwM zHU>kb(JE_Fu0nUCGq8-Jk-8<9c3@+-Br1|RxPjZ2&?7{t2f!P#TP~TD+VB|g$njJb zlu;W(-=J46ygPnxNYz5M!o9*ctd7XQ0wQXXzj4BxjZ2J$J>m`CKXOgFhm}c=GTZ3B zz;3L=m61VP96$^mYCamRXKKFovU z#t?#PbZZO2s<6Ae$H!w72nh>je7Pv8dwe6cIE5u~!MSLiUG0bph*(&Q9CfQGW0DV^NsV>kTJt1r`~g)We~6$GWiSG`86!050AxtA>OLK{;2%%HoorI+u3buVuv#e|=`%Ax9vb^faFX zyRjv=SvuXnMiS<_lDrN9`mCwa>)1?u1a`*mAt*Ao>q41h9|SMgs#Za9(OijuUZK-f zj&;6}^7#0-InaBGnGB%Mv*yEgv6AD`%7%UJ=yz526X}(#3bBjcY@lzV-wFYFdm%6E z@}+^w2PTY6`WS~zU-94+ZdbAtylzW-#_{Wm_{&!)S7G_?KOmHYqh)BS8-|3CS3 z|Et&a_oMvg{<{8s_80SCZvSw_{vGvCFYbSd{EwXfe` zbM}AA^jF6J&)ff&>z^LrKbGacFZsXs0RK-b{cr8RpNmHM+eFLsdGgtAnfCwF{>x1J z@9e*ydpZ0++J8U$!2kZ-{cZpKgZS$e|7rha__Ou*U-n;mCR&EyJ)8fRX7BMG;M(5> zI=MCH*6b$qUC&>*Vq0vrc=*`-y?upwDgkf-fAGlgTsnd{AcA~XY?sklcp)Ij29%$i zyW>H!(pd1Qez{b3l9>-Gr_$elD9Hqeb@aISn2>gIaB`Sy>U3fpq3$rpnu<&CC!Ssn zGor@5&SDSVeXyg}8kc=Ny7Mod*R0lm?|-V@)8zXewol!9?CZW%7aL8OMV-w2^6H+F z&ZF7}fcQjLA&917eRWNKW01u2^^QuFqiOP-%lG*Xd7`uS(*2rs_@|hm76h;2yMyPh)Z!LatQLj2#cOxl!UU1!NW(xp~Sk1cYb{HmpxxoLim?XEi zjvSd~9#bX6;7XhlztVegl%h^}hl@%^+#xVEoIrAa{C@yRK(@aOa@wP*YHBXy_mCwB zTM+gm2&5D7ib4%f0?0KXu-bJ90@=*(BHajk5Z*;#H9JwW6E!^6w3;gpv z(EvuUt=AQ;{I1!}_mUg}$N!37LqfRstU}sZNY^1vqJDiLy^UYfGb~_i)}TzucZhQc z9Nz7Lp3&ngcgUH#2062Fpk`w)Y68tJ{sD~Y0gUPajOqc5>N~^~ci)Kmji}#<`i*k^ zMndIVg%X8Z6*3R>8101`WSX^nJ3oa~;ug~i=~RA7Pi0_ta~D4ux85ShoB2t|uao0W zIUX;^E9BM{a(=O#Uo7XFh&#o<#^Z7U+=Z!4pC-Uc!1fD*DA0wx2d@G5eJRW71 zp39#tr{nn1a(WKxov0tnw-PhbG5jdGd^XA>Q9cW0mX78}^^6RZH!nfC6KxzZ@~nO& zMluqMITDk^YStlaMmQkXbRu4Xupfb!ds2QRel7Sl^Ub(I!aXFkNQCDl{F?9^&JRaR zBi^PFvBWpveFKQg5SkFiBXlC{L3kHI#Wx@h@-?I!K|*Ll=t5B7K51N+#<^cUKylFXa=MrUco9z+=b> z3^{>U9Vi8m;{ZCvWH-WogaZg{!izB(#h8p@ykIe|FP3{L<$m9xltbXjV#F&DPVd8} zrWmhWjAxy?3#%<3xa~*fnNf@ zV*E<*3*#5UFNj|NKR;G)J$~!(yB)vV@LP-D8mxwOOKNwD>#SK^v!Z5Q&8C_yHM?t6 zySUl-b#Yyime}pUiDr}9-7InfnMn-vUvm7c9A7HOk{mlE_e{f~nT9uK8t$8ExND|i z+DyZ_GYz9=8p>uG`sf_Vkuv--WmumwOi3APQ-+$9p(G)JSf~muBRXVXX4`KzV3>Af2y? z=aXpYB>{IJlj$==MN?8*^_HqrC8>s}N>v$EiKKgby}cc!Ztj*oN+wO~qd8V} zlc(FHY#XO%EoH=a=SI^b9j@-f3v7~+44(&>=zI7t2*RC9i zfeiE`LDY}jK|(B%`;j2)M}lYc^K*5qUyLRBetx;1e^9@zjiJ_&TSJKQeH!IHjf4Bl zAKYiY+-H8F4=;~jzQw?OR0l~&?h{fSl*fL0AAkN?|7)Mvf9!MGbj}-bTH)WabO#wj zKi=AMb?dxHYgeRo9zs|5n#&hByI0N$26vDa`Y~$?cJuMBIdd1VboRVH`f+65$nKWN z$l%s7@}+~@yRT-=VvvWcJAR-qEv@&klOrtpktSnwND-MMe;3>%x)vw`^G#hmd{!?3(2zO^1o%vFGI@Kj4UJIT=53YdYQfj zfQ=b$UW2e!#?kz;W$nv}yuQmWBkbwRS#&`A&5@SDyQx?h)R~%^|;`4cy1VbL1Uzn1%(Cy)m~Yw=wqsDI!OC zU;l4&6}gLX)nw8|E+f}s1S`oyWFKwk8oAxMTQR0-7{dzk0@+Jb0H`i-bQ970m*ifu zgS<@klTXPPlu{!tp)2VJ^g{*de=Yl3?(E#0++xy7&LwSRC0cznMw_|m{B-_V{*(Uy z&K}J9aqmgwa&jfPhO8s&$CW;!mbC=`ZL_ z^mckDeUv^!pQC@{6x^pg&tEV6PWW5)<*F(G{2wpdhH8=+LR^(pKeL^Cn7=0VT*S3;zWGY5|738m7Y@li~Ap-Cjd@r?mF%n zE(h*+J^z;A67J2Oo4q)DZ?-pAof`+(;=y#eNHu;#0Zo%hJMMi0X7ge46jr7e(DO0* zmO81QmeaH86grJ|(FJrdT|$@AYv{F@)hFpTx{H2H|46^(1Ww7>Fi$CNE_VaBf!oHt z#(m5k;t78qWSFJ=HT(vC8~-l0n+&`!P{{G)) zOS2=h7iHIEU&(%){Yy@l+nxJ@C`mcS*iPnSjK9G9-%M^Nn*bkAVT^w!Uy;9I&A-Q7 z@Ki(H7;!*ew-$_h97aABEYk(}Eua@-{#VkcX%Bso?xC;Hx9DE_KK-12$5D*F6u)8E z1(Uf8@DBHLPjlVeAMpEu`-zW(>#yXiAXRkXZC3HO;C=4lKj*&?IKd`V2UO33F<;HM- zMBO5?fxd!w+(i~~yXbGQF7?=tm(n)+0AE3_qf0R(L&$~Pog~aH;lhCD$>e|N4b+C6 zdmL*MhkXNLGVpr)QEILL9>PhHsSChiA%Ew_j) zr1$cFrH^vWWIUP2FXKkhyR$zC&3qMRY$vcui*ksXC>j(#p&Bdx6&Vg_oDU7j0^xw- z2A1bP;E(3obD?afqA2@0xf-)`7O>kI?4`5FXVgw-(FsD18!O~;Q^?cY7UA=pgX(FB zyqCic%WkI)G@1+2r8ym)00^JObT7gh;U?iS;abqA4>Irs zYQdB1uu1`3w>I|yo|YgUVE=0DQb2z0Z@G_iPxSA{{T{>E?@*2)e^a)Q5;C416WmlG zHBXY7hBr108#<)EuBN)GvZB1KG?Pvx6D7s*STqt21p|Jc*W-3M9d?`5Vm67!B7fUg}`%^q+27Sx`N&Du5KY7IqR$pD@SIdV)khjUEM)cjT+piJIJn^jiy08CG@=D zjGj`yr*yI>6@v|=A(IZaMuOe@Mn-~tbozv8$lo?H(jM$SEa%6``So(%fP5%~3xciA z1tWvqv@6)!J?ioWt6RH9X3})4PTLY`nWxR9$yTinSsilSj>wX&)G?gO8P3rH z2E1aoJ2JAh+ZDm3xD6j`oqc|H+k|PYBR!!|dnVmYTjoaQbQ8t}rsOW9MSe`TvZY%k zKPI@a8*f9_1h=O5tX|tEk~v)|{rQpeXV0A0&CkX?TDwgtJa=Tb%4mPs$lo#3DZuy))QiPXm7_oa4i=b)wOyQ9=#STHI_+A-P}#>)4J(R zcqDk{nEY1x_setiv91e)-I~aV$b!`uc42AUtGmg>t3o|)x3nX7khoiet0zs1gu0tN zk@ndmy<4qh^~9@sT~g3BxFwU`Dw^^WyS2zz$mk8HXXatj^KEiY?#^;!C!U;H%ElNu zyITT8%?)BC(;|4MdKS&AC#&byV*&8jPH|QD`B;&K-I|uJ)#6ZAk5{DKikKJ)uKs}l z0wRb1KDcIfp+*@Ke;}-p!O2Nb>!z~@^4+OacQVO9MAd>d#TbXn<(f?T@;+{1WQiC= z0)dFMVQy!)4=uy=heB+D*Yrtb4hr2XCrrzigJh1Uhe&0R8@MjkvS*;hHkq}o9B4Ut zc~=CGybVkQA+~OH{Nz8QXt%U37}`zk|4Z|{eEZn*B4Z~^pB8Lg-Bp0vv6BXs^6hLw zF>h!qdPHrSINn#%L=d2Jv3DqXnxq;!v>WH4Nt$CA3F&shZ{R-`s&r%L2aXe z%vP@+6$y@7-L-mlUvA}`NKlNd-T?+AzIsV3&`^Fw`*J(ic)CZeZO5xDphE$-92v1S zLT{O{Rid|?H+|X;Xj+1|Oq$jM)~2OvM0(8#;k8lUV41{3_Z2a>O?m{>WK!&h}7)Bs)n|qK3$qc!Msi|O0kz)Zo zGy78#6|}U>R-z?3Tw#E0WrW?uggP^^urBhS6>^FlQkxT;wp*4le5i+x73rMyQqN54S0|GpA75{(%|smtkBGGD*Tto`e<47 zPqFRs7mE|cPb4NJ9#6T`sq{~oPfA}YTV4K_ikmCXs>)!vPuIO)e+lFm@JhmbOdpTA z8?{xb>ZAH?Am0jsWq6`hDv)`e=Q+1V#p<4?#HAj8jWczwc(h?$f5W-rv4(MCKa}?k z{S7QslvkNTrdY@nnlF$OL4MB(NkNX2ps)vgvzB|De?@p7t7IZwTZca950 z4n(*}q=pZV6J77RIG2kbR#%g2t}Cf9+&x2eq=*sHv{4s7;CdxRZ9M6 z`f^|1v+%;Z@4oQDyBn5Gn6Qimdd`VsMJk<1r7-i_BDEHoz&#f(ya%1`X&mUp|G4Ph zdlxOb=blC9Enj{f!n^%~S+CV9m4!4bF1qL5i&&>g%a)%v@v`NFavj+dki)(LhG>(D z6Z)jcDI7%>t=XcwMCCFU>0?hw z^!sI$qZ1=Kr%9`SJKOijquIW<^jeck7p7yf(5Pp!C%6@b(IzyU#tjH`3v9$1v(jM~ z6-ta&tHq!(UL%klN8G+gcG7VJ<2}a4dk6!ThdXGrR*q8*ERwmVnk&vPqr+~tb1VMi zX#cS+o69~M*1Is;x9C}qJW9`c8>4mV!rAB9Xj9n_x%X%(aCMdBe3iUU4w55KAU!Y8 z|KVOC?;Byl;8ZWtdx6R?roQ|pKh%GSlpU6*FGLH&fx^I){lpV@MR;1;|7m5!rG>ek zlAWANuy8AY*W8kx?7_P#IG4b7*16bEUy`zM>_)awjbJ(PIJe@;D>0^hxxYX;_z%zx zFR)UNS|@y}a}`~@gZlA&tmin)46cgFFsh8?fti~et#6x9$D)6XuOE6Y3z*t3aIdcw zOqWwepY1hs+Q`n__k_u zE6T7dlDY4tNJ8N)3KWIS7pwhVGbyFT3PU(j6lyf58x>}S!r*QMW_;)QifChztNhnH zsS-?VJg9LN~0jsUwV(8Os)({Kli@}rZ7crs$c zZl^X;hV|lj9AI7}%G=aow>ucpD#kAo=4`-R4*aSr%{Bbj*U!6u%#EeKR-*&Cu{V_Z zM~e1IElF3&kkPkoZb>;yhMcu_Gxx`Lv;TPL+F>=JI~u1fdzXqVAHJhu%8D!YHAY;K z?7=-duK0ap*cGLrJq&^mfhd11{0Qu`wa2XX^yPk(j3y;fYdn&t&D`b@G{&9WlSEH9 zN*YnGH;ON7)Eui(pvFuU3XZ<4E(quYM1ci@tF>b+37S}976dNrORYA zs2OMQG-l!x?4=Y9ZdGzElcv4k(WMlEm5@FzXt{V8j)za*l!>KLRLzA+!R|I6HO z7fRFvGx_-og^5(WL=OR3>8JsSV#YR&Myq%C(Vw=-&)!96fK}j7ul}>CG1hG07K24} zpw^H6I__eq$9^@iE5&1AR*r#HVTktd;U>)QA@MLR%qd}WDwA_>AZm8nW5KvBhk!Kynf2M~p|h7Q&wl=E2CKi#{YAh;5iES~qIydDfVHYBD{D+cqi09Q#9Hbv zCCU|{o9piqHq_i*|7gu)^*by(9eXW%t@|8*wEW5Ocgw#VxiS;GZo4&%g){YG1--~5 z)J9#Z#Kf0jAWou)c!|p&EQzOGSo+>z(46k0xAn#wtBR0rH#aIHjkSH$AZcxlyw^K~ zcMmPwi6!uI*T0~14XIKn4S(NBSLT76u~-bNA3Aid_$AX%Y`p0qP;!gwEs zHEOXgz$0>nLoR_EQpwzEO?81UQ1X`LSO3tr=<8CWLlmtWpS|Pt+0S?Q-7eQzOE=tq z?bJKcqDg0RPQB{>P4CR%p03_L=bo=-mWyW5XjfOUvq*b1`_(PVIVbDlrN>B8d_xcXgfY{D}*n*5F7*SirVALLP(||8TUcyAh7#_iF9FjD? zMnTY$c+ApA|69^H8ny05QAJfdxtmCWTeKZL=f|Rb^iMB{u1rkO4uJ5fIU9Erf)^x% zjy(7>R=Sx=Sp#>XtLbXvtiF;D{s6pXaIvahM^GQj_kZZ;J>!N z`D0D2E@U^m%(uPu`0dZOicUM1VR#7W(~Q}51B*mRIekjfmxis;>aaiM5BcLebH|`; z|BF;qBMeiw2xHZgh3RT#3=`ao`3)9Q5PXy))zQA(hmw|I4_qBp8~SkN3PBLmR>7){ z3vqSQGSo8GGQ)DA={__6&0x_{g<2I<#$Co}Fcz8@oEy3-bXCc+ zvL)rc;a$m(^?%WRsW(qogXs}X=AgwIu=(vihf8!C!X#?Y$8>QmEidCr)1V>=RVt}) zD2oiy3ha?bw`Ur8UgPPb|0UT2jaEf*qsHL;v$ByS#bhv9o)nTVar>ZAh|(z0bC10c zZY(dNMXrinw4Pp{$62ye!DvT+2bf{dyu(ZyJbZ|)GNXQZ3J77)8%qa6f<-i%jAkRR z)EjgLPMH>x5)E3yee@a0M&erVar06M7ks$?Shhe#bJQE2Mn-%O+9_caAp^MIabl%PHzWn&bFV(g*m2dv& z+DY|JyUAcqH2yZb+ZBI!@sdrO=gpqpz*&}Ea^R7>f4X_iv+qB2%fe0b!bX?bp|xhW zeieG}`3JVFz44jz>aZ(6$YuGDu`6w4$E1Ls1-!LZYOpk<(}B)(75cN4=35@L*rz|r%6UUz&j3kH?hsMs;D$o z#4ykqbeqS7_!j;gw9{z{}{t1JfD3|Z7(uAmBOO9ye&4}eEdzf$th~hz`|ca zX81~$8DgY@u98NY9}mAxz9rx41-Ia{r7}}f^EidBNN{?Jtj^WWJL&!E`*jDoP zJV_re-p=jT?$qy0?bE)UvRp+U4RICL3^YZkU3Q%sUwYvgwoe&QIs_*4RHASgCr&rb}`<_|JmKxWFK$m z?0xjGq^k-xihoWwYFw3Ph#dgYqf8&eP|=q%pfWg>aZq`t!V@sr1hwBBl!(^~JXETJ z%uucX84Z|#kvuj;8FiUNDj;B-5+)d7{dY-%bkL5aWGQ5c9VC_ex);&_UgYau2nj5e z${`~toG2-r$WfM~ET?c<^-VS>y4zTtjn&y$9WdajzxI>#8`QgQ02KndRm!^4lo*!N z^1Nl?MF%%;K6ufEGm}F0(eoDOZhpFOFg7Q(inT} zI&}|Gns-4n<{|>MZ`bKuF7GKp6&krbcge(6IzS3#cEd8LbeixgOR#dp&uOb0b}kG3 z>rP3uv_6-F-vAqhlT4FLdy3vI`cynv^jGmn(NChv0pj&kZ@G~g`>0#eV0^~^5nr)G zWoVZSy6U3$jdp7P%te%iQ4*-Pj&>Ynm<&YzFtQ*}(2EQj9uG0UAm?+FV)f(O>JUws zN!8geY%Y^Cs61_`?_|rvX1`4jH7`d#$z2DD!2~_*Xxgy@^7NiwufN*dm)j$0%>HVF zgs2InUZj>n>XcJwbqnj|FgvSvs$Y~ivsh+`i2MR|&_^3C!5rX_qee+>qh5;Fm^82D^56O>K1e=qSwNU{E*p zG^e3zEt7P1TQp;jX4;?we35RZy12t71(WX!@KndnYlL z+d7G%QddG-6sVKb!%L_m0o7H+LRZj?KYFl6DuQ7(B^f3b^Huh(tOQ>zkTYK3r07kyydOE z_uf6$B$}KJT^rkO%6QKe9k(ocXyWP%tyY7@Ir5ixT|CDWv(i$XAl$p?nys@hSsQgl zo3`GV-TrF!pQA;m7>qX#s}9^fbixw&IFR4m(E96z{d+i&8JmV4q&G}D=K=*gg#p`u zup547NvKtxmr}JR%&2F0x-K)?e75_X^r#F(ZF{G?Gu@W?F=D_PNZau$NVx6(E6?f%O6Y-2e?FJb?hTGGUL~olYkG9=FxwahpvhKbHYNo{2^x zu(=cJPZ>)CaFi+4xH9Ru+Y*QJ&%F~)X=yrKvL@pm$*5@}CTfIo=b-0^M*tI&e!iTG zn=*0pPCA^Juoq0)CWu{oBoTd$CQ3}>p?}Yr1QYu9mbET&BE5-0=2E}{zz@*LvVcS= z3>lZsaD9ht1^~RSQpha&s#0fa)i1!Qt4}Ho{?W0t40?mpD*k^J<*QX7$t>iRfqVgL z3^4h$AXX!XSyo8 zZ$Jp(zj0VBj^nQml<6vNZvTT2rQl^ogm%D?7xtn`dV%!PmgLi^-)UdheWF#YORi2m z7~B}!lzJ|vye7ILwk&m7W}SAObxm|#Og&kgC$7*g5to>jn3q^oV}j#CXGh1TZZ1+( z8ixgkhK9zPlEYH1#?hi$Q|1bKL!Ou?=_!jClPUF8;)~HY%J@;ivtySBZw{_5zbp7? zaC=alRzr+~p~`3H)QS|PK6QDph>w&MRR)WFiMYKuuJ-%<6_u5CHD^~xVn%&HU#4%; zkJoqV7eme0M{kr8nHa(5Drah*2O$SX!OiGixy0`>_98+~40o&!O8go@1CKy+` zv|tVDkOerVa|ATVVu_fSqzkH}!2+9%v;5Jt*{ao9;;C5Dn#s_ZHj<%fa{}i%bny($ z3)Qk%&8!GZmoDwVU(7VH$g;(tfKUnxZ3zMUFd;hvJ5;5dLza@IY<)TL!Pg(X@#?lm zXZNpV<=1JVbA02-JFm$0(kCZeIlTR$HQDzk<(GT=)%SOnJuqw1nmJ4>#nnc<7uJox z>4g2P3x`No4#y;{$Q=;Q5uSzZ?|^h=#!Aaz_Zv@mh23VK;+SVW-@dSPiFKKMiF2Dn zTj#AUA7dX=JHs)f=0eAUnwz}$m1(Ogj6qKrj(_SRyQ8i$81Wk+k(+gqZ7FlCPPazz z$5M5?z@;=radlTH9(ND*#Elh!in5BP3ZcR^WYuYlFzztyapU^?+4RdgU&aUI2=y=6>WWeJ7ce~(+4z5vS}u- z2xZt_rGz$=fW1G7??JMQOZl3bYBSUw{HJW&I4mXyrC>_=sXJ6}K&Vy3J%W z+fx(wEu1mytXa2K-t^U~cZI+(wj_TIxSgI!&F!f`=G@Lv(>A=A{oAZgo89Cno7oZZ zob~jtrapZwWk0?3i4j44kop> zBBQ~mH|mUnG9D|AmBbP;L1{5t&73k6OKPK~G-!*I(wH$-O2g(rX+iD8RP6H|1ofnQr;lK}V)ZMt?mf4$y)At<_5;pB3T0T28fuo@oq@&56-wTu zD@vKoK3&)wsEI^;US6YQyq3}5#8N43bTuibaGXzLbvsfPi_cwM$^e|JNY&K%N{cg0 zKIW3Cc-)tPfVxO(aC0=Si$vq@8fZ=Ygy`IyP92ULz4SY8&dYh5;ZUfdZJN!RcQpq! zM>GmeO*~#oGGd0y^noJUW3ecRre>n0%>14Ch?zILYR4>=Z9E+f;|}*T?bA_4$;6JO zU`>}6u$jz;A;LdkG3Z);==iYVWTv2slIv5cfrby|zEDvy)i~7Rg-v7{phzdNm?>}Z ztO3Fr=u@bnlewGO9y&3bt;kXthw;l;P5)z5)}3G#oLo&dAk(qzHnu2v^p!opF4>nI z+sV@Gw=C|&Ds93lEypTVlYdCFx)ju?(WgYwrwMudHQ}(&Q$U zX3FYsU@UN66?o?C4=4f$ug+9t zJM|hN;)ulc#gTZlHma;8L)McaLx``ori>x1Dq|(BtSzmqEGzZZXw`vYF=L^AhZE!} zQ=1Iv}0uW&W4 zT6~JO%Vb4%^I*1YX0iZ2W8B`MQ{*MDXp|)q#zUWm**fw@qP)RKgmL3E%G0ccaQ1hi zfGsqg`-UVCN^;+9kJ`ib$N>ET0b1I@2#|@18l_x;usEvodZ)a;g`qK~LI;`?7%dvu zU<%m|r4-7#c6YAYcl-ETzg@d`t%~VjoMw}QD&MGUe8>Z%$ir(pWi&ol` zy|<>eZGF$J_phdk)r%{vMz{avfXm^VylCF-9hcwt-mzc_t-~&KQisK0S7Ajj!me73 zUDZNgmGtIc+n+1zweKzy@}h#ykSa(B?jT#WBGE^EsgTbX4Efw?IDeoDw&JoxRaseO zl`q{ef>nveCKxT7QY}qQBU*e7c{xI-Oclh4ybz(YCkiq|Dkk3t9vmg9Xh}&d>Pro) zVO1^A>(-~L>+5T(eZwMQKa|hV*~HW7R50$2#Z#%g%+N4wm=*#>l|NeTkG4qOK=r1U zEiK%-mIEzZOCPsO^0b=$p^(X6&Ph0qi8HY8a-5OtJRoKu#IWp1b7BEhP|b{sgG*glf{uehi+pj3n%OY?SQ#2Ab|W8Fc%=7 zNSQLBR1wh!4MA(rR^~194_8#_%dO?MCU2AfTt$msvP!nG-toTiej7Wl3*JXxE1Qme z8dpFrduxf;8z4Sco)^*q^D{%TPwh0b_F`MD$!0T~e9l1JWsbX?92Zv`;~I^c38AL( zupqmFYYz-iQrRtxEjC+q;PIca8lSe5XDqV3T4&&E5Xgd2Id5X-eszXD`5>EM4!amu zhvBCtD^C&G1Tu?dJND{*n70w!`BH~7S{-aW;D+aEo#0ZbZzr$X?62` z(#Ga3&AXcSR#}XswyL#iYPDbtr)o!4H`h$5c&+KT(w=6uC+w+M7+zR$XZ4oMleJ%m zf6Dw+tF0VCNX5WBrv}Y)5%E%QRS;7h^tqDdY-;Vn%=!#ho}rn{`ie}Zyuz2PAo*1& zf=ORdHE1DpAjSEGNJQAxZE<5f5HE*2YAVbyp)U~*HCIcuLeq$F1u+wUC~OUd!X#7? z7J{@qo{YqkiG-^n91db7v6N1(zAiqzsY$IC<51thTygcbP{^sN?4#3O2#y$0K}N(Y zaa<9{L#~z_Qd>n=#gYmh>d1<=3jScl5pZkGb-SQ(2tu=0E15=yf(#7@1R0OW1!fJDV^)cZ}=H#WccE=u4Nrd2lYJ@ zov4bSgvdK3>>%OXL44_=n#mYFNHK(V2EelL^mE9h;3p9=4d^TeunW}AVA}^u9K0B( zY-GqHyIIB`GFqWstY#xOawbdv$r{4h%K5i6MY|TVn&13#+ba5YcJ%lh-Y8KEgWDh5O;=3f=^}V;Xixh%A!o!M@ip_MI_@P%C)AzW=ent=BMaor~){ zi~%=lsKyOG&u=li!jE1hBZ0ge^koP5w!BhWHrLAB*-55sfM>&80j0|BfwqA?UNwMX z3-d%j;!0(&g)a88Z@$T5`UQ*GR;TAO6q=oNiUF3lJB7xY2z&58^<1$u^e?_I{oE)r zrhX4jCVoIa^}gpjMvl>AK5dK?`-=VX`qAF0-Y5J!{2!7J>4&~==+{2OG(XkLDA2Nr z34j3zfC-DyXtwzD0h#EEB-|F}!ijh|9ES^!zt$S3=Mit_KvS>0$}WJF4-zyxbcc)lsF# zL+u_xXOe-eC;_((6LxGYl?NuUgNbxWNhs1m350Tjet3ZimB)%^dZ! zayV4w3x)hXU(^G$JoS4$RzMT=5KAf^i}~ZxC{!g^Kku=|vGbv|z8e0LI<1z%H`-63 zCYC(#lb2#O#`O4fXL@mZUHU*;nRb_QaMSa!?iO>WWwB+Q<%mTvTBya98G6x4abqcy z!2uXhWp$*0HNMQV5dZ?2jX;WjOqDXEKn09c4UA8%CNCn=&#zjXd2{$xICKk8DxVgG~p2lL1FPn>@h|7upb zMYq{zw>yP5%>ObTv+xgU?$STPJ*jw7^N9X!<=blYjoezrZR(YJsK;z~avK%uI%S=@ zO4FbpDpr}R>_eUEB$v{ci7|7`UgjJI|6Aj3vB%tF>9KX&cRP2w)Xy596CXAI#`3W3 z5&IVBQ!e#X%LIFebCYD5a+qZ zF=DG(ty5~%9;HW}Fcw>iZIIYpR8U)t27#y?5JpWgEngI4O6DLASZszf{uS1k%GK*` zxmu6%1q|)$5g@vtuS_OM+Z2A?RG8vMq%(f){9hx^JK5t*#w82AEhFz zr^)WL`m@LC-5h8t<*`lWK?7$jU+P zg+3liR=ZhM%`pd5rg1e33vT)D*1g%iv}W(E-`+a;+n2T;r>aL^`j#8@ME1{{alX0; zXFjKG&i>`eeRNdztAiq%Q=2KQY7`8z*MZW!Qa|FfJ>agsev%Thvw_+w^cv?QyL|ADe&^N+H^l1QmPzMbIeab@)tsyyeHrtfA$9cE__|E)HR;@7Xn4vBZOx3D z3o0(F;8m%i6=N!qsgZ#_QyX8d=NYk|0wfa+ysHEqBSrobY=Rc z!0Pm`0>247oqjX;R_M!=!M_Xc;~IR`<3Fv@U=d>2sWl1&lc|t0oJmKZOs*}+0~z8k zD`nG;$kc4s|do5paq1@4JDSeGS01VMn9jw6aFIYQBLEVHc`Lj4b z4?ik!=%?}LI2KSaInl}g&Z(bx@ROS!n7;BhiDCaG4?Mj%`@(<@<%DzSaptPd{sx)751C$tK7GG z)(*LEg!b&y(q?qG4L*Qpx znwVzKX7zK-j8Ska8*s9crG=B;Wz3pU@KxkDT z8`-oXpk>!X54|v|wfx@qX3qTJ*=}LDm#xmn@HF;Jx_RB~%86A0lh;?gde-{Ax0bV} zubEwH<~db^Z_GQEZ=(_!wYW#$g(&uf_e+~Ts= zLXL7p%wYYXCRfARcJcF~Xo3X;Ow(d1D0<7hUEcj(!RT%Bj`wzYmtZ$-@gDH1y?>1{ zmYP}Iaij>0a{f$Ff5H54QkEJlSuu&K0HG(9-2+N)h+293f{9!I8GE;WS$_O1`vjXF z{#iDCgViV5KQV5GUXi_3P9f=$^8k<6;=Rjhco%GlKaxQ1$DV-bWrtWipta#EJcpED zdcO($#QmWB!SiF_cu=F`1SR$80ylX!DwSp@V>d-&6K$NW%4M@TT|RSOAyP!33rP^D zLWnPE(#mYAA)zrCv>Kl&uk{!muPSIepwWOzBav{%&Dyxx#QDHUghSA2FUHz%Mi}Wj z*-@ZMm)oyakJof+7Hd{$*1<63syL1F1mjuYJM%eN*9|z%vz-55n90HXBT9@rVIGqJ zZknI)cuk&RWCn-41}kEc&%xCe8cx>p{eORa$#Yl3G*_he=lRBsFW+$9t@CB+B3~g4 z?;o-C$ecH>qLwl>Je*5or4(s_&Bi#?0Ii+#7)Z+7fa?6H1r*K~`r zMcB_#(Jne9yW|j@oX6pJ1$_RJgrk&9W?ihlPAJ)HTt1)M`?CL%s%-)v zv?>I_Z?nQP)CwmjztaT~95yVDr+%jcc?Wdbl=s{0=wavLjy~>k$?uFqbq<-D7u3b^ zkemGr1}$-eGH%f0zzt=mgPp))F6`+JsdB%I23*u7C2L$#b#1k4Wf?M&Xthg<7gxLD zlCdOE(pj>iWL?RolKmy$m8eU0aaVy+a6pD~*m0R%Dnr1fcFA31w0|c%UQXM_N%0zp zU|01hg0`3NI4eGDm4+)|MzRI0bdQx<5bq@16kgy~a&Cv)?w0pcJ6hZ)9T+$` zFmP%IJ_E4TE*9El#al;5dk9WH5x$_SAJ}siOO?fPMjijjFTefkFRu+SbV%zNmV0gS ze_#LCi(i*3YFR~qZ#seR1m%efbn#)n?8JNge+`te)8=BQEx=Bzqz^Ea;8(pkb_U1v zucR8t1kZ=5CZefyMO>8&BMU2))6KK&oxbTIK^;0jd}sL4u<*~&j}h4UH4$6L6~P%V z2FE%O6n4VPr^(xn3?~gop>V1KJ$l7bTH43GD(NaqODigUsmg-tSO?ORSKzxW>~yuA z^*QNqmW;ByR~4rs#l_KxFBu7ksTej9-leIGSSsSFXgrk+#*^-l*)02%foMhIZ7?_X zal5wz!s8~m!R?lep*S&*H?L!c^s3YG>A1u4$pm-;1Bhg99b6qWIshc-O$RuD)4+rs zC_4otXC5y*y@_GkpYJK7U3@}kY_|&_!cHpp5~s;oaAsKwj`H6rcd19?mz*O=|+?}F#L ziHwrs(6fF|NTm+^!uOO`s&!f%+$J=t5w+#oHZ8Apndd!ux@m>kVFw+5!CRlC_X9!> z_p5izOiWc#^0BrX}vJq%F4BJ#Qs7@#= z%b)KZWZ)6*I{q-bi_j5px%&5?oIZ}M2lp|BUx_a?)Y3W9gr`)G1fDA8`U| zEPblz>C)FLKC1YlLR|uxBh%U@!y^;3i{;mW7%^<3pXHO`$EJ-Jt^^b;w=s zSXUlWvi8NwP0HQM14=>Zs!Q%VsSfL)sd4>ZGFBSSmieh4IQD_h05EI3>}7wFn}&1O zAlXQ^x3gWqJiT@k662}jlc+P^UgnFt`)k-GjTkyCgWlU4y#^cXto&?(Xd5 zzP3Q(aZvRe!_zzyAA6m-;@Ydr|;l-kKLE(!i{;$staWFlZ^fuwGYF z-K%Wu@bkF7a=v1-h#q_1W&d%1`Q##+92=saM^)ldXF*mOH=V(-XT(9mg_-%=egKfh zA&FH3OA|%St%Qc@=yp0WfDU2|QLr9dBS0@8MqHO=o|xilz&O&GZ~$~fi{i1e52a^0Z{EF#RW$-;t-@rXMfR4H$y33^ zU?{S3$f>8hpMK0K^C|8L>uU)_!=np~4!lj&uWT>Qsa$kPqDkwUVS0?}X+tg0Od>j@K=^;Do%qcK1hl<~^U|d<+pT@^C)3u^|Ovr!1L?iVZF+-xNJQ17oP<+c^4(Z==41Ce>XcV5#?gj4C zz0+%}!uQ{Zo|V1kEP>aemBF*{r}>5TnaZiaAUj@n`e}c0RmtAS8}PM1Vdy>YNAKjK zU@K_jqE5YCA<Jn&G}zFDmvKT8;vqmaa+5jnXO1&?j)kD9K^CO42%{p$lNBVPo5xK5b(N27(_!x&g}+j9_Sxg zA9-hyfPY~X<8^??q{D}$L)h=yc$VicluQ=HF!7d29U*AO)JYJncPjbH@3!m&627sIrNgS{EfxK7kBNMXI93^t5&Z&#QJf) z+Xk_Mxk-w=%AWeBs#Zsl^!uB@(nl{mP zIuJcxcibF!P1UQkJfcOhq}@K!Na;B@@%g0!&0`_yPb#F6Tr$1)M`D5J@#GE@$|-i# ztmbscOy#}uAF;drPhXf#SIKaOEWcZQJJC+nb(qzv4`@@gCH+Xjb(jDsY zei$I7+&R!fT;_nKHZ)nzF&qkjmWCA@iiPVyOW(A-8+S*YQ`vw+gzN<;i!W`c#)LvH z46Rw*l!~w_@ph z9{IV9=F$^S)H|kCrV%+>U8=Yc#6Ma`UuB;e!u$1w$C1*R+mWTXh0@N>*!tIUaS75q zd4furbZMzO<3&kv0eWhQ^J5r0Yd4HTl8Jb-NVc3s*T;(j>NJ5#v>uHQ4{S<-{)cH^;1MO1&TA+&F3&S$A*uI8=gn8HVM7QGck7Ks!N z{93}v;elE?B!zed3D%{HXgEzAtbl_@^W>i%%w$Mvhl_FM&v`&;w{=A&?nG9~&g0!! zm=&jzSVNj!p&yUK_1p-9@e`WgBn_bqXJR^~w3x&*mukFkecMah3aOjqUIqf0Ha(K_ z{^+Wf;ZTd&A?=v$DT+xIV@cKP`uJjN+`HEN%&MXF<<_dcJ;1wv(OOC~87QD@9Ay7nz%)Lto7umDDU(uvMT2q{f6!3e&NSX`X$&!cZy z@9WH^C!9LO1tN6=2Av0JoPB+-wkaTu+Q6kg%wE`%RWLU$jqXd71yJ1x3HYu+@C-h`MW(__vA1?$XFa>!Dsmr+dr@wA>R#fkYs=1I=?2PJE-@O6l>tly?%@pE4QgHI zA`(X}=`|gjB^nfj7<-NA!62YOhY^QL7Ivs%8@w@7gX$ z;!-~LM3V^kl9+PO@Y1gZVip(*n*xls+@_h1D+M+esklQ<^ulJ;V77a~e_8lu*dJAB z3-njsow_hz3->>FaD$$&7O6A+5ME77YB#Mi0yfg z)91|42>R=`B~ksod|Tzx1?TOH(L4mXvRlTu&#reShl8>4UNykP+G8!<$R#0thqhT1 z=ED|rG(VUV4RKbb>Cdm?)b;w)?(am%0x5AdA6+d1X`2vY!eEMBEv9v;7gJck-6oO> za*{%(Sek0Q+TTWKn_~~B$F?#64!g9cBX4hOZ(e72-e-FmCar6a4Rb41LQIMyxIcQN z5KDe-R}$#*JyuO7+3ypoIdF}{eAfGX*&MLcsm;?-KJ6Ku%h-c1lc=D{MTl+8?)~+| zgpWbf6M4Jq-JrDZj)BP|LwI~Ulx4K-eAaj;-$M^Yh8B^YKXr)fWj&V!y~JXeLn3|p z&%*1>XN1bK7n;XwgUpNgx4Jr%TJrm@_B)u;%TL(zCu%$Vd&vG{o{kuwdn1%ie4F$+ zEv~X<90T6O+g)kLQ?~OhH4PNovP&qYGt+-9WDYoo;awaTf8W1kBWFuBHP`O*y;dxaZp*`?X>n!n50!d9LG*5$M4FXoy=HLEIs3v(B~n7-_Qv1%oPIT-Ny_x^#03 z3(2s3IkHS$c7e)_^@H$)=-J0*x+snko%lzp%k-W;$l8YA9z3kZ;&EaWc zuBdjW-{j@q#jNr%!2^l;0^|n9*D07)Y*_V-tLEAQ>!g^J=Nz#2W z`<^J=&}F`b0c?i%<!c4%dl1`9jns$^FwTv{9v8?Kyu|CNdoZlP7vFzht3&#OGDXf5lb#`lL#VkM^ zARSIiK*rBL-PZk4%B2 z-LuOSwNCc#HCm-GtFsXQfm>q@V@>Z+Lg1&sO*5uRmy}8p7y7Ks=U*jqxVRQXc&02I z)e(J_`;nj|}2;Yf3tM&PSuWe!N zlieBj-WfJg2L-+QixF11cjH)(PNJnfG#LfFf`LO46ZGmh%1!Y`4ob0;KOTu^NU#Q9 zbuQvDsK?MQb8n>_IJmK{eY)aYDsMORRayRYRZv$yLVGz}aNzG9qSw2bx`&83B45$y zZplZ-c_CmmnWk)DbGf$^Drt_VddOg!a?}ZD{1B0}Bgr_7FhP0XJ^Y-Y%x%nTj7eA% znIu{ojFdq4;ld&zelA|V`_m-F$mVVj@oZ;<3aw z>36%@Y}cP2PyA2xjSYI2Ru5wW9Xh==vlJAeOHbo6QvHWGz`@vbPP`JEQmNkYD~lad z#9|@SX|fdJu{d3MnuU4{YXyP5-a(-MGJ)8~aS@U0(mT=(F6I+_*tp8;A09cYs6c+bz8dG zkmWvwvt3&?14IfO`>1hV*}Tcf-Z(*`jay0N8{bxtO-3bPC)dTVnGcg$cB;bBoHaX5 z8to?RJ{#B^&~_|DB{?2{-u?1?TCROIg|g&P>lpbE`7wz9@Tbpx>X%Hs0xBS~!?cL~^ zKt39sDp2#3^_b;YAPU>o2Q4_*p>86xNE-S^dx*FdXe8N08c%a35lT#h&o_W9FdAbTE1&jmToDMS4v(0^H z9JJbvf0P@v#YZ#Sdd20*p?7-pL6e2DcyF^cHwWLC_C7_5=Ts z5PlBpQe^u@M?G7l!EwFraYo<54|ytA=puY=?2Bun(#9-IZl3Ng#mS9Qy=+@;!yo4b zG1;U|??1P#-qLMw#c(Y-&%I>rbk-BjotU{*kKVba@Juyo{#r4e*n-8Upzr2yvT}yf zp-DAbL1Z8WXuU%Y6!Wr(ppN-;W-Z+(#{?HxNT4P^^j%L+Q|*_&3BeQ969*~Xr|FdM zq$brg7gAlW+;-G<$Vm9zCzz7meIh~Stx#e_0kN${jTRq^SZm1x>yM6jal zG!4;+Dgn!ggC!<-B_b-KClshTm$C08i@I-;sa;LShYe}w9k_o6D)92VYs&I{!8HiZ zOj~r{%np&6h`N82!R?goJem`Yd)eRs6XGLa&~7`qzpz?bb%ks`us+UL#cKn%Ae`7< zS}yGcuJMw-Bs)f3dtK#vBSh`9h;G)|Uw=UQ_&x;f*fgc=W1RftUL~+ykD%gSij`}b z*``;&x^V(d#M$E{xs;kE_2fmzGWcsRC280qPl7|VT4XJJ_4kWBtUM>MGp)rmi3>%-;)f0}4%4CVF95Swvt!>_UT_DSGgocNiA6d;kK6q{Jl6|Qd zf2?~uSzq#MPrD&}1w5b_d+qXNzP->6Zm_{hd)2GI^C80C4;x!dS&ZR3wxhlHqOGQg ztzbj<9ON#$L2&cVO}Kuo;8gajs(NZ?QF{L9@n}HIK|NF&k03#ul);i?)RI|cKs=6$ z$(V4j0h(J%xfe{3DZ%lRMya(sGgVh6|43RrWf>6WJ1+FIz;Vc8wNnJ* z$Vg7FZg~v_zK_D#5~_KByew=5_jrmxK)^j5ga~onN9^!$-`$igR9ljQ` zkCcl&0Z;7llWPS-ZXU-E7i)0D7{TLx)hDsdRqmpSojNJ#j{z3nEs65q1hRd3=7KAQ z;_WCWA~hlFTdB7gQ|lLgF#~6RF%v~&zi{0f@8|CgR7D?Ty`edhR`Zy|eOH5dw$P6~ zOt#F)kXe7Mrgu}8xt9KlH#cu|czxZt0pv;f(W0Zbp}m$|fLy!w)8$sR;^|jO#i}(@ zBl`=>M~O47yZiEz4+%Q0Pod~bAxNWjNku3Gp!5jX1%niZa%1KX z@!3M9037E57omZZkd);qi10@Ghfvh3K8#AmD6j@DqBgcg2|t494FDtZc@_-`xKi5> z3W;y~T)k5J5Ak9%r?$eD?>Y&b$cYRDA22h@2@H+$z-ea>F_eS&)dw4(AZ_p5$aITr zhl6`79Ea%(?Wo`C^qv?gBzOe_^wb2xJdXFiXiOG0im7wD?KIe+IXK3Y7*E`}BDM7! z1!D^G&{j=bFB4+m`P2GCVY=9-agvDO-zDIRZY>o zuKUf6i`z$vt$}i63Qk-#zhnRVnkmreMdXWM^hovV=+W@R7ho3yKl!E5eRl!0*)z-B z#~2}YaH!`)iSvoU{`{xS;mbL*Mu%~W)H((Sx#ykPt5-KR!r&-3?5YRY-X9HL?Rc@* z)Y-3FUX}V|%n+51gV%bo^T01;mPVZ=J)U8D%h@psHWijbMFqC=tNmHJeOg@uY$967 zTd~-9P7-UOK4k~#(SdQs%*Q+6Xk9g~3&MZ5d?XK*MbNz_L6k6u7fVSRoww(J?hu#D z$di0wCD4iEuz|R}&fb-eA+iX`tR>>VQ@(xjbI!36$5{_|S8f)lTN*LLtlW*>Jr6S< zn?GAR0%QdZMz5Oyk(vTZwKXVCAOa2IbaXwKOsZ*%gc9Mn*;-Ia73MWUi2Lrh+Fw_- z$`u|9(P;`gB4%rcsKu%tt=!8TwqWF^Rf18;`CG>hX*L0O@fnZsZfsINwp0?vtAXVy zz3x<>su$LCvbVcARAJ%vIU)@8JeTiz!VLqmKYQd5s}VL$pF5tvBdtM(xeF@w-^a8; zStVS?dlo-8ti-5271ZqC$^nlkhGgwa;SX3awS=1qf$tMsSJ?XDN7hGnIn^11TG?i;cw+=nXiRJAcZi=w0b+M>&Q+!9u}9fy#KtgXLYmakE~M{RKug&>N2% z-P{=}R{&!MCRNBK=*)Zpo%^F_?{(<&StrT@Z1!4MCX5f^<-tdi1{Z(fJcpQ&x`Z1X za^I*@BgDP^U-T0(NJjuoW|Ej#`N`T?K&+yX@nz+lD?UXc_TqO%w@S&K04?+4(X64c@^kTUDQ9fxrai~#QS^ZaRk+qrt44YyPib91^6~_t zvHgb;!!lr`5W7Dl*luMpohZ_Q-YtfHH0lz(`K7*m>Rc?=0dLGHI%@?()b@;G%5WYn zN@a&+wOw;*j_2vVmPBra38K#spYX9148$F2jjSVQxunnf z%wf7rnICW|%90QQ3O~{FjlI`&iyjzp4Y#Ad(hV9~_9PhD1q292Aai_A>~2+$Q}8Vl zq;q=BG~6v#PJo1}@jLGyT;MH#x#(ri{prtsY*QIrCbCJBh>u&(WX6PjNMpDoA;+9t zs`b;j(c`8QvLpo0O#3w$*}^5foZI#dHGBFjc6zC!2ip`mR%QPthx;~r05BJ?+ysB? z3|CT1>8-jHb52GoPkov&4$GXU{C85afTIdw=7}k)%4KTD3>c5o2aomjkFQ4g&){?QvQ)g`Br+rWlm_G`%s7sm z(hyKa0d>cEQD*r0B8JFu)G`tIgykXDJg1VpTJ0l>sWjbi`HSb4%{=-x%q6>bC`<@* zaCx*899*G|1>-RaTEW)l(<3!!=WmH_` z!f!vb>SXW`{{^8jdEjmHv3)C|d*ddb+#A6j%g1{pAf)Z)>~6M^`$0x2J#rn94U5Ck zpBctUuF2t<1zMD;|If8XSNWs=u^wKi%WEF1b`QlPe}1@p-`24`zdL+E7p+#S)4P@!1t1R zmty4;g-M#zzE+9^qfWeYN~DA*23X7|9d*po>YxLx5i>@b)4~8(#hhy{4Gc|5SjmtF z7?nqMf{Xj31^gcc0PmJJf)f)O^|;ycJhE$o)>J))#M1_-jY@Q|F?WfILp6%)4AdkY z^PMx@b{ek{&qv;UM8S8W3*c$H#HGc^x7=y(vPFu;S)0FS)6easo=pj6KE847R0{aL zR?nE%FWyPNu_?Mdoyp)|x32TWxs%;gP_Y5!ii9qm?wvBpPwjWe(~?c8+n`4=obxyN zXLE{Jl)(_sEG+h_^a`~gqRmgwmmJ?`4c00afGuX72if~ra%A74BJ8*h`cQA4WpVoI zo#a10eq?|W%SP>31E(5_Lo5zQ8CC_mrF?*%^J60w>(b_SV z2X`8}F?)4h7gGwvnV2fHR5@C(6WBrfx4hSdT-0LNjy(5xR~T9s;dM{PJWHlyIzU@F z`X1`r&nK2Io+_DwNm^KFpDy#p{Bxhtj1|T1%Zx<{*=Pkymgw7jGvMeMNl*OIa`!5? z8}o#Q2)3=yEq%teLSB8S_lrHz zs8@*auo5i@%SMGIi3>{4!h%||qSs97`LZI=x@1Mc`NhiVjr#(wYBYRNvmU@mx!bX4i z0ufO-ID#mrtl(Y2wWB+&yNOVR&pdkxVuhe?afp?RNFFAD#jz+ImG#l){1%?)Ygk`n zC3ueglHC|-`CQJ@UEbZt`yViM?zfO>bxFYJbqu=A)#|2;KNXo9&&6CI-YtE%J$=UJ zmw@SL2UL?TuAdus`+`nWiTP~r?ce>ftoq}N!E+~$7er?qM3_O_sZhTx&!_Xy49--q z#Cpa2*Y^!{B-2++S{On$Z|Yo(;U3jiakQU=Y0O^_Fls$7 zlm|HBxC{}29= z|2xHhP>`_vt55_5ZCv3s=~#j6M05Z~HX>$579fa%1i`0x6u)f=F~v4 zVXn%KjM2g14r{5eM5y(KR|{~og1%tQ7^Bt%ElizIo)}~*MUL{>67oy%g`dlGIhxU$ z1!yKUmyXaq`OKj!7U$~gO=p*Mh&|dJoWTzY?pDWNmfKJFwvwN{+aGw0ciGwj025=N zwyLFRF83k1zz*G!KE5IEs;YoUo#pWqbIX>ja3o%$OQ~Ao#!BUIM5&s`%_ZX53*LTt zyj9g4qHF;_gT_07V3Sz>FqQJ7ChBgFOxU_IE1SW?R*Fu|x!&@jdf7AIdHSd_i{XVQ zXWvK8a?{~M^(4wS=i(eNWksY}1$^itUV|shk?6f=)Q1DI>h~0|$L&IS-g(b4O6LkT zWE!lej@49aZ$GW_MnQ*NJsD(tPoB5&1UwqeAEe?Z{@M)~Wjgr*u~T~bN~ACN#rfsM zsNcwhRe^?3CtWgPli^tpSBU%Bx29_c*??h zMs8tVog9{L%*=x>K@+LE7wU4r07k!x*jbl%7_x(k zX!Vqex_rSwm>cD#W)sJpHH;^=7NwX!sQo=(Zs-1LF6j7LheDI}EcoJ6j0PfRua15& z3NQ+A__{DyQ-ChlIuU=ir!H0&BBQKCk9QTJ_o>i>=Q=Y#mo68-fFYs3XGG7YKvfF7 z{H<|SY_Oj-dPC}Ue^zeC8p4Cxghz*D6UFcws?woPbo?5$H~T$T%{B5s`nro>;`Nid zckY62!qL!FYYu>8Zl{m{p%sP_7H->_qyas9>0P96a-%>gE0373N>-l}PH2O()l^yP z+5Tb%+9#S@lDv76>v|`%_K=MzwunUgBJ23Rt>4jANg}s4W?gy@4Zk4-SbZL^<^McupwA(Qk2>rj5?Qq1 z9XUK04{7HnJJvxvnpkg@Z>1?a21aFdgu_ZMq*s^ko@JVC1I~^FO%EXjF$0b<`JI;9 z0sn)8S$YHnq;~3qah3Y7QtBNi%X2h&0i>j4dR$tGL7QArZE0_y(eUaaT@DV?`%1_O z@C9(Wi6!y@Ry&-mcXnoiu=D|GzVFf?Z4n>Pv#1+A7k0Yo38y^8u82XmCCtEt!STV0 z>e6P@s6L&@N+9Wetc8@H=HDzdA=(}QHx8)z{nLGj%?FKw-+`M2P9*i~-S+vb@A&>u z%_C)DP~I!4Z|Y7SJs9e{XAmv7v?Y8gT-2HezimB+ZS3JHiHIVk@0rP7@ z$$AE#=8WYs9YR`1&-Wy#tX)Hh)*)cm6v+yLoI22TOQ2aAskB~x<&9ZBn_ z?Tg$2!sHW3=+GqZyTxGd!8Z^VD3Bc{&o|VTU{R_$it#S0o~~n_n>>fy!o5Oei_&ZId|GIF2T5tuuT`5BO8E}jv9}$k z+VQsezP~PMN7b|gt}Hs+#6Ebf7ZddH8q{ET@+^F*xkd+u-3IWzYl67;z67A`N5#G# z{dn=Be1kl{Q^=N1Xb!<0x%60|RrGeLUyl0TW?cK&op)wl`v`f-WacG0bqAi;K;g9p z{gduM6QP>tAO^Wy=8>YY7`6&ispp3kf?MOYp-g>ma-kdDeHb7pKs=LHnF3F&YB7%& z%`oly(k@>y;8z+=QEK`}p{9dn(<$kK^lhdC{sbFNn*zbu#qW`X}3ab>AXJB~D#hXK1?P9r15|B<;!1hdmmU7lbKT+D*;wN&d=W-;}g- z9*F0UMq04HEj-Gy2|ChSnK=b*d@EVqVsLtq`*PSc49R=Yw0hU*7%-RJAC?_?Z``BP@j!575CY zmRXVN*h#B&$&B-o++bC>f~hE(?2NaPc=}M$HnW3RN3cKU$QeX1_2NmWPa}jEtw!rv z+#9oZE|j6!!mOp}&tS_`)nZuL;RaZAxAv(0O3+OEZoOzPN!leS@&zF%g>@?|XkYyF z`A2Z^JjTR%gfg^pfC*xX%9lG?xfu+Rqn5o4e+Tt#_`VtJW9%flg=icRbp|{<>B&;qX2}wG;KvJ4hxZ>7D(gmMB$VhxonnP!8wDJ zQ6`ISS31NwGI+ndNkz*9mM(VpAr=iiT)oPQL?>1;2mo(F=txuOy_#9DUrZ70TS+_; zQG$(10-x{5kceb%V1K}^Cx48sekd%=yKxM~*0(ebw%Jx%!Kti7Zd(2N?h$8Zhvp8xt zSt?$6mR($=r74NGTCquZ3aJ-V@M^cDAzgwWtUpCrwyDR|kn0vi+6as=C#iGw`+j@g zq9qkpIE`O~bGo0THx_en>VK3Lg4uOPGmgguv(FlgPgEdl=44i#^TfCFD51?SXng|-7pNc^Dsr9VPfZ784YK~zu*F&gZWIM za-7h}zu+Nu`-P=klglcKPxJoJwz;cKtUXiQJ-Fh&lGr^_EWW0eRTiJ+{UOD06&D|O zqNvq0yhUwyq6kcq%>#b4{dhrmbLISI{O0^d@FvjSq!)mJ!mHp~8_kAUk7Z52tkYO< zuABXtIw6P<>HZGm^@p5ghnS(ZtN)awD^e)mptDsp{z0J2=gG9lw9}6p1C#bc4iFqj z9OlgnwDkxZ?~QUKM$n}Ndx6wuWi68|+<=z;Wz8t!Oa6@t{9v*^gJ%Sp*wpv(6WG_wN zRMoLgmptcGjVv1@>&CjUKA#INK`4TLG6-(_ZJObpP5EwFK z??;+y%U$BRpMIQN?{X2KMDiOIKM3Jbrg~*X*SU(fVw${hY(s?ieH#&v^F}!bU%z{) znJ$=N&AY3R$wU=8=Wu675GGjs>{0ktruy48#?1z#6W^^ZQf(}Key(FQ%+%~LM~`Cv z+<`!;554Eup&69o0lj-z!X)N3ae9Y1m+)D2XCZ|cKD(KWqz}}`oU#KQwVh4mtpdlS zG9!c{#E0bN5H(j*kESRQIq}D!>(uqrd=zzgP60s76CF|)hd#gyMf7a;+EQb+5knrp z(*dlCsx%9q0vdgPFI$m);P_R?fOwleyJVKl0atJmXeSx$#JKttn z#WgLD*W0g9`R=<&?=@12B$H|TXPYWw%N)48{vQ@oE&`8WUPGWu_Uc?xx_)2WL8c?mWEDG^5)}pFm3lpUc(I4O}Jwfx6@j;*={WklB zfU{4Kw(D^rRzFi?^-DZK3PHlFHm5W?B_hh*M6Br+Km{4EmI(fHBD2bY0*%ad}H9GctGw5=~e(H&l<%UR`b5 z9F^R~++{ks8B%M(3m>+;sf4d|TTz{Cx-}&f;18Ux?NO&E!iqp!2Rl?MPb{${s~Q$G zm%CQ(uipf)H#sgM?PH4bY2>GE-5&cX)dguTV9JGRZG?OX^9l}dfZ>=m3fKEiac};z zdro3^7rD>cRi7u&dxHU&Pe?6Uh!ukj! zVjyRS4d!UDgnnJ1b`JHyWS~~1e2QTTh^`#b882<7#86f8aV;D#(fEX4P@gVLCRFkzH!2K(p)GLbE$$n z7Qbcj2yX3fi~fd15`P}%idnI9;|aayUmHufRdKZzHkkumV#+pUtwq=h+P$5VHw&Ma zdE zW%gqcm93wM;XlK-q1o(%uXcMp9O-{O*KLjXcC$%;p?DGJs{E|I5h_ci_&lU<6l5P@ zujD4~rud-XR3zZ^qe;_iXtP$Tnzp*Me%Xw}^r3YpZdTu_gWfatM%iLu~2-;z1>I{#ANnr&j(`t537`Op_;wJhxX12rpHzvuu6JTuDxJFCjPaF!po!}Djo!8A&;4|w#jTwlwQ z@TNQ3lHIC53cemMQdk*{ENOm_%%h^XN9BxE_d;)n4AR*yxd+12#Lh67VQ#*n-%$5> zz^o0Ce^rfNxz3(=_+n?d9HhJj4b-ICOuR6&*QM`>F!{2nPhl3 zeFW%I5QebQeVyILR1tu7gq?dDexOcI81zlnbI$UN~Q5;9e(Mu&+O^2D*BXbJN?X4 zYI#S=>sqE~q!aa??=VvwJnwA6A$+>-+zn>eEr1!F=B)hM{Mr_?P2S;L+A~ZPqN|MafXUACFjWFd3=64pyfMcwCf|nGl?k1kt)js!a zJ?LxLyv(jQoI?W))zywg_4qc97hG#&Nn1@1thwZ0YOQmVnP?5kIZ^b-nZxJ@?vs8D zGj=JN-b5$*KWmvmY&BK6v~k zU--U=t{=g9;`>#6I(LF6tvS+5jG)nRa>VywMF1hNsHN~8Qb*!^ucl#anXIN#WLx6s?_B2)s{h# z`9O8}gTnTM`xG}DZ$xZgMP-0TLPodFv70;E-gx2xW*X0G{ucwATYCKd(?h6RlXfK9 zUsJPgy^oQ%!}Dd@HSV)Rn8Qmc4B9j7Hr83@eQeLuGzHS>_LJMVLAVQM$sfjU<%sDi?m&B&ei2=}42Q!#qK&zYGZYIzZ9U;%vI4q~1krkc&O%+- zi`U(>RA_$~qqef&BNxih*koeJkLT8wKa*&SI26dr#K@P51ERXhM>;q$xtEQ5a%NSPs24d7OmAn$d4`&7AcW z&+*sCVGQ98q+SCx?ixqLR_I2x5HO$O0v(j{(6Jt+fT+Ic#Y$UyB_fAqs*z$w??gHt z#Z1F4NJH(=e*MU|xwzS2a7&3K6&v;(0D%4bk+Vs`{F@SGJTH}G^0ro$WoCqgO}%O| zFYfgC*0_TWzg8e_73YQA)|4yv9k({mT&rt~&ivulq$_Rwsr4Ld2*DYq9$KUeRF%Gw zjt{k$YwC1iJBNRHsbTyN-cp4b)Tjn>F<0Dfk&a|tV`GVv`mapmc#{#v6{mCER&c60 z-(ec@a_a`{ipBRWkDi5nt+X3imcufc>dGQENKIOR8tCE}0$8WBUm^12B#SU4(50E# zcMa&teva0<+`@cqk}lJSmuiD7o9I1gx{a!7LireBi{cKSg>K|%zbT`>S6 zneNlkm|CJ?nbib)-Y%oJb#Fw(HOCcc2TL&IPeq7$zXLy<#tI?fJj!>2dJ8fpGXO{| zlQF16VH6^ns?(lp-EA-&DiLx z%?yZ^C)$#5nU7pV*%^$%mNH}lTHy(TK_U+fE@+=QVwmc$kBf*eggHEIFT<)EAx^cN>fgvlcIt z&?XG*{aLcSo>_IvAinit<)gl0rQDj?3@iZ_K_&=YBHhV?Dp7uXN|gj}-x>9(<1V3@eiE3dnBZ{F0uVNk zboV)o%tqJM97lGPKh(P$59W-Ol4>Hpcd#D1hz#Q1(9^{0+9Q|RVm1&n?PN=bv!vP} zG%cu_{D^^4zAMcM*6;)w?T{Hi@I_xR+7^h*){v{*Pj2)V#YB`yR z%*ZR(gpP^ERG%)_pV=n4!BfA7XMkq_vPXo*Q3Bno0D{`<8^R{<(`%x=21$Z&i z82p&cHLzS`evYHzWC;4?NI#K{wk0oSpAYKIM^6F5~(Hq(rQ2mcC$N%W+84$@T5~+c3C3+?RJ&;J=NzdNV zok&htL$z{F|8mcQBN~oXm_&?2H`D983TfRsf3zBO?Xq z{cp`b@leWti~fYoG>NqT4DL^R+}uPAN@k9hAYAkJ&=iOmoeV%oB+KvkK>{HV z0O@FBPxMDXD$0a;lAte^uF|0M&m1DQd_e!qyU|69fgU}gqI z@D~{q6Eia?^uNeJjsMga1jPMK4**~W0gr#}3uI;lL2!SS{n7fXjER{Q0Gh+U=z($t z_=k`G&=&{-@IX`Ym%ad27RJBZ`1TwMzV{9Biroa1T z1Tz1I+W*>@gO%f-GB)PF`(R?^VE;$V9PIzF2hszAuCKrNU;+vM9v^6I%zqyn6KEKJ z_rb)(3ix}@L3;nl2NN^XKXM7m8`D4R0T`M7VUL*&RC#}knVEy*A9|n?`ujLQb-?uZ zzRZlQ|HwHrBOAxx^#Gu<`uiLJSUEsg^#h_{vY&!|FFmY&$$P(v$FiNFDv`s>lCyeF#fNabhOt4 z;pg`7zgILxGk4I^1VZ=~Y-}8fepk@%HA>vt*oFvX`H$a)LEAI9^+9RjU}V-e)HgO} z1nM!e16d7NjSTbw07f8(G0>P7{{L6`*9H# + + template-go + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..93b6169 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,29 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +[markdownlint](https://dlaa.me/markdownlint/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- Thing 5 +- Thing 4 + +## [1.0.1] - yyyy-mm-dd + +### Added to 1.0.1 + +- Thing 3 + +### Fixed in 1.0.1 + +- Thing 2 + +## [1.0.0] - yyyy-mm-dd + +### Added to 1.0.0 + +- Thing 2 +- Thing 1 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..f6f9f91 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at support@senzing.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..42274fa --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,124 @@ +# Contributing + +Welcome to the project! + +We encourage contribution in a manner consistent with the [Code of Conduct](CODE_OF_CONDUCT.md). +The following will guide you through the process. + +There are a number of ways you can contribute: + +1. [Asking questions](#questions) +1. [Requesting features](#feature-requests) +1. [Reporting bugs](#bug-reporting) +1. [Contributing code or documentation](#contributing-code-or-documentation) + +## License Agreements + +If your contribution modifies the git repository, the following agreements must be established. + +*Note:* License agreements are only needed for adding, modifying, and deleting artifacts kept within the repository. +In simple terms, license agreements are needed before pull requests can be accepted. +A license agreement is not needed for submitting feature request, bug reporting, or other project management. + +### Individual Contributor License Agreement + +In order to contribute to this repository, an +[Individual Contributor License Agreement (ICLA)](.github/senzing-individual-contributor-license-agreement.pdf) +must be completed, submitted and accepted. + +### Corporate Contributor License Agreement + +If the contribution to this repository is on behalf of a company, a +[Corporate Contributor License Agreement (CCLA)](.github/senzing-corporate-contributor-license-agreement.pdf) +must also be completed, submitted and accepted. + +### Project License Agreement + +The license agreement for this repository is stated in the +[LICENSE](LICENSE) file. + +## Questions + +Please do not use the GitHub issue tracker to submit questions. + +TODO: Instead, use ??? + +1. ??? Slack ??? +1. ??? stackoverflow.com ??? + +## Feature Requests + +All feature requests are "GitHub issues". +To request a feature, create a +[GitHub issue](https://help.github.com/articles/creating-an-issue/) +in this repository. + +When creating an issue, there will be a choice to create a "Bug report" or a "Feature request". +Choose "Feature request". + +## Bug Reporting + +All bug reports are "GitHub issues". +Before reporting on a bug, check to see if it has +[already been reported](https://github.com/search?q=+is%3Aissue+user%3Asenzing). +To report a bug, create a +[GitHub issue](https://help.github.com/articles/creating-an-issue/) +in this repository. + +When creating an issue, there will be a choice to create a "Bug report" or a "Feature request". +Choose "Bug report". + +## Contributing code or documentation + +To contribute code or documentation to the repository, you must have +[License Agreements](#license-agreements) in place. +This needs to be complete before a [Pull Request](#pull-requests) can be accepted. + +### Setting up a development environment + +#### Set Environment variables + +These variables may be modified, but do not need to be modified. +The variables are used throughout the installation procedure. + +```console +export GIT_ACCOUNT=senzing +export GIT_REPOSITORY=template-go +``` + +Synthesize environment variables. + +```console +export GIT_ACCOUNT_DIR=~/${GIT_ACCOUNT}.git +export GIT_REPOSITORY_DIR="${GIT_ACCOUNT_DIR}/${GIT_REPOSITORY}" +export GIT_REPOSITORY_URL="git@github.com:${GIT_ACCOUNT}/${GIT_REPOSITORY}.git" +``` + +#### Clone repository + +Get repository. + +```console +mkdir --parents ${GIT_ACCOUNT_DIR} +cd ${GIT_ACCOUNT_DIR} +git clone ${GIT_REPOSITORY_URL} +cd ${GIT_REPOSITORY_DIR} +``` + +### Coding conventions + +TODO: + +### Testing + +TODO: + +### Pull Requests + +Code in the main branch is modified via GitHub pull request. +Follow GitHub's +[Creating a pull request from a branch](https://help.github.com/articles/creating-a-pull-request/) +or +[Creating a pull request from a fork](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) instructions. + +Accepting pull requests will be at the discretion of Senzing, Inc. and the repository owner(s). diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6f307a2 --- /dev/null +++ b/Makefile @@ -0,0 +1,114 @@ +# Makefile that builds g2-sdk-go, a "go" program. + +# "Simple expanded" variables (':=') + +# PROGRAM_NAME is the name of the GIT repository. +PROGRAM_NAME := $(shell basename `git rev-parse --show-toplevel`) +MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) +MAKEFILE_DIRECTORY := $(dir $(MAKEFILE_PATH)) +TARGET_DIRECTORY := $(MAKEFILE_DIRECTORY)/target +DOCKER_CONTAINER_NAME := $(PROGRAM_NAME) +DOCKER_IMAGE_NAME := senzing/$(PROGRAM_NAME) +DOCKER_BUILD_IMAGE_NAME := $(DOCKER_IMAGE_NAME)-build +BUILD_VERSION := $(shell git describe --always --tags --abbrev=0 --dirty) +BUILD_TAG := $(shell git describe --always --tags --abbrev=0) +BUILD_ITERATION := $(shell git log $(BUILD_TAG)..HEAD --oneline | wc -l | sed 's/^ *//') +GIT_REMOTE_URL := $(shell git config --get remote.origin.url) +GO_PACKAGE_NAME := $(shell echo $(GIT_REMOTE_URL) | sed -e 's|^git@github.com:|github.com/|' -e 's|\.git$$||' -e 's|Senzing|senzing|') + +# Recursive assignment ('=') + +CC = gcc + +# Conditional assignment. ('?=') + +SENZING_G2_DIR ?= /opt/senzing/g2 + +# Exports + +export SENZING_TOOLS_DATABASE_URL=sqlite3://na:na@/tmp/sqlite/G2C.db + +# The first "make" target runs as default. + +.PHONY: default +default: help + +# ----------------------------------------------------------------------------- +# Export environment variables. +# ----------------------------------------------------------------------------- + +.EXPORT_ALL_VARIABLES: + +# Flags for the C compiler. +# Can be overridden with "export" +# Example: "export LD_LIBRARY_PATH=/path/to/my/senzing/g2/lib" + +LD_LIBRARY_PATH ?= ${SENZING_G2_DIR}/lib + +# ----------------------------------------------------------------------------- +# Build +# ----------------------------------------------------------------------------- + +.PHONY: dependencies +dependencies: + @go get -u ./... + @go get -t -u ./... + @go mod tidy + +# ----------------------------------------------------------------------------- +# Test +# ----------------------------------------------------------------------------- + +.PHONY: test +test: + @rm -rf /tmp/sqlite + @mkdir /tmp/sqlite + @cp testdata/sqlite/G2C.db /tmp/sqlite/G2C.db + @go test -v -p 1 ./... +# @go test -v ./. +# @go test -v ./g2config +# @go test -v ./g2configmgr +# @go test -v ./g2diagnostic +# @go test -v ./g2engine +# @go test -v ./g2product + + +# ----------------------------------------------------------------------------- +# Run +# ----------------------------------------------------------------------------- + +.PHONY: run +run: + @go run main.go + +# ----------------------------------------------------------------------------- +# Utility targets +# ----------------------------------------------------------------------------- + +.PHONY: update-pkg-cache +update-pkg-cache: + GOPROXY=https://proxy.golang.org GO111MODULE=on \ + go get $(GO_PACKAGE_NAME)@$(BUILD_TAG) + +.PHONY: clean +clean: + @go clean -cache + @go clean -testcache + @docker rm --force $(DOCKER_CONTAINER_NAME) 2> /dev/null || true + @docker rmi --force $(DOCKER_IMAGE_NAME) $(DOCKER_BUILD_IMAGE_NAME) 2> /dev/null || true + @rm -rf $(TARGET_DIRECTORY) || true + @rm -f $(GOPATH)/bin/$(PROGRAM_NAME) || true + + +.PHONY: print-make-variables +print-make-variables: + @$(foreach V,$(sort $(.VARIABLES)), \ + $(if $(filter-out environment% default automatic, \ + $(origin $V)),$(warning $V=$($V) ($(value $V))))) + + +.PHONY: help +help: + @echo "Build $(PROGRAM_NAME) version $(BUILD_VERSION)-$(BUILD_ITERATION)". + @echo "All targets:" + @$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | xargs diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..0b11a2f --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,13 @@ +# Pull request questions + +## Which issue does this address + +Issue number: #nnn + +## Why was change needed + +??? + +## What does change improve + +??? diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..9553dcd --- /dev/null +++ b/docs/README.md @@ -0,0 +1,5 @@ +# template-repository + +Placeholder for [GitHub pages](https://pages.github.com/). + +See [https://senzing.github.io/template-repository](https://senzing.github.io/template-repository). diff --git a/docs/errors.md b/docs/errors.md new file mode 100644 index 0000000..05c6801 --- /dev/null +++ b/docs/errors.md @@ -0,0 +1 @@ +## Errors \ No newline at end of file diff --git a/main.go b/main.go new file mode 100644 index 0000000..772d130 --- /dev/null +++ b/main.go @@ -0,0 +1,363 @@ +package main + +import ( + "context" + "fmt" + "log" + "math/rand" + "strconv" + "time" + + "github.com/senzing/g2-sdk-go/g2config" + "github.com/senzing/g2-sdk-go/g2configmgr" + "github.com/senzing/g2-sdk-go/g2diagnostic" + "github.com/senzing/g2-sdk-go/g2engine" + "github.com/senzing/g2-sdk-go/g2product" + "github.com/senzing/go-common/truthset" + "github.com/senzing/go-helpers/g2engineconfigurationjson" + "github.com/senzing/go-logging/messageformat" + "github.com/senzing/go-logging/messageid" + "github.com/senzing/go-logging/messagelevel" + "github.com/senzing/go-logging/messagelogger" + "github.com/senzing/go-logging/messagestatus" + "github.com/senzing/go-logging/messagetext" + "github.com/senzing/go-observing/observer" +) + +// ---------------------------------------------------------------------------- +// Constants +// ---------------------------------------------------------------------------- + +const MessageIdTemplate = "senzing-9999%04d" + +// ---------------------------------------------------------------------------- +// Variables +// ---------------------------------------------------------------------------- + +var Messages = map[int]string{ + 1: "%s", + 2: "WithInfo: %s", + 2001: "Testing %s.", + 2002: "Physical cores: %d.", + 2003: "withInfo", + 2004: "License", + 2999: "Cannot retrieve last error message.", +} + +// Values updated via "go install -ldflags" parameters. + +var programName string = "unknown" +var buildVersion string = "0.0.0" +var buildIteration string = "0" +var logger messagelogger.MessageLoggerInterface = nil + +// ---------------------------------------------------------------------------- +// Internal methods +// ---------------------------------------------------------------------------- + +func getG2config(ctx context.Context) (g2config.G2config, error) { + result := g2config.G2configImpl{} + moduleName := "Test module name" + verboseLogging := 0 // 0 for no Senzing logging; 1 for logging + iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") + if err != nil { + return &result, err + } + err = result.Init(ctx, moduleName, iniParams, verboseLogging) + return &result, err +} + +func getG2configmgr(ctx context.Context) (g2configmgr.G2configmgr, error) { + result := g2configmgr.G2configmgrImpl{} + moduleName := "Test module name" + verboseLogging := 0 // 0 for no Senzing logging; 1 for logging + iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") + if err != nil { + return &result, err + } + err = result.Init(ctx, moduleName, iniParams, verboseLogging) + return &result, err +} + +func getG2diagnostic(ctx context.Context) (g2diagnostic.G2diagnostic, error) { + result := g2diagnostic.G2diagnosticImpl{} + moduleName := "Test module name" + verboseLogging := 0 // 0 for no Senzing logging; 1 for logging + iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") + if err != nil { + return &result, err + } + err = result.Init(ctx, moduleName, iniParams, verboseLogging) + return &result, err +} + +func getG2engine(ctx context.Context) (g2engine.G2engine, error) { + result := g2engine.G2engineImpl{} + moduleName := "Test module name" + verboseLogging := 0 // 0 for no Senzing logging; 1 for logging + iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") + if err != nil { + return &result, err + } + err = result.Init(ctx, moduleName, iniParams, verboseLogging) + return &result, err +} + +func getG2product(ctx context.Context) (g2product.G2product, error) { + result := g2product.G2productImpl{} + moduleName := "Test module name" + verboseLogging := 0 // 0 for no Senzing logging; 1 for logging + iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") + if err != nil { + return &result, err + } + err = result.Init(ctx, moduleName, iniParams, verboseLogging) + return &result, err +} + +func getLogger(ctx context.Context) (messagelogger.MessageLoggerInterface, error) { + messageFormat := &messageformat.MessageFormatJson{} + messageIdTemplate := &messageid.MessageIdTemplated{ + MessageIdTemplate: MessageIdTemplate, + } + messageLevel := &messagelevel.MessageLevelByIdRange{ + IdLevelRanges: messagelevel.IdLevelRanges, + } + messageStatus := &messagestatus.MessageStatusByIdRange{ + IdStatusRanges: messagestatus.IdLevelRangesAsString, + } + messageText := &messagetext.MessageTextTemplated{ + IdMessages: Messages, + } + return messagelogger.New(messageFormat, messageIdTemplate, messageLevel, messageStatus, messageText, messagelogger.LevelInfo) +} + +func demonstrateConfigFunctions(ctx context.Context, g2Config g2config.G2config, g2Configmgr g2configmgr.G2configmgr) error { + now := time.Now() + + // Using G2Config: Create a default configuration in memory + + configHandle, err := g2Config.Create(ctx) + if err != nil { + return logger.Error(5100, err) + } + + // Using G2Config: Add data source to in-memory configuration. + + for _, testDataSource := range truthset.TruthsetDataSources { + _, err := g2Config.AddDataSource(ctx, configHandle, testDataSource.Json) + if err != nil { + return logger.Error(5101, err) + } + } + + // Using G2Config: Persist configuration to a string. + + configStr, err := g2Config.Save(ctx, configHandle) + if err != nil { + return logger.Error(5102, err) + } + + // Using G2Configmgr: Persist configuration string to database. + + configComments := fmt.Sprintf("Created by g2diagnostic_test at %s", now.UTC()) + configID, err := g2Configmgr.AddConfig(ctx, configStr, configComments) + if err != nil { + return logger.Error(5103, err) + } + + // Using G2Configmgr: Set new configuration as the default. + + err = g2Configmgr.SetDefaultConfigID(ctx, configID) + if err != nil { + return logger.Error(5104, err) + } + + return err +} + +func demonstrateAddRecord(ctx context.Context, g2Engine g2engine.G2engine) (string, error) { + dataSourceCode := "TEST" + recordID := strconv.Itoa(rand.Intn(1000000000)) + jsonData := fmt.Sprintf( + "%s%s%s", + `{"SOCIAL_HANDLE": "flavorh", "DATE_OF_BIRTH": "4/8/1983", "ADDR_STATE": "LA", "ADDR_POSTAL_CODE": "71232", "SSN_NUMBER": "053-39-3251", "ENTITY_TYPE": "TEST", "GENDER": "F", "srccode": "MDMPER", "CC_ACCOUNT_NUMBER": "5534202208773608", "RECORD_ID": "`, + recordID, + `", "DSRC_ACTION": "A", "ADDR_CITY": "Delhi", "DRIVERS_LICENSE_STATE": "DE", "PHONE_NUMBER": "225-671-0796", "NAME_LAST": "SEAMAN", "entityid": "284430058", "ADDR_LINE1": "772 Armstrong RD"}`) + loadID := dataSourceCode + var flags int64 = 0 + + // Using G2Engine: Add record and return "withInfo". + + return g2Engine.AddRecordWithInfo(ctx, dataSourceCode, recordID, jsonData, loadID, flags) +} + +func demonstrateAdditionalFunctions(ctx context.Context, g2Diagnostic g2diagnostic.G2diagnostic, g2Engine g2engine.G2engine, g2Product g2product.G2product) error { + // Using G2Diagnostic: Check physical cores. + + actual, err := g2Diagnostic.GetPhysicalCores(ctx) + if err != nil { + logger.Log(5300, err) + } + logger.Log(2002, actual) + + // Using G2Engine: Purge repository. + + err = g2Engine.PurgeRepository(ctx) + if err != nil { + logger.Log(5301, err) + } + + // Using G2Engine: Add records with information returned. + + withInfo, err := demonstrateAddRecord(ctx, g2Engine) + if err != nil { + logger.Log(5302, err) + } + logger.Log(2003, withInfo) + + // Using G2Product: Show license metadata. + + license, err := g2Product.License(ctx) + if err != nil { + logger.Log(5303, err) + } + logger.Log(2004, license) + + // Using G2Engine: Purge repository again. + + err = g2Engine.PurgeRepository(ctx) + if err != nil { + logger.Log(5304, err) + } + + return err +} + +func destroyObjects(ctx context.Context, g2Config g2config.G2config, g2Configmgr g2configmgr.G2configmgr, g2Diagnostic g2diagnostic.G2diagnostic, g2Engine g2engine.G2engine, g2Product g2product.G2product) error { + err := g2Config.Destroy(ctx) + if err != nil { + logger.Log(5401, err) + } + + err = g2Configmgr.Destroy(ctx) + if err != nil { + logger.Log(5402, err) + } + + err = g2Diagnostic.Destroy(ctx) + if err != nil { + logger.Log(5403, err) + } + + err = g2Engine.Destroy(ctx) + if err != nil { + logger.Log(5404, err) + } + + err = g2Product.Destroy(ctx) + if err != nil { + logger.Log(5405, err) + } + + return err +} + +// ---------------------------------------------------------------------------- +// Main +// ---------------------------------------------------------------------------- + +func main() { + var err error = nil + ctx := context.TODO() + + // Randomize random number generator. + + rand.Seed(time.Now().UnixNano()) + + // Configure the "log" standard library. + + log.SetFlags(0) + logger, err = getLogger(ctx) + if err != nil { + logger.Log(5000, err) + } + + // Test logger. + + programmMetadataMap := map[string]interface{}{ + "ProgramName": programName, + "BuildVersion": buildVersion, + "BuildIteration": buildIteration, + } + + fmt.Printf("\n-------------------------------------------------------------------------------\n\n") + logger.Log(2001, "Just a test of logging", programmMetadataMap) + + // Create 2 observers. + + observer1 := &observer.ObserverNull{ + Id: "Observer 1", + } + observer2 := &observer.ObserverNull{ + Id: "Observer 2", + } + + // Get Senzing objects for installing a Senzing Engine configuration. + + g2Config, err := getG2config(ctx) + if err != nil { + logger.Log(5001, err) + } + g2Config.RegisterObserver(ctx, observer1) + g2Config.RegisterObserver(ctx, observer2) + + g2Configmgr, err := getG2configmgr(ctx) + if err != nil { + logger.Log(5002, err) + } + g2Configmgr.RegisterObserver(ctx, observer1) + + // Persist the Senzing configuration to the Senzing repository. + + err = demonstrateConfigFunctions(ctx, g2Config, g2Configmgr) + if err != nil { + logger.Log(5003, err) + } + + // Now that a Senzing configuration is installed, get the remainder of the Senzing objects. + + g2Diagnostic, err := getG2diagnostic(ctx) + if err != nil { + logger.Log(5004, err) + } + g2Diagnostic.RegisterObserver(ctx, observer1) + + g2Engine, err := getG2engine(ctx) + if err != nil { + logger.Log(5005, err) + } + g2Engine.RegisterObserver(ctx, observer1) + + g2Product, err := getG2product(ctx) + if err != nil { + logger.Log(5006, err) + } + g2Product.RegisterObserver(ctx, observer1) + + // Demonstrate tests. + + err = demonstrateAdditionalFunctions(ctx, g2Diagnostic, g2Engine, g2Product) + if err != nil { + logger.Log(5007, err) + } + + // Destroy Senzing objects. + + err = destroyObjects(ctx, g2Config, g2Configmgr, g2Diagnostic, g2Engine, g2Product) + if err != nil { + logger.Log(5008, err) + } + + fmt.Printf("\n-------------------------------------------------------------------------------\n\n") +} diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..219b38b --- /dev/null +++ b/main_test.go @@ -0,0 +1,12 @@ +package main + +import ( + "testing" +) + +/* + * The unit tests in this file simulate command line invocation. + */ +func TestMain(testing *testing.T) { + main() +} From 01c40f52cae4a0b0eba2c5addb91778626e8a70a Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 11:26:23 -0500 Subject: [PATCH 02/11] #1 Add Go artifacts --- go.mod | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 go.mod diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..400317a --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/senzing/template-go + +go 1.19 From 81dd6d0340d2318a3bb2b439f9e6b27204ad2141 Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 11:49:40 -0500 Subject: [PATCH 03/11] #1 Go artifacts --- Makefile | 18 +-- main.go | 341 ++----------------------------------------------------- 2 files changed, 9 insertions(+), 350 deletions(-) diff --git a/Makefile b/Makefile index 6f307a2..4446cb7 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# Makefile that builds g2-sdk-go, a "go" program. +# Makefile that builds, tests, and packages the "go" program. # "Simple expanded" variables (':=') @@ -22,12 +22,6 @@ CC = gcc # Conditional assignment. ('?=') -SENZING_G2_DIR ?= /opt/senzing/g2 - -# Exports - -export SENZING_TOOLS_DATABASE_URL=sqlite3://na:na@/tmp/sqlite/G2C.db - # The first "make" target runs as default. .PHONY: default @@ -61,17 +55,7 @@ dependencies: .PHONY: test test: - @rm -rf /tmp/sqlite - @mkdir /tmp/sqlite - @cp testdata/sqlite/G2C.db /tmp/sqlite/G2C.db @go test -v -p 1 ./... -# @go test -v ./. -# @go test -v ./g2config -# @go test -v ./g2configmgr -# @go test -v ./g2diagnostic -# @go test -v ./g2engine -# @go test -v ./g2product - # ----------------------------------------------------------------------------- # Run diff --git a/main.go b/main.go index 772d130..b97ebb5 100644 --- a/main.go +++ b/main.go @@ -1,27 +1,8 @@ package main import ( - "context" - "fmt" - "log" - "math/rand" - "strconv" - "time" - - "github.com/senzing/g2-sdk-go/g2config" - "github.com/senzing/g2-sdk-go/g2configmgr" - "github.com/senzing/g2-sdk-go/g2diagnostic" - "github.com/senzing/g2-sdk-go/g2engine" - "github.com/senzing/g2-sdk-go/g2product" - "github.com/senzing/go-common/truthset" - "github.com/senzing/go-helpers/g2engineconfigurationjson" - "github.com/senzing/go-logging/messageformat" - "github.com/senzing/go-logging/messageid" - "github.com/senzing/go-logging/messagelevel" - "github.com/senzing/go-logging/messagelogger" - "github.com/senzing/go-logging/messagestatus" - "github.com/senzing/go-logging/messagetext" - "github.com/senzing/go-observing/observer" + "context" + "fmt" ) // ---------------------------------------------------------------------------- @@ -35,232 +16,16 @@ const MessageIdTemplate = "senzing-9999%04d" // ---------------------------------------------------------------------------- var Messages = map[int]string{ - 1: "%s", - 2: "WithInfo: %s", - 2001: "Testing %s.", - 2002: "Physical cores: %d.", - 2003: "withInfo", - 2004: "License", - 2999: "Cannot retrieve last error message.", + 1: "%s", } -// Values updated via "go install -ldflags" parameters. - -var programName string = "unknown" -var buildVersion string = "0.0.0" -var buildIteration string = "0" -var logger messagelogger.MessageLoggerInterface = nil - // ---------------------------------------------------------------------------- // Internal methods // ---------------------------------------------------------------------------- -func getG2config(ctx context.Context) (g2config.G2config, error) { - result := g2config.G2configImpl{} - moduleName := "Test module name" - verboseLogging := 0 // 0 for no Senzing logging; 1 for logging - iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") - if err != nil { - return &result, err - } - err = result.Init(ctx, moduleName, iniParams, verboseLogging) - return &result, err -} - -func getG2configmgr(ctx context.Context) (g2configmgr.G2configmgr, error) { - result := g2configmgr.G2configmgrImpl{} - moduleName := "Test module name" - verboseLogging := 0 // 0 for no Senzing logging; 1 for logging - iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") - if err != nil { - return &result, err - } - err = result.Init(ctx, moduleName, iniParams, verboseLogging) - return &result, err -} - -func getG2diagnostic(ctx context.Context) (g2diagnostic.G2diagnostic, error) { - result := g2diagnostic.G2diagnosticImpl{} - moduleName := "Test module name" - verboseLogging := 0 // 0 for no Senzing logging; 1 for logging - iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") - if err != nil { - return &result, err - } - err = result.Init(ctx, moduleName, iniParams, verboseLogging) - return &result, err -} - -func getG2engine(ctx context.Context) (g2engine.G2engine, error) { - result := g2engine.G2engineImpl{} - moduleName := "Test module name" - verboseLogging := 0 // 0 for no Senzing logging; 1 for logging - iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") - if err != nil { - return &result, err - } - err = result.Init(ctx, moduleName, iniParams, verboseLogging) - return &result, err -} - -func getG2product(ctx context.Context) (g2product.G2product, error) { - result := g2product.G2productImpl{} - moduleName := "Test module name" - verboseLogging := 0 // 0 for no Senzing logging; 1 for logging - iniParams, err := g2engineconfigurationjson.BuildSimpleSystemConfigurationJson("") - if err != nil { - return &result, err - } - err = result.Init(ctx, moduleName, iniParams, verboseLogging) - return &result, err -} - -func getLogger(ctx context.Context) (messagelogger.MessageLoggerInterface, error) { - messageFormat := &messageformat.MessageFormatJson{} - messageIdTemplate := &messageid.MessageIdTemplated{ - MessageIdTemplate: MessageIdTemplate, - } - messageLevel := &messagelevel.MessageLevelByIdRange{ - IdLevelRanges: messagelevel.IdLevelRanges, - } - messageStatus := &messagestatus.MessageStatusByIdRange{ - IdStatusRanges: messagestatus.IdLevelRangesAsString, - } - messageText := &messagetext.MessageTextTemplated{ - IdMessages: Messages, - } - return messagelogger.New(messageFormat, messageIdTemplate, messageLevel, messageStatus, messageText, messagelogger.LevelInfo) -} - -func demonstrateConfigFunctions(ctx context.Context, g2Config g2config.G2config, g2Configmgr g2configmgr.G2configmgr) error { - now := time.Now() - - // Using G2Config: Create a default configuration in memory - - configHandle, err := g2Config.Create(ctx) - if err != nil { - return logger.Error(5100, err) - } - - // Using G2Config: Add data source to in-memory configuration. - - for _, testDataSource := range truthset.TruthsetDataSources { - _, err := g2Config.AddDataSource(ctx, configHandle, testDataSource.Json) - if err != nil { - return logger.Error(5101, err) - } - } - - // Using G2Config: Persist configuration to a string. - - configStr, err := g2Config.Save(ctx, configHandle) - if err != nil { - return logger.Error(5102, err) - } - - // Using G2Configmgr: Persist configuration string to database. - - configComments := fmt.Sprintf("Created by g2diagnostic_test at %s", now.UTC()) - configID, err := g2Configmgr.AddConfig(ctx, configStr, configComments) - if err != nil { - return logger.Error(5103, err) - } - - // Using G2Configmgr: Set new configuration as the default. - - err = g2Configmgr.SetDefaultConfigID(ctx, configID) - if err != nil { - return logger.Error(5104, err) - } - - return err -} - -func demonstrateAddRecord(ctx context.Context, g2Engine g2engine.G2engine) (string, error) { - dataSourceCode := "TEST" - recordID := strconv.Itoa(rand.Intn(1000000000)) - jsonData := fmt.Sprintf( - "%s%s%s", - `{"SOCIAL_HANDLE": "flavorh", "DATE_OF_BIRTH": "4/8/1983", "ADDR_STATE": "LA", "ADDR_POSTAL_CODE": "71232", "SSN_NUMBER": "053-39-3251", "ENTITY_TYPE": "TEST", "GENDER": "F", "srccode": "MDMPER", "CC_ACCOUNT_NUMBER": "5534202208773608", "RECORD_ID": "`, - recordID, - `", "DSRC_ACTION": "A", "ADDR_CITY": "Delhi", "DRIVERS_LICENSE_STATE": "DE", "PHONE_NUMBER": "225-671-0796", "NAME_LAST": "SEAMAN", "entityid": "284430058", "ADDR_LINE1": "772 Armstrong RD"}`) - loadID := dataSourceCode - var flags int64 = 0 - - // Using G2Engine: Add record and return "withInfo". - - return g2Engine.AddRecordWithInfo(ctx, dataSourceCode, recordID, jsonData, loadID, flags) -} - -func demonstrateAdditionalFunctions(ctx context.Context, g2Diagnostic g2diagnostic.G2diagnostic, g2Engine g2engine.G2engine, g2Product g2product.G2product) error { - // Using G2Diagnostic: Check physical cores. - - actual, err := g2Diagnostic.GetPhysicalCores(ctx) - if err != nil { - logger.Log(5300, err) - } - logger.Log(2002, actual) - - // Using G2Engine: Purge repository. - - err = g2Engine.PurgeRepository(ctx) - if err != nil { - logger.Log(5301, err) - } - - // Using G2Engine: Add records with information returned. - - withInfo, err := demonstrateAddRecord(ctx, g2Engine) - if err != nil { - logger.Log(5302, err) - } - logger.Log(2003, withInfo) - - // Using G2Product: Show license metadata. - - license, err := g2Product.License(ctx) - if err != nil { - logger.Log(5303, err) - } - logger.Log(2004, license) - - // Using G2Engine: Purge repository again. - - err = g2Engine.PurgeRepository(ctx) - if err != nil { - logger.Log(5304, err) - } - - return err -} - -func destroyObjects(ctx context.Context, g2Config g2config.G2config, g2Configmgr g2configmgr.G2configmgr, g2Diagnostic g2diagnostic.G2diagnostic, g2Engine g2engine.G2engine, g2Product g2product.G2product) error { - err := g2Config.Destroy(ctx) - if err != nil { - logger.Log(5401, err) - } - - err = g2Configmgr.Destroy(ctx) - if err != nil { - logger.Log(5402, err) - } - - err = g2Diagnostic.Destroy(ctx) - if err != nil { - logger.Log(5403, err) - } - - err = g2Engine.Destroy(ctx) - if err != nil { - logger.Log(5404, err) - } - - err = g2Product.Destroy(ctx) - if err != nil { - logger.Log(5405, err) - } - - return err +func test(ctx context.Context, message string) error { + fmt.Println(message) + return nil } // ---------------------------------------------------------------------------- @@ -268,96 +33,6 @@ func destroyObjects(ctx context.Context, g2Config g2config.G2config, g2Configmgr // ---------------------------------------------------------------------------- func main() { - var err error = nil - ctx := context.TODO() - - // Randomize random number generator. - - rand.Seed(time.Now().UnixNano()) - - // Configure the "log" standard library. - - log.SetFlags(0) - logger, err = getLogger(ctx) - if err != nil { - logger.Log(5000, err) - } - - // Test logger. - - programmMetadataMap := map[string]interface{}{ - "ProgramName": programName, - "BuildVersion": buildVersion, - "BuildIteration": buildIteration, - } - - fmt.Printf("\n-------------------------------------------------------------------------------\n\n") - logger.Log(2001, "Just a test of logging", programmMetadataMap) - - // Create 2 observers. - - observer1 := &observer.ObserverNull{ - Id: "Observer 1", - } - observer2 := &observer.ObserverNull{ - Id: "Observer 2", - } - - // Get Senzing objects for installing a Senzing Engine configuration. - - g2Config, err := getG2config(ctx) - if err != nil { - logger.Log(5001, err) - } - g2Config.RegisterObserver(ctx, observer1) - g2Config.RegisterObserver(ctx, observer2) - - g2Configmgr, err := getG2configmgr(ctx) - if err != nil { - logger.Log(5002, err) - } - g2Configmgr.RegisterObserver(ctx, observer1) - - // Persist the Senzing configuration to the Senzing repository. - - err = demonstrateConfigFunctions(ctx, g2Config, g2Configmgr) - if err != nil { - logger.Log(5003, err) - } - - // Now that a Senzing configuration is installed, get the remainder of the Senzing objects. - - g2Diagnostic, err := getG2diagnostic(ctx) - if err != nil { - logger.Log(5004, err) - } - g2Diagnostic.RegisterObserver(ctx, observer1) - - g2Engine, err := getG2engine(ctx) - if err != nil { - logger.Log(5005, err) - } - g2Engine.RegisterObserver(ctx, observer1) - - g2Product, err := getG2product(ctx) - if err != nil { - logger.Log(5006, err) - } - g2Product.RegisterObserver(ctx, observer1) - - // Demonstrate tests. - - err = demonstrateAdditionalFunctions(ctx, g2Diagnostic, g2Engine, g2Product) - if err != nil { - logger.Log(5007, err) - } - - // Destroy Senzing objects. - - err = destroyObjects(ctx, g2Config, g2Configmgr, g2Diagnostic, g2Engine, g2Product) - if err != nil { - logger.Log(5008, err) - } - - fmt.Printf("\n-------------------------------------------------------------------------------\n\n") + ctx := context.TODO() + test(ctx, "A message") } From 480dfcff0f329da48b4bbd3d40304fa6047e444c Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 14:12:08 -0500 Subject: [PATCH 04/11] #1 Example documentation --- doc.go | 20 +++++++++ examplepackage/doc.go | 20 +++++++++ examplepackage/examplepackage_impl.go | 40 +++++++++++++++++ examplepackage/examplepackage_test.go | 65 +++++++++++++++++++++++++++ examplepackage/main.go | 30 +++++++++++++ go.mod | 8 ++++ go.sum | 17 +++++++ main.go | 16 ++++--- 8 files changed, 210 insertions(+), 6 deletions(-) create mode 100644 doc.go create mode 100644 examplepackage/doc.go create mode 100644 examplepackage/examplepackage_impl.go create mode 100644 examplepackage/examplepackage_test.go create mode 100644 examplepackage/main.go create mode 100644 go.sum diff --git a/doc.go b/doc.go new file mode 100644 index 0000000..0897dfd --- /dev/null +++ b/doc.go @@ -0,0 +1,20 @@ +/* +# Synopsis + +The Senzing XXXX packages are... + +# Overview + +(This page describes the nature of the entire Go module or the top-level command, not an individual package.) + +More information at https://github.com/senzing/template--go + +# Another Header + +Lorem ipsum dolor sit amet, consectetur adipiscing elit... + +# Examples + +Examples of use can be seen in the xxxx_test.go files. +*/ +package main diff --git a/examplepackage/doc.go b/examplepackage/doc.go new file mode 100644 index 0000000..5429afd --- /dev/null +++ b/examplepackage/doc.go @@ -0,0 +1,20 @@ +/* +# Synopsis + +The examplepackage package is... + +# Overview + +(This page describes the nature of the individual package.) + +More information at https://github.com/senzing/template--go + +# Another Header + +Lorem ipsum dolor sit amet, consectetur adipiscing elit... + +# Examples + +Examples of use can be seen in the xxxx_test.go files. +*/ +package examplepackage diff --git a/examplepackage/examplepackage_impl.go b/examplepackage/examplepackage_impl.go new file mode 100644 index 0000000..6595ba1 --- /dev/null +++ b/examplepackage/examplepackage_impl.go @@ -0,0 +1,40 @@ +package examplepackage + +import ( + "context" + "fmt" +) + +// ---------------------------------------------------------------------------- +// Types +// ---------------------------------------------------------------------------- + +// ExamplePackageImpl is an example type-struct. +type ExamplePackageImpl struct { + Something string +} + +// ---------------------------------------------------------------------------- +// Constants +// ---------------------------------------------------------------------------- + +const exampleConstant = "examplepackage" + +// ---------------------------------------------------------------------------- +// Interface methods +// ---------------------------------------------------------------------------- + +/* +The SaySomething method simply prints the 'Something' value in the type-struct. + +Input + - ctx: A context to control lifecycle. + +Output + - Nothing is returned, except for an error. However, something is printed. + See the example output. +*/ +func (examplepackage *ExamplePackageImpl) SaySomething(ctx context.Context) error { + fmt.Printf("From %s: %s\n", exampleConstant, examplepackage.Something) + return nil +} diff --git a/examplepackage/examplepackage_test.go b/examplepackage/examplepackage_test.go new file mode 100644 index 0000000..75733b6 --- /dev/null +++ b/examplepackage/examplepackage_test.go @@ -0,0 +1,65 @@ +package examplepackage + +import ( + "context" + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +// ---------------------------------------------------------------------------- +// Test harness +// ---------------------------------------------------------------------------- + +func TestMain(m *testing.M) { + err := setup() + if err != nil { + fmt.Print(err) + os.Exit(1) + } + code := m.Run() + err = teardown() + if err != nil { + fmt.Print(err) + } + os.Exit(code) +} + +func setup() error { + var err error = nil + return err +} + +func teardown() error { + var err error = nil + return err +} + +// ---------------------------------------------------------------------------- +// Test interface functions +// ---------------------------------------------------------------------------- + +func TestExamplePackageImpl_SaySomething(test *testing.T) { + ctx := context.TODO() + testObject := &ExamplePackageImpl{ + Something: "I'm here", + } + err := testObject.SaySomething(ctx) + assert.Nil(test, err) +} + +// ---------------------------------------------------------------------------- +// Examples for godoc documentation +// ---------------------------------------------------------------------------- + +func ExampleExamplePackageImpl_SaySomething() { + // For more information, visit https://github.com/Senzing/template-go/blob/main/examplepackage/examplepackage_test.go + ctx := context.TODO() + examplePackage := &ExamplePackageImpl{ + Something: "I'm here", + } + examplePackage.SaySomething(ctx) + //Output: From examplepackage: I'm here +} diff --git a/examplepackage/main.go b/examplepackage/main.go new file mode 100644 index 0000000..1b3709a --- /dev/null +++ b/examplepackage/main.go @@ -0,0 +1,30 @@ +package examplepackage + +import ( + "context" +) + +// ---------------------------------------------------------------------------- +// Types +// ---------------------------------------------------------------------------- + +// The ExamplePackage interface is an example interface. +type ExamplePackage interface { + SaySomething(ctx context.Context) error +} + +// ---------------------------------------------------------------------------- +// Constants +// ---------------------------------------------------------------------------- + +// An example constant. +const ExampleConstant = 1 + +// ---------------------------------------------------------------------------- +// Variables +// ---------------------------------------------------------------------------- + +// An example variable. +var ExampleVariable = map[int]string{ + 1: "Just a string", +} diff --git a/go.mod b/go.mod index 400317a..caec513 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,11 @@ module github.com/senzing/template-go go 1.19 + +require github.com/stretchr/testify v1.8.1 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2ec90f7 --- /dev/null +++ b/go.sum @@ -0,0 +1,17 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index b97ebb5..72651b8 100644 --- a/main.go +++ b/main.go @@ -15,16 +15,20 @@ const MessageIdTemplate = "senzing-9999%04d" // Variables // ---------------------------------------------------------------------------- -var Messages = map[int]string{ - 1: "%s", -} +// Values updated via "go install -ldflags" parameters. + +var ( + programName string = "unknown" + buildVersion string = "0.0.0" + buildIteration string = "0" +) // ---------------------------------------------------------------------------- // Internal methods // ---------------------------------------------------------------------------- -func test(ctx context.Context, message string) error { - fmt.Println(message) +func exampleFunction(ctx context.Context, name string, version string, iteration string) error { + fmt.Printf("exampleFunction: %s %s-%s\n", programName, buildVersion, buildIteration) return nil } @@ -34,5 +38,5 @@ func test(ctx context.Context, message string) error { func main() { ctx := context.TODO() - test(ctx, "A message") + exampleFunction(ctx, programName, buildVersion, buildIteration) } From c979c0d9289ecdf590ae7069573a55c397990681 Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 14:21:21 -0500 Subject: [PATCH 05/11] #1 Example documentation --- doc.go | 2 ++ examplepackage/doc.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/doc.go b/doc.go index 0897dfd..bf66521 100644 --- a/doc.go +++ b/doc.go @@ -1,4 +1,6 @@ /* +The Senzing XXXX module is... + # Synopsis The Senzing XXXX packages are... diff --git a/examplepackage/doc.go b/examplepackage/doc.go index 5429afd..b2c882a 100644 --- a/examplepackage/doc.go +++ b/examplepackage/doc.go @@ -1,4 +1,6 @@ /* +The example package is used to... + # Synopsis The examplepackage package is... From fe74f03cc41cb2e6f5fb3c507d364b818ab70c2e Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 15:04:45 -0500 Subject: [PATCH 06/11] #1 Build examples --- .dockerignore | 13 ++++++ .gitignore | 3 +- Dockerfile | 69 +++++++++++++++++++++++++++ Makefile | 76 +++++++++++++++++++++++++++++- README.md | 25 +++++++++- package.Dockerfile | 114 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 297 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100755 Dockerfile create mode 100755 package.Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4e2bf93 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +.github/ +docs/ +.DS_Store +.gitignore +.project +.pydevproject +CHANGELOG.md +CODE_OF_CONDUCT.md +CONTRIBUTING.md +docker-compose.test.yml +LICENSE +PULL_REQUEST_TEMPLATE.md +README.md \ No newline at end of file diff --git a/.gitignore b/.gitignore index c810800..5819915 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ -.history \ No newline at end of file +.history +target/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..e10bed2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,69 @@ +# ----------------------------------------------------------------------------- +# Stages +# ----------------------------------------------------------------------------- + +ARG IMAGE_GO_BUILDER=golang:1.20.0 +ARG IMAGE_FINAL=senzing/senzingapi-runtime:3.1.1 + +# ----------------------------------------------------------------------------- +# Stage: go_builder +# ----------------------------------------------------------------------------- + +FROM ${IMAGE_GO_BUILDER} as go_builder +ENV REFRESHED_AT 2023-02-06 +LABEL Name="senzing/template-go-builder" \ + Maintainer="support@senzing.com" \ + Version="0.0.5" + +# Build arguments. + +ARG PROGRAM_NAME="unknown" +ARG BUILD_VERSION=0.0.0 +ARG BUILD_ITERATION=0 +ARG GO_PACKAGE_NAME="unknown" + +# Copy local files from the Git repository. + +COPY ./rootfs / +COPY . ${GOPATH}/src/${GO_PACKAGE_NAME} + +# Build go program. + +WORKDIR ${GOPATH}/src/${GO_PACKAGE_NAME} +RUN make build + +# --- Test go program --------------------------------------------------------- + +# Run unit tests. + +# RUN go get github.com/jstemmer/go-junit-report \ +# && mkdir -p /output/go-junit-report \ +# && go test -v ${GO_PACKAGE_NAME}/... | go-junit-report > /output/go-junit-report/test-report.xml + +# Copy binaries to /output. + +RUN mkdir -p /output \ + && cp -R ${GOPATH}/src/${GO_PACKAGE_NAME}/target/* /output/ + +# ----------------------------------------------------------------------------- +# Stage: final +# ----------------------------------------------------------------------------- + +FROM ${IMAGE_FINAL} as final +ENV REFRESHED_AT 2023-02-06 +LABEL Name="senzing/template-go" \ + Maintainer="support@senzing.com" \ + Version="0.0.5" + +# Copy files from prior step. + +COPY --from=go_builder "/output/linux/template-go" "/app/template-go" + +# Runtime environment variables. + +ENV LD_LIBRARY_PATH=/opt/senzing/g2/lib/ + +# Runtime execution. + +WORKDIR /app +ENTRYPOINT ["/app/template-go"] diff --git a/Makefile b/Makefile index 4446cb7..21116d1 100644 --- a/Makefile +++ b/Makefile @@ -49,6 +49,25 @@ dependencies: @go get -t -u ./... @go mod tidy + +.PHONY: build +build: dependencies build-linux + + +.PHONY: build-linux +build-linux: + @GOOS=linux \ + GOARCH=amd64 \ + go build \ + -ldflags \ + "-X 'main.buildIteration=${BUILD_ITERATION}' \ + -X 'main.buildVersion=${BUILD_VERSION}' \ + -X 'main.programName=${PROGRAM_NAME}' \ + " \ + -o $(GO_PACKAGE_NAME) + @mkdir -p $(TARGET_DIRECTORY)/linux || true + @mv $(GO_PACKAGE_NAME) $(TARGET_DIRECTORY)/linux + # ----------------------------------------------------------------------------- # Test # ----------------------------------------------------------------------------- @@ -57,6 +76,48 @@ dependencies: test: @go test -v -p 1 ./... + +# ----------------------------------------------------------------------------- +# docker-build +# - https://docs.docker.com/engine/reference/commandline/build/ +# ----------------------------------------------------------------------------- + +.PHONY: docker-build +docker-build: + @docker build \ + --build-arg BUILD_ITERATION=$(BUILD_ITERATION) \ + --build-arg BUILD_VERSION=$(BUILD_VERSION) \ + --build-arg GO_PACKAGE_NAME=$(GO_PACKAGE_NAME) \ + --build-arg PROGRAM_NAME=$(PROGRAM_NAME) \ + --file Dockerfile \ + --tag $(DOCKER_IMAGE_NAME) \ + --tag $(DOCKER_IMAGE_NAME):$(BUILD_VERSION) \ + . + + +.PHONY: docker-build-package +docker-build-package: + @docker build \ + --build-arg BUILD_ITERATION=$(BUILD_ITERATION) \ + --build-arg BUILD_VERSION=$(BUILD_VERSION) \ + --build-arg GO_PACKAGE_NAME=$(GO_PACKAGE_NAME) \ + --build-arg PROGRAM_NAME=$(PROGRAM_NAME) \ + --no-cache \ + --file package.Dockerfile \ + --tag $(DOCKER_BUILD_IMAGE_NAME) \ + . + +# ----------------------------------------------------------------------------- +# Package +# ----------------------------------------------------------------------------- + +.PHONY: package +package: docker-build-package + @mkdir -p $(TARGET_DIRECTORY) || true + @CONTAINER_ID=$$(docker create $(DOCKER_BUILD_IMAGE_NAME)); \ + docker cp $$CONTAINER_ID:/output/. $(TARGET_DIRECTORY)/; \ + docker rm -v $$CONTAINER_ID + # ----------------------------------------------------------------------------- # Run # ----------------------------------------------------------------------------- @@ -65,15 +126,28 @@ test: run: @go run main.go + +.PHONY: docker-run +docker-run: + @docker run \ + --interactive \ + --tty \ + --name $(DOCKER_CONTAINER_NAME) \ + $(DOCKER_IMAGE_NAME) + + + + # ----------------------------------------------------------------------------- # Utility targets # ----------------------------------------------------------------------------- .PHONY: update-pkg-cache update-pkg-cache: - GOPROXY=https://proxy.golang.org GO111MODULE=on \ + @GOPROXY=https://proxy.golang.org GO111MODULE=on \ go get $(GO_PACKAGE_NAME)@$(BUILD_TAG) + .PHONY: clean clean: @go clean -cache diff --git a/README.md b/README.md index 04023c0..7817e56 100644 --- a/README.md +++ b/README.md @@ -1 +1,24 @@ -# template-go \ No newline at end of file +# template-go + +[![Go Reference](https://pkg.go.dev/badge/github.com/senzing/template-go.svg)](https://pkg.go.dev/github.com/senzing/template-go) +[![Go Report Card](https://goreportcard.com/badge/github.com/senzing/template-go)](https://goreportcard.com/report/github.com/senzing/template-go) +[![go-test.yaml](https://github.com/Senzing/template-go/actions/workflows/go-test.yaml/badge.svg)](https://github.com/Senzing/template-go/actions/workflows/go-test.yaml) + +## Syopsis + +The template-go repository serves as a starting point for new repositories hosting Go code. +It also shows best practices that can retro-fit into existing repositories hosting Go code. + +## Overview + +Aspects of the template-go repository: + +1. **Badges:** Example badges can be seen above. +1. **.github/workflows:** GitActions tailored to Go programming. +1. **.github/dependabot.yml** Specifications for keeping Go dependencies up-to-date. +1. **Example documentation:** used in the [Go Package library](https://pkg.go.dev). +1. **Dockerfile:** for use in containerizing the Go program. +1. **RPM/DEB builds:** Using `package.Dockerfile` to build `RPM` and `DEB` files for installation. +1. **Makefile:** for simplifying development lifecycle commands. +1. **Sample code:** `main.go` and `examplepackage` code examples. +1. **Sample test cases:** `*_test.go` files showing how to write and document test cases. diff --git a/package.Dockerfile b/package.Dockerfile new file mode 100755 index 0000000..6011a8b --- /dev/null +++ b/package.Dockerfile @@ -0,0 +1,114 @@ +# ----------------------------------------------------------------------------- +# Stages +# ----------------------------------------------------------------------------- + +ARG IMAGE_GO_BUILDER=golang:1.20.0 +ARG IMAGE_FPM_BUILDER=dockter/fpm:latest +ARG IMAGE_FINAL=alpine + +# ----------------------------------------------------------------------------- +# Stage: go_builder +# ----------------------------------------------------------------------------- + +FROM ${IMAGE_GO_BUILDER} as go_builder +ENV REFRESHED_AT 2023-02-06 +LABEL Name="senzing/template-go-builder" \ + Maintainer="support@senzing.com" \ + Version="0.0.5" + +# Build arguments. + +ARG PROGRAM_NAME="unknown" +ARG BUILD_VERSION=0.0.0 +ARG BUILD_ITERATION=0 +ARG GO_PACKAGE_NAME="unknown" + +# Copy local files from the Git repository. + +COPY ./rootfs / +COPY . ${GOPATH}/src/${GO_PACKAGE_NAME} + +# Build go program. + +WORKDIR ${GOPATH}/src/${GO_PACKAGE_NAME} +RUN make build + +# --- Test go program --------------------------------------------------------- + +# Run unit tests. + +# RUN go get github.com/jstemmer/go-junit-report \ +# && mkdir -p /output/go-junit-report \ +# && go test -v ${GO_PACKAGE_NAME}/... | go-junit-report > /output/go-junit-report/test-report.xml + +# Copy binaries to /output. + +RUN mkdir -p /output \ + && cp -R ${GOPATH}/src/${GO_PACKAGE_NAME}/target/* /output/ + +# ----------------------------------------------------------------------------- +# Stage: fpm_builder +# - Reference: https://github.com/jordansissel/fpm/blob/master/Dockerfile +# - FPM: https://fpm.readthedocs.io/en/latest/cli-reference.html +# ----------------------------------------------------------------------------- + +FROM ${IMAGE_FPM_BUILDER} as fpm_builder +ENV REFRESHED_AT 2023-02-06 +LABEL Name="senzing/template-go-fpm-builder" \ + Maintainer="support@senzing.com" \ + Version="0.0.5" + +# Use arguments from prior stage. + +ARG PROGRAM_NAME +ARG BUILD_VERSION +ARG BUILD_ITERATION +ARG GO_PACKAGE_NAME + +# Copy files from prior stage. + +COPY --from=go_builder "/output/linux/*" "/output/linux/" + +# Create RPM package. + +RUN fpm \ + --input-type dir \ + --output-type rpm \ + --name ${PROGRAM_NAME} \ + --package /output/${PROGRAM_NAME}-${BUILD_VERSION}.rpm \ + --version ${BUILD_VERSION} \ + --iteration ${BUILD_ITERATION} \ + /output/linux=/usr/bin + +# Create DEB package. + +RUN fpm \ + --deb-no-default-config-files \ + --input-type dir \ + --iteration ${BUILD_ITERATION} \ + --name ${PROGRAM_NAME} \ + --output-type deb \ + --package /output/${PROGRAM_NAME}-${BUILD_VERSION}.deb \ + --version ${BUILD_VERSION} \ + /output/linux/=/usr/bin + +# ----------------------------------------------------------------------------- +# Stage: final +# ----------------------------------------------------------------------------- + +FROM ${IMAGE_FINAL} as final +ENV REFRESHED_AT 2023-02-06 +LABEL Name="senzing/template-go" \ + Maintainer="support@senzing.com" \ + Version="0.0.5" + +# Use arguments from prior stage. + +ARG PROGRAM_NAME + +# Copy files from prior step. + +COPY --from=fpm_builder "/output/linux/${PROGRAM_NAME}" "/output/linux/${PROGRAM_NAME}" +COPY --from=fpm_builder "/output/*" "/output/" + +CMD ["/bin/bash"] From a6d145e955f6709e878f2761d0ec96cedcb4dcea Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 15:19:25 -0500 Subject: [PATCH 07/11] #1 Polishing --- CHANGELOG.md | 20 ++++---------------- Makefile | 4 ---- README.md | 6 +++--- examplepackage/examplepackage_impl.go | 4 ++-- main.go | 13 +++++++++++++ 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93b6169..0f6afde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,22 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -- Thing 5 -- Thing 4 +- -## [1.0.1] - yyyy-mm-dd +## [0.1.0] - 2023-02-d06 -### Added to 1.0.1 +### Added to 0.1.0 -- Thing 3 - -### Fixed in 1.0.1 - -- Thing 2 - -## [1.0.0] - yyyy-mm-dd - -### Added to 1.0.0 - -- Thing 2 -- Thing 1 +- Initial artifacts diff --git a/Makefile b/Makefile index 21116d1..68c944c 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,6 @@ build-linux: test: @go test -v -p 1 ./... - # ----------------------------------------------------------------------------- # docker-build # - https://docs.docker.com/engine/reference/commandline/build/ @@ -135,9 +134,6 @@ docker-run: --name $(DOCKER_CONTAINER_NAME) \ $(DOCKER_IMAGE_NAME) - - - # ----------------------------------------------------------------------------- # Utility targets # ----------------------------------------------------------------------------- diff --git a/README.md b/README.md index 7817e56..c2067b6 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ Aspects of the template-go repository: 1. **Badges:** Example badges can be seen above. 1. **.github/workflows:** GitActions tailored to Go programming. 1. **.github/dependabot.yml** Specifications for keeping Go dependencies up-to-date. -1. **Example documentation:** used in the [Go Package library](https://pkg.go.dev). -1. **Dockerfile:** for use in containerizing the Go program. +1. **Example documentation:** Documentation style conducive to the [Go Package library](https://pkg.go.dev). +1. **Dockerfile:** Containerizing the Go program. 1. **RPM/DEB builds:** Using `package.Dockerfile` to build `RPM` and `DEB` files for installation. -1. **Makefile:** for simplifying development lifecycle commands. +1. **Makefile:** Simplifies development lifecycle commands. 1. **Sample code:** `main.go` and `examplepackage` code examples. 1. **Sample test cases:** `*_test.go` files showing how to write and document test cases. diff --git a/examplepackage/examplepackage_impl.go b/examplepackage/examplepackage_impl.go index 6595ba1..240ee55 100644 --- a/examplepackage/examplepackage_impl.go +++ b/examplepackage/examplepackage_impl.go @@ -18,7 +18,7 @@ type ExamplePackageImpl struct { // Constants // ---------------------------------------------------------------------------- -const exampleConstant = "examplepackage" +const exampleConstant = "examplePackage" // ---------------------------------------------------------------------------- // Interface methods @@ -35,6 +35,6 @@ Output See the example output. */ func (examplepackage *ExamplePackageImpl) SaySomething(ctx context.Context) error { - fmt.Printf("From %s: %s\n", exampleConstant, examplepackage.Something) + fmt.Printf("%s: %s\n", exampleConstant, examplepackage.Something) return nil } diff --git a/main.go b/main.go index 72651b8..9c07015 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,8 @@ package main import ( "context" "fmt" + + "github.com/senzing/template-go/examplepackage" ) // ---------------------------------------------------------------------------- @@ -38,5 +40,16 @@ func exampleFunction(ctx context.Context, name string, version string, iteration func main() { ctx := context.TODO() + + // Calling a function in main.go. + exampleFunction(ctx, programName, buildVersion, buildIteration) + + // Using a package + + examplePackage := &examplepackage.ExamplePackageImpl{ + Something: " Main says 'Hi!'", + } + + examplePackage.SaySomething(ctx) } From bc2dca1834575583a983f7646d2d9325f11157cc Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 15:21:17 -0500 Subject: [PATCH 08/11] #1 Polishing --- rootfs/.dummy.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rootfs/.dummy.txt diff --git a/rootfs/.dummy.txt b/rootfs/.dummy.txt new file mode 100644 index 0000000..e69de29 From c97480f735dfb3f9efebe2f8cc9654089eca504e Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 15:22:55 -0500 Subject: [PATCH 09/11] #1 Polishing --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9553dcd..f00cfb2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,5 @@ -# template-repository +# template-go Placeholder for [GitHub pages](https://pages.github.com/). -See [https://senzing.github.io/template-repository](https://senzing.github.io/template-repository). +See [https://senzing.github.io/template-go](https://senzing.github.io/template-go). From 40d044f22df2051995e564b7c35b5571b356b17d Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 15:31:46 -0500 Subject: [PATCH 10/11] #1 Add documentation --- README.md | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/README.md b/README.md index c2067b6..73fd11c 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,111 @@ Aspects of the template-go repository: 1. **Makefile:** Simplifies development lifecycle commands. 1. **Sample code:** `main.go` and `examplepackage` code examples. 1. **Sample test cases:** `*_test.go` files showing how to write and document test cases. + +## Development + +### Build + +1. Identify repository. + Example: + + ```console + export GIT_ACCOUNT=senzing + export GIT_REPOSITORY=template-go + export GIT_ACCOUNT_DIR=~/${GIT_ACCOUNT}.git + export GIT_REPOSITORY_DIR="${GIT_ACCOUNT_DIR}/${GIT_REPOSITORY}" + + ``` + +1. Build the binaries. + Example: + + ```console + cd ${GIT_REPOSITORY_DIR} + make build + + ``` + +1. The binaries will be found in ${GIT_REPOSITORY_DIR}/target. + Example: + + ```console + tree ${GIT_REPOSITORY_DIR}/target + + ``` + +1. Clean up. + Example: + + ```console + cd ${GIT_REPOSITORY_DIR} + make clean + + ``` + +### Test + +1. Run Go tests. + Example: + + ```console + cd ${GIT_REPOSITORY_DIR} + make test + + ``` + +### Package + +#### Package RPM and DEB files + +1. Use make target to run a docker images that builds RPM and DEB files. + Example: + + ```console + cd ${GIT_REPOSITORY_DIR} + make package + + ``` + +1. The results will be in the `${GIT_REPOSITORY_DIR}/target` directory. + Example: + + ```console + tree ${GIT_REPOSITORY_DIR}/target + + ``` + +#### Test DEB package on Ubuntu + +1. Determine if `template-go` is installed. + Example: + + ```console + apt list --installed | grep template-go + + ``` + +1. :pencil2: Install `template-go`. + Example: + + ```console + cd ${GIT_REPOSITORY_DIR}/target + sudo apt install ./template-go-0.0.0.deb + + ``` + +1. Run command. + Example: + + ```console + template-go + + ``` + +1. Remove `template-go` from system. + Example: + + ```console + sudo apt-get remove template-go + + ``` From 5f51ea650459afcf8056a34289c6dce6d3fe80f9 Mon Sep 17 00:00:00 2001 From: docktermj Date: Mon, 6 Feb 2023 15:39:05 -0500 Subject: [PATCH 11/11] #1 Add documentation --- examplepackage/examplepackage_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examplepackage/examplepackage_test.go b/examplepackage/examplepackage_test.go index 75733b6..7370ae1 100644 --- a/examplepackage/examplepackage_test.go +++ b/examplepackage/examplepackage_test.go @@ -61,5 +61,5 @@ func ExampleExamplePackageImpl_SaySomething() { Something: "I'm here", } examplePackage.SaySomething(ctx) - //Output: From examplepackage: I'm here + //Output: examplePackage: I'm here }