, --output-directory=
+
+ Default: none
+
+ set the output directory path.
+
+
+Example Output
+''''''''''''''
+
+Example diagrams generated with the .dot output format are shown below.
+
+Class Diagram
+.............
+
+.. image:: ../media/pyreverse_example_classes.png
+ :width: 305
+ :height: 653
+ :alt: Class diagram generated by pyreverse
+ :align: center
+
+
+Package Diagram
+...............
+
+.. image:: ../media/pyreverse_example_packages.png
+ :width: 302
+ :height: 155
+ :alt: Package diagram generated by pyreverse
+ :align: center
+
+
+Creating Class Diagrams for Specific Classes
+''''''''''''''''''''''''''''''''''''''''''''
+
+In many cases creating a single diagram depicting all classes in the project yields a rather unwieldy, giant diagram.
+While limiting the input path to a single package or module can already help greatly to narrow down the scope, the ``-c`` option
+provides another way to create a class diagram focusing on a single class and its collaborators.
+For example, running::
+
+ pyreverse -ASmy -c pylint.checkers.classes.ClassChecker pylint
+
+will generate the full class and package diagrams for ``pylint``, but will additionally generate a file ``pylint.checkers.classes.ClassChecker.dot``:
+
+.. image:: ../media/ClassChecker_diagram.png
+ :width: 757
+ :height: 1452
+ :alt: Package diagram generated by pyreverse
+ :align: center
+
+
+Symilar
+-------
+
+The console script ``symilar`` provides a command line interface to the ``Similar`` class, which includes the logic for
+Pylint's ``duplicate-code`` message.
+It can be invoked with::
+
+ symilar [-d|--duplicates min_duplicated_lines] [-i|--ignore-comments] [--ignore-docstrings] [--ignore-imports] [--ignore-signatures] file1...
+
+Currently all files that shall be checked have to be passed in explicitly, e.g.::
+
+ symilar foo.py, bar.py, subpackage/spam.py, subpackage/eggs.py
+
+``symilar`` produces output like the following::
+
+ 17 similar lines in 2 files
+ ==tests/data/clientmodule_test.py:3
+ ==tests/data/suppliermodule_test.py:12
+ class Ancestor:
+ """ Ancestor method """
+ __implements__ = (Interface,)
+ cls_member = DoNothing()
+
+ def __init__(self, value):
+ local_variable = 0
+ self.attr = 'this method shouldn\'t have a docstring'
+ self.__value = value
+
+ def get_value(self):
+ """ nice docstring ;-) """
+ return self.__value
+
+ def set_value(self, value):
+ self.__value = value
+ return 'this method shouldn\'t have a docstring'
+ TOTAL lines=58 duplicates=17 percent=29.31
diff --git a/doc/index.rst b/doc/index.rst
index 1e70943d17..273474d00a 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -19,6 +19,7 @@ refactored and can offer you details about the code's complexity.
how_tos/index.rst
technical_reference/index.rst
development_guide/index.rst
+ additional_tools/index.rst
faq
backlinks
diff --git a/doc/media/ClassChecker_diagram.png b/doc/media/ClassChecker_diagram.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6a685ce2cb38ed71d1ce0bc4f246b7a74b1a4bf
GIT binary patch
literal 138128
zcma&O2RN2}|37{j;g(gQA&TrBg)$S_*?U$f5+yRSDk@Y~NRsTmLlIiC5*Z1hK}Ja#
z+4;Y&x}WEJKhN*`J&wQoxR2XiT-SM>pU>z0ey#Tzs&`n8o^~58K@jvB>M8~VK|V(i
z>+)&H@h7}gUrypbR7bVcRERawKlf^~VhCa>tEWXfoC0PiE$#Mx=S#C~u?*7scQTZl3tX%XSKfj>VPA>lXT*~&a_KO!O
z(@mK;$yp+KLT?2nOzjw*Pq1~}sBE_BhtJvvp|YfzJCZTqWzITYKA_LMGnh%4W^Sj&
z1Ovf|Z?j{L1YE+Oq}-*NVf+18du|PpekMEXNRBKK?0b85cJ|p7#ynZtU?yK%6*aY%
zw&yd_G@hmSx^-)dr`iQ3W%(Tu4JXIvS=)wocJVO(3MA(Y*5f-`)_eEvUE0kb7XRyY
zpR7=k-dUdhvosC9nQ#)XJAiNWbT7^8a?ZYD3a|H?8mtLetqKos$u}<}?mc+mJyh#|
ze*PP~oOf|mS_}^}t(bMy^G`oixT317mlu9~>fU&n*GpfG-zi>c=ljz#^WO$!Prnb!
ztbg-uuVr*>?A&N_AS*NTty{O=_V(%|O6i!IR~puhO5&pV%D>*&CSizb93v0I{9K7anaFuQPEgWg=i=**7`4#Kfbm5*!1+Y1^vO>>fBYnbAkdZ
zW3SVSZ0lSNT{>>A3?2=*q{sKAYUOfj_MJQ1$4URq%@t&+l=u2()kB%_xFbVrZLuw|
zBPQ_IVwO7hL`9#2MXvAW8q1sazkDgGt0*oWdu3;zJvchqFMIv^^<9Uq6_=Fw%uU43
zt^@@UA|eG?&>REx`R#n`)~zGHFODX6p8ff4U_H?iFE;fqZ2zh^6K#kv>w4nF4R)cr
zS*$VzH3MbPWPfGemdkrWRgSv2&=C^niwkhA9~any2YH4^FF&zsKf5$PRn&aBsi~>I
z(rqfYc-X4?+^NP$&e`;|w6q&H4$m8j3>mOgk0qt0TU(I6CRTh*YufrNz0Q4mXKrTp
z;CLH{JMD#v^YgC9j(sxDGr?B0@cC=t+@0C+PBq6Hb#--dajc20tl{-ZX8Kt>7=3+x
zO-xMQym^Bg!FT0Zl#PnM(TNk;5fO~UmTlW|aj{gF4oH2S)$-i4J@8Vb?|1J<3kwT#
zUwX1KGY7FoU0oh?6WulE=WEZ79yT}MN{mfRh?*5EnVL#VN=hm!*0~MU&WyIj3t+pa
zXJ&5OvPEX!J~Ab9b8{D$ub1iBre|g}E|=IhZ4?m^VYu??+qYMC;>rgPQqynSgQZ&Z
zrX)XLWo32bNJ>FLL1H4?YTC2WnN6EEt*51Z`SK-pOY6&*jVo~zzDu*?1Jz!Oe!pQmd#Z0wRbgXeV@HR9mX_A>gVL-L~zI-l}Nzt5ET`j?0-n;Sz5BOu#Ak3&SOh_{`}dsw=|^wr~qB)vk&%;j^vN2
zclas&icC*Wx3{;a+b(muJJ)!6(sypcSX*0LL*uW-p$dwin2dd|*Jik1uscEu1!pFx~VkXQ?d&I6em!yI$dTc)D_5wAJ90kJsoB^qWE50{(&^LRbB*&pzf7PY
z6j#1esOmHBP`D#==3@{Uh0OL>ShbN)0{r~9_MS93eE6`TVduyCaK(l96b8#_Y7s7{
zP8C@_oSq(OL7l@EiZoo(oXEvHU%$RC2+O|qYk3OmSM4=L6%@F(Jd|FDl1RTpK~6+O
zXD5^2;z)e@2R3Qfn-RGgeX+B5wY40ovi(I;`JEeXun*sUzawzv!`H9xz9q43*pQNy
z)o`>V;Md~u^XJbKjZIBX0^DJ#sCd-G`1rWJ0aujYbQ7N(hiCxBSX*0r
z;lc$RK3o5}?(xp7cwzI>6R)|bF73vyFD>)QS32p5SEI{$*X%8TV13sbJ}{R
z$gW)!1a1h+q2;=@qf9{EfB;mf^i{(j!{>%TI15f`fzgm|1r0
zU^KYo(%jM_FDKV{{C5$3_s(kEHs(}+1=(ZNvZnM)moBBH?OOc$?VGEkW2SgCPRZ*u
zwdDPtVcL!k4&!5E+}zw(Rk(zN@~}*uCw+Z<@MotVT8((d-n>aD+1qooD=zkO#h}_r
zOG{^ciMHX^@tM^0)y>T4uf)wYq#(X1hcnjx=qx{_W`Ral+>0L`g{rvnmTS
zGe2WacDA~f)|cg}x-8jqt+)41Phw%;Jvd`o>B^JLvoSOzWZmNV7o#&G!orl~WajsM
z=bV=q)3v#qEj<>#A0e*ZxWOBfUQ}rHP?@)G?bms0YwPJNnhH`KoHf34OQeJUGQrT?
zT%*l&m54j{^Q$>=Yv0+-r+UwxJtKSE-5uL;?Njiu^s$B;{`fmhO-(($NFaxr8h=&Q
zbs0YzE+r+gtLh&(aA4^%yb8XvCw_kIweNWHK
zC)#%sJL9(%`>~X
z4qpumb4ItLqnn*4eHCSAZ`toL25>R5OMj5dy{6;Mn>g(oTXvHZje)aGpShy0a+mJ(
zG9!PitGH_K;v#qCDW#j6+j#i4Q~QIQ?B5+ab}a3wUX!1DiT2qWF`LC~z7EwX?%!Ya
z@L_`ACxxZ4UEXRpsBLX+ckN2c&gOTQUck%TcW7Y^Nh(?@jL%xq4GRNgQ{OcM61vs`g?eoKK#tKU(ti2<@p{>#F&CBXJegs;Dtv
zIG7L~y
ziS|5yKD@B@@XV(dxLfg})`B}U5@#p6wS1%LvH&kc3Wfl9P@KEFx@aiLyH7fe-{V@O
zT^(lG%57ayRu*HM{^HZ~jt+@EduHF39K*g!l=G30UrUnVK({PAH`$k&nYl~thLNf1
z=*YBDH};SqeUT1l>z#d_PoHw_*|SGL
zASYu_Wl9Pe(U{G=ZJd%f20-U6&}3$iY?2BW>HYv;)vf;Q2XbYIbHvecb|zsXOG}};
zJz`>vgu?2q;iBrcfIHa+P21z}%^ei}cFdK0LWZ
z?Kb#`Gi`!UQd2wr>BaT!49CB`DabP^nDAbtqxyuhN4q&HoB`{RI*N<1s`2$iwIP&}
zUs4A>dh`hQ^si049^4yQ!_n9`a&WjFKfZbU_IDkj-=w-l2hM9+^wqM4s-!kHsvkUf
zaC*(!mnfgGKj)gLd{lhPm!6_J&o6IM4qm}4F~{ltv~zbaUExA2O3~Z0aieluPF|ku
znU5-oAEzF?fB$}QX4JOILqnJq`=ItxMu}NIHc@E(N3_glVL^WW2e>t
z>Z_MMU0v#Gs_3ph61=>bIXU=z@o{m}i+Dpl6F3LvSlYuC5~H@CF3pkw>U
z*|@rXGqv@1aCBrviDPCq($jnFSmy8VA1`9byCc-yUOGzi!`cm{r4>qnFdMNNgXcR$V#i6%rfoFw)-7R+`~3U&FTHlkZEaI
znPpfy&-~O7-@#DRd^3G3tCt^6Z{NP1u){@LiOvI8*vozG0hY$UP0!=*+*tvIrKY4*
z=iV5WDr)nHh5!QC56qs(V3%<0(gTqC^71)sn7L<+iuu;n=bm5PAnWzb1z(Pl`&;WpbwQVH2>jKyC
zLVtxQcYCcCSXPc1c>=}*xI1}HRZ>nds%0-{-yJ$}@}wcNF$$WkZP97=&6_t*pX?Ao
zCrLNtS4b9{v7ZGcxP5zD2-`2q>V37;#fI2ekHH1jDl=SyA58uetm9wnsiRI
z^ab**eWsf38`)S|qJV)J+*J%L{J50+^_^4*H#4oV!0<>*{O}uFym(o5db-No!rqvb
zk^?BkAUgamNtbu_#)G7Wk+)GPKH81>$cYnUU%%%2S$eYbO=kZ5ltTR&
z+RU8y>XPT#vt>#u6|%hKC!PdRuc#OIKq1W9z=SwiPeR!^4x1
zknr%~!&Cm!CR#N;r_z&+#g07=B6DUeV!v6LExT)6W$NP%rKHS6T^`P^PdN(#RMXi)
z0QCu*dBFm=;cM&GlHRX{bcXWW8=FwNGqn>^^YZeFiWCD@7TVj}D{3vQG^U)$=^3Y1
zFUWrMzc)M|cfj-O;yxPAtu9jiot=h@(&2RLb|!mzdNy5>b!u&Gbq-uRYkJbz*>8xj3~>9g#H{RmZ{=xVmRzguvvS#oWGt6;vg0pbng8{e{m0!e
zO=|~KAW5|^|MlOZ*uTUpowgk>u0~qipLIS8Eo*?l&s9RitR0~u$qZ*AN(8x(;5U2Xf<3;$ac`~FKH*q0$i&wIRsha-Y-V<;+PL&T1v
zZU=)#bmh&@0QUn49;$L-~4@RDG<0fj4HK|I+O7w!1m9{J~5Hj4$1oCOFT1eftB_
zO5p5kHSpiHrJg$U3vC^pZgys6njC7NlsTrJLTfe&dm4H0ifm{kFTC*v*H7aOoOdzN
zeEj&4cK!NOr%nyLdw1>HwMIXM)T>ZMa5)$
zNv$~H*Bu@Ip(h+WdKCSnzjE*1y$}aFGj-CwppjrVm*2ndaqb+)K6mbzCL^u94a(VU
z?;#j=eFEkN2{?D|9L}HOr;i^mGq77&S`kN5(Hn`Y=$tVlBO?UU_U+od_-izo!#zAT*l2^+q)kb>XLcaoDCNq1*0UoKU+GfS?r#
zbzR-8(OZd$Cr_T7$1?BgUR+pk=`D2_sPcUM`ZZLAL6qsuwtlap$TujfKZE8Rx$SLV
zANgZIsIh(673gp5(yrTy^o)$xGc(iEkTrR=Z?#8Fmu1zKqImEL#NUTxU<
zJw2NVlp7+5E{!Y*yEjT*MW6Z7lkB`aiXhbg(yRFzf1{=suV3r`Moj@YI+rhB9vD0U
zt@_Zw{`RdY^Ff01y86uZpMF4C+d@Zm>B%h#2U;k@Gi+>ZtE;Q%o#^dPpFVYLy9+ByjMiO~+22)N++kqe=0)i5B!oAtZ8t
z)aZ1Rq=dxMY^SblMp%A+eyorwZk|NKOF+P=1jDSu4rRSb1`4?OJ4vXm#AN&prLoBdavcSFc_%Ffsski@`XV?;wDq&P^#WI_LnfD%p0jc0IUoG2Nt0MgyveeA`x?fW_g29m6f-Np%CU7oKz)h`7)T-rC>
z6a%&dZN{=M-T2IzGqUHt>MgimURm+e)opX?%mnHoQ&LvGn3e{{#s(qR7dQ~$SJ<|8
z#gyqP^11R#sLP=W4^QL$?wVJWcqp7qiA+&HHi9D(L-K{a_`!nZRz~5BoT?$jZt}
zej!NMqQ-YGiPZvp85!Yh&p~~SQ3YZ+`6ge#Hq@hOnv(npY5>k8vnaaux}X?7-Dr(z
z@>h_vepf&>HMQy9fq{XSFY~({xq|h2^rz2<_hc~{)PZ-Qti$|}FxS`L?J?G#rJH!!Y?s7i$0-x?6Mo`%?D
z*pq`aoLvGWbz}8`Rbgmo6Z9q)(Yg8gWcl;w{QMqOSD!z8_|@7<+uHpqjm<|S5|~wA
z$B+!OJ*;S@IXhySfT>-^SM?;1zq(&sOhZpU*`2r9f3#v+r;5~UIj@I&3g2L$_}_Gt
za`B~|_?sfzK=5QxA8e_dQVnU)25A426%(-IbVwH^Kk?-YnbJ-sA_(?VLV~%Hl9HaD
z-hl&Tr~-3y))g*WYf39Cy`Wda7jQgrLj5y;uS%7@55OaKKQgk
z{Qy)ION(^zhx)Y|TKjn(k`Yk14hvA@BeLK4m;Z>yhGy)$4b=_bbamSOU)Jb9!CH!x
zY~Zg)RR_@;9k50;@?WY-Q7)6g`nNCh-UB$^6-o_M(qM+ngJIgP>LQ@SFfkM2n-z@Oi5%H6!1)m
ztj+b<0vNTwd-pCS-~dg^tDvdlO6v3*H*Pd3vavQcR@FBGG%+^rMuGK_x6UFO&t_-iH^dzOWjbsHO-8#+GZUR%E(s+yY3IK+Xl
z4)DA64Gl4ZGTRRu8FekqeZk(tk&YL$1-w7As1A$?oO;C0uK36^s>KX2!j<6|T`AXh
z3qY<*%gfad9?VYm_q=-bt*GwTw%tdA;r#&iuB@y)KU$)~_1F6KElo`cDBZva@jp3~
zY03+i2d6{Zmk-3wUom7ZM+qbz_%BN(c$_|c+QWl8`3gPT=cy@Oh3e|+w%dEd{S^Eb
z#0hxYTJfhxnpq?kQKi02Ou!|LO9el4J931RiKa2NJI|Ct$=A2aZwvW__pm?lDW=1@
zH)^c?THUvuA>m!6+YWYgz^yfX(L7qjPARFl)a;8FFPgC3_e`Ns@htC2i)Yd8xsQv)euT7I0mxa*`n})A$*hM@Z9K5S-VQvoT3&t(Z
zl$xsQUMVR6xM)=t78a}l`pP(jJcp<4Jw3LMyi1cjcllJco{6(@}$5m%X
zfrH5&uPn}FB;trogkY0yyU=8Bz^tl}c>DIRpZ#u-W0U24rs1-F$TJli*T9t!
zP)&))Bknrd+RQeQ&M{ESV70Xm43OR$dd$lAXN*mL<12@>w8DRF<_z9L`HPz~{S1`S
za+ESOLBF|fQ*GWdb{_GBmuMEy`WOyL_|Afdy1?p$zCulX1z<30v4eCPeafy1|J1
zQ=h4~8t?jd$xG$eL?u;1{W*B>8OdAe=z#dVj+`vHZFFXl*ts#Zk=I^l=??8f3Dr38
z=-UYi>nJHH*R6wR0)T02JLJ$3*K{Q+Hg@Fe*E`YCTymZ06-R1VaxOK@`kgDgx$EI;QjqQbdDxJ
zhAYpGmO$$O0@%jN>gepOInmnKIA+!cJk-y>SmU6#CY`N;~jg`xKL
zNIyujpqP_FqtI08sEz@EYQAwgabjn0?4!@09Ya+N%*_Q1mHqu|V4t&df_;XNkY^w*
zrw(`0{`=tI#M!emCOu99_>MJv9Wgz=;h`ZrY3cs|7ijM_X6313-0eSxs~1?{L>Q;M
zd<`g6Mg}f#J*)5uwGx0wd{*pnuQO*7_MVK3-m9gl+0ohAH2UG$mGJtb*TWiKzb;|#
z7Kr*gAYx!?c^--e*kkGa`!~(Y{I95)Hi%tsbv*Cw?eV6iB`iD~(7ACG&Y!S;utm$cs#RucSQ_|V?S
z0!#`?{S&$_-iE7I9Us3LJOiK(4(VQzyFZPyf>G}D^`qkBdzxc~*bp_y%|#8zSyx;f
zjscz3tnImJ=lfX&nIt=CgACra}>CIadB~Y2HTFz4)D-^x;0T6zK4rf6ZklB?|W}^M`Lna
zRn`91YifTbSm#ugmP!zjuHh<9-oL0)yfpsw(TveZFXf!q;4f0{!|Ea79-f{+`u)}t
zK2>&>L&k+pKklmpnC2e-6?Kh{3YOw0m=fSTxA!=0T(yxjW{CKy+7Y!7iu?k&1(a5K
zzlGvmBRkWXu&dNhE%*f-J$e+(7t95U6RLMY+ovD6QKSNR`?l}QXB{}{sQeJv6MuJ8
z$t~B=O;JEwlVnZ*k;o7bD}!(^C3OyG6*udTsM3f|(D;BlEY-l!5Rm4%y#$OukjCMI
z1%-tQ{!8~OE9bB52;eU}0pO?Ew}pu*GBQ%n$jIK#4%`7j4QSazU0wD^kA55<&q*(#
z)k6Q*)ztj>!y78d9R>fYr=EL6IP|)nO;?vzR7eR5Hn+7+0agG@50pBr*U0L74hs^M
z9<>7>G1>oT!paA9v;UHHhIftMU4Wtw{d#g_1h#b`T0S^NQ+|8LhV!GZ*xi@H=rTIG
zyCKZJ#5?p?PT@8C`;KMveR(ybPE*5Z^hjZD?DZ~7%YMj|kNg&=Aw#1x4ZEyihb;jQ
zK?Hy=<8%IeOiDiT2{?i{Yxoe`#qEeI&wLiXbH=yKeg9677=WOdq=G^K4jf4`JAAX*0*byirD=T#ECm0uTdUi~IMpN(@MF}}kp%0l|4c4Svvwo&
z#ItH;Ysz?i*#!g{}r(^bsscbT
z%l1$p42`|x^=l*zm{mort8PBA8y*>nQmsBWNgjmO5|#=P5KAyt0Pa1mXxH5GuHqCM
z@vhcCQP}-Awn^vLaVN;~0uN6$WH2(f79larGh^Sjt}c>1rA
z>#?u+7W`^MLPC^w?#zoi@)YR|qw49zZ`ZOiIO2L^!8^%<-o7;pOQofywHSN977@L|
zOX{hPukL89&VP9Q?wuSOH*|rhZqQZ_4-ZryY^2KzFx0KBtQto_f{4e3*46fJoW`$W
zCFnFVsg+~n<54u#-NF}Jmr2=)baTWrNKRG2ins5L#Kc51Vcxnqs2;+s;VXPB1jMu#
zM@yjHG^WokFpitL35vy79Vsa-zAyT@+fd$Q5S$2G0O;`Z_iq{nk(~e1BgV}=j9S?7<-W&r^2c}fojr78
zJNELCuvCHs5dr5-ZFc!Gen3F2Yp0^(4gxOz*uEHE9rB=y7s(f65!It&21;MLqdfC?0^tz{qZ?iuQJ3ISQ+4OXnz=bDvkNlS_J~?!#
zaOvCIgCl+br+0hzKwn?~0M+UHjH`++TZLJ*K2IFfN@o*l9UQdbXTBU9+&aky#0sh{$yggVR%k@;ErYddg?dO8Q$1
z@bWrN4>t|#=0pC3HUln*Ua!Z`9I8U-L4uE^-adlC;a)V#KK=
z441zDk2Z^TTm@1G;L|C6wMnHT;|Cu%H!Qi%2$6e`I>;a|QIG8tVK14b1y$TDA(2~H
zm`SabQ%S>@~^FWefV_=6dotKr4`-90Dr=U7$!Rd)cs**@t?5x
z-t44l#~(H0rd*Y&Fe}J)8w5?l&ffmM+mOO|KSGlVTNmU&lcC+MThIF7;lrp73ul)@
zhb|*ka=CF!*amjwCBxyO<~q1+`dizm?Q~AMIC6^
z=P{;7$asIh=g|o?lBJ!XJdq@R$+DC`Plg>tl^>s5C6U%;6oYS^_-p(f3#{#
z3&Fr`$u1pH5+hM12?sCJ>DS&~ktOR3tM$nOk(}0Ikutdpck=1tu*Ee;Qqioe5>n;T
z2ctvKOfV`Ni)I#(>Bqf|O;Lo8uK^AE$k}0Ps-~Cv9Jgk5t`?Bq)rlOMP=^dD9qsDM
zN<%qamoBf{z=m5ekfpl=F&zX}5Y=kEwL7ihc}zmWBK&QSnbrf_I0Dhx?dTe1pGIpc2^z-3-K{MzDg6V%eT>{#19
zr|aGKy(5*elyJV;16jEy$Vg%7If39kT6xE|`EJxXnV(sIiTP>PBB!z4uke36lY?aS
z_4R{;gK`{2iIv^=Eno<$Lgk!gX#BT^F71}*RK7Dfk`x6SV}JkQgTArxUi6s5y+45r
zlQvs~m-D}7A;VAX!L9R^=JyjZlC97=d>FCG^T$=v^I3VSM2TRgR8k=%WugHE^_XL$
zqf0^EpenpB(n5RZaZCO6Z?#G|N*y^@L`@I4y&9b%2}|4P=I39#TjXc?JNzul
zM1%12ri~lFy?eL`5m0=wu&CZOO$4;xu;I*P-`>R_0DXiShB}1)a^Mmc5?UV5N`{PM
zV>4LyYpw{XqEHpC9ZJVNxS`*5Shu}DFy^1qJhLhaodY5Sl(!_9TLe^S-esVr@2mVBW8(S&^
z7d}ug5`De(G@Nj-YHc^Ad`tg06ONA5Y$py7**FZ`MeO9}4o=PH(TXFKTwH`z^^vrP
zB!D<;?y~Iuvk<7#gHcF3goNsdaf*8!VW(u%qk=zLQhc9Z=)oj*;11n
zOQOBIJ40GqQ_~my4Qkc+KAb7g0gO=;xN0FOvo!O+;V3tO_kdiWxq?=LhUxtW7&=f(lvmU-TP)jN*&LK-{
zoUg@OV^(S(3P}f{1sDd`uj@$5t#IH<^h`;>jvq_^1#|m?ai52DK
zIKgDjHF|C*j^iLC50m3Ra&pec-k;*#K`7IB?#JOVNQ8dkuKyPSrivW1_B7kyop|>4
z@aIXmm_%`9rESSkRSS!4@~I=(ps?)_k1lXsPoR-Oti@>t3buD3%&N~7V8X@IbFVyy
zx{ZlRTv-`Oa(tR0QI2d15d`cV1BieGsa2}M7SaWXk}iM^;~F@hlvGp*^(>&e5Brdk
zwGS~hLM$vUBK}3Lbm-6vyffMRc-sKv38_c{Xjn&nZ}QENPmn$PSsUOIq6BDyQSZ4A
zPeYhh_wC=0%Y&s6qfQFl1LeApX!5*etmwuM1i}bA_Iu!{AfSvCl0%ZX#LUXX#L?cq3%*c=30#4;5%()}
zTO}ZLRk&tnWbmBjyP20Kl-P=fY*Kmz=9uh9quqE#XCbs0YlTQA&h$GlS(c^t{OL6P
zl_@XpfEEJEjx^B|9-8iHe=Yz!CY|Hoy`jU)*9%fWKAb7A;hQ&aK6oJG8GrjQ1H{2&s^|2Myef
zXBu@*W>nbbo`31;>Uv(m8JZHqi%o1?_`C_X)p>Z84%1s8E@%sL|DFo_r}gol(_8<1
zyD*l`o8fWIct3K@*4oL0bcWyjfLCt59~KVv9n^LfvFO>Cu^O<{>I?^@Jr!OA|itOP89@1dhgy&-0s7F
zy?{*sbwC?|_M06{%Fd+R!&EeikC){lOekYxW6;vC9oxpMfRD}d-z3Xao$L`sgqEE>
z2|+Sk_?PkV8cbcmiVp|~fc4KFdcjpTyna7CiU`GDZ{;7dD`yMA8)}!`1xbN4*P|21M0UH6XA`>)v-0@H2(Wdj@A$RxMvYHJJg^NUMLp2g9Yl-xA~
zC*03(1y&109eA4%k}={nfddLg8l{diMNdbEy?is?+{A>Hjjj5~GdRI30MPVXCG4A`
zd2+dh;39^FhLYTC*>mU}fR{GhLllT6T8UOd>B4N%o;_X9pW8zmgt8><`i^G(`Y-P)
zC>{gv!n@gmSG9Wr_v0c{#~uiJoO5uWJUu+N?{)4%K_DHMlP6`5JPpP`9vKuMfcQ2<
zIl!OC@d>A<7zu2Y^0Knd?r!$oM=4jSt9kz4><{l|TU4YI$Okhqy&oOjymc!ne}E5z
z_>lD8y-hchlar^$$M=D|;gUxjc>m9sP`fiDGb?KV^7x1+U^ET-+>P+?v>CP#c{}u{
zQ>S$FyP(uz4o}8!;WV)@U$-U?ra3NT$nGX<-37M}!I!Kh1yvd+CR)y}oPfoV&BnFn
z=#!Yr;7itE*nrfJK67$gWpObR4W<2Suw$~F^72Wk{9ayOl9FX6S`g3y7NL`6j-v7Y
zneqrrjr(^?PsR2mQ&LyI>bHmakGUYzK?;OI
zh+>FXRZJKr#5wZv?GFW8#Xtj$6O;anOa|-!=&qb|(6dNN@;@U)R0PNomQ6>EhZQ~(+)%nGBBAmUs0Vi+=D<-yYeqb4`F)MOC*g6>K>b#N2>{QQx&=DNCW
zXw0Yt%`I+*5L}RW8aeQJc$j#ct)Diw&!fBfyiy^W9^vu7%(W
zh*2!Yf`2$TWI%eGp6)lw6eLBGcJA7B(3ki3$6g*wi+}^O=ohg3(WQJ6`75G*;sjrC
zB-Ow2D7Yn{@kqxZzJiP3oSB@Q3{gI!4kgwR;sAgpf#DI7@X;OJaGi~s=!nQdW*d3P
z+aQrE&5Rs!-pF$UXWfh+%9JoZaJN4G&K==8bq&TwXsA9Isr&ubSZ4(G5!KeOvBrHT
z)zXPG*moGEMN9`B7U`zsV2E#fBqi6=(9qD*A~SDS)(iB}5+_3OU+&jigQlN9e+rr8
zW7;T<`pKV6R&>B^Et29yMymQGi{tZgQWgtp8gJt1|B(&!M?$2fq@W-6
zzkREsq7obu0%fooPLQxg^*NE4rj-W8UnLNCFb4ov0D~3>YF7aFy}iAEZ>d7ty2A9A
zr0jSorW5~U$8&X)6^LSFc5okg4k(=ec}>n7-18|G3CsmLeJ@HFjtcY6-h54An)+|{sfl4#Xu|#rzbKpE%z+gsID?OZ~Bv&n2?6S
zU