From 3c7711033e841fa72026e20a5eb8fb1e210070b5 Mon Sep 17 00:00:00 2001 From: Jaroslaw Kaminski Date: Thu, 24 Sep 2015 17:04:29 +0200 Subject: [PATCH 1/2] nmap in subbrute --- dnslib/__init__.pyc | Bin 0 -> 13627 bytes dnslib/bimap.pyc | Bin 0 -> 3167 bytes dnslib/bit.pyc | Bin 0 -> 3163 bytes dnslib/buffer.pyc | Bin 0 -> 4316 bytes dnslib/dns.pyc | Bin 0 -> 70094 bytes dnslib/label.pyc | Bin 0 -> 9847 bytes dnslib/lex.pyc | Bin 0 -> 12617 bytes dnslib/ranges.pyc | Bin 0 -> 6523 bytes nmap/__init__.py | 44 ++ nmap/__init__.pyc | Bin 0 -> 1466 bytes nmap/nmap.py | 1075 ++++++++++++++++++++++++++++++++++++++++ nmap/nmap.pyc | Bin 0 -> 30821 bytes nmap/nmap_new.py | 1131 +++++++++++++++++++++++++++++++++++++++++++ nmap/test_nmap.py | 226 +++++++++ subbrute.py | 97 +++- 15 files changed, 2567 insertions(+), 6 deletions(-) create mode 100644 dnslib/__init__.pyc create mode 100644 dnslib/bimap.pyc create mode 100644 dnslib/bit.pyc create mode 100644 dnslib/buffer.pyc create mode 100644 dnslib/dns.pyc create mode 100644 dnslib/label.pyc create mode 100644 dnslib/lex.pyc create mode 100644 dnslib/ranges.pyc create mode 100644 nmap/__init__.py create mode 100644 nmap/__init__.pyc create mode 100755 nmap/nmap.py create mode 100644 nmap/nmap.pyc create mode 100755 nmap/nmap_new.py create mode 100644 nmap/test_nmap.py diff --git a/dnslib/__init__.pyc b/dnslib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7802a12279a4edf9fc181d540fe61cf32eb57dc9 GIT binary patch literal 13627 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 pO7<vg`3H1|E@AG7yZ literal 0 HcmV?d00001 diff --git a/dnslib/bit.pyc b/dnslib/bit.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d5532f4db0f6eb94f884e80500a38a3b6161b7a GIT binary patch literal 3163 zcmb_eTW=Fr5T3PTCoyq?prn+xbbtmnA;i0zV1m@96ev|uL6w7w6sa|PIZig&tj+E* zO(a`=fIrfgK2+*kANs%e0rZ>W3qdLLp{%{LbI#7pIcL7PZ1H8aayz0QLmFNsJa3Uj z`QKn7qAgI1q5>rr?H6dPK$a@fHj$d3s7TK(y8F`-ZIwusD4L)>qWrGmOSCsZ*?o%2 z)OjE?KNslfWl`8FQ#47@6h+hY0w%#%C^|te@CuXQXAD0rVhY2m5j#O@hN4;8D^T{A z+0+~*RobeOs?zQ(JtwkK>~@Ye?UUGieifv`xHjASiUU87Lk?oi`+l5ux{0sjcFJ8H zC$WxIUWs4fvMng-S&&W^r@GndrlH8ia0$hX`S@2MD?(%yjhn(E$QGC- zz&0?Lpbw%F?OI~AHw83KQXf7mQ?Ekv;`3*+M5{pa{S!vV;B-W1`d@VZ80*Z4(cJ=R zgLS`3z3C&vS?ZN(7rVd)3)I7oPEZdj0Hh><^k#=lt4#CQh9x2v-GE=7*61-}02_x1 zyxO#<;k^7$IL?6fgZQ6!)IrqU?{K@txyHl80LPS>_+wnV)Vedu@FY*O9fczT>jvv9rp~ z8avn7sk3u~*;!}jCObYm0Xrc(5j%>V7W2yR8Z$#{E>42mb=mdUU1fKT-Rtbu*@ZQC zo!y)4`s@bmhU`Y{Dt6yt&4V@Ep39!c-YR=*>|JNC&K|6J>+IcR&u1@SFJv!bPq7DU zeBt7y&lfIVVS91u>hiUf+Q2U{P@}jY*iC>eTwBUxNe3;N#Dh7* zoIPooN7k}2AVcyxxY`bCPi@!V$<$u$QM;YwwYv{DYk4;avaVLw+E_PE{iGJ*cyUle zeOl=p>Pe^$BfA1NXAr8EtqOi+YsQ+k&fvF(-yD8ttaH|^6^kcLB@)lcrc5O|4+fP8 z>A8W&S!CaaR3+qQk#1r1)uwI0`yFy7+N5HBt2E~w6~?VtMN%|#Ze{I#1{!KxWdr0z zP!chSQ+r$Krij^2;5e@9I?l2;%mop<;soxMvGsQ-Im@H;9jU?8YfWRq9CYAkIjI36 z^0jZ!Yqwgt(q>NfW0-wE-+Mo}Okut8QNf$=rphTRl$}UuO5hp43;N>s;?VE#KY9Qf zDT?;j=mCO2$si!mVDi>&sq}8eLEWPzz~gPINouc<>P+E>}$V{ z5IL^6dJGUK;u`20D9|{EA#c*S@ey`za_X6%bXDUVhK-Mfd@_0wCMcZm50TNXufu*W z5YhB0B+9&HvO%(2ZiC8WFldz0deN7W4*&%J=S4KZbJDJn<%8V#3U6?M_^nZ-UDJh4|B?{MA0P|Iu-%RGPU0W3KqYD7XNPRJ)8vq&xYbgbN<%eB zte_hw`WmF3KqoTyTY9*MFCS%H z^@id|RhE?qGiMlu*sE6!DR8z)c~h~a=?)6L&P>G|8g7V)Eh3E>5EF`FyPN99B^ip9 zLlcniCjuqw2iV>LH;BL48z|FNOG_{|oASZgY(5-xCMoUBX4DRwO)a&(iEm86shZ6O zM${+@xd37|8aKpzfdGXJFQt@D>tPi77N%ol>72;1C0BQz zNjmVQ@UefWzpFo>eRfZl9SZ$|4Z586?)G+{dv^C!{QLCMy-@rZi0oIy-#d7;MiUCL zht?5cLG&H5hmP$R#9l#!MWKqK3rR`565^#0zwDJnI49H`OUt>mEY!RR=fz<`q{&#v zg4kOSYC-fCX{i%qqk`CV7ijY}G)oe{d!uewrSh`W(O}qDGW3lvJ1ks^{=u(hPGPQ{ z_8?7@H21_IIVmHJ3Z6K^+jY?wZUK!Ual0M+1J!PuC4Lzs;i!*SI}0MgJ$(bc`av>K z^`3u_s>Aw|B-+U?nj-vHL^B5_DIhn9!=Yp9aF|1 zYjAEWjj*j9bgZp}JuqgxUjh3f;SHDxV#a%Kj<6<4S%i%B9)nDh1raXr(4q(zxw9m~ zCGMOe6bLi@7j|Wk@4f+Df_yX_CaKYK=m&>Uyk8&1Sx-i>)FvGTMs|~Q;2XKbiawJq zr9u^wR6ag72T3d&^`;Dyz$k5GkPL>ti8@g~GRM4PXJsN;cWVA{sN&G=R5rI7%_~>0ZC}4pdCRh`$-1H2sU4^z zcf(Fy-`v{V+-%^XU$eQ{+-f$O&E}Qn)#kP4cJq4k#`@Hr))e@#IVH45lbLVTx?5G* zsLE+Kj*aru)IY}l`^vaiGXpvkIc$L=>r*~V#@@Py{hnS^8x0Yt%H6J38oE;LRF00` z01I50U@~RHTlYCSn%HK*U=dKU5`S3l2qO; zpJa(Eg30anW!izZ5vBK?fKnbk1PQ}&79D~^h~5~HUO}wxx-?5y(d6zC44#c7@=PPF z20k{4_wy;%cS5kQV)n_K#|ta-D4ovCMZ!1V{|a6>cZw1pIJrBAhdmskgVQDtxda`S zM7k}^_}JlXK7?uAqF4bj{%{1!4Gk2;3p)d?BhJ4llC(st9I;&hX$(txCGi}xqFBS~ zT|Qj>Eq2bKA@m-qSOOSn;X_gkMro>IBeRHgKS$mS;MPQDbvo`c+)8aRov zgG7cuvnYA24;khr)amy~Y3Ynpb}l-L&S~dOJpBMuz*CUa9txw(9Ia#I1j-pl`6A$J zi9AZB=)W{2K6X%$br3~{Xo{KrsC#VjAlDEv9+`cQBJjmIcj_EH4C;RM08>@^6IGz2WtB(gg&(&db1 ztM-PRqT&gCmT$SJWw}N0F>&m2&Om|R4|MdqVmvtoasefOEzziljd{pV_w}sE<*h*R zcX({xn_G4AGC(Z9Pb0L~1nAdMo<#Qq**jQ~yG;RkmrJ|Ugx@r z8P9()0i}VJxpxH0_eqEl$_bYxwr4|=K9l*xmdn}ZEEe-wF$@fdWfMgvX9z6w&eN<_ zYCc9YQ*i7hqL-?X?+PemfF z;Ygg7ja*mSZIsh?djRD&@jEVA?D1}7Vm1pOLG8B3&~vS3{6C_Zl+e6SsJTE5Iqt2Y znV8AFce^%vlo!Y_O=n)dSS~EjFP0aV@hmLPxSCj6ebsX^9|p0f{0c86M6ZkV679 zz}x{Jid4%cWjl=>JBibz^~TvYjT@(_5XoDqqVTZO>J`1 zo89J>Id@^a-xW4HzsD8(oWI)nYupikt@GF6gf7{D z(?;iS!U>tS;B=q!@5gDY^B=(JLFaG7DeL_0IPGx$LpVL`{9c?MasE!6Q0y+8c02z) zIPG!%UYz=!zYnMV&L6<(fb$RHbjbOKaXRAsM{#=0`R~Q)sPiAk=?Ui_!|Ay5zYnJ; zoj-`v3Fn{0X~_A*I6dY3r*S&v{L?tS&-u^b^sMvG;56d=vpAh|{&P5a&L72T%=ypb z^n&xx;+{$-qsDlmL^zuvv#iY?B+>ij7@pH>m!^8r0Cxgx-~Y|m%x6SMY-ihUxmPgHGa z=4@!LIsZBeyy5(tIKArp@5kvi=f56T{eX)9E3SxH7JmMNR{R@Q{D)LvSeb*afU)?n zyPa|4hn;`R6^;mKZpT3LsPo^9?tUb`iy`}HboXQN-S;~G2co-wHNJ~+{lVz&$K$(? zJO2}|@VLJAL-Ab<{wJfnpNj7ubN&zWVjMuR)fJBEr5}kOe;>g)y!)f^T|myK_0pj8 ze@qDg(IZj5zZT~^=>X~B+dm%P1*ENy?*2r4ci3Ta6o&QvzaHNOIIfNE{*CzV(+=|~ zEcY|5d1vGs% zPH5R9IH7yC;)E96hZ8Eh87I_ZBTlH~TAc8uJvgBnyK%x7PT+(Ib=(~pKjVr((rcXm z-vZSBrt|+6PCxDZzm3z+IRA4v{T=83EHYx|eV+9hKkNLTbCb^be>bk)Iahej`9JTj zwz$gK_K+-iZrpPP&s`aH{@+t#42UX|DdE*tH`@0F5SZW@9J;dj8yXqS?#)i;ilwYy z3Z{w|v(sgNZmN*&(&LlmQWejFY`$D6DDzA%f3;A}Ue1;Lsbc989{7c>;&<@ZmqDS` zRXEI4ilyqrD)}UD@qMlD&>kj1r>EC<|Zc#l`21JNqgRkYn6vics6&j zFjZZNJJE&mR6FgCy=Il4u$6< zRkpEIotv2|OjL4cyQ-DHT*zOYcYX0@6(ZXU>`oYFPOV{u`*XJ z>@8P{mx`s_)II|ep898QdYka-R+hnmXwRr0o*TPxZdh#}ED9p{Y-ALOJM5^FBZFs# z0sXjS-;ACe1VIQd&W(APakyaaGcOi~5HB7UN!KX%tP88Qh`9@Da zUECa9JTrWuxP=#O%!t1tE327wPPnQ*^aa4#)`Y5i@|fx7I*W4MGTD=-@`Ot8XZ0L)VbmwUUG;|pBo)M z$!hM6GI$=F(9cVL661cdxQ|!tBa8_%@8`9uaO&jgq2fSv$;=0f2YAV;pv!ZE-r$+y zLEd9|W6zEb77y`?bv||aT=CK9V)Wco#XK*RkKg(8_=tC}w!UhMatMaCB5zPLJqx(ymUP zDza2H{!}3-mVHoQT=OteE)|OZ53dMjyYw?7i^R;OS>|G4kTj*)xNv75jhW?AYlu=k$U%{M7TK z!$Zn*AUw9EiI6PKl+CCHB;CP4M9UFXp>{L;xgV|8*_}P)+A_q<1IeSi(=M(IgV*rtYup}A>8LH6A z4!W&=f#k$XFqSyBx!W!5EQ(MMH2S~H-G(5w-1%T)@qanJ-iHa(%* zM$+;ix-z)c7P1Xw9nO$x07lB@r*c66E&^R&DFicR073Su6DY+tSvTu1IwuqRj9Wo!xGIez?j*3TZ} zyEf{5yW;ZntRKKQF&h@!m-+MJhFd(-C-C08a1h+Z>MTm`%!#yp#MPs!Tv+&wb}y2?)CY}&Bq_l z?md3|)bQZYu=m6hd$Z*ka*0Q?LS=ihz!%lI;Al3)zk9Mp|7f{hy!*DSA z2}=$BPLJ5l!Q_p{!wSqVY@xD_?6*Rq!UPJqmGp8=qe&IisCWMbz=l4V`a-q_I{LE_ zaAXM_b%&b9#+^F9I_cuAiFT}SuvI3T4M8U^o)a{vRsb~FW5<+=r*Z#Gt`Zdbe4O)F z`_iyBR+%fP1kpWGAL4h>y$Ny{Abp}_ueZ3H%QK)|S3vND&0lYImz;aOO~++Aw(Gdu z-PlXU<+WCKrHx2-=#{PR^$z!1o4c}%v^XvT&oZ-5x${Z><>~y(l)s}c|Fv}f&UAj1 zjPmRAe=eQBE1iFN!~EZJ=Rw<1dDQncP%Myo&>^%Mb!%-IJzpAjZICahf!hTIT;{_N zJr3Yjw}YrN*`f#Inat~*E`w~Kf9S3&tK4gye7F%!{xEn1YU$d*5s*&{K8-^>iX8KE z94#WyY>4ZL^Mu4Jh3Z^I6vFUxHsTa&-p8}KN>IF3n7WA)P*#va{rTLKgv{K`Or;Do zldBdiQ+B#gyqQ+4&EdE(b*P4R!EPK} zdv~T4TvvPeZ)4`ZO!}A2ti+QI_<8puw>N}C9&Cf-FP^WGhs30!qGU>2Gz&3Vk-&d| zb1TzO8$x$s+-UH5u(~y{GkUpPspjXZ%EcDcvQS1;9WS=qd4MS#X-^^G(Nd%wc_2!yC<26Gs7$M zIZ^B^l{S{D-kd222h57aZpv(yz#7exYxrKk&%1S-GkMNV{wPt3s{RlXn4B{p7czE$ z)_~B0M$Ft#>d8ycnpQWnJGuk~X?HX4jV>{bm%Eu$(d9DIsmdius30`$yd+&Mp{!-D z@`fIO663+L_yMF@P&4OfJ_->5@lf2+gzl3z`AdcC36765jP$Wl-Xsqd9s(ZFB9|ad z?+PxZ{-bWu@a)8FPH&2|1cj-|`nNg4-c(IF%^RYLiDIc(otXFp$`97#;Fhfg+SR|7 z_RKmU*mW5x*zzPC{E>WV+@3@N?E`8hM}Q7QXG_8j(=cL4)b%kS$b;?%rgh68%rXPJ z9w?Wc7Ccdpa>Jeut`?>WRY+@iY$cn^L5j&%a_=n2EE2;nB!sZJ_)9RnUE2}O zHK}SokIxJXm3gOpzPOX3Z;VW_N+mt9%WNf44Ofg)%H<4WlFu=WnM~LZ^4=Rf2&od* zz1Mm8Fb}tIXwJMN`W5JX775cY^=!y=gPVytn0StzMV33AV^A$&j**o~=9u3h@d8s$ zGRv(@%cyJ#!GjA-Ih$$JzG2c)%L2Aryf(BjuR;~Ncd`hx&1AVUovY59RtqsdcQg^l zQF^TC$YSURBYAE?djDT1l~ff=GpW2}K70sJsHv1p1S=nGQnLq41*7BnC^vv;CK+*32*pvq$D>A#e8 z7|)~~p~~>giwn}GdnI%nNOWsW6*?9oA7R%lK$7n8tursiy*|<>nn1=*q^5AA3c1_^ zh?qIlsD+3JZW*;$gbhMA+_ZN2YbezC=vAv10lwSnQ9q$Kc2gql9bxqbu%1h^ zSGzs0KSm0XHav~`Yx$-`*88ux|6SnzP*I$4Y2g&9SDc2BF6rfCfVz4Z=Y!^8Y2swU zxWV7IVhHb9421uSh7b<59V~>^n_z5cz61_R(;*FIRz=#$2f?=M5+k@|Uxvx#??# zO13;1PyMLFdG0Gw*)RqDpASJUTZMHjfUT@hs!rWZ=8>si`fU7aY$=XrYUrmZGbul3LSo=W*lg(V&_3NT^}aUg^XkwRKz zYW3w6+PwNo^-p)#*#}r@pk!2Z@zqsFQ`%pu>gIOTRhKh>Vws@)3rJY+QewA0eLVtU zx}FL4GdCVot~S`=*E!hnX^)N{&hCYI+%hb)40r@{L6Tu4&d_cdV1R%nKgm#zGc30Z z(162qpJezHEb4F^=)iyzI)Z;tPZH0;mK@Fo7_?z{ya>P83T@X?f!E9ru(K)KcK&LR zE#xq(Lf5A7b(weHNilIp!rg4YP3it3{h|gA96VGr>+96(wOYLt37r2@RBn#i`C7xH zIM}OI+|Pv$8}nW_0vg-iL;sGMtJONS$Gg$I&ub(K32mxSz5jnt?|!FZqEyMkd~#}# zyD{+$RORwCl5&0Esp+F_tw4Eq@B7KSGp2cWt+}E7O@-jel!uelgzb zKpr8I&~xA&ZCkfoD@bJMwes!yS?rl_O0|MD3UC|nLHTBGlFr3on(dRSee9&*33IlZ zkTem$N@2Qu4c;msfZ53NBgj4i-$mSm595`&pbA7mADAGdwY4S8n<$G?(%+RjXJ^O- zQl^1tJv?A`W_z=JJ8$gF?#>=Kd^qiO#l{MCET|m%?w1C}qA$WfwVnLff%neqXTw&} z*f;1n!&r3#{%+7y+NqKKSc9E_O{@7j97XMG=;ZhgirBbSi8Vl`wQ64WfRyJ!13Ox? zc>vDNs6U4}r-?+|S}OF5hmp$jnx->a*ffp*E^@{E!0R&jS01Fr8n)`!mxqq&pvy>u z#8)2A071dE08<)F*;RNEyhv{exVpvnBX>2afWgJV#2r6_ClOxWgzxYRU^|v80frf0 zleZsi-&Z?bO%p4pCF6xP1`qd5N?B5Weo(y5XAA z-O`EU+RT>BRtQ_&py})27ub`@;?AZ_S7s&FZ166hc4a7=IJvRVF_Hr$9PwvJVAfUS zepG^Et5$5lmlu=R#9U0ROBwq0hFrefeEEn1#9H?{3gYY( zCy-s}!LSUo7Z=J-;bMOFpI9h6MUDB{zY%8#P6K|*xJ?i{%p+>ks0>;Gno>LAo|1W= z49iYfP%At42GyIe`ZJB0hqanoLJ`aB@s#6a?JLii9uES$cpJPkS-ioiy02Wx1^_jb z3-%?Upm~g{q-35)k&=-MwKC~w#9)XI(a+A^Xbwzupr|LNa?=<6-0=^gTuRz5;0L;F zxuvGCsw?&-XoW5}~0cYCFbwWkCyn`bP7bHWo7ors%M;lVeZ-{l0x}Y&O+kbsh>5_M@-Z$!9`h2E;nrmY%6#+iVCa>H z9p($AXb8FxmGNGx089nK`D5mRhX?Jh@`b1=B z*UXjFJR2%Ly))ZKKZspesKD6XuWFC=qCf%m?I zgYk|M0skRO;H-GH$rHi*G79|xPJyjRxMiCm{;kX$Zg3P1;-nyL6J6MY1V$2V2;qRs zHa0k_lf*v)@B!t7Y;Z=g7IY`xsu{BPB?4O3!*a^RBo*Qseo!4EZyI%>R&=TETIMKB zV!k%WyLi6>&iQ~&?LWz$VWVA}5CW5}_^JH|k-)H_v1lC=TE=)4cwj3BYm`Vq1O<=L zLx>JAitY-1XOH6Lnr;{auR*u5Y+-gT2LQR5y$FSFadMI?CL)6@=?DKze=dY6=VVs+ zsoWI!9CjApO8P||R<2%d7OO#Mo|q`iPE7nXdxw{r4Tm0}@4NF*Z|MT(qWmLNrD4tJMyPv~Dj7x~VRY%m6<9A3H)3}@H zekgRnNBTxN12JXjl}j1oba?PW5(0a4fmrdjmN#KNFXRkMLmI?KxV8x;VMesz&CO(q zz+xCngd+;)JeeaTk^PC^K^@-VozLqX2vR6cf*AxUre%eI3~}QuB{Yf=knSY!;2T4) zJmw$;;ROgjTacG0w*1ecme)K9+dlhe4*$>JI24tL_mUDHP>CQ9sI$Ed-^%FC_hq8j zI_XD_>Yx^?Na{7@533Tr_My!A*~cM$Vd|Jy=Cc^QnrSlxSdXR$*1o1yy_^P-k{9b& z$yjkN)o@mgxRgAhlRwTXaa-Gvzy!yn#>fz$HJYGkJx>S{nQ5)B)`#sK^TV;GL88GOIomU!xLe-<6qx{BTG$>%1o7hW9hXj`btY-Ow1kgU>3L`AUOe&yIsf5C(y+$Cp zYD*ZVn1|OF0U{U&^QI0ide?B(oH712l=KVim`9LsZItV_f>?J;$~%-f#1!tV&+NeQ ze*Cs2_A1s)NUsYCL&>)i@qtgh{|<+xP)JQoP%xO7_$I5)zHxU|Eix$0uGVstIWd6= zIWh5@Nv%fuvbgV25AJQjK|?(;;g|D>-9l*4>K|M2=mDoY@B4W;#lv6W0SMoDALZc( zc=)S4{2&h>=K;O$ydT0rN&zmUL@b<}#?O6{&j>=&sdzui)K_@;0uLM+F+1M>z!d4G z_ZvL?8V_&r@Xv8bpiHSnI9AH>|49@XJcdL2=JuAJt*x208{0FRSNE*%S=YIyb8Y7a z{9Do4(%p(*OXs%EjT^T2tn6Oj+1}aN+1k0KvsK>Cc@&^O_PJs}kf$nOB_qTD9HSTz zKt6E*2&R`Q7zFSV((Ou1dO^eo28odPfp8B@i|8SYUI9@a5C+0xNnjN%;wIofLPEs< z5ex!>_@EZFU=WD-V8I|P;=?KheLxfm1bwjB5KzWhY>0JX^oPPaqI<@Duuu_*`(WWA z5DN?8AvQ4j12Z7>gGGoy&?jR_?--} zv*~U?lfhfyVWfuUs%eJXYQwh!M(By#L_YfTG~z!^Ltzty>zPFrCUbcN-r{rq1+4$} zQ~FzIIdj-K^OiG{W_n!3lB_qj<;P$noe?Z9IP_%V`yf+q@KEHTwl|wdM=qiC-zVDZ zM#3#?&1}y+0R3NkhM#qLHkVX_6!RJCny~VmV}^mf3KhV^By*E&i>?TwO;+ZCvDW|=Kv9g;OV5IRb#vZ&X65s@J6A3V|f6U>B@*f0i=#_uz zUY4x@oGp3U6};=Wi2?sba-)2w+s%F~^>mq@{kn8!W==(r_2H< zxu^DNho0_^o-V6>+Nr0fqNl5CpTgjPl2K2q^BO+I|MTd%QSlxl8V)JxZE4AeFd$MK zTO1E9xbl94H#yTPzSf5ro5naFeN<+cE}iTgyn_7lv}hWW0QA)K{at2l0Cg&@SS?Hk zN==m!0mfrJy#JX8^u1FJY-!5x;nLI|Qd+z%Jc~WcRW1eIKf_z%oUSDVY%#Qpr1*~r z-iMHIV2L(E3EmBj29@E_zb#;%x)=E6@v``T&Hy2<)kuJS25dpN0Yn4pBS)kjJTf7c z7)H~#+1v_8PmV~H4h(d}LUGLb<7ZXLtw_X`he1QXqK|XT^#{*F1I;V$*7xS zxVS@rPAa^#-OF0Ddvm$_Q?cT?>zfR3+bS*CrLdH(guJKa{HV-E?ioz3bYF zLhCIS4JQ@8H(gut-}5fJmi*v7LI{=I{!}I3Ez~9zzDHe~JD93<1hp|5dwcSR&b=q( zjZ>NAtwPrDu~dDdUS?n2C3UN-`_lF{8$k4{20Y%N0i02406m?+|6GxbX*?T`wVGSr zk*EQ+_^stwyiB&6eKC@j_smXBKbI7`mBThYHuR+p=2(8F!eAm3WOh_tH zodSUziWJD?(40UlM+{9!<|UNbrAI6Ds9TR#@)49FEC(hC2xQi$vI^9HqK85p6lv&c z3=eo{$p47-627vEmlXR^R8J@vURfOqhF9P-WhJk5lPlfE(LS=|7NT}=Q1Z{%Nu9hQ zI}Lg-BZtzjmUWt`=rm`cFLHh&@92Ihkk%p?#cNMM-;p(${wSg%9@~GT_ePcq?_<3| z7)6mOc{np6m^`*q?wbLEnZc2>?s!}h&K~odx`j`e*d)2@!@Rt}+LAxRBsJkm;?w*1 z>_a?!i5WQfh%W)nwW%G?@Cn7Pq%kS~VCFU_3nHaSHFI*nP6zCC&`yV%1F>)6Ged+} z6$b%}|JG(UL$|A@&hh5Q-$Q z;jp7&O@Y)13|$0ZGb0#s3O@Nt7i}LK4dMar&?mq+kOoj@GWZ5iA`OVdagCc?hSxB$ zFjqR=Cg?HX!_b9#kJxB67~-HGj~DV@?G2K6oJ=zmC%o@Y*ejtceQyv4uj%y@4^^cj z*95*+yK=PG7wlz2Yr3=of~W>{6c~E{1z$B7OyEnVASd4o%J&hNwPxOfka!#J((JJW_62F<=`C5$B;uAqI1xDE$S`5X z-5bNW_Z#@^R9(F|VC0xI^Ik%NlC5mBOw_qFkRm8D;3YhxB^w?@@B$vlX3kIi0F`ov=2YU0KP=`@kgjfb545u?2Gb zN4WI9f`hOsTt#IEv}YpJzs_fTiDBRZ?~6z^2SC4ylFIDm4kR3~Ut4Q?W~6U7E)wIC z_bpzMioHE&;r$M?pu5wCrvHVP|0@sQ=0UUh-!S!Wd5~)E-!b(^JZPH#Z%qAr9;h(% z{&yb!m2qJaDcExCKcb8=7>PQj1aCO`^Ep0;LL0 zA<^E}-WpA9oLhRj@6W=l)Y{W>N5{6#&7CWmQvv_-C{TX{b{U~Qf`fMh9QGzNJoQ9|r`5E!tVC6U?Ks312XG(JN|qXXOCCTaDj8GC5^mf)9CEuDXiQFW zzG#(ZFwmr#Rxpn-U8!w{6%D#IGo)Z9x6)QZLrM{blw~lapzT%$*e&^`qzx&Y!maq^ zNWdd(BEfrbZV=uzu6~_GL~eevrTPdl;TNU}=)I&f^ZQl8?d zl=Ae5`4Lu(-RsQFj7frvDzz60PD-nq=4FQ0fD!>v>`a7-nHEFCDJCyaO&PeR#8XCa zBgA|Y#cMvK`oFm{=#R5?Y>vZ9fwVmNXjM) z^my;ygZqPQ@7_mo2yDrtT6Pi-jSbaIzmJz}Xp=`#1no0P^ALPBf~UncZzpOiF)~7h zN3)U-XCpDvV#z{!Jf3Q|8Y=c%!>Vpz4>Y^oq~<@Bw7WHFcRZK6kj3WGt-9&-2D)F6IW zXwg!HD`EUFNHJ^a#Z0ib355og=U z+H~>oZRShR9Dy!zby^bs^C~`ZomFQ&!GE^&bgf+mcP8?jZTbg(Qm%r-;Ly%$6;B>n z^+!MzX9=#d0cQzZNcSc!m1G(WB{)lCD2=m(my&Uok?$~hN@FF#QyMD?p3+#!m1G<_ zLxUUmaLhO+^~%l!g*m^xH*|1JB6+<~K#+vWoR4L7Sf+$@FgL^1ZE`*5`}?8b;`$^k zmWH*TYY3~Ci@3-I*;2Why;vxe;_q==G^|zf=MZ(IoXusY7?c64o)ixi8^+vZJd*3V zlKgIwqlnFCuvk0(X1Nj<#Ro+n<9JZ^$;;3vf2<8f@01aFWoiw;_ zV9&)J3`3BLh57^^XKkR4W>1269vjFGaW9yi2L}!wIC${jp`FL$8q}5dUjEH5bF2dA zpo?s0-*j0k%k${SEO$si^MmTHWNVZ3s^etgxE*EZ06(?`nf>=ri zCh08&2lGEA?M`tp@3P&bOOF#_97PZc?vg}pD<=U{NrSyr1lOJjX1&!&HM?!3b>C{( zHhj#+^xku4zsm~Y_r1oQ{foMKarp0?JA>otVz@JYY$S!j*grxt1R*5|L3Ikrd&-Ob zYj#fusud|B`^ZVxvtp}xPbf=IiH*&r{a)$*x&hgLpH*FtPq(jcZ=udF!jG?aMQ+Z}2>^B#v<&)mhMjROlXWttngd5^=5+}y?SuDOfDf!zGV;XrQw z;n*h79Ktt|vtuU&uiy}qelju$7gwIEz%|)Zc-F*2Io=%@`}JAqDaC#8hO&KFj&AP| z4tLdV{p9^)d_g9~idHsAQI0M1gwrd&MJf=bBv7!+MNW=jsBZpcNGw4-Fo8%JW1S-e zo|HQ`bdI2-pqTV_{i4>}*;+Nc0u`f-&**zNao;#6pIzJm&45x8!9_l&J1AMo1Zp#3 zi^j4wvomXBE{4c}cd(4lbftwuu*NMjdmih?V8-rtr6c@Ks7BiWgm`6 zT!ZfP^eMSDMygcr7w|CHfkVAM6{A|OM%8>>j)5@U>3w+1qn^p*Oqb$Bnlr>k!sd`z z^d|np<0O;C!y7s?c+UG1=DoxNm08*hE9IOnM36YAf0J1VFy0z|mVx}dbu5p#Hk25& zaf_uVY`ZMODL>EGgj0T%spjf!|CCtc5tQqsx4j=0W$t^$e?8a}i#BK6!|^`pbJfj7 zW{;J+F}2u=yU>Z6?vosoOaOwE7Qkp24B|9$#q*L21Z?Xyj1uQqmSIG+5kyuSL8Jn( zOclZAgMY>X#Q1&hB1%(liaQiX&3qCwxnf*}SB!#aG(N%?lDBZRc>efJ6w=*_enek_ zCziXpVg(UkV}9z#alv^~%g)oNAf0#U!jDT#0^BiH89G22;W_<(l=saK2cG^wGrRo`gz52n|b zJ9`UV**Cz>C|u1UL?*-4{YU_!F=|cF@@w&DN{C@=o6<7jD*1L%nVw}6*{9r8_%5{k z4+0xCnG;vVuJ_8mLLCnToCo+2%vr&Ek7Sa8Qx~{q`a;8o=^=TyCr@g z7{~koAR;0SC(uXTjRBS43DY|Qb7G3YjZ5?w_$f0x?ar6XK?Rg9zRlwC9V1Pko`%(M z+3Ge^uGIu0#E*z$C20~OVAv=8*+SSAMEHVlv4nM$0MpRfPHLh;oLXWm=4OBs3#QYqcIogKCFr2U*I(V|pZDbTAU`V{MoU9JtXK)lm9fFhr z?nJB!eIlNwbtD5e$AX%Xx?u2`A09|}UCal*jR$m*vrBW4LmqQQ!a6rNA(>-^4c{Tu zSw@Gm=f;j^BYZ_yG{4Lv_Tw=BNnXtPGsJaB9uLE!PzR#dJ#6kPYlT*Mn}-`Wmu8B4 zD&uY2Q<<5L%NNghgBYE9TL~}s^Y8!<_wn#Cl&>Y@9zDD)q=!IC7LSv>7c&{01kc`nd;%-8sUI;a*Ra;3YEPiOeK)B z2rOvrx&)5W074tx@`W%A6#xP>Ee42l1`wc?0285)QAi@pj~R=j9Mcfej%mRGp~Nl) zC04SgI(RSTf=HRrLEw;5oB_rNlP&X$cu z#Xz{OU=xnLdk-9ptamcug?2n~r@|18;Gqr_zJY>LpdiLlpdg?SJbW2h5_k}gMA&X3 zOz;asgbAwt4JKN_Mgl*y5Hf7PKj8?ro1AH8mBUB^@JD?G@^N1I>D!{pcbUV0;1myJcD-$wXU)UYlYfldxE6)%wi7pSw!BNoAPN8n*q;Jz}8zqHivS#DnBS-X9Gow zM)VFw^MO1aY9A7PSRcZ@+x7?9atTouclza>Fds%{#{%{%kE<40{r0E!gEPPW9e#Po zo`^|0u>a6wdqOICY#_0@HQ=@e$ZQRyc&+_0tHn}k4UQJ#cp@qA@p*JQu4+B4#tuOt zsrJi{^BYIA{6L(aO+()xCcOH;aRU>UaA1MP?m-#Bv6ooJSy_f@YGtfxf9I}Ol8T34 zi@$y+Ju|RC&or<gYxEuSByLA@w?vr2F29{WsD13sI2|OnD~qKiyE}cXwTI6eHJ}Gd}H#s zc@y$3z$gJB;JcvER|$7@*p)qYESq>uj8*0g%N9v*#Gh;X@RhiVCE4G{MHT!z`AHZ;WCQfx{~=yA&f zDF~%640@5tuv_enk#>1VkYCZg0rrZFzqbJgDJp`wX^;9J24hKhUTKG9#SAlJwO9NqJ2~zxo*ill$R41wYjr+D~umB^L;op zNA>t4WcVaAx2#hb>0OzP2$tJ}r48)jdX`UITq6IGpG)eZ)FS+X)t8r8Awqfku6Bg> zkUb-hOa0-Qv0hY7rCBeAj8Xt=0A3hz3LxL&ZcAh`$1KbXT&A7n&)JmrIf zVg%5+($!M=I=HnVEjmo?!#GyXhMZY0TPj?Sa)7hBC=;HsX0$nA&nt3cvh-y8E*22F zCB^lOM)^Zt3yxV92PxYpW^0;Oqq%7~GsR6H_7pD4_Ss2>4%===mXCxMG3&$xil|OZ zWc$JjtA6!)EHWI;l-!>K=E=}~D!!*5y$y>qD7SgDTl&%cD-R9f#slE>4v%X8Xh&!x^l69m_(=i0=iT zI+K;}Hu%+j@`gde8kZ-SlF^Tm^$WPT`G8c2z?)JJahV~~z}k>+=ZC<04l6f^&IQ+y zed(j5$dqa8BLmj(TUwbJSD6F#e2HUdW-Bw=#g7|XBZum(kt60EBYjOLzEN*UWcyO9 zI1+1Ma}9xCMEl~9Ry~^TBdi#pKc9)mX!_kX6x~Q z6Gwm%+HL?A<`Earq7jb^!GODEgdt~vv4CXjrp<`81I5j27R?{c85F8Pels4FwmgYF zf9zq62fH=|a)7!J33S!BBInD%!}FSE4H;excQha&!sdf1VH|O(iwF&6iULv|#$pe% z#RZw-=^psVy@l%kcHI7D^V?4r4ecij$)RN5jF@?l#)l>w3Z;wsc3ho|z&Rhy53)xZ zlNZA}3DLxrW87tn7!Ex<_*zsMBPFFLl%TREkPuiJlS*lrqsW8rQtSL^R6|ru6`=PO z9;6YJ_K#Y^M2YVGI-h=#_wZZ%Ec+@7`2)6}giNkx-!tLBz288M{#`OQ1_g<89(9=Y z%D{c+^0DtctXxqev7|TG9rrIy~@dS@qk50oB2jakYTij0$=&1D0yXxL)HsP&#KnDSg!A-(t25%SO#o^*kF85G*LvwEXS zf%DkF&V+^C5#QVq*CKi${l=cuZj5jD&P%DU>`AHN?)aUZ!F5#f*n$4TI~%{gXGff) zw#wXnGS*L|wryi`!i}Cw0RlzVZuY#ha3e=4qdyP-C~WE;Zh4og@6J@y@1m@M1C0vH z#CkfeL8v@#Ck42Zx5eC!W{~t*NRI6QhUf9KtzrtKnEYh z3a6u~jXd8*$(8E7e!^PxhmO==q~sz{^Dot{F}N*M20M^{Z&OCPH&veaYR;=zaCr+C zH$OxCa|=G95Lv)bK|KVe5RS{-jY@cjZelHN6Bb)lKB-%BM*)p~8Tp{#fjb4Zh(i|U zxE5YNO7E3ui&+Xdk>6-$7Q5A9RTaL6ceOQKDE8pNd0@X9u?Z1jmPZTT|0%>K#C_t+ zC{LAznyM~xFzG7A7mLMeUNI*mL!B;x7b^NGEOM0lr}g#vyRyg09fcRcLwLR3qm!dl z@6yT6^fm(xd(>E%U#D0|$yJ+pFBYzZ(HeNo0s=9oabTXh8N3@1chPZZ+)P5|A=&ukZkyh_8lXiiYazylln624e{XulxB` z_JK2oiXV$RPYOosFnRcae`GiZI6EH`Bgu_E%=ZZMLtRRqaT_}h?wO^vp$#7W496wA ziTMz+pxnC+8eujsO#phBi-VSS70U>!S=$hvfre| znoj=!9^beS0^iUpBkCe!%cCx;9Hy5!dnO4)u3-XS4^&0T*Z@3q_7h4(_hn|g!T`{y z$Q|@vh>%SGqW<^<-ZLj|3W&DsOz@d_-w}Fz#&qsOV)2|mzq2#xx7Bc(S%^pjc9j5lERLYe= zI&vuYs6sX1_!9C9dTebL>tMR}rg65C_WIdoP0XgZ^*^J^aa+A7I2(@PaL<}YQa+G0 zZ^S%6<=3&`>g_k#&2rih;C-2wEGGdnr4}O-ZAWqc3BW8PMEeHFMC&0FwRUzuB5KX! zq5cT%k|xd}QIIrI0AxuG0G}1OT^N|=x@8tBLv%+t!U6U7El2nPWI=||6PLDz-LQDw(77-HTfBeR37W{S)* z$sTH;wgIJ$$?R_7a*Z{~C;UHk2TB{zQ8JZ)Ej@+TrzMQDvCKZlmR}n2Ucs>;EfiKK zn;}{Vb)#?}@E)uRGCD4q(sYMoKLPtKN@l9b&aO1>xn^($gudinte|;T^cmpJoDUX8mW-{4!Sh z0nI7Q7`Pft4AOSM1PHk}oM?|xEavN{E|b#&D7TdyK1sc4G5g)eg`XkiC8bE*n^#J8 z;ZmwmDVTKNVu4D)YDuC5KH1Eaq{hwbA@_l8prpARk|v~0;TwW_FoQvl1?F>fy~v(E zckKwxsaQ%G^k+}|1z7j6b1wp0$W0CQMfutlXTm&itMlieJAyhXDd}eQa=CP{{~&Ay z3>Hz^S%vNi#gt2ktZ|KwY&0CElu1Knm@OG_<1(zdC=F|n5NcyD_J)*gmz6;V?iW0F z5&MdUJDnyrO)5|(WT>6s{?vUtjvn11=aIhsdv;}aX9teNm5ZH7s05hz9%E`8J$&TR z$BrJQ&)3oYM<*xu?@vY9=o@%!PxdfW9FHB@lZ7r}Pj>$Qfk)x2c3}VE=-Gk8Ook>{ z;oYN0G4jqGwdGqhWfqZGk{8CHer78i0LAJ;>Pb$R>rgdaB~9DQ1A_{1j58?b6WuU$1y`W$pF|} zHkslC?{fXhmkIQEm+8+b5B9f#ngwZlr46s7O6Xt-VgA2HUk5NWv%jPXj@c!5oy;t@ z=fQ->HC%JB@BniuGuxZ`5GpJ|2oJ)de$O!j9DC|tI?tS~u1xzcS4 zuZ3JTji#TDVwLr1Uk^v>r_gmVct2%^tn@U__Q`ob3SD}T4jjQ|tB5?a3*N8@QG>a~ z85zLh#q9u*BQA_EVR`8pu=D8Aop*;4;)2fIHAc|PG^?CV>6iAuvU}i2qQzuw;_~O^ zPJthh!T$XN2Q;mBq_nOmA-sF11qnOs5Anm~B(TFkO@R%bThX8en0tlEs;0Tkda^>c za+CA5NP<)(w*jI7SSVh)Y&(PR7sBYh;XR3LA@Ue8!{cRSw6)F>gujGKTYN?=;Jpv| zy=QQc&=@)idvkcCF9;84sxNxJli{W50~S<`6=tff?RG0I0QMFvN5;-XSaHAH*Ss zn-g&4&PSfo@F7a1K&T*Q`IIq;B+>@&ui@I5198!(@jNAHh^0r4#S0qLa(tFeTbyu&5(Inq zN;dl2@n|%Vjp(w-(U24;cG!BCqvxGPS~IlSUK4Mj^uLo-Ys41o*D0FTu?qKIE_wu? z{TS=E8VRlcNlQk!r$2(Tv`y5n8j^koZ4*34)7mCnijljGh%t>q02WqoV^hSXfvCio z(iRaA!DlQYAVQ9;aN|A1<-`Xv`GA25H!_x$j!?><1UM4NoBPDENf^dZzifIc@o=}m zX=0{{8KmV5ZiDkfMd$A>R5U?o`>BS$glAryhhJG!!>rk+P?6U4p})g8)&LR6XaMiD?vEvH zKV@vW6n}&aZv_uIJW6%+EHCj}Jjn1nznOr{x`fch4Ox#Yn4GM#rYmI7bo4{cW<)nY z#6N+#>a6Ob-c9UznMVF;(&6e7^Ba|3AVJ~Mp&DqC5TzW|bg2q1s4pC4Z;$ctZNAHf zSaeDfUM&hv`dz6-=s3JA%KSMtNiJ(tBz94e*wYq=&~0F(DdD9w*}NUwX`tZ%J%mGm zNiq;@a4E{!FnDhLZVYC#!2%6ixS`0oh}i}@8KXUpbxasXadGp$5XMOcp>zO%2&@}8 z-H+Uf(|w`{??vhL;>F34!8612=pQTPElB$Gw2t&?RIlN+WGojmj8HbYZ*dqS`J%ht zcLNWNRLB4jVc>+~iGAesF|QdzTCC;LlD2=vN(+A_whCT~s*%5qshXbz>%VoKZ`Xdnjpw`{@p2E`IG`{M>Z8V@w_yAdj)c;ODC zN*w9XGk@uc(EpjLB0tPuT*bzAC_V<+VNN5EN^v-wGm=F4f0|S)q&WOYio}r5O_7-I z4Z`vOD)km?&as8nU-qf)){v|q@^~cso8tXu!Ae9*qJ|7u5k0r~bOO;v-zTAe= z|2*o~_RM#+E?ZHTzi3bwk`49C&mm#`Vp1xQHfSo%acwSij*!;_Pm=4FVtu$ma+NaRxRM+@MAtBk>gp(r>KX<|9bZdQ zy$02lYPO1S^+A!%kjQkJtD|sX;>&U*Vme;M#m&cS>A3h-(sU`2XmwC~Xc`fThp_~f z3z$+G2)ktv`gXX9!k%J28h8n@z7oH#jC;{1J!!>5Yk zGSx`pWee-vJ=HDK3^Ze5QJx3vH(By+L4St}ez_x3H{3UDPb3MA0JFrm>uFq|FVXqH zy$L4}UbjTDFn9|-Z*|+`muQ}FVzKD&)vqCt#9*9*E!QSuwCS5e$}}7_%uWy}Ound< zmLUrwUoyoPGrQkJQ7hRGtOZ;!*=qg>iefAVkcb(JSX>6*Sb11>FSU+Q!Az14RhI%5 zlm1zfQjHGQycamO-$Xv|YdmnM?SY7W@>CCyqdAPr8aCU=J{@}V>;e8*cQw69%!>@T z69VOwP{>v_We6qYQu@{xHYSa_tKgCsSRMSDCU^6xGYr$4`>mMDWG+hO zp$VDvcXJgTdy@WMo!*#>#6t6P4-#SR(O7ZAz(R1dg)15DDY&CJ93b|#F_)3B4!qXO z{kZU7ZntJZO`7&4WbnSu!#8+PBbz%lq#hYy`-p3)DD&da+m3qTSv7H#QfOMG#3|S| z%Q3g-t&i%N3N?0$_uk||UaN>8@4T0Ikg7zVOTv$Rlle5HZ!yJXf62sAYB5CSL6rF& zv^3a?L_6%jJu9d=i8mjzEr^zNw&n3$f9M)x=str)L5yyV*+JeSWa1EK3~9l090mWj z=~xg5AC6K`j40RzGt1Q#>>mH)K3F_(g^hM00`FGnCLc!*4kid=@xaPi5Dc(#E8X}S za&QzVv?v8@uF92S^`@}>^#YCg-p}Bnc!>@qIG+TzU>Xt*&Nwx?nME<>IZMI5ft!Ov z7vLIt8nJJ5?m~>e`Q{38a9rq<=HMDG^fB-!#32OksmA=9_rg4l4J-Z*77Mnoj(_uB zCak@}1G_=pf^|FG{kyrkoMV8M*nY7YT->Hw`$gREhfxi5D7qhAOdbv(5nh0SODu93c*I7*SmG7B zs|V&ZjmW_IADA>!*B&(mL)Ju=S$x3KA`C$q+Eq5RH?XU4R!PzG5hMz4&liBm z!<>@#9D`RuYozOeW(SvI4bn?sV&^fV|8Pwp3xJ%a1_Cc&Y9R0etK7Kux9&kzq^&4d z5a7zA#Y#k6PAQZgc zN3lsAIF1$vzy?TwFClA!PPhM9HDx;-$Yq)?7lI1FCfBeMlJFP+SOB8Y$^{zT@@9zl6-9jf*9aT3?JR+xp_TGGs{Cu`3eqtdC*7(uaig48z&vSPNcz zs*h6ayQWkMvn##m`8Z0~LZnxVGv;1jt9tVeBZI6_Qo>Dpf603NK~x*7CM&lXap_IG z|0?U%frLZkzaH*=!a2epCzt5;Q6w<0-;w1bsDS+e-IhQx0lb*l2MLW{?G*AjJ{};` zc?BG7NuV@wZ=Vk(Eq+WWtA2=WmvvSv?X?F?!mki$)c$6v=lCUt&*KVP;)WE5sP^OW zqT5v^k$#;H$&1C=IC7XDegMwcZ`3_Z2`@kgC`y{JJU~@^|6V0pde-??5=opu1 zN01nxwwM}WCXuzmDh>#=p*M|y(QeJlXhAP(GV0d6jKXoXCF+(kiozkLDn4qKQImUl zgxsqpZ9icVPQ|7sQ2hyH@km9?#Xgw_VqFCc>=2WUnyc*kG<%zTn#*j#zt!=Nl@R78 zGEm>2L!u!YOC}w|q8?Auh;OU=T&iiNFk^U^yP0Rm0D-W8?ZxLoz&GJ&JTF(FXOly3 zpeDJ!e5wg`?ogH~((jVuw*y<7zh52kXR7++dwFTv3MB$}Wu%#Hr zVq>pKTtdYbtJ|PioA0F*`}cNHvjz9`?wHibO zY;%VSH84yNK>!^!|H%NCfU3M7vEvC032(^CDso zA2}p|xp?G|?Z#{y?vPnqTE*Niv#$sXu4Q+od0M&JarUO;MvDz=^psWT<6$w3Cz-Eb zWs5k(^R#k!U<9ZcilP%IQi`Iw20;Vmtj$YBZNC~1TUt>>U=oGhheSgPix~%iC544y z3BU`;h1~WwdLzy0y5^NQbvfe!trpr=ja`zRw%@{MzL7L`Lq?wpHA);%BYYh1nTlcF zfK`hzuXb+*j?uc)dZMR>k+bz;oV2h3O1u{9(`@U~A(Z*EY~y+)YII2S%xz0qmDn&_q^atN(#29< zX^bA!zn4TqiPp(63Cw>HiJLb=8cKg)K(s6)sQ1g*N(vhtFAEh5P#c9?6AOz2>bU~~ z(s;|%Rnk^$7Ol07g)vV+Jf)DZJr%HT0(UpSCc~YPu1WC{LS56}1L@@^!(vlSglN3U zFzLXEP}KHQCr-c<>6CVQyF<#W8A&!LWzuRugKZaa3IAmDy`SgdA9 z0p0@H$(EvnKa%N7g9zVnoUEn76K$0G(*lzR(ceG_0D#UM-LTpd`eKR*}W$Mza{ zg{dyL1>?=wF)O%{ByV*aTL3;1{&U6_09-U2^=yGmaALjG(NCWl6Wh{zp?A91?>*If zrgyY=+??t-Z;BfFUto&(&R7X)6tDA=8fYz0((uvDF8$&3RVDcbV$xuLAULEEgL`Ej zzQmW7p3V3-9C1lHEk`qt;NSX8o|pW^`keJHydJ^ph$%AH0 z*ppXcEBPn8Q$ zjB}VEnwcm;VzRIfp1KYd54(M-7^pvw0TP>!uSF2d)yYyM3UunmH;@1uRYey?9cZ9M zs*&o$5Ctd@Be4J;Nqa*iW!NG8NKrZPh}l3+aMV`y*ff;s9zyRGMAidq(@DjKQ43CP zI{cVDkL#cGKTJs3m_{3N%r%T4+R$iBUIkc7WCdD4l!p*qT$&b!s3izCD#98w(TrF! zc8>;za0hM3`-oG@fA`}b&sG!8$dNvRyHp-|<1p$Nzl7Bgt&La>Q<4~~5vRdwC>^pI zl8CfNBzqqOu#c=+J@=?i75A7>Q>j)Okks!2TX_Ig{vQeE^j-?tN>Ez;Yw1~qzFpqg zjmUi6E+fN4@d>sOQJGwEHP|ddfV*6L<2g(KCjH_YN3s1olh^Y+@<&ENQ)LJVfG=jt z7EE3MFETRB=@F4>J;(yEaknPdmi40~<5Iwkf|MJ$2dqgKgB|hDf;7_2-B3HNiI*=;xFb8ejFFT#h^%rg}Lh4@N!1`mzZWAX{lrYRKVIW z76AoYI(*AEE)(MiDfViItK_3))LpKGNETok^b~JRX!A5Cu)VWXgJB_%kOc4(u&k4} zAZs?F$?>>WxsN<6i~8uf!IQ&klNn{+1XzS?oIau?h<3*0F?$o4^;#CBeY6~)V4qNVDO62jY9w-Kn4o)O1v zFL^Jr2mg?d@mqZVd;-Ni$^IeR1S39f6lz>0v!;Rs67LTxmo2l-ypb1a>!ZEr-D(TMBZYG(ZK(aNhfQ5Ht~n z45U7QRLZu<2Tkc3`8Eiv*gE&8*h^F&5Q-Sk0Sf^XeM!B=?u$i3dibz4)@Q;8=rjB` z9~6-z%w+_pI!0|XJ2sW6WS9YJ0zG1GNOUAyg_^9kI;6qkB(MX_YhF z02xW60vHAE2JXPR7&tM4?*j(srGl~X66j_*c|fynW6OBlyycdeVZlU3ZwT%5p29)M z<`;IL`s6@47MpG!YT%S@lvsBQTbHZ z1{Nlc@lROdG!GIkPckJ5^G&9RV$8ijA`zyrA)7{3@_v_@@mus968bYhsZ^dzaLs0f z0q+&7NN8zC3b+O>i5*6SYY5E-D}aX@2Mx}-W*ejlrr2T+=y_t|{j4fyxU*`p?>Woz zbRGHYs3%nkHspew&SO_pYKIDVHhQN) z0TB2xjik2Zo85X-4d7IRvz#i3w3*c&9vges=G|9NhTdTu zPYa%C-4y`k&N3(keaQ;c@@q(AWKuo=nQ`=F&noa%`-Qg zSc6o1M$BtUqWTt!vxOe&2jVL0n@=;P8OkpMdqVi3N-rp z^2|-4-EsgP8ryvkBa{R0_xb9laS-!i8ya~(!E089f%vXt<9JWvI>C`R1v@lM1s=ZS zJeH#Got~x_t+dFVK!C91mx8I{#eVEM>yg@fL_6X#;|J3y8(m@MTY*{h2=Ww|OIAW_ zUem8hg>S$r^EX|P)Ft7&Q-vGiYSZOaa-~a!z!S$SshK3+lfX>9mbZ?F^*n6gfovq` zBrMW57|@V$WjFD@h>*z9`*?YVhYLKM;vt8F`q4IW_42$q$-`A1y3u7u)rjx4A+2|W zsqK7vKM#ybX93k7;boSG2YA@V!&V+BP2Mi5ifIm=e8Qp}ALrNxAIG5`aV&4Qu7=8eJ!atgmW|j1 zVq<12X6uu!8<(|b_GWhD-$UWQRhYlL$Kx6uw;}Haq literal 0 HcmV?d00001 diff --git a/dnslib/label.pyc b/dnslib/label.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09d9d8a9be7be09ddbdf54a9d3d4dd45cc5f21df GIT binary patch literal 9847 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 A@Bjb+ literal 0 HcmV?d00001 diff --git a/dnslib/lex.pyc b/dnslib/lex.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ac63e780cb585fa72766aaa0d49c9cf9409f1e8 GIT binary patch literal 12617 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 literal 0 HcmV?d00001 diff --git a/dnslib/ranges.pyc b/dnslib/ranges.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17082b8c90003f5cf435bf19b30a9e63204ed3d1 GIT binary patch literal 6523 zcmcgwZBrb_5$@ePkU&UCvITbRs;r4IM~rxpqEyKxQwfS(BBi2K3vps7)z#kZ04I)J zYG+SCO8F98M)|GzkPrC*&hzx#?H(toN)AX!GuJ!QGt=GkOn1*z{(E(FC6@1-(*3L8 z_YWxcKd54nP1K&mzO+5r^u&1b+?Ti_dm`BbF%>aY+4f~~NX)R9OG;msoB5W%dkn1I#P6na0f7<|djS*Jhdn%`uu+Ycugcvq5t!v3ZmEPUA;b?UU`=m zmy~-Wi<+hZLkG3})WVRaX_7o>M(uV0Blg)&*~?A*Cir840+=t@?_hMp;D3H-OcKzX zEWs9*dZvTR)zR_6mgic7>(4aW(eBKLG5{Crmw<4%fB$};P1y2X)V5}zZ7oe))5UC) zDYvNy#~|Gfa4`Cg&aP?h)%85prgEJ4skx;)cjp%8?%caqVzT)<7c}bUx)_NmKq+(& zTZ^|LOt6I&pA8D$)2m;0oUuX42ic~Mj*h103dZ*#d~eCZ;;o9(14}4xF%khD6y!=X{eUoz}{C$o<&)mTvI+4+Ox{2E3(p!G!h z7A=-05^vla_L@|cg~F)Su7jY})NruZNd*R>h1b+9;U)G{&Bk$V>eR-%4$cr#g$tAZ z3MO;Xb1l1qPfJQtCQV1s`W`G?QXQ|vC%4_{jLNu)FCag87 z8VhIp2*ut&>Co9uLyYTWLFWwy&_)nYhoWpfpTC3{07fK%tJtJ3XOm1 zVW9RQ&8k+i&PpMr4LPqv4ENU|Mmxs%No6hq`J4yK!eoz0T}DO3Px`~2+aI ztRG%QUpS6RC2_(Qz31FZ!mD=}i%jMb8hfYGzd2lhlD2xtK1$?3$s+RW&b6RlN}371Dt_v{2pw z+?)^LdU}4KYF)JOho$gS4Se*YC0mhKXVCJ>E6{>I2I|***yr?HT^|Nd1~m19D1P06 z{W2sePI$yZde)F})S-xqgr(!+7V3cuZ;|>Kl_Ke!CZzA#Lh1UguS>rbGCtRcAh#@6 zbZZYdtv5(^KA|+3P)rwY>u(g1+X~m}-zwb}t@n_9Wio*fgx%6)LSg?Ix;0hjeey4f zZSCL&9IPPDYikSL()t;d!{%f`U8r~C4zDy(IjmL-$NLT%e2!tSYp}kXW_iB~(BZwS z@R;WMKU8@0COk=#ol=8U=Gd72{cEwB_G!TlAhLSC(yrnIF7Xu4L`YsV$NQJpOZi-a zS1mm!*iP}#G{mQ;pO6g>sl%zt%OU4KIenS?5s{if&48e1LakvIk&CVc(N5#omrR-V zJX!a>GXc186uQ$GDstqqhKuwH`DM)epdIZu;%NB=Xp16eAgfBeYXbY;gTNtWq{Hkc z>}P_&-_h)XzzNdqs_a!Ho9|xGU}dz>qxWCU5C`D%xgWYW7?y1c?o>UX4mh>X;9JGylIYWA3+GZcGI_|31y9T^zc)>XMn$wr2 z6!}NnBpOvT3Bh|&HyJt5c;f(6hML0XE55eNfTQ0@jdnhthu4(%nA0%ciFXqT%Y=7p zF!=CTy5RE#skcU;Lf|kUUvU&d4m+QuIioLNK;@NO# z+r=W_eJu-h@al+pvPc&M`0OOKd7+3$6dN7th%9k zeLrd?^?FWxrU!W|O}5+7j;;L)-+Je(*W|!y)fJpi zE|812cSy+RF{MfDr?E0Udh%rT>H6xro~g1rCuRxH2Uw!hHp_QG>z#VoAH%g2#UJs; X{E?xN%E%RzA=JbAZyaBhF>w43o@aW| literal 0 HcmV?d00001 diff --git a/nmap/__init__.py b/nmap/__init__.py new file mode 100644 index 0000000..d15a222 --- /dev/null +++ b/nmap/__init__.py @@ -0,0 +1,44 @@ +# -*- coding: latin-1 -*- + +""" +python-nmap - 2010.12.17 + +python-nmap is a python library which helps in using nmap port scanner. +It allows to easilly manipulate nmap scan results and will be a perfect +tool for systems administrators who want to automatize scanning task +and reports. It also supports nmap script outputs. + + +Author : + +* Alexandre Norman - norman@xael.org + +Contributors: + +* Steve 'Ashcrow' Milner - steve@gnulinux.net +* Brian Bustin - brian at bustin.us +* old.schepperhand +* Johan Lundberg +* Thomas D. maaaaz + +Licence : GPL v3 or any later version + + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +from .nmap import * +from .nmap import __author__ +from .nmap import __version__ +from .nmap import __last_modification__ diff --git a/nmap/__init__.pyc b/nmap/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..497fc66e7b190571aee3cde14401b49fc13eeecb GIT binary patch literal 1466 zcmah}-EZ4A5SQ(=9XJfw%iixTL6%5K_b?zUiYTA;;5weHph#W>TB0Mi6e*CD9rs_} z-u4gdM>$!yK5P<1-5rm2zx&{g{``*p{>P8MmC@5P#QzkZyTDRK(LL5dR1G6Fi1I*< z0@Vzo`(ZQ){7%o0qWjU7f6?IdrWw8naJCD&Tmn2kMgrOeuqHzc@| zN^Pj&TDG0yUTlv9ZL-33%EOheXbm-5h~QS(r6@h~#wc1EOK#)5XrNX#QcLG8_r^Nl zF|_8|2RFR)rr}ebiVDN#TZLFhQLJNl4jSvt+{et{-> z1-q#0){bmiB@qiUXVIM-KxFSPv-5Y*PtV4aaef!7a5c`Sm-9JY-DH%~EY0%q`Rydl zXm*>;ZswOU(HvO-GWH+Y3)iDDXwFJ_E>-B>JJiYnlB%fY=t3(>Ay)vzsWfeX^FJkF zTp3)S5EwMS^aT)&muP-}Kn}>>)ZVuzNwQwAV>EQQ2?+`-v=c6Q8#6h;%-IWz56k|R zWFU(I*A*A6D7Lb1d)ZSnJ_~>7g^D|0^z9|fz6FY6y7vNGK1{Tts7zTD9&;@UgD4A* zvM@cf5tcoC|5)4+*aUY(Bp-Qg#iu04gmKBmbe_0wv9M_BB$!Ex0&~U}MT`mf4Gz5l Tf=-FIyP#bVyd1K@_jvyTSZl`B literal 0 HcmV?d00001 diff --git a/nmap/nmap.py b/nmap/nmap.py new file mode 100755 index 0000000..9f72b7e --- /dev/null +++ b/nmap/nmap.py @@ -0,0 +1,1075 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +nmap.py - version and date, see below + +Source code : https://bitbucket.org/xael/python-nmap + +Author : + +* Alexandre Norman - norman at xael.org + +Contributors: + +* Steve 'Ashcrow' Milner - steve at gnulinux.net +* Brian Bustin - brian at bustin.us +* old.schepperhand +* Johan Lundberg +* Thomas D. maaaaz +* Robert Bost + +Licence : GPL v3 or any later version + + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + + +""" + + +__author__ = 'Alexandre Norman (norman@xael.org)' +__version__ = '0.4.3' +__last_modification__ = '2015.09.11' + + +import collections +import csv +import io +import os +import re +import shlex +import string +import subprocess +import sys +import types +from xml.etree import ElementTree as ET + + +try: + from multiprocessing import Process +except ImportError: + # For pre 2.6 releases + from threading import Thread as Process + +############################################################################ + +class PortScanner(object): + """ + PortScanner class allows to use nmap from python + + """ + + def __init__(self, nmap_search_path=('nmap','/usr/bin/nmap','/usr/local/bin/nmap','/sw/bin/nmap','/opt/local/bin/nmap') ): + """ + Initialize PortScanner module + + * detects nmap on the system and nmap version + * may raise PortScannerError exception if nmap is not found in the path + + :param nmap_search_path: tupple of string where to search for nmap executable. Change this if you want to use a specific version of nmap. + :returns: nothing + + """ + self._nmap_path = '' # nmap path + self._scan_result = {} + self._nmap_version_number = 0 # nmap version number + self._nmap_subversion_number = 0 # nmap subversion number + self._nmap_last_output = '' # last full ascii nmap output + is_nmap_found = False # true if we have found nmap + + self.__process = None + + # regex used to detect nmap (http or https) + regex = re.compile('Nmap version [0-9]*\.[0-9]*[^ ]* \( http(|s)://.* \)') + # launch 'nmap -V', we wait after 'Nmap version 5.0 ( http://nmap.org )' + # This is for Mac OSX. When idle3 is launched from the finder, PATH is not set so nmap was not found + for nmap_path in nmap_search_path: + try: + if sys.platform.startswith('freebsd') or sys.platform.startswith('linux') or sys.platform.startswith('darwin'): + p = subprocess.Popen([nmap_path, '-V'], bufsize=10000, stdout=subprocess.PIPE, close_fds=True) + else: + p = subprocess.Popen([nmap_path, '-V'], bufsize=10000, stdout=subprocess.PIPE) + + except OSError: + pass + else: + self._nmap_path = nmap_path # save path + break + else: + raise PortScannerError('nmap program was not found in path. PATH is : {0}'.format(os.getenv('PATH'))) + + + + self._nmap_last_output = bytes.decode(p.communicate()[0]) # store stdout + for line in self._nmap_last_output.split(os.linesep): + if regex.match(line) is not None: + is_nmap_found = True + # Search for version number + regex_version = re.compile('[0-9]+') + regex_subversion = re.compile('\.[0-9]+') + + rv = regex_version.search(line) + rsv = regex_subversion.search(line) + + if rv is not None and rsv is not None: + # extract version/subversion + self._nmap_version_number = int(line[rv.start():rv.end()]) + self._nmap_subversion_number = int(line[rsv.start()+1:rsv.end()]) + break + + if is_nmap_found == False: + raise PortScannerError('nmap program was not found in path') + + return + + + def get_nmap_last_output(self): + """ + Returns the last text output of nmap in raw text + this may be used for debugging purpose + + :returns: string containing the last text output of nmap in raw text + """ + return self._nmap_last_output + + + + def nmap_version(self): + """ + returns nmap version if detected (int version, int subversion) + or (0, 0) if unknown + :returns: (nmap_version_number, nmap_subversion_number) + """ + return (self._nmap_version_number, self._nmap_subversion_number) + + + + def listscan(self, hosts='127.0.0.1'): + """ + do not scan but interpret target hosts and return a list a hosts + """ + assert type(hosts) is str, 'Wrong type for [hosts], should be a string [was {0}]'.format(type(hosts)) + + self.scan(hosts, arguments='-sL') + return self.all_hosts() + + + + def scan(self, hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False): + """ + Scan given hosts + + May raise PortScannerError exception if nmap output was not xml + + Test existance of the following key to know if something went wrong : ['nmap']['scaninfo']['error'] + If not present, everything was ok. + + :param hosts: string for hosts as nmap use it 'scanme.nmap.org' or '198.116.0-255.1-127' or '216.163.128.20/20' + :param ports: string for ports as nmap use it '22,53,110,143-4564' + :param arguments: string of arguments for nmap '-sU -sX -sC' + :param sudo: launch nmap with sudo if True + + :returns: scan_result as dictionnary + """ + if sys.version_info[0]==2: + assert type(hosts) in (str, unicode), 'Wrong type for [hosts], should be a string [was {0}]'.format(type(hosts)) + else: + assert type(hosts) is str, 'Wrong type for [hosts], should be a string [was {0}]'.format(type(hosts)) + assert type(ports) in (str, type(None)), 'Wrong type for [ports], should be a string [was {0}]'.format(type(ports)) + assert type(arguments) is str, 'Wrong type for [arguments], should be a string [was {0}]'.format(type(arguments)) + + for redirecting_output in ['-oX', '-oA']: + assert not redirecting_output in arguments, 'Xml output can\'t be redirected from command line.\nYou can access it after a scan using:\nnmap.nm.get_nmap_last_output()' + + h_args = shlex.split(hosts) + f_args = shlex.split(arguments) + + # Launch scan + args = [self._nmap_path, '-oX', '-'] + h_args + ['-p', ports]*(ports!=None) + f_args + if sudo: + args = ['sudo'] + args + + p = subprocess.Popen(args, bufsize=100000, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + # wait until finished + # get output + (self._nmap_last_output, nmap_err) = p.communicate() + self._nmap_last_output = bytes.decode(self._nmap_last_output) + nmap_err = bytes.decode(nmap_err) + + # If there was something on stderr, there was a problem so abort... in + # fact not always. As stated by AlenLPeacock : + # This actually makes python-nmap mostly unusable on most real-life + # networks -- a particular subnet might have dozens of scannable hosts, + # but if a single one is unreachable or unroutable during the scan, + # nmap.scan() returns nothing. This behavior also diverges significantly + # from commandline nmap, which simply stderrs individual problems but + # keeps on trucking. + + nmap_err_keep_trace = [] + if len(nmap_err) > 0: + regex_warning = re.compile('^Warning: .*') + for line in nmap_err.split(os.linesep): + if len(line) > 0: + rgw = regex_warning.search(line) + if rgw is not None: + sys.stderr.write(line+os.linesep) + pass + else: + #raise PortScannerError(nmap_err) + nmap_err_keep_trace.append(nmap_err) + + return self.analyse_nmap_xml_scan(nmap_xml_output = self._nmap_last_output, + nmap_err = nmap_err, + nmap_err_keep_trace = nmap_err_keep_trace) + + + def analyse_nmap_xml_scan(self, nmap_xml_output=None, nmap_err='', nmap_err_keep_trace=''): + """ + Analyses NMAP xml scan ouput + + May raise PortScannerError exception if nmap output was not xml + + Test existance of the following key to know if something went wrong : ['nmap']['scaninfo']['error'] + If not present, everything was ok. + + :param nmap_xml_output: xml string to analyse + :returns: scan_result as dictionnary + """ + + # nmap xml output looks like : + # + # + #
+ # + # + # + # + # + # + # + # + # + # + # + # + #