PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/lib64/python2.7/site-packages/hgext/zeroconf
Viewing File: /usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyo
� Hq�Qc@swdZdZdZdZddlZddlZddlZddlZddlZddl Z ddl Z dddgZ d e �d <d Z d Zd ZdZdZdZdZdZddZdZdZdZd ZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(dZ)dZ*dZ+dZ,d Z-d$Z.d%Z/d&Z0d'Z1d(Z2d)Z3d*Z4d+Z5d,Z6d-Z7d.Z8dZ9d/Z:d0Z;d"Z<id1e"6d2e#6d3e$6d4e%6d5e&6d6e'6Z=id7e*6d8e+6d9e,6d:e-6d;e.6d<e/6d=e06d>e16d?e26d@e36dAe46dBe56dCe66dDe76dEe86dFe96dGe:6dHe;6d6e<6Z>dI�Z?dJe@fdK��YZAdLe@fdM��YZBdNe@fdO��YZCdPe@fdQ��YZDdRe@fdS��YZEdTe@fdU��YZFdVeFfdW��YZGdXeHfdY��YZIdZeIfd[��YZJd\eIfd]��YZKd^eKfd_��YZLd`eKfda��YZMdbeKfdc��YZNddeKfde��YZOdfeKfdg��YZPdheHfdi��YZQdjeHfdk��YZRdleHfdm��YZSdnejTfdo��YZUdpeHfdq��YZVdrejTfds��YZWdejTfdt��YZXdeHfdu��YZYdeHfdv��YZZe[dwkrsdxGeGHeZ�Z\dyGHidzd{6d|d76d}d~6Z]eYdd�ej^d��d�d d e]�Z_d�GHe\j`e_�d�GHd�GHd�Geae\jbdd���GHd�GHd�GHd�Geae\jbdd���GHd�GHd�GHe\jce_�d�GHe\jd�ndS(�s Multicast DNS Service Discovery for Python, v0.12 Copyright (C) 2003, Paul Scott-Murphy This module provides a framework for the use of DNS Service Discovery using IP multicast. It has been tested against the JRendezvous implementation from <a href="http://strangeberry.com">StrangeBerry</a>, and against the mDNSResponder from Mac OS X 10.3.8. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see <http://www.gnu.org/licenses/>. sPaul Scott-Murphys!paul at scott dash murphy dot coms0.12i����NtZeroconft ServiceInfotServiceBrowserit _GLOBAL_DONEi}i�i�i�i�s 224.0.0.251i�i5i<i�i #i�iiii@i iiiiii�i�i�iiiii i i i i iiii!tintcstchthstnonetanytatnstmdtmftcnametsoatmbtmgtmrtnulltwkstptrthinfotminfotmxttxttquadatsrvcCstj�dS(s#Current system time in millisecondsi�(ttime(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytcurrentTimeMillis�stNonLocalNameExceptioncBseZRS((t__name__t __module__(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�stNonUniqueNameExceptioncBseZRS((RR (((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR!�stNamePartTooLongExceptioncBseZRS((RR (((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR"�stAbstractMethodExceptioncBseZRS((RR (((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR#�stBadTypeInNameExceptioncBseZRS((RR (((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR$�st BadDomainNamecBseZd�ZRS(cCstj|d|�dS(Nsat position %s(t Exceptiont__init__(tselftpos((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�s(RR R'(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR%�stBadDomainNameCircularcBseZRS((RR (((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR*�stDNSEntrycBsDeZdZd�Zd�Zd�Zd�Zd�Zd�ZRS(s A DNS entrycCsHtj|�|_||_||_|t@|_|t@dk|_dS(Ni( tstringtlowertkeytnamettypet _CLASS_MASKtclazzt _CLASS_UNIQUEtunique(R(R/R0R2((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�s    cCsGt|t�rC|j|jkoB|j|jkoB|j|jkSdS(s&Equality test on name, type, and classi(t isinstanceR+R/R0R2(R(tother((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt__eq__�s4cCs|j|� S(sNon-equality test(R7(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt__ne__�scCs)y t|SWntk r$d|SXdS(sClass accessors?(%s)N(t_CLASSEStKeyError(R(R2((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytgetClazz�s  cCs)y t|SWntk r$d|SXdS(s Type accessors?(%s)N(t_TYPESR:(R(R0((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytgetType�s  cCs�d||j|j�|j|j�f}|jrA|d7}n |d7}||j7}|dk ru|d|7}n |d7}|S(s1String representation with additional informations%s[%s,%ss-unique,t,s,%s]t]N(R=R0R;R2R4R/tNone(R(thdrR6tresult((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyttoString�s+      ( RR t__doc__R'R7R8R;R=RC(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR+�s     t DNSQuestioncBs)eZdZd�Zd�Zd�ZRS(sA DNS question entrycCs8|jd�st|��ntj||||�dS(Ns.local.(tendswithRR+R'(R(R/R0R2((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR' scCsC|j|jkoB|j|jks3|jtkoB|j|jkS(s6Returns true if the question is answered by the record(R2R0t _TYPE_ANYR/(R(trec((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt answeredByscCstj|dd�S(sString representationtquestionN(R+RCR@(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt__repr__s(RR RDR'RIRK(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyREs  t DNSRecordcBsqeZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z d �Z d �Z d �Z RS( s.A DNS record - like a DNS entry, but has a TTLcCs/tj||||�||_t�|_dS(N(R+R'tttlRtcreated(R(R/R0R2RM((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR's cCs#t|t�rtj||�SdS(sTests equality as per DNSRecordi(R5RLR+R7(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR7!scCs+x$|jD]}|j|�r dSq WdS(s^Returns true if any answer in a message can suffice for the information held in this record.ii(tanswerstsuppressedByAnswer(R(tmsgtrecord((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt suppressedBy'scCs*||kr&|j|jdkr&dSdS(sqReturns true if another record has same name, type and class, and if its TTL is at least half of this record's.iii(RM(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRP/s"cCs|j||jdS(sRReturns the time at which this record will have expired by a certain percentage.i (RNRM(R(tpercent((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytgetExpirationTime6scCstd|jd�|d�S(s%Returns the remaining TTL in seconds.iidi�(tmaxRU(R(tnow((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytgetRemainingTTL;scCs|jd�|kS(s(Returns true if this record has expired.id(RU(R(RW((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt isExpired?scCs|jd�|kS(s9Returns true if this record is at least half way expired.i2(RU(R(RW((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytisStaleCscCs|j|_|j|_dS(sDSets this record's TTL and created time to that of another record.N(RNRM(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytresetTTLGs cCs t�dS(sAbstract methodN(R#(R(tout((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytwriteMscCs5d|j|jt��|f}tj|d|�S(s1String representation with additional informations%s/%s,%sRR(RMRXRR+RC(R(R6targ((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRCQs"(RR RDR'R7RSRPRURXRYRZR[R]RC(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRLs          t DNSAddresscBs2eZdZd�Zd�Zd�Zd�ZRS(sA DNS address recordcCs&tj|||||�||_dS(N(RLR'taddress(R(R/R0R2RMR`((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'YscCs |j|jt|j��dS(s'Used in constructing an outgoing packetN(t writeStringR`tlen(R(R\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR]]scCs#t|t�r|j|jkSdS(sTests equality on addressi(R5R_R`(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR7ascCs0ytj|j�SWntk r+|jSXdS(sString representationN(tsockett inet_ntoaR`R&(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRKgs (RR RDR'R]R7RK(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR_Vs    tDNSHinfocBs2eZdZd�Zd�Zd�Zd�ZRS(sA DNS host information recordcCs/tj|||||�||_||_dS(N(RLR'tcputos(R(R/R0R2RMRfRg((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'qs cCs<|j|jt|j��|j|jt|j��dS(s'Used in constructing an outgoing packetN(RaRfRbRg(R(R\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR]vscCs5t|t�r1|j|jko0|j|jkSdS(sTests equality on cpu and osi(R5ReRfRg(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR7{s"cCs|jd|jS(sString representationt (RfRg(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRK�s(RR RDR'R]R7RK(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRens    t DNSPointercBs2eZdZd�Zd�Zd�Zd�ZRS(sA DNS pointer recordcCs&tj|||||�||_dS(N(RLR'talias(R(R/R0R2RMRj((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�scCs|j|j�dS(s'Used in constructing an outgoing packetN(t writeNameRj(R(R\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR]�scCs#t|t�r|j|jkSdS(sTests equality on aliasi(R5RiRj(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR7�scCs|j|j�S(sString representation(RCRj(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRK�s(RR RDR'R]R7RK(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRi�s    tDNSTextcBs2eZdZd�Zd�Zd�Zd�ZRS(sA DNS text recordcCs&tj|||||�||_dS(N(RLR'ttext(R(R/R0R2RMRm((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�scCs |j|jt|j��dS(s'Used in constructing an outgoing packetN(RaRmRb(R(R\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR]�scCs#t|t�r|j|jkSdS(sTests equality on texti(R5RlRm(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR7�scCsAt|j�dkr-|j|jd d�S|j|j�SdS(sString representationi is...N(RbRmRC(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRK�s(RR RDR'R]R7RK(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRl�s    t DNSServicecBs2eZdZd�Zd�Zd�Zd�ZRS(sA DNS service recordc CsAtj|||||�||_||_||_||_dS(N(RLR'tprioritytweighttporttserver( R(R/R0R2RMRoRpRqRr((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�s    cCsD|j|j�|j|j�|j|j�|j|j�dS(s'Used in constructing an outgoing packetN(t writeShortRoRpRqRkRr(R(R\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR]�scCsYt|t�rU|j|jkoT|j|jkoT|j|jkoT|j|jkSdS(s3Tests equality on priority, weight, port and serveri(R5RnRoRpRqRr(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR7�sFcCs|jd|j|jf�S(sString representations%s:%s(RCRrRq(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRK�s(RR RDR'R]R7RK(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRn�s    t DNSIncomingcBszeZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z d �Z d �Z d �Z d �ZRS( s/Object representation of an incoming DNS packetcCsjd|_||_g|_g|_d|_d|_d|_d|_|j�|j �|j �dS(s/Constructor from string holding bytes of packetiN( toffsettdatat questionsROt numQuestionst numAnswerstnumAuthoritiestnumAdditionalst readHeadert readQuestionst readOthers(R(Rv((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�s          cCs�d}tj|�}tj||j|j|j|!�}|j|7_|d|_|d|_|d|_|d|_|d|_ |d|_ dS( sReads header portion of packets!HHHHHHiiiiiiN( tstructtcalcsizetunpackRvRutidtflagsRxRyRzR{(R(tformattlengthtinfo((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR|�s&     cCs�d}tj|�}x�td|j�D]�}|j�}tj||j|j|j|!�}|j|7_y.t||d|d�}|j j |�Wq(t k r�q(Xq(WdS(s!Reads questions section of packets!HHiiN( RR�trangeRxtreadNameR�RvRuRERwtappendR(R(R�R�tiR/R�RJ((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR}�s & cCsRd}tj|�}tj||j|j|j|!�}|j|7_|dS(s Reads an integer from the packets!Ii(RR�R�RvRu(R(R�R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytreadInt�s &cCs2t|j|j�}|jd7_|j|�S(s(Reads a character string from the packeti(tordRvRut readString(R(R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytreadCharacterStringscCs`dt|�d}tj|�}tj||j|j|j|!�}|j|7_|dS(s0Reads a string of a given length from the packett!tsi(tstrRR�R�RvRu(R(RbR�R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR� s &cCsRd}tj|�}tj||j|j|j|!�}|j|7_|dS(s'Reads an unsigned short from the packets!Hi(RR�R�RvRu(R(R�R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytreadUnsignedShorts &c Csrd}tj|�}|j|j|j}x?td|�D].}|j�}tj||j|j |j |!�}|j |7_ d}|dt kr�t ||d|d|d|j d��}n�|dtks�|dtkrt||d|d|d|j��}n5|dtkrZt||d|d|d|j |d��}n�|dtkr�t||d|d|d|j�|j�|j�|j��}n�|dtkr�t||d|d|d|j�|j��}nS|dtkr8t ||d|d|d|j d��}n|j |d7_ |dk r<|jj|�q<q<WdS( sDReads the answers, authorities and additionals section of the packets!HHiHiiiiiiN(RR�RyRzR{R�R�R�RvRuR@t_TYPE_AR_R�t _TYPE_CNAMEt _TYPE_PTRRit _TYPE_TXTRlt _TYPE_SRVRnR�t _TYPE_HINFOReR�t _TYPE_AAAAROR�(R(R�R�tnR�tdomainR�RH((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR~s. &0 -4H60  cCs|jt@tkS(sReturns true if this is a query(R�t_FLAGS_QR_MASKt_FLAGS_QR_QUERY(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytisQuery?scCs|jt@tkS(s"Returns true if this is a response(R�R�t_FLAGS_QR_RESPONSE(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt isResponseCscCs|j|||!jd�S(s6Reads a UTF-8 string of a given length from the packetsutf-8(Rvtdecode(R(RuRb((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytreadUTFGscCs6d}|j}d}|}x�trt|j|�}|d7}|dkrQPn|d@}|dkr�dj||j||�df�}||7}q|dkr|dkr�|d}n|d@d>t|j|�B}||kr�t|��n|}qt|��qW|dkr)||_n ||_|S( s#Reads a domain name from the packetti����iii�t.i?i(RutTrueR�RvtjoinR�R*R%(R(RBtofftnexttfirstRbtt((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�Ks2      %         (RR RDR'R|R}R�R�R�R�R~R�R�R�R�(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRt�s        %   t DNSOutgoingcBs�eZdZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z d �Z d �Z d �Z d �Z d �Zd�Zd�Zd�Zd�ZRS(s+Object representation of an outgoing packeticCsgd|_d|_||_||_i|_g|_d|_g|_g|_g|_ g|_ dS(Nii ( tfinishedR�t multicastR�tnamesRvtsizeRwROt authoritiest additionals(R(R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'ps          cCs|jj|�dS(sAdds a questionN(RwR�(R(RR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt addQuestion~scCs&|j|�s"|j|d�ndS(sAdds an answeriN(RStaddAnswerAtTime(R(tinpRR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt addAnswer�scCsH|dk rD|dks(|j|� rD|jj||f�qDndS(s6Adds an answer if if does not expire by a certain timeiN(R@RYROR�(R(RRRW((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR��s cCs|jj|�dS(sAdds an authoritative answerN(R�R�(R(RR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytaddAuthoritativeAnswer�scCs|jj|�dS(sAdds an additional answerN(R�R�(R(RR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytaddAdditionalAnswer�scCs;d}|jjtj|t|���|jd7_dS(s"Writes a single byte to the packets!ciN(RvR�RtpacktchrR�(R(tvalueR�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt writeByte�s"cCs8d}|jj|tj||��|jd7_dS(s=Inserts an unsigned short in a certain position in the packets!HiN(RvtinsertRR�R�(R(tindexR�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt insertShort�scCs5d}|jjtj||��|jd7_dS(s&Writes an unsigned short to the packets!HiN(RvR�RR�R�(R(R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRs�scCs;d}|jjtj|t|���|jd7_dS(s(Writes an unsigned integer to the packets!IiN(RvR�RR�tintR�(R(R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytwriteInt�s"cCsCdt|�d}|jjtj||��|j|7_dS(sWrites a string to the packetR�R�N(R�RvR�RR�R�(R(R�R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRa�scCsQ|jd�}t|�}|dkr0t�n|j|�|j||�dS(s5Writes a UTF-8 string of a given length to the packetsutf-8i@N(tencodeRbR"R�Ra(R(R�tutfstrR�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytwriteUTF�s     cCs�y|j|}Wnytk r�|j|j|<|jd�}|ddkr]|d }nx|D]}|j|�qdW|jd�dSX|j|d?dB�|j|�dS(s"Writes a domain name to the packetR�i����R�iNii�(R�R:R�tsplitR�R�(R(R/R�tpartstpart((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRk�s    cCs4|j|j�|j|j�|j|j�dS(sWrites a question to the packetN(RkR/RsR0R2(R(RJ((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt writeQuestion�scCs�|j|j�|j|j�|jrI|jrI|j|jtB�n|j|j�|dkrx|j|j �n|j|j |��t |j �}|j d7_ |j|�|j d8_ t dj|j |��}|j||�dS(sJWrites a record (answer, authoritative answer, additional) to the packetiiR�N(RkR/RsR0R4R�R2R3R�RMRXRbRvR�R]R�R�(R(RRRWR�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt writeRecord�s  cCs^|jsNd|_x|jD]}|j|�qWx'|jD]\}}|j||�q=Wx!|jD]}|j|d�qgWx!|jD]}|j|d�q�W|jdt|j��|jdt|j��|jdt|j��|jdt|j��|jd|j �|j r8|jdd�qN|jd|j �ndj |j �S(suReturns a string containing the packet's bytes No further parts should be added to the packet once this is done.iiR�(R�RwR�ROR�R�R�R�RbR�R�R�R�Rv(R(RJtanswerRt authorityt additional((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytpacket�s&   (RR RDR'R�R�R�R�R�R�R�RsR�RaR�RkR�R�R�(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�ms"              tDNSCachecBsMeZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z RS(sA cache of DNS entriescCs i|_dS(N(tcache(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'scCsMy|j|j}Wn%tk r;g}|j|j<nX|j|�dS(s Adds an entryN(R�R.R:R�(R(tentrytlist((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytadds  cCs9y!|j|j}|j|�Wntk r4nXdS(sRemoves an entryN(R�R.tremoveR:(R(R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s  cCsDy%|j|j}||j|�SWnttfk r?dSXdS(sHGets an entry by key. Will return None if there is no matching entry.N(R�R.R�R:t ValueErrorR@(R(R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytget%s cCst|||�}|j|�S(sLGets an entry by details. Will return None if there is no matching entry.(R+R�(R(R/R0R2R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt getByDetails.scCs(y|j|SWntk r#gSXdS(s5Returns a list of entries whose key matches the name.N(R�R:(R(R/((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytentriesWithName4s cCs<d�}yt||jj��SWntk r7gSXdS(sReturns a list of all entriescSs||S(N((txty((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�=sN(treduceR�tvaluesR&(R(R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytentries;s   ( RR RDR'R�R�R�R�R�R�(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s     tEnginecBsDeZdZd�Zd�Zd�Zd�Zd�Zd�ZRS(sNAn engine wraps read access to sockets, allowing objects that need to receive data from sockets to be called back when the sockets are ready. A reader needs a handle_read() method, which is called when the socket it is interested in is ready for reading. Writers are not implemented here, because we only send short packets. cCsHtjj|�||_i|_d|_tj�|_|j�dS(Ni( t threadingtThreadR'tzeroconftreadersttimeoutt Conditiont conditiontstart(R(R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'Ps    cCs�x�t�ds�|j�}t|�dkr^|jj�|jj|j�|jj�qy|tj|gg|j�\}}}xQ|D]I}y|j |j �Wq�t k r�t�ds�t j �q�q�Xq�WWqt k r�qXqWdS(NRi(tglobalst getReadersRbR�tacquiretwaitR�treleasetselectR�t handle_readR&t tracebackt print_exc(R(trstrrtwrterRc((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytrunXs   $    cCs-|jj�|jj�}|jj�|S(N(R�R�R�tkeysR�(R(RB((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�ns  cCs8|jj�||j|<|jj�|jj�dS(N(R�R�R�tnotifyR�(R(treaderRc((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt addReaderts   cCs5|jj�|j|=|jj�|jj�dS(N(R�R�R�R�R�(R(Rc((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt delReaderzs   cCs+|jj�|jj�|jj�dS(N(R�R�R�R�(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR��s  ( RR RDR'R�R�R�R�R�(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�Ds      tListenercBs eZdZd�Zd�ZRS(s(A Listener is used by this module to listen on the multicast group to which DNS messages are sent, allowing the implementation to cache information as it arrives. It requires registration with an Engine object in order to have the read() method called when a socket is available for reading.cCs)||_|jjj||jj�dS(N(R�tengineR�Rc(R(R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�s cCs�|jjjt�\}\}}||_t|�}|j�r�|tkrg|jj|t t�q�|t kr�|jj|||�|jj|t t�q�n|jj |�dS(N( R�Rctrecvfromt_MAX_MSG_ABSOLUTERvRtR�t _MDNS_PORTt handleQueryt _MDNS_ADDRt _DNS_PORTthandleResponse(R(RvtaddrRqRQ((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR��s!     (RR RDR'R�(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR��s tReapercBs eZdZd�Zd�ZRS(sKA Reaper is used by this module to remove cache entries that have expired.cCs'tjj|�||_|j�dS(N(R�R�R'R�R�(R(R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�s cCs�x�tr�|jjd�t�dr*dSt�}xR|jjj�D]>}|j|�rF|jj||�|jjj |�qFqFWqWdS(Ni i�Ri'( R�R�R�R�RR�R�RYt updateRecordR�(R(RWRR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR��s   (RR RDR'R�(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s cBs2eZdZd�Zd�Zd�Zd�ZRS(s�Used to browse for a service of a specific type. The listener object will have its addService() and removeService() methods called when this browser discovers changes in the services availability.cCs�tjj|�||_||_||_i|_t�|_t |_ g|_ d|_ |jj |t|jtt��|j�dS(s%Creates a browser for a specific typeiN(R�R�R'R�R0tlistenertservicesRtnextTimet _BROWSER_TIMEtdelayR�tdonet addListenerRER�t _CLASS_INR�(R(R�R0R((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�s        "cs�jtkr�j�jkr�j|�}yi�j�jj�}|s_|j��n9�j�jj�=��fd�}�jj |�dSWnRt k r�|s���j�jj�<��fd�}�jj |�q�nX�j d�}|�j kr|�_ qndS(s|Callback invoked by Zeroconf when new information arrives. Updates information required by browser in the Zeroconf cache.cs�jj|�j�j�S(N(Rt removeServiceR0Rj(R�(RRR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt<lambda>�sNcs�jj|�j�j�S(N(Rt addServiceR0Rj(R�(RRR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR �siK( R0R�R/RYRRjR-R[R�R�R&RUR(R(R�RWRRtexpiredt oldrecordtcallbacktexpires((RRR(s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s$! cCsd|_|jj�dS(Ni(R R�t notifyAll(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytcancel�s cCsvxotrqd}t�}t|j�dkrV|j|krV|jj|j|�nt�dsl|j rpdSt�}|j|kr(t t �}|j t |jtt��x9|jj�D](}|j|�s�|j||�q�q�W|jj|�||j|_td|jd�|_nt|j�dkrR|jjd�}n|dk r||j�qqWdS(NiRii�ii N(R�R@RRbR�RR�R�R�R R�R�R�RER0R�R RR�RYR�tsendRtmintpop(R(teventRWR\RR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR��s*  $   (RR RDR'RRR�(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s    cBs�eZdZddddddd�Zd�Zd�Zd�Zd�Zd�Z d�Z d �Z d �Z d �Z d �Zd �Zd�Zd�Zd�Zd�Zd�ZRS(sService informationic Csz|j|�st�n||_||_||_||_||_||_|r`||_n ||_|j |�dS(s�Create a service description. type: fully qualified service type name name: fully qualified service name address: IP address as unsigned short, network byte order port: port that the service runs on weight: weight of the service priority: priority of the service properties: dictionary of properties (or a string holding the bytes for the text field) server: fully qualified name for service host (defaults to name)N( RFR$R0R/R`RqRpRoRrt setProperties( R(R0R/R`RqRpRot propertiesRr((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR' s          cCst|t�r||_g}d}x�|D]�}||}|dkrPd}nEt|t�rh|}n-t|t�r�|r�d}q�d}nd}|jdj||f��q+Wx>|D]6}dj|tj dt t |���|f�}q�W||_ n ||_ dS(s7Sets properties and text of this info from a dictionaryR�ttruetfalset=s!cN( R5tdictRR@R�R�R�R�RR�R�RbRm(R(RR�RBR.R�tsuffixtitem((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR%s(          4 c CsZ||_y&i}t|�}d}g}xL||krxt||�}|d7}|j||||!�||7}q-Wx�|D]�}|jd�}|dkr�|} d} nI|| } ||d} | dkr�d} n| dks�| r�d} n| r�|j| �dkr�| || <q�q�W||_Wn$tk rUt j �d|_nXdS(s+Sets properties and text given a text fieldiiRi����RRN( RmRbR�R�tfindR�R@RR&R�R�( R(RmRBtendR�tstrsR�R�teindexR.R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytsetText?s8             cCs|jS(s Type accessor(R0(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR=dscCsT|jdk rM|jjd|j�rM|jt|j�t|j�d S|jS(s Name accessorR�iN(R0R@R/RFRb(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytgetNamehs(%cCs|jS(sAddress accessor(R`(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt getAddressnscCs|jS(s Port accessor(Rq(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytgetPortrscCs|jS(sPriority accessor(Ro(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt getPriorityvscCs|jS(sWeight accessor(Rp(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt getWeightzscCs|jS(sProperties accessor(R(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt getProperties~scCs|jS(s Text accessor(Rm(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytgetText�scCs|jS(sServer accessor(Rr(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt getServer�scCs |dk r|j|� r|jtkrO|j|jkr|j|_qq|jtkr�|j|jkr|j|_|j|_|j |_ |j |_ |j |||j j |jtt��qq|jtkr|j|jkr|j|j�qqndS(s-Updates service information from a DNS recordN(R@RYR0R�R/RrR`R�RqRpRoRR�R�R R�R%Rm(R(R�RWRR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s    .c Cs�t�}t}||}||}d}z�|j|t|jtt��xu|jdks{|j dks{|j dkr�||kr�dS||kr�t t �}|j t|jtt��|j|jj|jtt�|�|j t|jtt��|j|jj|jtt�|�|jdk rx|j t|jtt��|j|jj|jtt�|�n|j|�||}|d}n|jt||�|�t�}qNWd}Wd|j|�X|S(suReturns true if the service could be discovered on the network, and updates this object with details discovered. iiiN(Rt_LISTENER_TIMER RER/RGR RrR@R`RmR�R�R�R�R�R�R�R�R�RR�RtremoveListener( R(R�R�RWRR�tlastRBR\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytrequest�s6   0   %%(     cCs#t|t�r|j|jkSdS(sTests equality of service namei(R5RR/(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR7�scCs|j|� S(sNon-equality test(R7(R(R6((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR8�scCs�d|jtj|j��|jf}|jdkrD|d7}n:t|j�dkri||j7}n||jd d7}|d7}|S(sString representationsservice[%s,%s:%s,R@iis...R?N(R/RcRdR'RqRmR@Rb(R(RB((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRK�s(  N(RR RDR@R'RR%R=R&R'R(R)R*R+R,R-RR1R7R8RK(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRs$  %           #  cBs�eZdZdd�Zd�Zd�Zd�Zd�Zdd�Z d�Z d �Z e d �Z d �Zd �Zd �Zd�Zd�Zd�Zd�Zd�Zeed�Zd�ZRS(s{Implementation of Zeroconf Multicast DNS Service Discovery Supports registration, unregistration, queries and browsing. cCs�dt�d<|dkr4tjtj��|_n ||_dtf|_tjtjtj �|_y<|jj tj tj d�|jj tj tj d�Wntk r�nX|jj tjtjd�|jj tjtjd�y|jj|j�Wntk rnX|jj tjtjtjt�tjd��g|_g|_i|_i|_t�|_tj�|_t|�|_ t!|�|_"t#|�|_$dS(srCreates an instance of the Zeroconf class, establishing multicast communications, listening and reaping threads.iRR�ii�s0.0.0.0N(%R�R@Rct gethostbynamet gethostnametintfR�tgrouptAF_INETt SOCK_DGRAMt setsockoptt SOL_SOCKETt SO_REUSEADDRt SO_REUSEPORTR&tSOL_IPtIP_MULTICAST_TTLtIP_MULTICAST_LOOPtbindtIP_ADD_MEMBERSHIPt inet_atonR�t listenerstbrowsersRt servicetypesR�R�R�R�R�R�R�R�RRtreaper(R(t bindaddress((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR'�s6      2     cCs|jjd�S(Ns 127.0.0.1(R4t startswith(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt isLoopback scCs|jjd�S(Ns169.254.(R4RG(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt isLinklocalscCs2|jj�|jj|d�|jj�dS(sLCalling thread waits for a given number of milliseconds or until notified.i�N(R�R�R�R�(R(R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s cCs+|jj�|jj�|jj�dS(sNotifies all waiting threadsN(R�R�RR�(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRs  i� cCs)t||�}|j||�r%|SdS(s�Returns network's service information for a particular name and type, or None if no service matches by the timeout, which defaults to 3 seconds.N(RR1R@(R(R0R/R�R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytgetServiceInfoscCs-|j|�|jjt|||��dS(s�Adds a listener for a particular service type. This object will then have its updateRecord method called when information arrives for that type.N(tremoveServiceListenerRCR�R(R(R0R((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytaddServiceListener(s cCs7x0|jD]%}|j|kr |j�~q q WdS(s<Removes a listener from the set that is currently listening.N(RCRR(R(Rtbrowser((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRK/s c Cs�|j|�||j|jj�<|jj|j�rQ|j|jcd7<nd|j|j<t�}|}d}x+|dkr�||kr�|j||�t�}qynt t t B�}|j t |jtt||j�d�|j t|jtt||j|j|j|j�d�|j t|jtt||j�d�|jr|j t|jtt||j�d�n|j|�|d7}|t7}qyWdS(s�Registers service information to the network with a default TTL of 60 seconds. Zeroconf will then respond to requests for information for that service. The name of the service may be changed if needed to make it unique on the network.iiiN(t checkServiceRR/R-RDthas_keyR0RR�R�R�t _FLAGS_AAR�RiR�R RnR�RoRpRqRrRlR�RmR`R_R�Rt_REGISTER_TIME(R(R�RMRWRR�R\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytregisterService6s,    (:( +  c Cs�yS|j|jj�=|j|jdkrE|j|jcd8<n |j|j=Wntk rfnXt�}|}d}x+|dkr�||kr�|j||�t�}qntt t B�}|j t |jt td|j�d�|j t|jttd|j|j|j|j�d�|j t|jttd|j�d�|jr�|j t|jttd|j�d�n|j|�|d7}|t7}qWdS(sUnregister a service.iiiN(RR/R-RDR0R:RR�R�R�RPR�RiR�R RnR�RoRpRqRlR�RmR`R_RrR�Rt_UNREGISTER_TIME(R(R�RWRR�R\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytunregisterServiceSs0    (:( +  c Csyt|j�dkrut�}|}d}xH|dkrq||kre|j||�t�}q-ntttB�}x�|jj�D]�}|jt |j t t d|j �d�|jt|j tt d|j|j|j|j�d�|jt|j tt d|j�d�|jr�|jt|jtt d|j�d�q�q�W|j|�|d7}|t7}q-WndS(s#Unregister all registered services.iiiN(RbRRR�R�R�RPR�R�RiR0R�R R/RnR�RoRpRqRrRlR�RmR`R_R�RRS(R(RWRR�R\R�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pytunregisterAllServicesos&   (:( /  cCs�t�}|}d}xg|dkr~x�|jj|j�D]�}|jtkr:|j|� r:|j|jkr:|jjd�dkr�|jd|j d|j d|j|_|j |�dSt �q:q:W||kr|j ||�t�}qntttB�}||_|jt|jtt��|jt|jttt|j��|j|�|d7}|t7}qWdS( shChecks the network for a unique service name, modifying the ServiceInfo passed in if it is not unique.iiR�s.[t:s].Ni(RR�R�R0R�RYRjR/R!R`RqRNR!R�R�R�RPtdebugR�RER R�Rit_DNS_TTLRt _CHECK_TIME(R(R�RWRR�RRR\((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRN�s, 1-     %  cCs�t�}|jj|�|dk r}xU|jj|j�D];}|j|�r;|j|� r;|j |||�q;q;Wn|j �dS(s�Adds a listener for a given question. The listener will have its updateRecord method called when information is available to answer the question.N( RRBR�R@R�R�R/RIRYRR(R(RRJRWRR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR �s  cCs6y|jj|�|j�Wntk r1nXdS(sRemoves a listener.N(RBR�RR&(R(R((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR/�s  cCs5x$|jD]}|j|||�q W|j�dS(sHUsed to notify listeners of new information that has updated a record.N(RBRR(R(RWRHR((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�scCs�t�}x�|jD]�}|j|�}||jj�kr�|rV|jj|�q�|jj|�}|dk r�|j|�|}q�n|jj |�|j ||�qWdS(sfDeal with incoming response packets. All answers are held in the cache, and listeners are notified.N( RRORYR�R�R�R�R@R[R�R(R(RQRWRRRR�((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s    cCsad}|tkrItttBd�}x!|jD]}|j|�q/Wnx�|jD]�}|jtkrN|j dkr�x[|j j �D]G}|dkr�tttB�}n|j |t dttt|��q�WnxJ|jj�D]b}|j |jkr�|dkrtttB�}n|j |t |jttt|j ��q�q�WqSy�|dkrptttB�}n|jtks�|jtkr�xa|jj�D]M}|j|j j�kr�|j |t|j tttBt|j��q�q�Wn|jj|j j�d�}|swSn|jtks:|jtkr{|j |t|j tttBt|j|j|j|j��n|jtks�|jtkr�|j |t |j tttBt|j!��n|jtkr|j"t|jtttBt|j��nWqSt#k r!t$j%�qSXqSW|dk r]|j&r]|j'|_'|j(|||�ndS(sEDeal with incoming query packets. Provides a response if possible.is_services._dns-sd._udp.local.N()R@R�R�R�RPRwR�R0R�R/RDR�R�RiR RXRR�R�RGRrR-R_R3R`R�R�RnRoRpRqR�RlRmR�R&R�R�ROR�R(R(RQRRqR\RJtstypetservice((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR��sL  ) 2 6A/0  cCs>y&|jj|j�d||f�Wntk r9nXdS(sSends an outgoing packet.iN(RctsendtoR�R&(R(R\RRq((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyRs& cCs�t�ddkr�dt�d<|j�|jj�|j�|jjtjtjtj t �tj d��|jj �ndS(sXEnds the background threads, and prevent this instance from servicing further queries.Riis0.0.0.0N( R�RR�R�RURcR8R<tIP_DROP_MEMBERSHIPRAR�tclose(R(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR^ s    2N(RR RDR@R'RHRIR�RRJRLRKRXRRRTRURNR R/RRR�R�R�RR^(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyR�s( /              3 t__main__s3Multicast DNS Service Discovery for Python, versions'1. Testing registration of a service...s0.10tversions test values another valuetbs_http._tcp.local.s!My Service Name._http._tcp.local.s 127.0.0.1i�s Registering service...s Registration done.s*2. Testing query of service information...s Getting ZOE service:sZOE._http._tcp.local.s Query done.s"3. Testing query of own service...s Getting self:s/4. Testing unregister of service information...s Unregister done.(eRDt __author__t __email__t __version__R,RRRcR�R�R�t__all__R�RSRYRQR.RR�R�R�RXt_MAX_MSG_TYPICALR�R�R�R�RPt _FLAGS_TCt _FLAGS_RDt _FLAGS_RAt_FLAGS_Zt _FLAGS_ADt _FLAGS_CDR t _CLASS_CSt _CLASS_CHt _CLASS_HSt _CLASS_NONEt _CLASS_ANYR1R3R�t_TYPE_NSt_TYPE_MDt_TYPE_MFR�t _TYPE_SOAt_TYPE_MBt_TYPE_MGt_TYPE_MRt _TYPE_NULLt _TYPE_WKSR�R�t _TYPE_MINFOt_TYPE_MXR�R�R�RGR9R<RR&RR!R"R#R$R%R*tobjectR+RERLR_ReRiRlRnRtR�R�R�R�R�RRRRRtrtdescRAR�RRR�RJRTR^(((s=/usr/lib64/python2.7/site-packages/hgext/zeroconf/Zeroconf.pyt<module>s6              0=��5AO��A   '