ó
    cÛ–iCS ã            
       ó”  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJ	r	  S SK
JrJrJrJr  S SKJr  S SKJr  S SKJr  S SKrS SKJr  S SKJr  S S	KJrJrJr  S S
KJr  S SKJr  S SKJ r   S SKJ!r!  S SK"J#r#  S SK$r$S SK%J&r&J'r'J(r(  S SK)J*r*  S SK+J,r,J-r-J.r.J/r/  S SK0J1r1  S SK2J3r3  S SK2J4r4  S SK5J6r6  S SK7J8r8  S SK9r9Sr:Sr;Sr<Sr=SSSSSSSSSS.	r>SSSSSSSSS.r?1 Skr@SrAS\A-  rBSrCS rD\8" \ES 9rFS! rGS" rHS# rI " S$ S%\J5      rK " S& S'\L5      rMS( rNS) rO " S* S+\L5      rP " S, S-\L5      rQ " S. S/\L5      rR " S0 S1\R5      rSGSS2 jrTS3 rUS4 rVS5 rW " S6 S7\L5      rXGSS8 jrY0 S9S:_S;S<_S=S<_S>S<_S?S<_S@S<_SAS:_SBS<_SCS<_SDS<_SES<_SFS<_SGS:_SHS:_SIS<_SJS:_rZ0 SKSL_SMSN_SOSP_SQSR_SSST_SUSV_SWSX_SYSZ_S[S\_S]S^_S_S`_SaSb_ScSd_SeSf_SgSh_SiSj_SkSl_0 SmSn_SoSp_SqSr_SsSt_SuSv_SwSx_SySz_S{S|_S}S~_SS€_S�S‚_SƒS„_S…S†_S‡SX_SˆS‰_SŠSZ_S‹SŒ_E0 S�SŽ_S�S�_S‘S’_S“S”_S•S–_S—S˜_S™Sš_S›Sl_SœSn_S�Sž_SŸS _S¡S¢_S£S¤_S¥S¦_S§S¨_S©Sª_S«S¬_E0 S­S®_S¯S°_S±S²_S³S´_SµS¶_S·S¸_S¹Sº_S»S¼_S½S¾_S¿SÀ_SÁSÂ_SÃSÄ_SÅSÆ_SÇSÈ_SÉSÊ_SËSÌ_SÍSÎ_E0 SÏSÐ_SÑSÒ_SÓSÔ_SÕSÖ_S×SØ_SÙSÚ_SÛSÜ_SÝSÞ_SßSà_SáSâ_SãSä_SåSæ_SçSè_SéSê_SëSì_SíSî_SïSð_ESñSòS¸SóSôSõSöS÷Sø.Er[Sù r\Sú r]GSSû jr^GSSü jr_         GSSý jr`Sþ raSÿ rbGS  rc\" GSGS5      rdGS re GSGS jrfGS rgGS rhGS riGSGS jrjGS	 rkGSGS
 jrl GSGS jrmGS rnGS roGS rp GSGS jrq " GS GS\L5      rrGS rsGS rtGS ruGS rvGS rwGS rxg(  é    N)ÚECHILDÚESRCH)ÚOrderedDictÚCounterÚdefaultdictÚ
namedtuple)Úquery)Útraffic_packets)ÚSamDB)ÚLdbError)ÚClientConnection)ÚsecurityÚdrsuapiÚlsa)Únetlogon)Únetr_Authenticator)Úsrvsvc)Úsamr)Ú
drs_DsBind)ÚCredentialsÚDONT_USE_KERBEROSÚMUST_USE_KERBEROS)Úsystem_session)ÚUF_NORMAL_ACCOUNTÚUF_SERVER_TRUST_ACCOUNTÚUF_TRUSTED_FOR_DELEGATIONÚUF_WORKSTATION_TRUST_ACCOUNT)ÚSEC_CHAN_BDC)Úgensec)Úsd_utils)Ú
get_string)Úget_samba_loggeré   ga2U0*©3?Ú-ç      ð?)	©ÚdnsÚ0©ÚsmbÚ0x72©Úldapr(   ©r-   Ú3©r-   Ú2©Úcldapr/   ©ÚdcerpcÚ11©r5   Ú14©Únbnsr(   )©r'   Ú1©r-   r<   ©r-   Ú4©r-   Ú5©r3   rA   ©r5   Ú12©r5   Ú13©r5   Ú15>   r*   Úsmb2ÚbrowserÚsmb_netlogong      $@)iöÿÿÿéýÿÿÿ)Únamec                 ó¢   • U [         ::  aE  U(       d  [        U[        R                  S9  g[        U[	        U5      -  [        R                  S9  gg)a}  Print a formatted debug message to standard error.


:param level: The debug level, message will be printed if it is <= the
              currently set debug level. The debug level can be set with
              the -d option.
:param msg:   The message to be logged, can contain C-Style format
              specifiers
:param args:  The parameters required by the format specifiers
©ÚfileN)ÚDEBUG_LEVELÚprintÚsysÚstderrÚtuple)ÚlevelÚmsgÚargss      Ú7/usr/lib/python3/dist-packages/samba/emulate/traffic.pyÚdebugrZ   e   s9   € ð ”ÓÞÜ�#œCŸJ™JÓ'ä�#œ˜d›Ñ#¬#¯*©*Ó5ð	 ó    c                  ó4  • [         R                  " SS9n[        SUS   S   < SUS   S   < S3S[        R                  S9  U  H  n[        U[        R                  S	9  M     [        [        R                  S	9  [        R                  R                  5         g
)zKPrint an unformatted log message to stderr, containing the line number
    r#   )ÚlimitÚ r   z	:[01;33mé   z [00m)ÚendrP   rO   N)Ú	tracebackÚextract_stackrR   rS   rT   Úflush)rX   ÚtbÚas      rY   Údebug_linenorf   w   sv   € ô 
×	 Ò	  qÑ	)€BÝ	Ø! !™u Qœx¨¨A©¨q¬ð3Ø9<Ü�z‰zòó ˆÜˆa”c—j‘jÔ!ñ ä	Œs�z‰zÒÜ‡J�J×ÑÕr[   c                 ón   ^• U (       a)  SnU  H  nUS-  nX-  nUS-  nM     SSU-   -  mU4S jnU$ S nU$ )zƒReturn a function that prints a coloured line to stderr. The colour
of the line depends on a sort of hash of the integer arguments.éÖ   é   z
[38;5;%dmé   c                  ól   >• [         S:”  a)  U  H"  n[        T< U< S3[        R                  S9  M$     g g )Nr   z[00mrO   ©rQ   rR   rS   rT   )rX   re   Úprefixs     €rY   ÚpÚrandom_colour_print.<locals>.p�   s,   ø€ Ü˜Q‹Û�AÜªF³AÐ6¼S¿Z¹ZÔHò ð r[   c                  ó\   • [         S:”  a"  U  H  n[        U[        R                  S9  M     g g )Nr   rO   rl   )rX   re   s     rY   rn   ro   ”   s&   € Ü˜Q‹Û�AÜ˜!¤#§*¡*Ô-ò ð r[   © )ÚseedsÚsÚxrn   rm   s       @rY   Úrandom_colour_printru   „   sY   ø€ ö ØˆÛˆAØ�‰GˆAØ‰FˆAØ�‰HŠAñ ð ! B¨¡FÑ+ˆõ	Ið €Hò	.ð
 €Hr[   c                   ó   • \ rS rSrSrg)ÚFakePacketErroréœ   rq   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__rq   r[   rY   rw   rw   œ   s   † Úr[   rw   c                   óp   • \ rS rSrSrSrS r\S 5       rSS jr	S r
S rS	 rS
 rS rS rS rSS jrSrg)ÚPacketé    zDetails of a network packet©
Ú	timestampÚip_protocolÚstream_numberÚsrcÚdestÚprotocolÚopcodeÚdescÚextraÚ	endpointsc
                 ó  • Xl         X l        X0l        X@l        XPl        X`l        Xpl        X€l        X�l        U R                  U R                  :  a  U R                  U R                  4U l	        g U R                  U R                  4U l	        g ©Nr�   )
Úselfr‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   s
             rY   Ú__init__ÚPacket.__init__¬   si   € à"ŒØ&ÔØ*ÔØŒØŒ	Ø ŒØŒØŒ	ØŒ
Ø�8‰8�d—i‘iÓØ"Ÿh™h¨¯	©	Ð2ˆD�Nà"Ÿi™i¨¯©Ð2ˆD�Nr[   c                 óÂ   • UR                  S5      R                  S5      nUS S u  nnnnnnn	n
USS  n[        U5      n[        U5      n[        U5      nU " X4XVUX‰X«5	      $ )NÚ
Ú	é   )ÚrstripÚsplitÚfloatÚint)ÚclsÚlineÚfieldsr‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   s               rY   Ú	from_lineÚPacket.from_line¼   s�   € à—‘˜TÓ"×(Ñ(¨Ó.ˆð ˜˜�ñ	ˆØ	Ø	Ø	Ø	Ø	Ø	Ø	Ø�q�r�
ˆä˜)Ó$ˆ	Ü�#‹hˆÜ�4‹yˆá�9¨=¸tØ Tó2ð 	2r[   c                 ó  • SR                  U R                  5      nU R                  U-   nUSUU R                  U R                  =(       d    SU R
                  U R                  U R                  U R                  U R                  U4	-  4$ )z5Format the packet as a traffic_summary line.
        r“   z%f	%s	%s	%d	%d	%s	%s	%s	%sÚ )
ÚjoinrŠ   r‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   )rŽ   Útime_offsetrŠ   Úts       rY   Ú
as_summaryÚPacket.as_summaryÐ   s~   € ð —	‘	˜$Ÿ*™*Ó%ˆØ�N‰N˜[Ñ(ˆØÐ7ØØ×!Ñ!Ø×#Ñ#×) rØ—‘Ø—‘Ø—‘Ø—‘Ø—‘Øðñ	ð 	ð 		r[   c                 ó:  • SU R                   U R                  U R                  U R                  =(       d    SU R                  U R
                  U R                  U R                  U R                  (       a$  SSR                  U R                  5      -   S-   4	-  $ S4	-  $ )Nz:%.3f: %d -> %d; ip %s; strm %s; prot %s; op %s; desc %s %sr$   ô   Â«r^   ô   Â»rŸ   )
r‚   r…   r†   rƒ   r„   r‡   rˆ   r‰   rŠ   r    ©rŽ   s    rY   Ú__str__ÚPacket.__str__à   s‹   € ØLØ—‘ §¡¨4¯9©9°d×6FÑ6F×6MÈ#Ø×#Ñ# T§]¡]°D·K±KÀÇÁØ8<¿
¿
�$˜Ÿ™ $§*¡*Ó-Ñ-°Ñ4ðMñMð 	Nð IKðMñMð 	Nr[   c                 ó   • SU -  $ )Nz<Packet @%s>rq   r¨   s    rY   Ú__repr__ÚPacket.__repr__æ   s   € Ø Ñ$Ð$r[   c                 óè   • U R                  U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  5	      $ r�   )
Ú	__class__r‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   r¨   s    rY   ÚcopyÚPacket.copyé   sU   € Ø�~‰~˜dŸn™nØ"×.Ñ.Ø"×0Ñ0Ø"Ÿh™hØ"Ÿi™iØ"Ÿm™mØ"Ÿk™kØ"Ÿi™iØ"Ÿj™jó*ð 	*r[   c                 ó@   • U R                   < SU R                  < 3nU$ )NÚ:©r‡   rˆ   )rŽ   r¢   s     rY   Úas_packet_typeÚPacket.as_packet_typeô   s   € Ø—}”} d§k£kÐ2ˆØˆr[   c                 ó‚   • U R                   U R                  4nU[        ;   a	  [        U   $ U[        ;   a
  [        U   * $ g)z†A positive number means we think it is a client; a negative number
means we think it is a server. Zero means no idea. range: -1 to 1.
ç        )r‡   rˆ   ÚCLIENT_CLUESÚSERVER_CLUES)rŽ   Úkeys     rY   Úclient_scoreÚPacket.client_scoreø   sB   € ð �}‰}˜dŸk™kÐ*ˆØ”,ÓÜ Ñ$Ð$Ø”,ÓÜ  Ñ%Ð%Ð%Ør[   c           
      óÜ  • SU R                   < SU R                  < 3n [        [        U5      nU R                   S:w  a  [        SSUR                  < S	U< 35        [        R                  " 5       n U" XU5      (       aJ  [        R                  " 5       nXv-
  n[        S
XqR                  U R                   U R                  U4-  5        gg! [         a4  n[        SUR                  < SU< 3[        R                  S9   SnAgSnAff = f! [         aS  n[        R                  " 5       nXv-
  n[        SXqR                  U R                   U R                  X…4-  5         SnAgSnAff = f)zÙSend the packet over the network, if required.

Some packets are ignored, i.e. for  protocols not handled,
server response messages, or messages that are generated by the
protocol layer associated with other packets.
Úpacket_Ú_zConversation(z) Missing handler rO   NÚkerberosr#   z) Calling handler z%f	%s	%s	%s	%f	True	z%f	%s	%s	%s	%f	False	%s)r‡   rˆ   Úgetattrr
   ÚAttributeErrorrR   Úconversation_idrS   rT   rZ   ÚtimeÚ	Exception)	rŽ   ÚconversationÚcontextÚfn_nameÚfnÚeÚstartr`   Údurations	            rY   ÚplayÚPacket.play  s?  � ð %)§M¤M°4·;³;Ð?ˆð	Üœ¨'Ó2ˆBð �=‰=˜JÓ&Ü‘!Ø"×2Ô2²Gð=ô >ô —	’	“ˆð	.Ù�$ g×.Ñ.ô —i’i“k�Ø™;�ÜÐ2Ø×8Ñ8¸$¿-¹-Ø—{‘{ Hð.ñ.õ /ð /øô ó 	ÝØ×/Ô/²ð:ä—z‘zò#ô ûð		ûô, ó 	.Ü—)’)“+ˆCØ‘{ˆHÜÐ1Ø×4Ñ4°d·m±mØ—;‘; ð-ñ-÷ .ñ .ûð	.ús1    C Á4AD Ã
DÃ*DÄDÄ
E+ÄA	E&Å&E+c                 ó4   • U R                   UR                   -
  $ r�   ©r‚   ©rŽ   Úothers     rY   Ú__cmp__ÚPacket.__cmp__+  s   € Ø�~‰~ §¡Ñ/Ð/r[   Nc                 óB   • [        U R                  U R                  5      $ r�   )Úis_a_real_packetr‡   rˆ   )rŽ   Úmissing_packet_statss     rY   Úis_really_a_packetÚPacket.is_really_a_packet.  s   € Ü §¡¨t¯{©{Ó;Ð;r[   )
r‰   r†   r‹   rŠ   rƒ   rˆ   r‡   r…   r„   r‚   )r¸   r�   )ry   rz   r{   r|   Ú__doc__Ú	__slots__r�   Úclassmethodrœ   r£   r©   r¬   r°   rµ   r¼   rÎ   rÔ   rÙ   r}   rq   r[   rY   r   r       sT   † Ù%ð	€Iò3ð  ñ2ó ð2ô&ò Nò%ò	*òò	ò&.òP0÷<r[   r   c                 óä   • U [         ;   a  gU S:X  a  US:X  a  gSU < SU< 3n[        [        US5      nUc&  [        R	                  SU-  [
        R                  S9  gU[        R                  L a  gg	)
z\Is the packet one that can be ignored?

If so removing it will have no effect on the replay
Fr-   rŸ   r¿   rÀ   Nzmissing packet %srO   T)ÚSKIPPED_PROTOCOLSrÂ   r
   ÚLOGGERrZ   rS   rT   Únull_packet)r‡   rˆ   rÉ   rÊ   s       rY   r×   r×   2  sp   € ð
 Ô$Ó$àØ�6Ó˜f¨›làøã (ª&Ð1€GÜ	” '¨4Ó	0€BØ	�zÜ�‰Ð(¨7Ñ2¼¿¹ˆÑDØØ	Œ_×(Ñ(Ò(ØØr[   c                 ó6   • U S:X  a  gX4S;   a  g[        X5      $ )zÐReturn true if a packet generates traffic in its own right. Some of
these will generate traffic in certain contexts (e.g. ldap unbind
after a bind) but not if the conversation consists only of these packets.
ÚwaitF)©rÁ   rŸ   r0   rG   ©r5   Ú16)r×   r´   s     rY   Úis_a_traffic_generating_packetrç   H  s/   € ð
 �6ÓØàÐð ó ð
 ä˜HÓ-Ð-r[   c                   óú   • \ rS rSrSrSSSSSSSSSS\R                  R                  S5      SS4S jrS r	S r
S rS	 rS
 rS rSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrS rS rS rS rSrg)ÚReplayContextiZ  a7  State/Context for a conversation between an simulated client and a
server. Some of the context is shared amongst all conversations
and should be generated before the fork, while other context is
specific to a particular conversation and should be generated
*after* the fork, in generate_process_local_config().
NÚDOMAINc                 óš  • Xl         S U l        X0l        X l        U(       a  [        U l        O[        U l        X�l        X l        X°l	        X€l
        Xpl        XÀl        UR                  S5      U l        XÐl        XPl        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        X@l        U R5                  5         g )NÚrealmF)ÚserverÚnetlogon_connectionÚcredsÚlpr   Úkerberos_stater   ÚouÚbase_dnÚdomainÚstatsdirÚglobal_tempdirÚ
domain_sidÚgetrì   Úinstance_idÚbadpassword_frequencyÚlast_lsarpc_badÚlast_lsarpc_named_badÚlast_simple_bind_badÚlast_bind_badÚlast_srvsvc_badÚlast_drsuapi_badÚlast_netlogon_badÚlast_samlogon_badÚtotal_conversationsÚgenerate_ldap_search_tables)rŽ   rí   rð   rï   r  rú   Úprefer_kerberosÚtempdirrõ   rò   ró   rô   r÷   rù   s                 rY   r�   ÚReplayContext.__init__a  s¼   € ð )/ŒØ(,ˆÔ Ø(-Œ
Ø(*ŒÞÜ"3ˆDÕä"3ˆDÔØ(*ŒØ(/ŒØ(.ŒØ(0ŒØ(/ÔØ(2ŒØ(*¯©¨w«ˆŒ
Ø(3Ôð )>Ô"Ø(-ˆÔØ(-ˆÔ"Ø(-ˆÔ!Ø(-ˆÔØ(-ˆÔØ(-ˆÔØ(-ˆÔØ(-ˆÔØ(;Ô Ø×(Ñ(Õ*r[   c                 ór  • [        5       n[        SU R                  -  UU R                  U R                  S9nUR                  UR                  5       [        R                  S/S/S9n0 nS/ 0nU Hœ  n[        UR                  5      nSR                  S UR                  S5       5       5      R                  5       nUR                  U/ 5      n	U	R                  U5        UR!                  S	5      (       d  Mˆ  US   R                  U5        Mž     [#        UR%                  5       5       Hu  n
U
S
S  S:w  a  M  U
S S
 nUS
S  S:X  a  US S
 nUS
S  S:X  a  M  ['        S5       H:  nUS-  nXº:w  a'  X´;   a"  [)        SU
< SU< 3[*        R,                  S9  M4  XJ   XK'   M<     Mw     X@l        XPl        0 U l        UR                  UR                  5       [        R                  S/SS9nSR                  S U 5       5      nSR5                  U5      U R2                  S'   SnS H%  nUSR5                  XòR                  5       5      -  nM'     SR5                  U5      U R2                  S'   SU R2                  S'   UR                  S[        R6                  S/S9nSR5                  US   S   5      U R2                  S'   g ) Nú	ldap://%s)ÚurlÚsession_infoÚcredentialsrð   zpaged_results:1:1000Údn)ÚscopeÚcontrolsÚattrsÚinvocationIdÚ,c              3   óF   #   • U  H  oR                  5       S S v •  M     g 7f)Nr#   )Úlstrip©Ú.0rt   s     rY   Ú	<genexpr>Ú<ReplayContext.generate_ldap_search_tables.<locals>.<genexpr>£  s   é € ÐE²}°!Ÿx™x›z¨"¨1�~²}ùs   ‚!zCN=NTDS Settings,rL   z,DCé   zdn_map collision r^   rO   z"(objectclass=groupPolicyContainer))r  r  Ú
expressionrŸ   c              3   óJ   #   • U  H  nS R                  US   5      v •  M     g7f)z(distinguishedName={0})r  N)Úformat)r  rW   s     rY   r  r  Ç  s%   é € ÐXÒTWÈSÐ6×=Ñ=¸cÀ$¹i×HÐHÒTWùs   ‚!#z(|{0})ÚgPCFileSysPath)zDomain Controllers,ztraffic_replay,rŸ   z(distinguishedName={0}{1})ÚgpLinkz'(objectCategory=pKICertificateTemplate)ÚpKIExtendedKeyUsageÚhighestCommittedUSN)r  r  z(usnChanged>={0})r   Ú
usnChanged)r   r   rí   rï   rð   ÚsearchÚ	domain_dnÚldbÚSCOPE_SUBTREEÚstrr  r    r–   ÚupperÚ
setdefaultÚappendÚ
startswithÚlistÚkeysÚrangerR   rS   rT   Údn_mapÚattribute_clue_mapÚsearch_filtersr  Ú
SCOPE_BASE)rŽ   ÚsessionÚdbÚresr.  r/  Úrr  Úpatternr'   Úkrn   ÚiÚ
gpos_by_dnÚou_strrò   s                   rY   r  Ú)ReplayContext.generate_ldap_search_tables�  s¦  € Ü Ó"ˆä�{ T§[¡[Ñ0Ø 'Ø#Ÿz™zØ—g‘gñˆð
 �i‰i˜Ÿ™›Ü!×/Ñ/Ø"8Ð!9Ø#˜fð ð &ˆð ˆà˜Bð
Ðó ˆAÜ�Q—T‘T“ˆBØ—h‘hÑE°r·x±xÀ´}ÓEÓE×KÑKÓMˆGØ×#Ñ# G¨RÓ0ˆCØ�J‰J�rŒNØ�}‰}Ð0×1Ó1Ø" >Ñ2×9Ñ9¸"Ö=ñ ô �f—k‘k“mÖ$ˆAØ��ˆv˜‹ÙØ�#�2�ˆAØ�B�C�&˜E“/Ø�c�r�F�ð �B�C�&˜E•/ä˜1–X�Ø�U‘
�Ø“6˜a›kÝ³aºÐ;Ü"Ÿz™zò+áØ"™I�“	ó ñ %ð ŒØ"4Ôð
 !ˆÔð �i‰i˜Ÿ™›¬c×.?Ñ.?ÈÀvØ#Gð ð Iˆà—W‘WÑXÑTWÓXÓXˆ
ð 19·±À
Ó0Kˆ×ÑÐ,Ñ-ð ˆÛ@ˆBØÐ2×9Ñ9¸"¿l¹l»nÓMÑMŠFñ Aà(0¯©¸Ó(?ˆ×Ñ˜HÑ%ð
 6ð 	×ÑÐ1Ñ2ð
 �i‰i˜¤#§.¡.Ð9NÐ8OˆiÐPˆà×&Ñ& s¨1¡vÐ.CÑ'DÓEð 	×Ñ˜LÒ)r[   c                 óø   • U R                   R                  5        H  nXA;   d  M
  U R                   U   s  $    US:X  a=  [        R                  " 5       U R                  -  n[	        U R
                  U5      nSU-  $ g)NzDC,DCz((&(sAMAccountName=%s)(objectClass=user))z(objectClass=*))r0  r,  Úrandomr  Ú	user_namerù   )rŽ   r  Údn_sigr  r»   Úrandom_user_idÚaccount_names          rY   Úguess_search_filterÚ!ReplayContext.guess_search_filterä  su   € ð ×&Ñ&×+Ñ+Ö-ˆCØ�|Ø×*Ñ*¨3Ñ/Ò/ñ .ð �WÓÜ#Ÿ]š]›_¨t×/GÑ/GÑGˆNÜ$ T×%5Ñ%5°~ÓFˆLØ=ÀÑLÐLð !r[   c                 ó4  • / U l         / U l        / U l        / U l        / U l        / U l        / U l        UR                  U l        UR                  U l        UR                  U l	        UR                  U l
        [        U R                  SUR                  -  5      U l        U R                  R!                  SU R                  5        U R                  R!                  SU R                  5        U R                  R!                  SU R                  5        U R                  R!                  SS5        SU l        SU R                  < S	U R$                  < 3U l        SU R                  < S	U R$                  < 3U l        U R+                  5         U R-                  5         g )
Nzconversation-%dzprivate dirzlock dirzstate directoryztls verify peerÚno_checkz/root/ncalrpc_as_systemúcn=r  )Úldap_connectionsÚdcerpc_connectionsÚlsarpc_connectionsÚlsarpc_connections_namedÚdrsuapi_connectionsÚsrvsvc_connectionsÚsamr_contextsÚnetbios_nameÚmachinepassÚusernameÚuserpassÚmk_masked_dirrö   rÄ   r  rð   ÚsetÚremoteAddressrò   Úsamlogon_dnÚuser_dnÚgenerate_machine_credsÚgenerate_user_creds)rŽ   ÚaccountrÇ   s      rY   Úgenerate_process_local_configÚ+ReplayContext.generate_process_local_configö  sB  € Ø(*ˆÔØ(*ˆÔØ(*ˆÔØ(*ˆÔ%Ø(*ˆÔ Ø(*ˆÔØ(*ˆÔØ(/×(<Ñ(<ˆÔØ(/×(;Ñ(;ˆÔØ(/×(8Ñ(8ˆŒØ(/×(8Ñ(8ˆŒä$ T×%8Ñ%8Ø%6Ø%1×%AÑ%Añ&BóCˆŒð 	�‰�‰�M 4§<¡<Ô0Ø�‰�‰�J §¡Ô-Ø�‰�‰Ð% t§|¡|Ô4Ø�‰�‰Ð% zÔ2à6ˆÕà#×0Ô0°$·'³'ð;ˆÕð  $Ÿ}œ}¨d¯g«gð7ˆŒð 	×#Ñ#Ô%Ø× Ñ Õ"r[   c                 óÊ   • U(       dB  U R                   (       a/  [        R                  " 5       U R                   :  a   U" U5        SnOSnU" U5      nXT4$ ! [         a     Nf = f)a¹  Execute the supplied logon function, randomly choosing the
bad credentials.

Based on the frequency in badpassword_frequency randomly perform the
function with the supplied bad credentials.
If run with bad credentials, the function is re-run with the good
credentials.
failed_last_time is used to prevent consecutive bad credential
attempts. So the over all bad credential frequency will be lower
than that requested, but not significantly.
TF)rú   r=  rÆ   )rŽ   ÚfÚgoodÚbadÚfailed_last_timeÚresults         rY   Úwith_random_bad_credentialsÚ)ReplayContext.with_random_bad_credentials  sf   € ö  Ø×*×*Ü—’“ $×"<Ñ"<Ó<ðÙ�c”Fð
 $(Ñ à#(Ð á�4“ˆØÐ)Ð)øô !ó ñ ðús   ½A Á
A"Á!A"c                 ó>  • [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  U R                  5        U R                  R                  U R                  5        U R                  R                  U R                  5        U R                  R                  U R                  5        [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  U R                  SS 5        U R                  R                  U R                  5        U R                  R                  U R                  5        [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  U R                  5        U R                  R                  U R                  5        U R                  R!                  U R                  R#                  5       [$        R&                  -  5        U R                  R                  U R                  5        U R                  R)                  U R*                  5        [        5       U l        U R,                  R                  U R                  5        U R,                  R	                  U R
                  5        U R,                  R                  U R                  SS 5        U R,                  R                  U R                  5        U R,                  R!                  U R,                  R#                  5       [$        R&                  -  5        U R,                  R                  U R                  5        U R,                  R)                  U R*                  5        g)a  Generate the conversation specific user Credentials.

Each Conversation has an associated user account used to simulate
any non Administrative user traffic.

Generates user credentials with good and bad passwords and ldap
simple bind credentials with good and bad passwords.
Néüÿÿÿ)r   Ú
user_credsÚguessrð   Úset_workstationrN  Úset_passwordrQ  Úset_usernamerP  Ú
set_domainrô   Úset_kerberos_staterñ   Úuser_creds_badÚsimple_bind_credsÚset_gensec_featuresÚget_gensec_featuresr   ÚFEATURE_SEALÚset_bind_dnrV  Úsimple_bind_creds_badr¨   s    rY   rX  Ú!ReplayContext.generate_user_creds1  sÏ  € ô &›-ˆŒØ�‰×Ñ˜dŸg™gÔ&Ø�‰×'Ñ'¨×(9Ñ(9Ô:Ø�‰×$Ñ$ T§]¡]Ô3Ø�‰×$Ñ$ T§]¡]Ô3Ø�‰×"Ñ" 4§;¡;Ô/Ø�‰×*Ñ*¨4×+>Ñ+>Ô?ä)›mˆÔØ×Ñ×!Ñ! $§'¡'Ô*Ø×Ñ×+Ñ+¨D×,=Ñ,=Ô>Ø×Ñ×(Ñ(¨¯©°s¸Ð);Ô<Ø×Ñ×(Ñ(¨¯©Ô7Ø×Ñ×.Ñ.¨t×/BÑ/BÔCô "-£ˆÔØ×Ñ×$Ñ$ T§W¡WÔ-Ø×Ñ×.Ñ.¨t×/@Ñ/@ÔAØ×Ñ×+Ñ+¨D¯M©MÔ:Ø×Ñ×+Ñ+¨D¯M©MÔ:Ø×Ñ×2Ñ2Ø×"Ñ"×6Ñ6Ó8¼6×;NÑ;NÑNô	Pà×Ñ×1Ñ1°$×2EÑ2EÔFØ×Ñ×*Ñ*¨4¯<©<Ô8ä%0£]ˆÔ"Ø×"Ñ"×(Ñ(¨¯©Ô1Ø×"Ñ"×2Ñ2°4×3DÑ3DÔEØ×"Ñ"×/Ñ/°·±¸c¸rÐ0BÔCØ×"Ñ"×/Ñ/°·±Ô>Ø×"Ñ"×6Ñ6Ø×&Ñ&×:Ñ:Ó<Ü×Ññ ô	!ð 	×"Ñ"×5Ñ5°d×6IÑ6IÔJØ×"Ñ"×.Ñ.¨t¯|©|Õ<r[   c                 óü  • [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  [        5        U R                  R                  U R                  5        U R                  R                  U R
                  S-   5        U R                  R                  U R                  5        U R                  R                  U R                  5        [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  [        5        U R                  R                  U R                  SS 5        U R                  R                  U R
                  S-   5        U R                  R                  U R                  5        g)zªGenerate the conversation specific machine Credentials.

Each Conversation has an associated machine account.

Generates machine credentials with good and bad passwords.
Ú$Nre  )r   Úmachine_credsrg  rð   rh  rN  Úset_secure_channel_typer   ri  rO  rj  rk  rô   rl  rñ   Úmachine_creds_badr¨   s    rY   rW  Ú$ReplayContext.generate_machine_creds_  si  € ô )›]ˆÔØ×Ñ× Ñ  §¡Ô)Ø×Ñ×*Ñ*¨4×+<Ñ+<Ô=Ø×Ñ×2Ñ2´<Ô@Ø×Ñ×'Ñ'¨×(8Ñ(8Ô9Ø×Ñ×'Ñ'¨×(9Ñ(9¸CÑ(?Ô@Ø×Ñ×%Ñ% d§k¡kÔ2Ø×Ñ×-Ñ-¨d×.AÑ.AÔBä!,£ˆÔØ×Ñ×$Ñ$ T§W¡WÔ-Ø×Ñ×.Ñ.¨t×/@Ñ/@ÔAØ×Ñ×6Ñ6´|ÔDØ×Ñ×+Ñ+¨D×,<Ñ,<¸S¸bÐ,AÔBØ×Ñ×+Ñ+¨D×,=Ñ,=ÀÑ,CÔDØ×Ñ×1Ñ1°$×2EÑ2EÕFr[   c                 ó8  • U R                   R                  U5      nU(       a  [        R                  " U5      $ UR	                  5       nU(       a@  XR
                  ;   a#  [        R                  " U R
                  U   5      $ USS  nU(       a  M@  U R                  $ )Né   )r/  rø   r=  Úchoicer'  r.  ró   )rŽ   r6  Ú
attributesÚ	attr_clues       rY   Úget_matching_dnÚReplayContext.get_matching_dnx  sz   € ð ×+Ñ+×/Ñ/°
Ó;ˆ	ÞÜ—=’= Ó+Ð+à—-‘-“/ˆÞØŸ+™+Ó%Ü—}’} T§[¡[°Ñ%9Ó:Ð:à˜a˜b�kˆG÷	 ˆgð �|‰|Ðr[   c                 óÚ   • SnU R                   (       a  U(       d  U R                   S   $ [        SU R                  -  US4U R                  5      nU R                   R	                  U5        U$ )Nz$12345678-1234-abcd-ef00-01234567cffbéÿÿÿÿzncacn_ip_tcp:%sr_   )rH  r   rí   rð   r)  )rŽ   ÚnewÚguidÚcs       rY   Úget_dcerpc_connectionÚ#ReplayContext.get_dcerpc_connectionŽ  s_   € Ø5ˆØ×"×"®3Ø×*Ñ*¨2Ñ.Ð.ÜÐ.°·±Ñ<Ø" A˜Y¨¯©ó1ˆà×Ñ×&Ñ& qÔ)Øˆr[   c                 ó  ^ • T R                   (       a  U(       d  T R                   S   $ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        T R                   R                  U5        U$ )Nrƒ  c                 ób   >• [         R                   " STR                  -  TR                  U 5      $ ©Nzncacn_np:%s)r   rí   rð   ©rï   rŽ   s    €rY   ÚconnectÚ4ReplayContext.get_srvsvc_connection.<locals>.connect›  s)   ø€ Ü—=’= °$·+±+Ñ!>Ø!%§¡Ø!&ó(ð (r[   )rL  rb  rf  rm  rÿ   r)  ©rŽ   r„  r�  r†  s   `   rY   Úget_srvsvc_connectionÚ#ReplayContext.get_srvsvc_connection—  sw   ø€ Ø×"×"®3Ø×*Ñ*¨2Ñ.Ð.õ	(ð ×,Ñ,¨WØ-1¯_©_Ø-1×-@Ñ-@Ø-1×-AÑ-AóCñ 	"ˆˆDÔ ð 	×Ñ×&Ñ& qÔ)Øˆr[   c                 ó  ^ • T R                   (       a  U(       d  T R                   S   $ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        T R                   R                  U5        U$ )Nrƒ  c                 ór   >• Sn[         R                  " STR                  < SU< S3TR                  U 5      $ )Nzschannel,seal,signúncacn_ip_tcp:Ú[Ú]©r   Úlsarpcrí   rð   )rï   Úbinding_optionsrŽ   s     €rY   r�  Ú4ReplayContext.get_lsarpc_connection.<locals>.connect­  s1   ø€ Ø2ˆOÜ—:“:Ø#Ÿ{œ{«Oð=à"Ÿg™gØ#ó%ð %r[   )rI  rb  rw  ry  rû   r)  r�  s   `   rY   Úget_lsarpc_connectionÚ#ReplayContext.get_lsarpc_connection©  sy   ø€ Ø×"×"®3Ø×*Ñ*¨2Ñ.Ð.õ	%ð ×,Ñ,¨WØ-1×-?Ñ-?Ø-1×-CÑ-CØ-1×-AÑ-AóCñ 	"ˆˆDÔ ð 	×Ñ×&Ñ& qÔ)Øˆr[   c                 ó  ^ • T R                   (       a  U(       d  T R                   S   $ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        T R                   R                  U5        U$ )Nrƒ  c                 ób   >• [         R                  " STR                  -  TR                  U 5      $ r‹  r—  rŒ  s    €rY   r�  Ú?ReplayContext.get_lsarpc_named_pipe_connection.<locals>.connectÁ  s)   ø€ Ü—:’:˜m¨t¯{©{Ñ;Ø"Ÿg™gØ#ó%ð %r[   )rJ  rb  rw  ry  rü   r)  r�  s   `   rY   Ú get_lsarpc_named_pipe_connectionÚ.ReplayContext.get_lsarpc_named_pipe_connection½  sy   ø€ Ø×(×(¶Ø×0Ñ0°Ñ4Ð4õ	%ð ×,Ñ,¨WØ-1×-?Ñ-?Ø-1×-CÑ-CØ-1×-GÑ-GóIñ 	(ˆˆDÔ&ð 	×%Ñ%×,Ñ,¨QÔ/Øˆr[   c                 ó0  ^ • T R                   (       a  U(       d  T R                   S   nU$ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        [        U5      u  pgXV4nT R                   R                  U5        U$ )zget a (drs, drs_handle) tuplerƒ  c                 óv   >• SnSTR                   < SU< S3n[        R                  " UTR                  U 5      $ )NÚsealr”  r•  r–  )rí   r   rð   )rï   r™  Úbinding_stringrŽ   s      €rY   r�  Ú:ReplayContext.get_drsuapi_connection_pair.<locals>.connectÕ  s/   ø€ Ø$‰Oà"Ÿkœk«?ð<ˆNä—?’? >°4·7±7¸EÓBÐBr[   )rK  rb  rf  rm  r   r   r)  )rŽ   r„  Úunbindr†  r�  ÚdrsÚ
drs_handleÚsupported_extensionss   `       rY   Úget_drsuapi_connection_pairÚ)ReplayContext.get_drsuapi_connection_pairÏ  s�   ø€ à×#×#®CØ×(Ñ(¨Ñ,ˆAØˆHõ	Cð ×,Ñ,¨WØ-1¯_©_Ø-1×-@Ñ-@Ø-1×-BÑ-BóDñ 	%ˆˆdÔ#ô .8¸«_Ñ*ˆØÐˆØ× Ñ ×'Ñ'¨Ô*Øˆr[   c                 óœ  ^ • T R                   (       a  U(       d  T R                   S   $ U 4S jnU 4S jnU(       a;  T R                  UT R                  T R                  T R                  5      u  nT l        O:T R                  UT R
                  T R                  T R                  5      u  nT l        T R                   R                  U5        U$ )Nrƒ  c                 óH   >• [        STR                  -  U TR                  S9$ )zÜ
To run simple bind against Windows, we need to run
following commands in PowerShell:

    Install-windowsfeature ADCS-Cert-Authority
    Install-AdcsCertificationAuthority -CAType EnterpriseRootCA
    Restart-Computer

z
ldaps://%s©r  rð   ©r   rí   rð   rŒ  s    €rY   Úsimple_bindÚ6ReplayContext.get_ldap_connection.<locals>.simple_bindê  s'   ø€ ô ˜¨¯©Ñ3Ø%*Ø ŸG™Gñ%ð %r[   c                 óH   >• [        STR                  -  U TR                  S9$ )Nr	  r¯  r°  rŒ  s    €rY   Ú	sasl_bindÚ4ReplayContext.get_ldap_connection.<locals>.sasl_bindø  s%   ø€ Ü˜ t§{¡{Ñ2Ø%*Ø ŸG™Gñ%ð %r[   )	rG  rb  rn  rs  rý   rf  rm  rþ   r)  )rŽ   r„  Úsimpler±  r´  Úsamdbs   `     rY   Úget_ldap_connectionÚ!ReplayContext.get_ldap_connectionæ  s¹   ø€ Ø× × ®Ø×(Ñ(¨Ñ,Ð,õ	%õ	%ö à×0Ñ0°Ø15×1GÑ1GØ15×1KÑ1KØ15×1JÑ1JóLñ /ˆU�DÕ-ð ×0Ñ0°Ø15·±Ø15×1DÑ1DØ15×1CÑ1CóEñ (ˆU�DÔ&ð 	×Ñ×$Ñ$ UÔ+Øˆr[   c                 óÔ   • U R                   (       a  U(       aB  U R                   R                  [        U R                  U R                  U R
                  S95        U R                   S   $ )N)rð   rï   rƒ  )rM  r)  ÚSamrContextrí   rð   rï   )rŽ   r„  s     rY   Úget_samr_contextÚReplayContext.get_samr_context  sK   € Ø×!×!¦SØ×Ñ×%Ñ%Ü˜DŸK™K¨D¯G©G¸4¿:¹:ÑFôHà×!Ñ! "Ñ%Ð%r[   c                 óÐ   ^ • T R                   (       a  T R                   $ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        UT l         U$ )Nc                 ób   >• [         R                   " STR                  -  TR                  U 5      $ )Nzncacn_ip_tcp:%s[schannel,seal])r   rí   rð   rŒ  s    €rY   r�  Ú6ReplayContext.get_netlogon_connection.<locals>.connect  s/   ø€ Ü×$Ò$Ð%EØ&*§k¡kñ&3à%)§W¡WØ%*ó,ð ,r[   )rî   rb  rw  ry  r  )rŽ   r�  r†  s   `  rY   Úget_netlogon_connectionÚ%ReplayContext.get_netlogon_connection  sf   ø€ à×#×#Ø×+Ñ+Ð+õ	,ð ×,Ñ,¨WØ-1×-?Ñ-?Ø-1×-CÑ-CØ-1×-CÑ-CóEñ 	$ˆˆDÔ"ð
 $%ˆÔ Øˆr[   c                 ó   • U R                   S4$ )NÚA©rì   r¨   s    rY   Úguess_a_dns_lookupÚ ReplayContext.guess_a_dns_lookup$  s   € Ø—
‘
˜CÐ Ð r[   c                 ó²   • U R                   R                  5       n[        5       n[        US   5      UR                  l        US   Ul        [        5       nX#4$ )NÚ
credentialr‚   )rw  Únew_client_authenticatorr   r+  ÚcredÚdatar‚   )rŽ   ÚauthÚcurrentÚ
subsequents       rY   Úget_authenticatorÚReplayContext.get_authenticator'  sR   € Ø×!Ñ!×:Ñ:Ó<ˆÜ%Ó'ˆÜ   lÑ!3Ó4ˆ�‰ÔØ  Ñ-ˆÔä'Ó)ˆ
ØÐ$Ð$r[   c                 óä   • [         R                  R                  U R                  U5      n[	        US5      nUR                  5        H  u  pE[        U< SU< 3US9  M     UR                  5         g)z“Write arbitrary key/value pairs to a file in our stats directory in
order for them to be picked up later by another process working out
statistics.Úwz: rO   N)ÚosÚpathr    rõ   ÚopenÚitemsrR   Úclose)rŽ   ÚfilenameÚkwargsr]  r7  Úvs         rY   Úwrite_statsÚReplayContext.write_stats0  sR   € ô —7‘7—<‘< §¡¨xÓ8ˆÜ�˜3ÓˆØ—L‘L–N‰DˆAÜ›a¢Ð#¨!Ô,ñ #à	�‰�	r[   )/r/  rú   ró   rï   rH  r.  rô   r÷   rK  rö   rù   rñ   rþ   r   rû   rü   r  r  rý   rÿ   rG  rð   rI  rJ  rw  ry  rO  rN  rî   rò   rì   rT  rU  rM  r0  rí   rn  rs  rL  rõ   r  r  rf  rm  rV  rP  rQ  r�   )F)FF)ry   rz   r{   r|   rÛ   rÔ  Úenvironrø   r�   r  rB  rZ  rb  rX  rW  r€  r‡  r�  r›  r   r«  r¸  r¼  rÁ  rÆ  rÐ  rÜ  r}   rq   r[   rY   ré   ré   Z  s£   † ñð ØØØ%)Ø'+Ø!%ØØØØØŸ
™
Ÿ™ xÓ0Ø Ø!ô*+òXPFòn!ò$#ò>*ò8,=ò\Gô2ô,ôô$ô(ô$ô.$ôL&òò$!ò%õr[   ré   c                   ó.   • \ rS rSrSrSS jrS rS rSrg)	r»  i;  z5State/Context associated with a samr connection.
    Nc                 óŠ   • S U l         S U l        S U l        S U l        S U l        S U l        S U l        Xl        X l        X0l	        g r�   )
Ú
connectionÚhandleÚdomain_handler÷   Úgroup_handleÚuser_handleÚridsrí   rð   rï   )rŽ   rí   rð   rï   s       rY   r�   ÚSamrContext.__init__>  sE   € Ø!ˆŒØ!ˆŒØ!ˆÔØ!ˆŒØ!ˆÔØ!ˆÔØ!ˆŒ	Ø#ŒØŒØ"�
r[   c                 ó´   • U R                   (       d<  [        R                  " SU R                  -  U R                  U R                  S9U l         U R                   $ )Nzncacn_ip_tcp:%s[seal])Úlp_ctxr  )rá  r   rí   rð   rï   r¨   s    rY   Úget_connectionÚSamrContext.get_connectionJ  s?   € Ø��Ü"ŸišiØ'¨4¯;©;Ñ7Ø—w‘wØ ŸJ™Jñ(ˆDŒOð
 �‰Ðr[   c                 ó¦   • U R                   (       d5  U R                  5       nUR                  S [        R                  5      U l         U R                   $ r�   )râ  rê  ÚConnect2r   ÚSEC_FLAG_MAXIMUM_ALLOWED)rŽ   r†  s     rY   Ú
get_handleÚSamrContext.get_handleS  s9   € Ø�{�{Ø×#Ñ#Ó%ˆAØŸ*™* T¬8×+LÑ+LÓMˆDŒKØ�{‰{Ðr[   )
rá  rï   rã  r÷   rä  râ  rð   ræ  rí   rå  ©NN)	ry   rz   r{   r|   rÛ   r�   rê  rï  r}   rq   r[   rY   r»  r»  ;  s   † ñô
#òõr[   r»  c                   ó€   • \ rS rSrSr  SS jrS rS r SS jrS r	\	r
S	 rS
 rS rS rSS jrSS jrS rS rSrg)ÚConversationiZ  zADetails of a converation between a simulated client and a server.Nc                 ó”   • Xl         X l        / U l        [        U5      U l        SU l        X@l        U H  nU R                  " U6   M     g )Nr¸   )Ú
start_timer‹   Úpacketsru   rW   Úclient_balancerÄ   Úadd_short_packet)rŽ   rõ  r‹   ÚseqrÄ   rn   s         rY   r�   ÚConversation.__init__\  sE   € à$ŒØ"ŒØˆŒÜ& yÓ1ˆŒØ!ˆÔØ.ÔÛˆAØ×!Ò! 1Ó%ò r[   c                 óˆ   • U R                   c  UR                   c  ggUR                   c  gU R                   UR                   -
  $ )Nr   rƒ  r_   )rõ  rÒ   s     rY   rÔ   ÚConversation.__cmp__g  sB   € Ø�?‰?Ñ"Ø×ÑÑ'ØØØ×ÑÑ#ØØ�‰ ×!1Ñ!1Ñ1Ð1r[   c                 ó†  • UR                  5       nU R                  c  UR                  U l        U R                  c  UR                  U l        UR                  U R                  :w  a'  [	        SU R                  < SUR                  < 35      eU=R                  U R                  -  sl        UR
                  UR                  S   :X  a$  U =R                  UR                  5       -  sl        O#U =R                  UR                  5       -  sl        UR                  5       (       a  U R                  R                  U5        gg)zeAdd a packet object to this conversation, making a local copy with
a conversation-relative timestamp.NzConversation endpoints z don't matchpacket endpoints r   )r°   rõ  r‚   r‹   rw   r…   r÷  r¼   rÙ   rö  r)  )rŽ   Úpacketrn   s      rY   Ú
add_packetÚConversation.add_packetp  sé   € ð �K‰K‹Mˆà�?‰?Ñ"ØŸk™kˆDŒOà�>‰>Ñ!ØŸ[™[ˆDŒNà�;‰;˜$Ÿ.™.Ó(Ý!à#'§>¤>°1·;³;ð#@ó Að Að 	
�Š�t—‘Ñ&�à�5‰5�A—K‘K ‘NÓ"Ø×Ò 1§>¡>Ó#3Ñ3Öà×Ò 1§>¡>Ó#3Ñ3Õà×Ñ×!Ñ!Ø�L‰L×Ñ Õ"ð "r[   c                 ó*  • U(       a  [        X#5      (       d  gU R                  5       u  pxU(       d  X‡p‡X#4n	[        R                  U	S5      n
[        R                  US5      n[        XR                  -
  USXxX#X¤5	      nUR                  UR                  S   :X  a$  U =R                  UR                  5       -  sl	        O#U =R                  UR                  5       -  sl	        UR                  5       (       a  U R                  R                  U5        gg)z±Create a packet from a timestamp, and 'protocol:opcode' pair, and a
(possibly empty) list of extra data. If client is True, assume
this packet is from the client to the server.
NrŸ   Ú06r   )r×   Úguess_client_serverÚOP_DESCRIPTIONSrø   ÚIP_PROTOCOLSr   rõ  r…   r‹   r÷  r¼   rÙ   rö  r)  )rŽ   r‚   r‡   rˆ   rŠ   ÚclientÚskip_unused_packetsr…   r†   r»   r‰   rƒ   rþ  s                rY   rø  ÚConversation.add_short_packetŠ  së   € ö Ô'7¸×'IÑ'IØà×,Ñ,Ó.‰	ˆÞØ�ØÐ ˆÜ×"Ñ" 3¨Ó+ˆÜ"×&Ñ& x°Ó6ˆÜ˜	§O¡OÑ3°[Ø˜CØ ¨$ó7ˆð �:‰:˜×)Ñ)¨!Ñ,Ó,Ø×Ò 6×#6Ñ#6Ó#8Ñ8Öà×Ò 6×#6Ñ#6Ó#8Ñ8ÕØ×$Ñ$×&Ñ&Ø�L‰L×Ñ Õ'ð 'r[   c                 óv   • SU R                   U R                  U R                  [        U R                  5      4-  $ )Nz-<Conversation %s %s starting %.3f %d packets>)rÄ   r‹   rõ  Úlenrö  r¨   s    rY   r©   ÚConversation.__str__¦  s5   € Ø?Ø×%Ñ% t§~¡~°t·±Ü�T—\‘\Ó"ð$ñ$ð 	%r[   c                 ó,   • [        U R                  5      $ r�   )Úiterrö  r¨   s    rY   Ú__iter__ÚConversation.__iter__­  s   € Ü�D—L‘LÓ!Ð!r[   c                 ó,   • [        U R                  5      $ r�   )r
  rö  r¨   s    rY   Ú__len__ÚConversation.__len__°  s   € Ü�4—<‘<Ó Ð r[   c                 óœ   • [        U R                  5      S:  a  gU R                  S   R                  U R                  S   R                  -
  $ )Nr#   r   rƒ  )r
  rö  r‚   r¨   s    rY   Úget_durationÚConversation.get_duration³  s>   € Üˆt�|‰|Ó˜qÓ ØØ�|‰|˜BÑ×)Ñ)¨D¯L©L¸©O×,EÑ,EÑEÐEr[   c                 óv   • U R                    Vs/ s H  oR                  U R                  5      PM     sn$ s  snf r�   )rö  r£   rõ  )rŽ   rn   s     rY   Úreplay_as_summary_linesÚ$Conversation.replay_as_summary_lines¸  s)   € Ø7;·|²|ÓD²|°!—‘˜TŸ_™_Ö-±|ÑDÐDùÒDs   �$6c                 ó   • U R                   n[        R                  " 5       U-
  nXE-
  nU[        -
  nUS:”  a  [        R                  " U5        [        R                  " 5       U-
  U-
  nU R	                  SX4-  5        Sn	Sn
[        R                  " 5       nU R
                   H¥  n[        R                  " 5       U-
  nX\R                  -
  nXi:”  a  Un	US:  a^  U* [        -
  nUS:”  aN  [        R                  " U5        [        R                  " 5       U-
  nXLR                  -
  U
:”  a  XLR                  -
  n
UR                  X5        M§     X˜U
4$ )zEReplay the conversation at the right time.
(We're already in a fork).r   zstarting %s [miss %.3f]r¸   )rõ  rÅ   ÚSLEEP_OVERHEADÚsleeprW   rö  r‚   rÎ   )rŽ   rÌ   rÈ   rY  r¢   ÚnowÚgapÚ
sleep_timeÚmissÚmax_gapÚmax_sleep_missÚp_startrn   s                rY   Úreplay_with_delayÚConversation.replay_with_delay»  s  € ð �O‰OˆÜ�iŠi‹k˜EÑ!ˆØ‰gˆØœ>Ñ)ˆ
Ø˜‹>Ü�JŠJ�zÔ"ä—	’	“˜eÑ# qÑ(ˆØ�‰Ð*¨d¨\Ñ9Ô:àˆØˆä—)’)“+ˆØ—”ˆAÜ—)’)“+ Ñ'ˆCØŸ™Ñ#ˆCØ‹}Ø�Ø�Q‹wØ!˜T¤NÑ2�
Ø “>Ü—J’J˜zÔ*ÜŸ	š	› gÑ-�AØŸ;™;‘¨Ó7Ø)*¯[©[©˜à�F‰F�4Ö!ñ ð ˜nÐ,Ð,r[   c                 óz   • U R                   u  p#U R                  S:  a  X#4$ U R                  S:X  a  X:X  a  X#4$ X24$ )zXHave a go at deciding who is the server and who is the client.
returns (client, server)
r   )r‹   r÷  )rŽ   Úserver_cluere   Úbs       rY   r  Ú Conversation.guess_client_serverÞ  sG   € ð �~‰~‰ˆà×Ñ Ó"Ø�6ˆMð
 ×Ñ !Ó#¨Ó(8Ø�6ˆMàˆvˆr[   c                 óø   • U R                    Vs/ s H!  o1UR                  s=::  a  U::  d  M  O  M  UPM#     snU l         U R                   (       a  U R                   S   R                  U l        gSU l        gs  snf )zyPrune any packets outside the time window we're interested in

:param s: start of the window
:param e: end of the window
r   N©rö  r‚   rõ  )rŽ   rs   rË   rn   s       rY   Úforget_packets_outside_windowÚ*Conversation.forget_packets_outside_windowï  sX   € ð $(§<¢<ÓI¢<˜a¸¿¹Õ3HÀqÑ3H›Ñ3H�¡<ÑIˆŒØ7;·|·|˜$Ÿ,™, q™/×3Ñ3ˆ�Èˆ�ùò Js   �A7­A7±A7c                 óš   • U R                    H  nU=R                  U-  sl        M     U R                  b  U =R                  U-  sl        gg)z=Adjust the packet start times relative to the new start time.Nr*  )rŽ   rõ  rn   s      rY   Úrenormalise_timesÚConversation.renormalise_timesø  s=   € à—”ˆAØ�KŠK˜:Ñ%�Kñ ð �?‰?Ñ&Ø�OŠO˜zÑ)ŽOð 'r[   )r÷  rÄ   r‹   rW   rö  rõ  )NNrq   N)TTrñ  r�   )ry   rz   r{   r|   rÛ   r�   rÔ   rÿ  rø  r©   r¬   r  r  r  r  r#  r  r+  r.  r}   rq   r[   rY   ró  ró  Z  s\   † ÙKØ<>Ø!%ô	&ò2ò#ð6 ;?ô(ò8%ð
 €Hò"ò!òFò
Eô!-ôFò"Nõ*r[   ró  c                   ó<   • \ rS rSrSrS	S jrS rS	S jrS	S jrSr	g)
Ú	DnsHammeri  zKA lightweight conversation that generates a lot of dns:0 packets on
the flyNc                 ó  • [        X-  5      n[        U5       Vs/ s H  n[        R                  " SU5      PM     snU l        U R                  R                  5         Xl        X l        SU l        U R                  US9U l
        g s  snf )Nr   ©Ú
query_file)r˜   r-  r=  ÚuniformÚtimesÚsortÚraterÍ   rõ  Ú_get_query_choicesÚquery_choices)rŽ   Údns_raterÍ   r4  Únr8  s         rY   r�   ÚDnsHammer.__init__  so   € Ü�Ñ#Ó$ˆÜ;@À¼8ÓDº8°a”f—n’n Q¨Ö1¹8ÑDˆŒ
Ø�
‰
�‰ÔØŒ	Ø ŒØˆŒØ!×4Ñ4À
Ð4ÐKˆÕùò Es   ›!Bc                 ó`   • S[        U R                  5      U R                  U R                  4-  $ )Nz-<DnsHammer %d packets over %.1fs (rate %.2f)>)r
  r6  rÍ   r8  r¨   s    rY   r©   ÚDnsHammer.__str__  s)   € Ø?Ü�T—Z‘Z“ $§-¡-°·±Ð;ñ<ð 	=r[   c                 ó‚  • U(       a¤  [        US5       nUR                  5       nSSS5        / nWR                  5        Hg  nUR                  5       nU(       d  M  UR	                  S5      (       a  M4  UR                  S5      n[        U5      S:X  d   eUR                  U5        Mi     U$ / SQ$ ! , (       d  f       N‘= f)z�
Read dns query choices from a file, or return default

rname may contain format string like `{realm}`
realm can be fetched from context.realm
r5  NÚ#r  é   )
)r   ú{realm}rÄ  Úyes)r_   rC  ÚNSrD  )r#   ú	*.{realm}rÄ  Úno)r|  rF  rE  rG  )é
   ú_msdcs.{realm}rÄ  rD  )é   rI  rE  rD  )é   únx.realm.comrÄ  rG  )é   rL  rE  rG  )é   ú*.nx.realm.comrÄ  rG  )é   rO  rE  rG  )rÖ  ÚreadÚ
splitlinesÚstripr*  r–   r
  r)  )rŽ   r4  r]  ÚtextÚchoicesrš   rX   s          rY   r9  ÚDnsHammer._get_query_choices  sš   € ö Ü�j #Ô&¨!Ø—v‘v“x�÷ 'àˆGØŸ™Ö)�Ø—z‘z“|�ß�4 §¡°× 4Ó 4ØŸ:™: c›?�DÜ˜t›9¨›>Ð)˜>Ø—N‘N 4Ö(ñ *ð ˆNòð ÷ 'Õ&ús   ”B0Â0
B>c           
      óÎ  • U(       d   eUR                   (       d   e[        R                  " 5       nU R                   Hä  n[        R                  " 5       U-
  nX4-
  nU[        -
  nUS:”  a  [        R                  " U5        [
        R                  " U R                  5      u  pxpšUR                  UR                   S9nSn[        R                  " 5       n [        X‰5      nU
S:X  a  [        U5      (       d  Sn[        R                  " 5       nXì-
  n[        SXçXû4-  5        Mæ     g ! [         a    Sn N<f = f! [        R                  " 5       nXì-
  n[        SXçXû4-  5        f = f)Nr   rÅ  TrD  Fz%f	DNS	dns	%s	%f	%s	)rì   rÅ   r6  r  r  r=  r}  r:  r  Ú	dns_queryr
  rÆ   rR   )rŽ   rÈ   rÌ   r¢   r  r  r  rˆ   ÚrnameÚrtypeÚexistÚsuccessÚpacket_startÚanswersr`   rÍ   s                   rY   ÚreplayÚDnsHammer.replay3  s*  € ÞˆˆwØ�}�}Ðˆ}Ü—	’	“ˆØ—”ˆAÜ—)’)“+ Ñ%ˆCØ‘'ˆCØœ~Ñ-ˆJØ˜A‹~Ü—
’
˜:Ô&ä*0¯-ª-¸×8JÑ8JÓ*KÑ'ˆF˜5Ø—L‘L w§}¡}�LÐ5ˆEØˆGÜŸ9š9›;ˆLð
WÜ# EÓ1�Ø˜E“>¬#¨g¯,©,à#�Gô —i’i“k�ØÑ-�ÜÐ2°cÀ8Ð5UÑUÖVò+ øô  ó  Ø’ð ûô —i’i“k�ØÑ-�ÜÐ2°cÀ8Ð5UÑUÕVús$   Ã#D'Ä'D6Ä3D9Ä5D6Ä6D9Ä9+E$)rÍ   r:  r8  rõ  r6  r�   )
ry   rz   r{   r|   rÛ   r�   r©   r9  r_  r}   rq   r[   rY   r1  r1    s   † ñôLò=ô÷BWr[   r1  c                 óÖ  • [        [        5      n/ nU  H¶  n[        U[        5      (       a  [	        U5      n[        SUR                  < 3[        R                  S9  U HW  n[        R                  U5      nUR                  S:X  a  US:w  a  X&R                  ==   S-  ss'   MF  UR                  U5        MY     UR                  5         M¸     U(       d  / S4$ [        S U 5       5      n[!        S U 5       5      n[        S	[        R                  S9  [#        5       n	[%        U5       Hc  u  p¦U=R&                  U-  sl        U	R)                  UR*                  5      nUc  [-        U
S
-   S9nX¹UR*                  '   UR/                  U5        Me     / nU	R1                  5        H%  n[3        U5      S:w  d  M  UR                  U5        M'     [5        X‡-
  5      n[3        U	5      U-  nXÎXÒ4$ )zLLoad a summary traffic summary file and generated Converations from it.
    z
Ingesting rO   r'   Úincluder_   r   c              3   ó8   #   • U  H  oR                   v •  M     g 7fr�   rÑ   ©r  rn   s     rY   r  Ú#ingest_summaries.<locals>.<genexpr>e  s   é € Ð2ª' Q—[–[ª'ùó   ‚c              3   ó8   #   • U  H  oR                   v •  M     g 7fr�   rÑ   rd  s     rY   r  re  f  s   é € Ð3ª7 a—k–kª7ùrf  z$gathering packets into conversationsr#   )rÄ   )r   r˜   Ú
isinstancer&  rÖ  rR   rM   rS   rT   r   rœ   r‡   rˆ   r)  rØ  ÚminÚmaxr   Ú	enumerater‚   rø   r‹   ró  rÿ  Úvaluesr
  r—   )ÚfilesÚdns_modeÚ
dns_countsrö  r]  rš   rn   rõ  Úlast_packetÚconversationsr8  r†  Úconversation_listrÍ   Úmean_intervals                  rY   Úingest_summariesrt  O  sœ  € ô œSÓ!€JØ€GÛˆÜ�aœ×ÑÜ�Q“ˆAÝ §£Ð(¬s¯z©zÒ:ÛˆDÜ× Ñ  Ó&ˆAØ�z‰z˜UÓ" x°9Ó'<ØŸ8™8Ó$¨Ñ)Õ$à—‘˜qÖ!ñ ð 	
�‰Ž	ñ ö Ø�1ˆuˆäÑ2©'Ó2Ó2€JÜÑ3©7Ó3Ó3€Kä	Ð
0´s·z±zÒBÜ“M€MÜ˜'Ö"‰ˆØ	�Š�zÑ!�Ø×Ñ˜aŸk™kÓ*ˆØ‰9Ü¨a°!©eÑ5ˆAØ)*˜!Ÿ+™+Ñ&Ø	�‰�QŽñ #ð ÐØ×!Ñ!Ö#ˆÜˆq‹6�Q�;Ø×$Ñ$ QÖ'ñ $ô �[Ñ-Ó.€HÜ˜Ó&¨Ñ1€Mà¨XÐAÐAr[   c                 ó–   • [        5       nU  H  nUR                  UR                  5        M      U(       a  UR                  S5      S   $ g )Nr_   r   )r   Úupdater‹   Úmost_common)rq  Ú	addressesr†  s      rY   Úguess_server_addressry  „  sC   € ä“	€IÛˆØ×Ñ˜Ÿ™Ö%ñ æØ×$Ñ$ QÓ'¨Ñ*Ð*ð r[   c                 óf   • 0 nU R                  5        H  u  p#SR                  U5      nX1U'   M     U$ ©Nr“   )r×  r    )rt   Úyr7  rÛ  Úk2s        rY   Ústringify_keysr~  �  s4   € Ø
€AØ—‘–	‰ˆØ�Y‰Y�q‹\ˆØˆ"‹ñ ð €Hr[   c                 óŠ   • 0 nU R                  5        H,  u  p#[        [        U5      R                  S5      5      nX1U'   M.     U$ r{  )r×  rU   r&  r–   )rt   r|  r7  rÛ  r¢   s        rY   Úunstringify_keysr€  •  s>   € Ø
€AØ—‘–	‰ˆÜ”#�a“&—,‘,˜tÓ$Ó%ˆØˆ!‹ñ ð €Hr[   c                   ób   • \ rS rSrSS jrSS jrS rS r     SS jrS r	S	 r
  SS
 jrSrg)ÚTrafficModeli�  c                 ót   • 0 U l         0 U l        Xl        [        [        5      U l        SU l        SS/U l        g )Nr¸   r   r_   )ÚngramsÚquery_detailsr<  r   r˜   Údns_opcountsÚcumulative_durationÚpacket_rate)rŽ   r<  s     rY   r�   ÚTrafficModel.__init__ž  s7   € ØˆŒØˆÔØŒÜ'¬Ó,ˆÔØ#&ˆÔ Ø˜q˜6ˆÕr[   Nc           
      ó  • Uc  0 nSnSn[         4U R                  S-
  -  n[        U5      nUR                  5        H  u  pxU R                  U==   U-  ss'   M     [        U5      S:”  an  US   R                  n	Sn
U	S-   nU H3  nU
[        U5      -  n
[        X¼R                  S   R                  5      nM5     X R                  S'   X¹-
  U R                  S'   U GHb  nUR                  U5      u  pÖXLR                  5       -  n[         4U R                  S-
  -  nU GH  nUR                  U:w  a  M  UR                  U-
  nUR                  nU[        :”  a^  S[        R                   " [        SU["        -  5      5      -  nU R$                  R'                  U/ 5      R)                  U5        USS  U4-   nUR+                  5       nU R,                  R'                  U/ 5      R)                  [/        UR0                  5      5        U R$                  R'                  U/ 5      R)                  U5        USS  U4-   nGM     GMe     U =R2                  U-  sl        U R$                  R'                  U/ 5      R)                  [         5        g )Nr¸   r_   r   gš™™™™™¹?rƒ  úwait:%dr%   )Ú
NON_PACKETr<  ry  r×  r†  r
  rõ  rj  rö  r‚   rˆ  r  r  r…   ÚWAIT_THRESHOLDÚmathÚlogÚ
WAIT_SCALEr„  r(  r)  rµ   r…  rU   rŠ   r‡  )rŽ   rq  r†  ÚprevÚcum_durationr»   rí   r7  rÛ  ÚfirstÚtotalÚlastr†  r  rn   Úelapsedrã   Úshort_ps                     rY   ÚlearnÚTrafficModel.learn¦  sJ  € ØÑØˆLØˆØˆÜˆm˜tŸv™v¨™zÑ*ˆä% mÓ4ˆà ×&Ñ&Ö(‰DˆAØ×Ñ˜aÓ  AÑ%Õ ñ )ô ˆ}Ó Ó!Ø! !Ñ$×/Ñ/ˆEØˆEØ˜3‘;ˆDÛ"�Øœ˜Q›‘�Ü˜4§¡¨2¡×!8Ñ!8Ó9’ñ #ð #(×Ñ˜QÑØ"&¡,ˆD×Ñ˜QÑäˆAØ×2Ñ2°6Ó:‰NˆFØŸN™NÓ,Ñ,ˆLÜ�- 4§6¡6¨A¡:Ñ.ˆCÜ�Ø—5‘5˜F“?ÙàŸ+™+¨Ñ,�Ø—{‘{�Øœ^Ó+à$¬¯ª´°SØ5<¼zÑ5Ió2Kó )Lñ M�Dà—K‘K×*Ñ*¨3°Ó3×:Ñ:¸4Ô@Ø˜a˜b˜' T GÑ+�Cà×*Ñ*Ó,�Ø×"Ñ"×-Ñ-¨gØ.0ó2ß28±&¼¸q¿w¹w»Ô2HØ—‘×&Ñ& s¨BÓ/×6Ñ6°wÔ?Ø˜!˜"�g  
Ñ*“ô# ñ	 ð. 	× Ò  LÑ0Õ à�‰×Ñ˜s BÓ'×.Ñ.¬zÕ:r[   c                 óê  • 0 nU R                   R                  5        H,  u  p4SR                  U5      n[        [	        U5      5      X#'   M.     0 nU R
                  R                  5        H"  u  p4[        [	        S U 5       5      5      XS'   M$     UUU R                  U R                  [        S.nU R                  US'   [        U[        5      (       a  [        US5      n[        R                  " XaSS9  g )Nr“   c              3   óV   #   • U  H  nU(       a  S R                  U5      OSv •  M!     g7f)r“   r$   N)r    r  s     rY   r  Ú$TrafficModel.save.<locals>.<genexpr>à  s&   é € ð ,8Ú56°ö =>¨D¯I©I°a¬LÀ3Ô,FÚ56ùs   ‚'))r„  r…  r‡  rˆ  Úversionr'   rÓ  r#   )Úindent)r„  r×  r    Údictr   r…  r‡  rˆ  ÚCURRENT_MODEL_VERSIONr†  rh  r&  rÖ  ÚjsonÚdump)rŽ   r]  r„  r7  rÛ  r…  Úds          rY   ÚsaveÚTrafficModel.saveØ  sÛ   € ØˆØ—K‘K×%Ñ%Ö'‰DˆAØ—	‘	˜!“ˆAÜœW Q›ZÓ(ˆF‹Iñ (ð ˆØ×&Ñ&×,Ñ,Ö.‰DˆAÜ#¤Gñ ,8Ù56ó,8ó %8ó  9ˆMÓñ /ð
 Ø*Ø#'×#;Ñ#;Ø×+Ñ+Ü,ñ
ˆð ×$Ñ$ˆˆ%‰ä�aœ×ÑÜ�Q˜“ˆAä�	Š	�!˜qÓ!r[   c           	      óR  • [        U[        5      (       a  [        U5      n[        R                  " U5      n US   nU[
        :  a  [        SU[
        4-  5      e US   R                  5        H‹  u  pE[        [        U5      R                  S5      5      nU R                  R                  U/ 5      nUR                  5        H#  u  pxUR                  [        U5      /U-  5        M%     UR                  5         M�     US   R                  5        H¦  u  pEU R                  R                  [        U5      / 5      nUR                  5        HX  u  pxUS:X  a  UR                  S/U-  5        M"  UR                  [        [        U5      R                  S5      5      /U-  5        MZ     UR                  5         M¨     S	U;   a3  US	   R                  5        H  u  pEU R                   U==   U-  ss'   M     US
   U l        US   U l        g ! [         a    [        S[
        -  5      ef = f)Nr�  z4the model file is version %d; version %d is requiredz=the model file lacks a version number; version %d is requiredr„  r“   r…  r$   rq   r'   r‡  rˆ  )rh  r&  rÖ  r¡  ÚloadÚREQUIRED_MODEL_VERSIONÚ
ValueErrorÚKeyErrorr×  rU   r–   r„  r(  Úextendr7  r…  r†  r‡  rˆ  )	rŽ   r]  r£  r�  r7  rÛ  rl  rn   Úcounts	            rY   r§  ÚTrafficModel.loadñ  sð  € Ü�aœ×ÑÜ�Q“ˆAä�IŠI�a‹Lˆð		;Ø˜	‘lˆGØÔ/Ó/Ü ð ":à")Ô+AÐ!Bñ"Có Dð Dð 0ð �h‘K×%Ñ%Ö'‰DˆAÜ”c˜!“f—l‘l 4Ó(Ó)ˆAØ—[‘[×+Ñ+¨A¨rÓ2ˆFØŸG™GžI‘�Ø—‘œs 1›v˜h¨Ñ.Ö/ñ &à�K‰KŽMñ (ð �oÑ&×,Ñ,Ö.‰DˆAØ×'Ñ'×2Ñ2´3°q³6¸2Ó>ˆFØŸG™GžI‘�Ø˜“8Ø—M‘M 2 $¨¡,Ö/à—M‘M¤5¬¨Q«¯©°dÓ);Ó#<Ð"=ÀÑ"EÖFñ	 &ð
 �K‰KŽMñ /ð �A‹:Ø˜%™Ÿ™Ö(‘�Ø×!Ñ! !Ó$¨Ñ)Õ$ñ )ð $%Ð%:Ñ#;ˆÔ Ø˜]Ñ+ˆÕøô5 ó 	;Ü ð ":ä"8ñ":ó ;ð ;ð	;ús   ¸#H	 È	H&c                 óü  • / n[         4U R                  S-
  -  nUc  US-
  n [        R                  " U R                  R                  U[         45      5      nU[         :X  au  X:  a   U$ [        R                  " 5       U:”  a  [        SXu4-  [        R                  S9   U$ S[        R                  " SS5      -  n[        SU-  [        R                  S9  X€R                  ;   a$  [        R                  " U R                  U   5      n	O/ n	UR                  S	S5      u  p«U
S
:X  aF  [        U5      [        R                  " 5       -   n[        R                  " U5      [        U-  -  nX-  nOW[        R                   " ["        6 n[        R                  " U5      U-  nX-  nUb  X:”  a   U$ X:¼  a  UR%                  XX¹45        USS U4-   nUS   SS S:X  a#  US   SS S:X  a  [         4U R                  S-
  -  nGMÛ  )zEConstruct an individual conversation packet sequence from the
model.
r_   Nz"ending after %s (persistence %.1f)rO   r‹  r  é   ztrying %s instead of endr³   rã   éþÿÿÿzwait:rƒ  )rŒ  r<  r=  r}  r„  rø   rR   rS   rT   Ú	randranger…  r–   r˜   rŽ  Úexpr�  r5  ÚNO_WAIT_LOG_TIME_RANGEr)  )rŽ   r‚   Ú	hard_stopÚreplay_speedÚignore_beforeÚpersistencer†  r»   rn   rŠ   r‡   rˆ   Úlog_wait_timerã   Úlog_waits                  rY   Úconstruct_conversation_sequenceÚ,TrafficModel.construct_conversation_sequence  sè  € ð ˆÜˆm˜tŸv™v¨™zÑ*ˆØÑ Ø%¨™MˆMàÜ—’˜dŸk™kŸo™o¨c´J°=ÓAÓBˆAØ”J‹ØÓ,ØðF ˆôE —=’=“? [Ó0ÜÐ>À#ÐASÑSÜ"Ÿz™zò+àð> ˆð; ¤× 0Ò 0°°BÓ 7Ñ7�ÜÐ0°1Ñ4¼3¿:¹:ÒFà×&Ñ&Ó&ÜŸš d×&8Ñ&8¸Ñ&;Ó<‘à�à Ÿw™w s¨A›ÑˆHØ˜6Ó!Ü # F£¬f¯mªm«oÑ =�Ü—x’x Ó.´*¸|Ñ2KÑL�ØÑ!‘	ä!Ÿ>š>Ô+AÐB�Ü—x’x Ó)¨LÑ8�ØÑ!�	ØÑ(¨YÓ-BØð ˆð Ó-Ø—H‘H˜i°6ÐAÔBà�a�b�'˜Q˜D‘.ˆCØ�2‰w�r˜ˆ{˜gÓ%¨#¨b©'°"°1¨+¸Ó*@ô "�m t§v¡v°¡zÑ2�òK r[   c                 ó,   • U R                   u  p#X-  U-  $ r�   ©rˆ  )rŽ   ÚscaleÚrate_nÚrate_ts       rY   Úscale_to_packet_rateÚ!TrafficModel.scale_to_packet_rateO  s   € Ø×*Ñ*‰ˆØ‰~ Ñ&Ð&r[   c                 ó,   • U R                   u  p#X-  U-  $ r�   r½  )rŽ   Úppsr¿  rÀ  s       rY   Úpacket_rate_to_scaleÚ!TrafficModel.packet_rate_to_scaleS  s   € Ø×*Ñ*‰ˆØ‘˜vÑ%Ð%r[   c                 ó®  • SU-  n[        X-  5      n/ nSnX†:  aq  [        R                  " U* U5      n	U R                  U	UUSUS9n
U
 H  u  p¼pÞ[	        XÍ5      (       d  M    O   MP  UR                  U
5        U[        U
5      -  nX†:  a  Mq  U R                  U5      n[        SX†[        U5      X4-  [        R                  S9  UR                  5         U$ )z<Generate a list of conversation descriptions from the model.é	   r   )r´  rµ  r¶  r·  zGwe have %d packets (target %d) in %d conversations at %.1f/s (scale %f)rO   )r˜   r=  r5  rº  rç   r)  r
  rÅ  rR   rS   rT   r7  )rŽ   rˆ  rÍ   rµ  r·  Úlead_inÚtarget_packetsrq  Ú	n_packetsrÌ   r†  r‚   r‡   rˆ   rŠ   r¾  s                   rY   Úgenerate_conversation_sequencesÚ,TrafficModel.generate_conversation_sequencesW  sû   € ð �h‘,ˆÜ˜[Ñ3Ó4ˆØˆØˆ	àÓ(Ü—N’N G 8¨XÓ6ˆEØ×4Ñ4°UØ?GØBNØCDØALð	 5ð NˆAó 78Ñ2�	 VÜ1°(×CÓCÙñ 78ñ à× Ñ  Ô#Øœ˜Q›ÑˆIð% Õ(ð( ×)Ñ)¨+Ó6ˆÜð Ø(¼#¸mÓ:LØ*ð3ñ3ô —:‘:ò	ð 	×ÑÔØÐr[   )r‡  r†  r<  r„  rˆ  r…  )r|  r�   )r¸   Nr_   r   r   )r_   r   )ry   rz   r{   r|   r�   r˜  r¤  r§  rº  rÁ  rÅ  rÌ  r}   rq   r[   rY   r‚  r‚  �  sH   † ô"ô0;òd"ò2&,ðP 9<Ø26Ø56Ø67Ø45ô	4òl'ò&ð STØ45÷%r[   r‚  c                 ó‚   • / nU  H6  nU(       d  M  [        US   S   X4U5      nUS-  nUR                  U5        M8     U$ )Nr   r_   )ró  r)  )rù  rí   r  rq  rs   r†  s         rY   Úseq_to_conversationsrÏ    sN   € Ø€MÛˆßˆ1Ü˜Q˜q™T !™W vÐ&6¸Ó:ˆAØ�a‰KˆFØ× Ñ  Ö#ñ	 ð
 Ðr[   r'   r6   Úrpc_netlogonr  rÁ   r*   rI   r-   r3   r˜  r   r5   Úepmr   rJ   rK   r   r:   )rJ   Ú0x01zHost Announcement (0x01))rJ   Ú0x02zRequest Announcement (0x02))rJ   Ú0x08zBrowser Election Request (0x08))rJ   Ú0x09zGet Backup List Request (0x09))rJ   Ú0x0cz$Domain/Workgroup Announcement (0x0c))rJ   Ú0x0fz Local Master Announcement (0x0f)r2   ÚsearchRequestrB   ÚsearchResDone)r5   r(   ÚRequestr4   ÚBindrC   ÚBind_ackrE   ÚBind_nakr7   ÚAlter_contextrG   ÚAlter_context_resprå   ÚAUTH3)r5   r1   ÚResponser&   r	   r;   Úresponse)r   r(   ÚDsBind)r   rD   ÚDsCrackNames)r   rF   ÚDsWriteAccountSpn)r   r<   ÚDsUnbind)r   r1   ÚDsReplicaSync)r   r/   ÚDsGetNCChanges)r   r?   ÚDsReplicaUpdateRefs)rÑ  r/   ÚMaprä   rŸ   r,   ÚbindRequestr=   ÚbindResponser0   ÚunbindRequestr.   r>   ÚsearchResEntryr@   )r-   rŸ   z*** Unknown ***)r˜  r8   Úlsa_LookupNames)r˜  rH   Úlsa_LookupSids)r˜  Ú39Úlsa_QueryTrustedDomainInfoBySid)r˜  Ú40Úlsa_SetTrustedDomainInfo)r˜  Ú6Úlsa_OpenPolicy)r˜  Ú76Úlsa_LookupSids3)r˜  Ú77Úlsa_LookupNames4r9   )r:   r<   )rÐ  Ú21ÚNetrLogonDummyRoutine1)rÐ  Ú26ÚNetrServerAuthenticate3)rÐ  Ú29ÚNetrLogonGetDomainInfo)rÐ  Ú30ÚNetrServerPasswordSet2)rÐ  rñ  ÚNetrLogonSamLogonEx)rÐ  ró  ÚDsrEnumerateDomainTrusts)rÐ  Ú45ÚNetrLogonSamLogonWithFlags)rÐ  r?   ÚNetrServerReqChallenge)r   r(   ÚConnect)r   ræ   ÚGetAliasMembership)r   Ú17ÚLookupNames)r   Ú18Ú
LookupRids)r   Ú19Ú	OpenGroup)r   r<   ÚClose)r   Ú25ÚQueryGroupMember)r   Ú34ÚOpenUser)r   Ú36ÚQueryUserInfo)r   rñ  ÚGetGroupsForUser)r   r/   ÚQuerySecurity)r   rA   ÚLookupDomain)r   Ú64ÚConnect5)r   rõ  ÚEnumDomains)r   Ú7Ú
OpenDomain)r   Ú8ÚQueryDomainInfo)r*   Ú0x04zClose (0x04))r*   Ú0x24zLocking AndX (0x24))r*   Ú0x2ezRead AndX (0x2e))r*   Ú0x32zTrans2 (0x32))r*   Ú0x71zTree Disconnect (0x71)r)   zNegotiate Protocol (0x72))r*   Ú0x73zSession Setup AndX (0x73))r*   Ú0x74zLogoff AndX (0x74))r*   Ú0x75zTree Connect AndX (0x75))r*   Ú0xa2zNT Create AndX (0xa2))rI   r(   ÚNegotiateProtocol)rI   r6   ÚIoctl)rI   r8   ÚFind)rI   ræ   ÚGetInfo)rI   r  ÚBreak)rI   r<   ÚSessionSetup)rI   r1   ÚSessionLogoff)rI   r/   ÚTreeConnectÚTreeDisconnectÚCreateÚReadz$SAM LOGON request from client (0x12)z3SAM Active Directory Response - user unknown (0x17)ÚNetShareGetInfoÚNetSrvGetInfo))rI   r?   )rI   rA   )rI   rõ  )rI   r  )rK   Ú0x12)rK   Ú0x17)r   ræ   )r   rû  c                 óÖ   • U R                  SS5      u  pV[        R                  XV4S5      n[        R                  US5      nXSX#XVU/n	U	R	                  U5        SR                  U	5      $ )Nr³   r_   rŸ   r  r“   )r–   r  rø   r  r«  r    )
rn   r‚   r…   r†   rŠ   r‡   rˆ   r‰   rƒ   rš   s
             rY   Úexpand_short_packetr:  þ  se   € Ø—w‘w˜s A“Ñ€HÜ×Ñ Ð1°2Ó6€DÜ×"Ñ" 8¨TÓ2€Kà B¨°8ÀTÐJ€DØ‡K�K�ÔØ�9‰9�T‹?Ðr[   c                 ó¨   • [         R                  R                  5         [         R                  R                  5         [        R
                  " S5        g)z‡Signal handler closes standard out and error.

Triggered by a sigterm, ensures that the log messages are flushed
to disk and not lost.
r   N)rS   rT   rØ  ÚstdoutrÔ  Ú_exit)ÚsignalÚframes     rY   Úflushing_signal_handlerr@    s/   € ô ‡J�J×ÑÔÜ‡J�J×ÑÔÜ‡H‚HˆQ…Kr[   c                 óè  • US-  [         R                  " SS5      -   n[        R                  R	                  5         [        R
                  R	                  5         [        R                  " 5       nUS:w  a  U$  [         R                  " U5        XT4nSn	U S   S   n
[        X¨XS9n[        R                  " [        R                  [        5        UR                  X;5        [        R                  R                  5         [        R                  " S5        [        R                   R#                  UR$                  SUR&                  -  5      n[)        US5      n [        R                  R                  5         [        R                  " S5        U[        l        [0        R0                  " 5       U-
  nX¯-
  nU[2        -
  nUS:”  a  [0        R4                  " U5        UR7                  UUS
9u  nnn[9        SU-  5        [9        SU-  5        [9        SU-  5        [        R
                  R                  5         [        R                  R                  5         [        RB                  " U	5        g	! [*         a#  n[,        R/                  SU-  5         S	nAGNS	nAff = f! [:         ax    Sn	[9        S[        R<                  " 5       W4-  [        R
                  S9  [>        R@                  " [        R
                  5        [        R
                  R	                  5          GNf = f! [        R
                  R                  5         [        R                  R                  5         [        RB                  " W	5        f = f)z8Fork a new process and replay the conversation sequence.éè  r   iç  )rù  rÄ   zstats-conversation-%drÓ  r_   ústdout closing failed with %sN)rÌ   rÈ   zMaximum lag: %fzStart lag: %fzMax sleep miss: %fz*EXCEPTION in child PID %d, conversation %srO   )"r=  ÚrandintrS   r<  rc   rT   rÔ  ÚforkÚseedró  r>  ÚSIGTERMr@  rZ  ÚstdinrØ  rÕ  r    rõ   rÄ   rÖ  ÚIOErrorrà   ÚinforÅ   r  r  r#  rR   rÆ   Úgetpidra   Ú	print_excr=  )ÚcsrÌ   rÈ   rY  Ú	client_idÚ	server_idrF  Úpidr‹   Ústatusr¢   r†  rÙ  r]  rË   r  r  r  Úmax_lagÚ	start_lagr!  s                        rY   Úreplay_seq_in_forkrT    s…  € ð �tÑœfŸnšn¨Q°Ó4Ñ4€Dô ‡J�J×ÑÔÜ‡J�J×ÑÔÜ
�'Š'‹)€CØ
ˆaƒxØˆ
ð
*Ü�Š�DÔØÐ*ˆ	ØˆØˆq‰E�!‰HˆÜ˜¨2ÑIˆÜ�Š”f—n‘nÔ&=Ô>à×-Ñ-¨gÔ9Ü�	‰	�‰ÔÜ
�Š�ŒÜ—7‘7—<‘< × 0Ñ 0Ð2IØ !× 1Ñ 1ñ32ó 3ˆä�˜3Óˆð	=Ü�J‰J×ÑÔÜ�HŠH�QŒKð ŒŒ
Ü�iŠi‹k˜EÑ!ˆØ‰gˆØœ>Ñ)ˆ
Ø˜‹>Ü�JŠJ�zÔ"à-.×-@Ñ-@ÀuØIPð .Að .RÑ*ˆ�˜NäÐ 'Ñ)Ô*Üˆo 	Ñ)Ô*ÜÐ" ^Ñ3Ô4ô 	�
‰
×ÑÔÜ�
‰
×ÑÔÜ
�Š�Õøô3 ó 	=Ü�K‰KÐ7¸!Ñ;×<Ò<ûð	=ûô  ó ØˆÜÐ;¼r¿yºy»{ÈAÐ>NÑNÜ—:‘:ò	ä×ÒœCŸJ™JÔ'Ü�
‰
×Ñ×ðûô 	�
‰
×ÑÔÜ�
‰
×ÑÔÜ
�Š�ÕúsR   Á8CJ Å4I( ÆB
J É(
JÉ2JÊ
J ÊJÊJ ÊA>LÌL ÌLÌL ÌAM1c                 ó  • [         R                  R                  5         [         R                  R                  5         [        R
                  " 5       nUS:w  a  U$ [         R                  R                  5         [        R                  " S5         [         R                  R                  5         [        R                  " S5        [        R                  R                  UR                  S5      n[        US5      [         l         Sn[        R                  " [        R                   ["        5        [%        XUS9nUR'                  US9  [         R                  R                  5         [         R                  R                  5         [        R2                  " U5        g ! [         a"  n[        R                  SU-  5         S nANþS nAff = f! [(         aW    Sn[+        S[        R,                  " 5       -  [         R                  S	9  [.        R0                  " [         R                  5         Nâf = f! [         R                  R                  5         [         R                  R                  5         [        R2                  " W5        f = f)
Nr   r_   rC  z	stats-dnsrÓ  r3  )rÈ   z)EXCEPTION in child PID %d, the DNS hammerrO   )rS   r<  rc   rT   rÔ  rE  rH  rØ  rI  rà   ÚwarnrÕ  r    rõ   rÖ  r>  rG  r@  r1  r_  rÆ   rR   rK  ra   rL  r=  )	r;  rÍ   rÈ   r4  rP  rË   rÙ  rQ  Úhammers	            rY   Údnshammer_in_forkrX  R  s›  € Ü‡J�J×ÑÔÜ‡J�J×ÑÔÜ
�'Š'‹)€CØ
ˆaƒxØˆ
ä‡I�I‡O�OÔÜ‡H‚HˆQ„Kð9Ü�
‰
×ÑÔÜ
�Š�Œô �w‰w�|‰|˜G×,Ñ,¨kÓ:€HÜ�h Ó$„C„JðØˆÜ�Š”f—n‘nÔ&=Ô>Ü˜8¸*ÑEˆØ�‰˜gˆÑ&ô 	�
‰
×ÑÔÜ�
‰
×ÑÔÜ
�Š�Õøô% ó 9Ü�‰Ð3°aÑ7×8Ñ8ûð9ûô ó (ØˆÜÐ:¼b¿iºi»kÑJÜ—:‘:ò	ä×ÒœCŸJ™JÖ'ð	(ûô 	�
‰
×ÑÔÜ�
‰
×ÑÔÜ
�Š�Õús?   Â4F ÄAG	 Æ
GÆ$GÇGÇ	AH*È'H- È)H*È*H- È-AJc
                 ó   • [        SUUU[        U 5      S.U
D6n[        U5      [        U 5      :  a"  [        S[        U5      [        U 5      4-  5      e[        R                  " 5         [        U 5      S-  n[
        R
                  " 5       U-   nUc  U S   S   S   U-   n[        SU-  [        R                  S9  [        SX|-   -  [        R                  S9  [        S	U-  [        R                  S9  X×-   S
-   n[        R                  S[        U 5      U4-  5        UR                  S[        U 5      [        S U  5       5      S9  0 n U(       a  [        XWUUS9nSUU'   [        U 5       H#  u  nnUU   nUS-   n[        UXÛUU5      nUUU'   M%     [
        R
                  " 5       n[        SUU-
  U-   UU-
  4-  [        R                  S9  [
        R
                  " 5       U:  aÀ  U(       a¹  [
        R                   " S5         [        R"                  " S[        R$                  5      u  nnU(       aQ  UR-                  US 5      n[.        S:”  a'  [        SUU[        U5      4-  [        R                  S9  U	(       a  US:w  a  O"[
        R
                  " 5       U:  a	  U(       a  M¹  UR                  S[        U5      S9  S GH�  n[        S[        U5      U4-  [        R                  S9  U H  n [        R6                  " UU5        M     [
        R                   " S5        [
        R
                  " 5       S-   nU(       aî   [        R"                  " S[        R$                  5      u  nnWS:w  aœ  UR-                  US 5      nUc`  [        SU-  5        [        R                  R;                  5         [        R<                  R;                  5         [        R>                  " S5        [        SUU[        U5      4-  [        R                  S9  [
        R
                  " 5       U:¼  a  O	U(       a  Mî  U(       d    O[
        R                   " S5        GM�     U(       a$  [        S[        U5      -  [        R                  S9   [        R@                  " SS5        g ! [&         a!  nUR(                  [*        :w  a  e  S nAGM  S nAff = f! [0         a1    [        S[        R                  S9  [2        R4                  " 5          GNYf = f! [&         a!  nUR(                  [8        :w  a  e  S nAGM<  S nAff = f! [&         a   nUR(                  [*        :w  a  e  S nAGNìS nAff = f! [B         a    [        S[        R                  S9   g f = f! UR                  S[        U5      S9  S GHé  n[        S[        U5      U4-  [        R                  S9  U HH  n [        R6                  " UU5        M  ! [&         a   nUR(                  [8        :w  a  e  S nAMB  S nAff = f   [
        R                   " S5        [
        R
                  " 5       S-   nU(       Ga   [        R"                  " S[        R$                  5      u  nnO,! [&         a  nUR(                  [*        :w  a  e  S nAOS nAff = fWS:w  aœ  UR-                  US 5      nUc`  [        SU-  5        [        R                  R;                  5         [        R<                  R;                  5         [        R>                  " S5        [        SUU[        U5      4-  [        R                  S9  [
        R
                  " 5       U:¼  a  O
U(       a  GM  U(       d    O[
        R                   " S5        GMì     U(       a$  [        S[        U5      -  [        R                  S9   [        R@                  " SS5        f ! [B         a    [        S[        R                  S9   f f = f= f) N)rí   rï   rð   r  z(we have %d accounts but %d conversationsg{®Gáz”?rƒ  r   zWe will start in %.1f secondsrO   zWe will stop after %.1f secondszruntime %.1f secondsr%   z6Replaying traffic for %u conversations over %d secondsÚ
intentionsc              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr�   )r
  r  s     rY   r  Úreplay.<locals>.<genexpr>¨  s   é € Ð+MÒ<L°q¬C°¯F¨FÒ<Lùrf  )ÚPlanned_conversationsÚPlanned_packetsr3  r_   r#   z,all forks done in %.1f seconds, waiting %.1fgú~j¼t“h?z-process %d finished conversation %d; %d to gozEXCEPTION in parentÚ
unfinished)ÚUnfinished_conversations)é   ra  rÈ  zkilling %d children with -%dç      à?zchildren is %s, no pid foundz)kill -%d %d KILLED conversation; %d to goz%d children are missingzignoring fake ^Crq   )"ré   r
  r©  rÔ  ÚsetpgrprÅ   rR   rS   rT   rà   rJ  rÜ  ÚsumrX  rk  rT  r  ÚwaitpidÚWNOHANGÚOSErrorÚerrnor   ÚpoprQ   rÆ   ra   rL  Úkillr   rc   r<  r=  ÚkillpgÚKeyboardInterrupt)Úconversation_seqÚhostrï   rð   Úaccountsr;  Údns_query_filerÍ   Úlatency_timeoutÚstop_on_any_errorrÚ  rÈ   ÚdelayrÌ   r`   ÚchildrenrP  r8  rM  rY  rN  r¢   rQ  rË   r†  rs   s                             rY   r_  r_  t  sÕ  € ô ð & 4Ø"'Ø!Ü03Ð4DÓ0Eñ&ð %ñ	&€Gô ˆ8ƒ}”sÐ+Ó,Ó,ÜÐDÜ˜x›=¬#Ð.>Ó*?Ð@ñAó Cð 	Cô
 ‡J‚J„Lô Ð Ó! DÑ(€EÜ�IŠI‹K˜%Ñ€EàÑð $ BÑ'¨Ñ+¨AÑ.°Ñ@ˆä	Ð
)¨EÑ
1Ü�z‰zòä	Ð
+¨xÑ/?Ñ
@Ü�z‰zòä	Ð
  8Ñ
+Ü�z‰zòð Ñ
˜SÑ
 €Cä
‡K�KÐHÜÐ!Ó" HÐ-ñ.ô /ð ×Ñ˜Ü.1Ð2BÓ.CÜ(+Ñ+MÑ<LÓ+MÓ(Mð ñ Oð €HðY7ÞÜ# H¸Ø/=ñ?ˆCàˆH�S‰MäÐ/Ö0‰EˆAˆrØ˜q‘kˆGØ˜A™ˆIÜ$ R¨¸À)ÓLˆCØ%ˆH�S‹Mñ	 1ô �IŠI‹KˆÜÐ<Ø�5‰y˜5Ñ  ! e¡)Ð,ñ-ä—:‘:ò	ô �iŠi‹k˜CÓ¦HÜ�JŠJ�uÔðÜ Ÿjšj¨¬R¯Z©ZÓ8‘��Vö
 Ø—L‘L  dÓ+�Ü “?Üð 'à ¤C¨£MÐ2ñ3ä:=¿*¹*òFö %¨°1«Øô �iŠi‹k˜CÓ§H Hð* 	×Ñ˜LÜ58¸³]ð 	ñ 	Dô ˆAÜÐ1Ü˜“M 1Ð%ñ&Ü-0¯Z©Zò9ã�ðÜ—G’G˜C –Oñ  ô �JŠJ�sŒOÜ—)’)“+ ‘/ˆCÞðÜ"$§*¢*¨R´·±Ó"<‘K�C˜ð ˜!“8Ø Ÿ™ S¨$Ó/�AØ‘yÜÐ<¸xÑGÔHÜŸ
™
×(Ñ(Ô*ÜŸ
™
×(Ñ(Ô*ÜŸš œÜð &à˜s¤C¨£MÐ2ñ3ô  #Ÿz™zò+ô —9’9“; #Ó%Ø÷% �(ö( ÙÜ�JŠJ�q�MñC öF ÜÐ+¬c°(«mÑ;Ü—z‘zò#ð	7Ü�IŠI�a˜�OøôC ó Ø—7‘7œfÓ$ØÞûðûô ó ÜÐ#¬#¯*©*Ò5Ü×Ò×ðûô ó Ø—w‘w¤%Ó'Øö (ûðûô ó Ø—w‘w¤&Ó(Øõ )ûðûô@ !ó 	7ÜÐ$¬3¯:©:Ô6ð	7ûðc 	×Ñ˜LÜ58¸³]ð 	ñ 	Dô ˆAÜÐ1Ü˜“M 1Ð%ñ&Ü-0¯Z©Zò9ã�ðÜ—G’G˜C –OøÜó Ø—w‘w¤%Ó'Øõ (ûðúñ  ô �JŠJ�sŒOÜ—)’)“+ ‘/ˆCßðÜ"$§*¢*¨R´·±Ó"<‘K�C™øÜó Ø—w‘w¤&Ó(Øô )ûðúð ˜!“8Ø Ÿ™ S¨$Ó/�AØ‘yÜÐ<¸xÑGÔHÜŸ
™
×(Ñ(Ô*ÜŸ
™
×(Ñ(Ô*ÜŸš œÜð &à˜s¤C¨£MÐ2ñ3ô  #Ÿz™zò+ô —9’9“; #Ó%Ø÷% ‘(ö( ÙÜ�JŠJ�q�MñC öF ÜÐ+¬c°(«mÑ;Ü—z‘zò#ð	7Ü�IŠI�a˜�OøÜ ó 	7ÜÐ$¬3¯:©:Ô6ð	7ýs%  Å
B:S È(R È-AS ÊV Ê S Ë2TÍ(T2Ò U Ò
SÒ"R>Ò7S Ò;V Ò>SÓS Ó7TÓ=V Ô TÔV Ô
T/ÔT*Ô*T/Ô2
UÔ<UÕUÕ"VÖVÖA_=×W,×*_=×,
X×6XØ_=ØXØ;_=Ù(Y;Ù:_=Ù;
Z$	ÚZ	Ú_=ÚZ$	Ú$C_=Ý-A_=Þ=_ß_=ß"_:ß7_=ß9_:ß:_=c                 ó<   • [        5       n[        SU -  US/UUS9nU$ )Nr	  zmodules:paged_searches)r
  r  Úoptionsr  rð   )r   r   )rn  rï   rð   r2  r$  s        rY   ÚopenLdbrw    s1   € ÜÓ€GÜ
�K $Ñ&Ø$Ø1Ð2Ø!Øñ	€Cð
 €Jr[   c                 ó.   • SUU R                   " 5       4-  $ )z(Generate an ou name from the instance idz#ou=instance-%d,ou=traffic_replay,%s)r#  )r$  rù   s     rY   Úou_namery    s"   € à0°KØ47·M²M³Oð4Eñ Eð Er[   c                 óL  • [        X5      n U R                  " UR                  SS5      S   SS.5         U R                  " USS.5        U$ ! [         a  nUR                  u  pEUS:w  a  e  SnAN<SnAff = f! [         a   nUR                  u  pEUS:w  a  e  SnAU$ SnAff = f)z‡Create an ou, all created user and machine accounts will belong to it.

This allows all the created resources to be cleaned up easily.
r  r_   Úorganizationalunit)r  ÚobjectclasséD   N)ry  Úaddr–   r   rX   ©r$  rù   rò   rË   rQ  rÀ   s         rY   Ú	create_our€    s·   € ô
 
�Ó	"€BðØ�Š�r—x‘x  QÓ'¨Ñ*Ø 4ñ6ô 	7ðØ�Š�rØ 4ñ6ô 	7ð €Iøô ó Ø—f‘f‰ˆà�R‹<Øô ûðûô ó Ø—f‘f‰ˆà�R‹<Øó à€Iûðús.   �(A ¶A9 Á
A6ÁA1Á1A6Á9
B#ÂBÂB#ÚConversationAccounts)rN  rO  rP  rQ  c                 óž   • / n[        SUS-   5       H7  n[        X5      n[        X5      n[        XcUU5      nUR	                  U5        M9     U$ )z;Generate a series of unique machine and user account names.r_   )r-  Úmachine_namer>  r�  r)  )	r$  rù   ÚnumberÚpasswordro  r8  rN  rP  rY  s	            rY   Úgenerate_replay_accountsr†  ;  sV   € ð €HÜ�1�f˜q‘jÖ!ˆÜ# KÓ3ˆÜ˜[Ó,ˆä& |¸xØ'/ó1ˆà�‰˜Ö ñ "ð €Or[   c                 óø   • [        X5      nSU< SU< 3nS[        U5      -  R                  S5      nU(       a  [        [        [
        -  5      nO[        [        5      nU R                  " USSU-  UUS.5        g)	z"Create a machine account via ldap.rF  r  ú"%s"ú	utf-16-leÚcomputerz%s$©r  r|  ÚsAMAccountNameÚuserAccountControlÚ
unicodePwdN)ry  r!   Úencoder&  r   r   r   r~  )	r$  rù   rN  rO  Útraffic_accountrò   r  Úutf16pwÚaccount_controlss	            rY   Úcreate_machine_accountr“  I  s€   € ô 
�Ó	"�BÛ#¢RÐ	(€BØœ
 ;Ó/Ñ/×7Ñ7¸ÓD€Gæô Ô8Ü6ñ 7ó 8Ñô Ô;Ó<Ðà‡G‚GØØ!Ø ,Ñ.Ø.Øñõ  r[   c                 ó  • [        X5      nSU< SU< 3nS[        U5      -  R                  S5      nU R                  " USU[	        [
        5      US.5        [        R                  " U 5      nUR                  US5        g)	zCreate a user account via ldap.rF  r  rˆ  r‰  Úuserr‹  z(A;;WP;;;PS)N)	ry  r!   r�  r~  r&  r   r    ÚSDUtilsÚdacl_add_ace)r$  rù   rP  rQ  rò   rV  r‘  Úsdutilss           rY   Úcreate_user_accountr™  b  sx   € ä	�Ó	"�BÛ$¢bÐ)€GØœ
 8Ó,Ñ,×4Ñ4°[ÓA€GØ‡G‚GØØØ"Ü!Ô"3Ó4Øñô ô ×Ò˜sÓ#€GØ×Ñ˜ .Õ1r[   c                 óZ   • [        X5      nSU< SU< 3nU R                  " USUS.5        g)zCreate a group via ldap.rF  r  Úgroup)r  r|  rŒ  N)ry  r~  )r$  rù   rM   rò   r  s        rY   Úcreate_grouprœ  t  s2   € ô 
�Ó	"�BÛšRÐ	 €BØ‡G‚GØØØñõ r[   c                 ó   • SX4-  $ )z-Generate a user name based in the instance idz
STGU-%d-%drq   ©rù   r8  s     rY   r>  r>  €  ó   € à˜;Ð*Ñ*Ð*r[   c                 óŠ   • U R                   " SR                  U5      U/S9nU Vs1 s H  n[        XB   5      iM     sn$ s  snf )z(Search objectclass, return attr in a setz(objectClass={}))r  r  )r"  r  r&  )r$  r|  ÚattrÚobjsÚobjs        rY   Úsearch_objectclassr¤  …  sC   € à�:Š:Ø%×,Ñ,¨[Ó9Øˆfñ€Dñ '+Ó+¢d˜sŒC�‘	ŽN¡dÑ+Ð+ùÒ+s   ¦A c                 óÔ   • [        U SS9nSn[        USS5       HJ  n[        X5      nXt;  d  M  [        XXs5        US-  nUS-  S:X  d  M1  [        R                  SXR4-  5        ML     U$ )zAdd users to the serverr•  ©r|  r   rƒ  r_   é2   zCreated %u/%u users)r¤  r-  r>  r™  rà   rJ  )r$  rù   r„  r…  Úexisting_objectsÚusersr8  rM   s           rY   Úgenerate_usersrª  Ž  sp   € ä)¨#¸6ÑBÐØ€EÜ�6˜1˜bÖ!ˆÜ˜Ó(ˆØÕ'Ü °$ÔAØ�Q‰JˆEØ�r‰z˜Q�Ü—‘Ð1°U°OÑCÖDñ "ð €Lr[   c                 ó(   • U(       a  SX4-  $ SX4-  $ )z1Generate a machine account name from instance id.z
STGM-%d-%dzPC-%d-%drq   )rù   r8  r�  s      rY   rƒ  rƒ  �  s%   € æð ˜{Ð.Ñ.Ð.ð ˜[Ð,Ñ,Ð,r[   c                 óà   • [        U SS9nSn[        USS5       HP  n[        XU5      nUS-   U;  d  M  [        XXƒU5        US-  nUS-  S:X  d  M7  [        R                  SXb4-  5        MR     U$ )	z"Add machine accounts to the serverrŠ  r¦  r   rƒ  rv  r_   r§  zCreated %u/%u machine accounts)r¤  r-  rƒ  r“  rà   rJ  )	r$  rù   r„  r…  r�  r¨  Úaddedr8  rM   s	            rY   Úgenerate_machine_accountsr®  ¬  s€   € ô *¨#¸:ÑFÐØ€EÜ�6˜1˜bÖ!ˆÜ˜K¨OÓ<ˆØ�#‰:Ð-Õ-Ü" 3°TØ#2ô4à�Q‰JˆEØ�r‰z˜Q�Ü—‘Ð<À¸ÑNÖOñ "ð €Lr[   c                 ó   • SX4-  $ )z'Generate a group name from instance id.z
STGG-%d-%drq   rž  s     rY   Ú
group_namer°  ½  rŸ  r[   c                 óÔ   • [        U SS9nSn[        USS5       HJ  n[        X5      nXc;  d  M  [        XU5        US-  nUS-  S:X  d  M1  [        R                  SXB4-  5        ML     U$ )z3Create the required number of groups on the server.r›  r¦  r   rƒ  r_   rB  zCreated %u/%u groups)r¤  r-  r°  rœ  rà   rJ  )r$  rù   r„  r¨  Úgroupsr8  rM   s          rY   Úgenerate_groupsr³  Â  sr   € ä)¨#¸7ÑCÐØ€FÜ�6˜1˜bÖ!ˆÜ˜+Ó)ˆØÕ'Ü˜¨4Ô0Ø�a‰KˆFØ˜‰} Õ!Ü—‘Ð2°fÐ5EÑEÖFñ "ð €Mr[   c                 óœ   • [        X5      n U R                  " US/5        g! [         a  nUR                  u  pEUS:w  a  e  SnAgSnAff = f)z7Remove the created accounts and groups from the server.ztree_delete:1é    N)ry  Údeleter   rX   r  s         rY   Úclean_up_accountsr·  Ñ  sL   € ä	�Ó	"€BðØ�
Š
�2˜Ð(Õ)øÜó Ø—f‘f‰ˆà�R‹<Øô ûðús   �" ¢
A¬AÁAc	                 ó4  • Sn	Sn
Sn[        X5        [        R                  S5        [        XX25      n[        R                  S5        [	        XXrU5      nUS:”  a!  [        R                  S5        [        XU5      n
US:”  aV  [        R                  S5        [        UU
UUUU5      n[        R                  S5        [        XU5        UR                  5       n	U
S:”  a   US:X  a  XJ:w  a  [        R                  S5        [        R                  SXËU
U	4-  5        g	)
zMGenerate the required users and groups, allocating the users to
those groups.r   zGenerating dummy user accountsz!Generating dummy machine accountszGenerating dummy groupszAssigning users to groupszAdding users to groupsz(The added groups will contain no membersz:Added %d users (%d machines), %d groups and %d membershipsN)
r€  rà   rJ  rª  r®  r³  ÚGroupAssignmentsÚadd_users_to_groupsr”  Úwarning)r$  rù   r…  Únumber_of_usersÚnumber_of_groupsÚgroup_membershipsÚmax_membersÚmachine_accountsÚtraffic_accountsÚmemberships_addedÚgroups_addedÚcomputers_addedÚusers_addedÚassignmentss                 rY   Úgenerate_users_and_groupsrÇ  Ý  s  € ð ÐØ€LØ€OäˆcÔä
‡K�KÐ0Ô1Ü  °?ÓM€Kä
‡K�KÐ3Ô4Ü/°Ø0@Ø0@óB€Oð ˜!ÓÜ�‰Ð-Ô.Ü& sÐ9IÓJˆà˜1ÓÜ�‰Ð/Ô0Ü&Ð'7Ø'3Ø'6Ø'2Ø'8Ø'2ó4ˆô 	�‰Ð,Ô-Ü˜C¨kÔ:Ø'×-Ñ-Ó/Ðà�qÓ˜[¨AÓ-ØÓ'Ü�‰ÐAÔBä
‡K�KÐLØ¨|Ø"ð$ñ$õ %r[   c                   óV   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)r¹  i
  c                 ó°   • SU l         U R                  U5        U R                  X55        X`l        [	        [
        5      U l        U R                  XUXE5        g )Nr   )r¬  Úgenerate_group_distributionÚgenerate_user_distributionr¿  r   r+  rÆ  Úassign_groups)rŽ   r½  rÃ  r¼  rÅ  r¾  r¿  s          rY   r�   ÚGroupAssignments.__init__  sQ   € ð ˆŒ
Ø×(Ñ(Ð)9Ô:Ø×'Ñ'¨ÔKØ&ÔÜ&¤tÓ,ˆÔØ×ÑÐ+¸?Ø&õ	;r[   c                 ór   • / n[        U5      nUS:X  a  g SnU H  nXE-  nUR                  XC-  5        M     U$ )Nr   r¸   )rd  r)  )rŽ   ÚweightsÚdistr”  Ú
cumulativeÚprobabilitys         rY   Úcumulative_distributionÚ(GroupAssignments.cumulative_distribution  sI   € ð ˆÜ�G“ˆØ�A‹:Øàˆ
Û"ˆKØÑ%ˆJØ�K‰K˜
Ñ*Ö+ñ #ð ˆr[   c                 óè   • US:”  a  SnOUS:”  a  SnOUS:”  a  SnOSn/ n[        SUS-   5       H*  n[        R                  " U5      nUR                  U5        M,     U R	                  U5      U l        g	)
zAProbability distribution of a user belonging to a group.
        i@KL g      @i€„ g      @ià“ g      @g      ü?r_   N)r-  r=  Úparetovariater)  rÓ  Ú	user_dist)rŽ   Ú	num_usersÚnum_membershipsÚshaperÏ  rt   rn   s          rY   rË  Ú+GroupAssignments.generate_user_distribution'  sz   € ð ˜WÓ$Ø‰EØ˜wÓ&Ø‰EØ˜vÓ%Ø‰EàˆEàˆÜ�q˜) a™-Ö(ˆAÜ×$Ò$ UÓ+ˆAØ�N‰N˜1Öñ )ð
 ×5Ñ5°gÓ>ˆ�r[   c                 óž   • / n[        SUS-   5       H  nSUS-  -  nUR                  U5        M     X l        U R                  U5      U l        g)z6Probability distribution of a group containing a user.r_   gÍÌÌÌÌÌô?N)r-  r)  Úgroup_weightsrÓ  Ú
group_dist)rŽ   r<  rÏ  rt   rn   s        rY   rÊ  Ú,GroupAssignments.generate_group_distributionA  sP   € ð
 ˆÜ�q˜!˜a™%–ˆAØ�Q˜‘V‘ˆAØ�N‰N˜1Öñ !ð
 %ÔØ×6Ñ6°wÓ?ˆ�r[   c                 óØ   • [         R                   " U R                  [        R                  " 5       5      n[         R                   " U R                  [        R                  " 5       5      nX4$ )z2Returns a randomly generated user-group membership)Úbisectr×  r=  rÞ  ©rŽ   r•  r›  s      rY   Úgenerate_random_membershipÚ+GroupAssignments.generate_random_membershipO  s@   € ô �}Š}˜TŸ^™^¬V¯]ª]«_Ó=ˆÜ—’˜dŸo™o¬v¯}ª}«Ó?ˆàˆ{Ðr[   c                 ó    • U R                   U   $ r�   )rÆ  )rŽ   r›  s     rY   Úusers_in_groupÚGroupAssignments.users_in_group[  s   € Ø×Ñ Ñ&Ð&r[   c                 ó6   • U R                   R                  5       $ r�   )rÆ  r,  r¨   s    rY   Ú
get_groupsÚGroupAssignments.get_groups^  s   € Ø×Ñ×$Ñ$Ó&Ð&r[   c                 óî   • [        U R                  U   5      nX2:¼  aX  [        R                  SR	                  X5      5        SU R
                  US-
  '   U R                  U R
                  5      nX@l        gg)z?Prevent the group's membership from exceeding the max specifiedzGroup {0} has {1} membersr   r_   N)r
  rÆ  rà   rJ  r  rÝ  rÓ  rÞ  )rŽ   r›  r¿  Únum_membersÚnew_dists        rY   Úcap_group_membershipÚ%GroupAssignments.cap_group_membershipa  sk   € ä˜$×*Ñ*¨5Ñ1Ó2ˆØÓ%Ü�K‰KÐ3×:Ñ:¸5ÓNÔOð -.ˆD×Ñ˜u q™yÑ)Ø×3Ñ3°D×4FÑ4FÓGˆHØ&�Oð &r[   c                 óè   • XR                   U   ;  a3  U R                   U   R                  U5        U =R                  S-  sl        U R                  (       a  U R	                  X R                  5        g g )Nr_   )rÆ  r)  r¬  r¿  rî  râ  s      rY   Úadd_assignmentÚGroupAssignments.add_assignmentm  s_   € ð ×'Ñ'¨Ñ.Ó.Ø×Ñ˜UÑ#×*Ñ*¨4Ô0Ø�JŠJ˜!‰O�Jð ××Ø×%Ñ% e×-=Ñ-=Õ>ð r[   c                 ó®  • US::  a  g[         R                  " [        U5      [        U5      [        U5      -  -  5      nU R                  (       a  [	        UU R                  U-  5      nX4-
  S-
  nX-
  S-
  nU R                  5       U:  aK  U R                  5       u  p‰X—:”  d  X†:”  a  U R                  US-   U	S-   5        U R                  5       U:  a  MJ  gg)zãAllocate users to groups.

The intention is to have a few users that belong to most groups, while
the majority of users belong to a few groups.

A few groups will contain most users, with the remaining only having a
few users.
r   Nr_   )rŽ  Úceilr—   r¿  ri  r”  rã  rñ  )
rŽ   r½  rÃ  r¼  rÅ  r¾  Úexisting_usersÚexisting_groupsr•  r›  s
             rY   rÌ  ÚGroupAssignments.assign_groupsy  sÚ   € ð  Ó!Øô !ŸIšIÜÐ#Ó$Ü�;Ó¤%¨Ó"8Ñ8ñ:ó;Ðð ××Ü #Ð$5Ø$(×$4Ñ$4Ð7GÑ$Gó!IÐð *Ñ8¸AÑ=ˆØ*Ñ9¸AÑ=ˆØ�j‰j‹lÐ.Ó.Ø×9Ñ9Ó;‰KˆDàÓ&¨$Ó*?ð ×#Ñ# D¨1¡H¨e°a©iÔ8ð �j‰j‹lÐ.×.r[   c                 ó   • U R                   $ r�   ©r¬  r¨   s    rY   r”  ÚGroupAssignments.totalš  s   € Ø�z‰zÐr[   )rÆ  r¬  rÞ  rÝ  r¿  r×  N)ry   rz   r{   r|   r�   rÓ  rË  rÊ  rã  ræ  ré  rî  rñ  rÌ  r”  r}   rq   r[   rY   r¹  r¹  
  s;   † ò	;òò"?ò4@ò
ò'ò'ò
'ò
?ò9õBr[   r¹  c                 ól  • UR                  5       nSnSnUR                  5        HŒ  nUR                  U5      n[        U5      S:X  a  M%  [	        S[        U5      S5       HM  nXxUS-    n	[        XXi5        U[        U	5      -  nUS-  nUS-  S:X  d  M4  [        R                  SXS4-  5        MO     MŽ     g)zDTakes the assignments of users to groups and applies them to the DB.r   rB  r_   r§  zAdded %u/%u membershipsN)r”  ré  ræ  r
  r-  Úadd_group_membersrà   rJ  )
r3  rù   rÆ  r”  r¬  r­  r›  ræ  ÚchunkÚchunk_of_userss
             rY   rº  rº  ž  s¸   € ð ×ÑÓ€EØ€EØ€Eà×'Ñ'Ö)ˆØ$×3Ñ3°EÓ:ˆÜˆ~Ó !Ó#Ùô
 ˜1œc .Ó1°4Ö8ˆEØ+°%¸$±,Ð?ˆNÜ˜b¨uÔEà”S˜Ó(Ñ(ˆEØ�Q‰JˆEØ�r‰z˜Q�Ü—‘Ð5¸¸ÑFÖGó 9ò *r[   c                 ól  ^
• [        X5      m
U
4S jnU" [        X5      5      n[        R                  " 5       n[        R                  " X5      Ul        U HJ  nU" [        X5      5      nS[        U5      -   n	[        R                  " U[        R                  S5      Xi'   ML     U R                  U5        g)z(Adds the given users to group specified.c                 ó   >• SU < ST< 3$ )NrF  r  rq   )rM   rò   s    €rY   Úbuild_dnÚ#add_group_members.<locals>.build_dn»  s   ø� Û!¢2Ð&Ð'r[   zmember-ÚmemberN)ry  r°  r$  ÚMessageÚDnr  r>  r&  ÚMessageElementÚFLAG_MOD_ADDÚmodify)r3  rù   r›  ræ  r  Úgroup_dnÚmr•  rV  Úidxrò   s             @rY   rü  rü  ¶  s�   ø€ ô 
�Ó	!€Bõ(ñ œ
 ;Ó6Ó7€HÜ�Š‹€AÜ�6Š6�"Ó€A„DãˆÙœ9 [Ó7Ó8ˆØœ#˜d›)Ñ#ˆÜ×#Ò# G¬S×-=Ñ-=¸xÓHˆ‹ñ ð
 ‡I�Iˆa…Lr[   c                 ó\  • [         R                  R                  nSnSnSn0 n[        5       n[	        5       nUb  UR
                  n	OS n	U	" S5        SSSS.n
SSSS.n[        R                  " U 5       GH  n[        R                  R                  X5      n[        US5       nU HÉ  n UR                  S5      R                  S	5      nUS
   nUS   nUS   n[        US   5      n[        US   5      n[        UU-
  U5      n[        UU5      nUU4nUR                  U/ 5      R!                  U5        US   S:X  a  US
-  nOUS
-  nUU==   S
-  ss'   UR#                  U5        U	" U5        MË     SSS5        GM
     X2-
  nUS:X  a  SnOUU-  nUS:X  a  SnOUU-  n[/        U5      n[+        SU-  5        [+        SUU4-  5        [+        SUU4-  5        [1        U
R3                  5       5       H)  u  nn[+        SUR5                  SS5      S-   U4-  5        M+     [1        UR3                  5       5       H)  u  nn[+        SUR5                  SS5      S-   U4-  5        M+     [+        S5        0 nU H-  u  nnUU;  a  [	        5       UU'   UU   R#                  U5        M/     [1        UR7                  5       5      n U  H¥  n[1        UU   [8        S9n!U! H‹  nUU4nUU   n"[1        U"5      n"[/        U"5      n#UU   n[;        U"5      U#-  n$[=        U"S5      n%[=        U"S5      n&U"S   U"S   -
  n'U"S   n([>        RA                  US5      n)[+        SUUU)U#UU$U%U&U'U(4
-  5        M�     M§     g! [$        [&        4 až    SU;   a{  UR                  SS
5      u  nnUU
;   a  [        [        U5      U
U   5      U
U'    GM  UU;   a  [        [)        U5      UU   5      UU'    GM9  [+        U[         R,                  S9   GMU  [+        U[         R,                  S9   GMq  f = f! , (       d  f       GM·  = f) z/Generate and print the summary stats for a run.r   Nc                 ó   • g r�   rq   )rt   s    rY   ÚtwÚgenerate_stats.<locals>.twÖ  s   € Ør[   z2time	conv	protocol	type	duration	successful	error
)zMaximum lagz	Start lagzMax sleep miss)r]  r^  r`  r5  r’   r“   r_   r#   r|  rB  r  ÚTruer³   rO   zTotal conversations:   %10dz-Successful operations: %10d (%.3f per second)z-Failed operations:     %10d (%.3f per second)z%-28s %frÀ   r^   z%-28s %dz“Protocol    Op Code  Description                                Count       Failed         Mean       Median          95%        Range          Max)r»   rb  gffffffî?rƒ  rŸ   z?%-12s   %4s  %-35s %12d %12d %12.6f %12.6f %12.6f %12.6f %12.6f)!rS   Ú
float_inforj  r   rS  ÚwriterÔ  ÚlistdirrÕ  r    rÖ  r•   r–   r—   ri  r(  r)  r~  r©  Ú
IndexErrorr˜   rR   rT   r
  Úsortedr×  Úreplacer,  Ú
opcode_keyrd  Úcalc_percentiler  rø   )*rõ   Útiming_filer“  r•  Ú
successfulÚfailedÚ	latenciesÚfailuresÚunique_conversationsr  Úfloat_valuesÚ
int_valuesrÙ  rÕ  r]  rš   r›   rÇ   r‡   Úpacket_typeÚlatencyr¢   Úopr7  rÛ  rÍ   Úsuccess_rateÚfailure_raterq  ÚopsÚprotorþ  Ú	protocolsÚpacket_typesrl  r¬  ÚmeanÚmedianÚ
percentileÚrngÚmaxvr‰   s*                                             rY   Úgenerate_statsr/  Ê  sb  € ä—‘×#Ñ#€EØ€DØ€JØ€FØ€IÜ“€HÜ›5ÐØÑØ×Ñ‰ò	ñ ÐBÔCð ØØñ€Lð "#ØØ$%ñ€Jô —J’J˜x×(ˆÜ�w‰w�|‰|˜HÓ/ˆÜ�$˜Œ_ Û�ð"5Ø#'§;¡;¨tÓ#4×#:Ñ#:¸4Ó#@�FØ#)¨!¡9�LØ#)¨!¡9�HØ#)¨!¡9�KÜ#(¨°©Ó#3�GÜ˜f Q™iÓ(�AÜ#& q¨7¡{°EÓ#:�EÜ#& q¨$£<�Dà" KÐ0�BØ×(Ñ(¨¨RÓ0×7Ñ7¸Ô@Ø˜a‘y FÓ*Ø" a™™
à !™˜Ø  ›¨Ñ)›à(×,Ñ,¨\Ô:á�t–Hñ+ ÷ Š_ñ )ðP ‰|€HØ�QƒØ‰à! HÑ,ˆØ�ƒ{Ø‰à Ñ(ˆäÐ,Ó-€Mä	Ð
'¨-Ñ
7Ô8Ü	Ð
9Ø˜Ð&ñ'ô (ä	Ð
9Ø�\Ð"ñ#ô $ô �|×)Ñ)Ó+Ö,‰ˆˆ1Üˆj˜AŸI™I c¨3Ó/°#Ñ5°qÐ9Ñ9Ö:ñ -ä�z×'Ñ'Ó)Ö*‰ˆˆ1Üˆj˜AŸI™I c¨3Ó/°#Ñ5°qÐ9Ñ9Ö:ñ +ô 
ð *ô +ð €CÛ"‰ˆˆvØ˜ÓÜ›ˆC�‰JØˆE‰
�‰�vÖñ #ô �s—x‘x“zÓ"€IãˆÜ˜c (™m´Ñ<ˆÛ'ˆKØ˜KÐ(ˆBØ" 2™ˆFÜ ›ˆFÜ˜V›ˆEØ! "™ˆFÜ˜V› uÑ,ˆDÜ(¨°Ó6ˆFÜ(¨°Ó6ˆJØ ™ f¨Q¡iÑ/ˆCØ ™ˆDÜ(×,Ñ,¨R°Ó4ˆDÜð 0àØ ØØØØØØØØð	ñö ó (ò øôc #¤JÐ/ó 5Ø˜d“{Ø#Ÿz™z¨#¨qÓ1™˜˜1Ø Ó,Ü.1´%¸³(Ø2>¸q±/ó/C˜L¨�Oà *›_Ü,/´°A³Ø0:¸1±ó-?˜J q�Mô " $¬S¯Z©ZÖ8ô ˜d¬¯©Ö4ð5ú÷/ �_úsV   Â#PÂ*CM*Å/PÍ*AP	Î6PÎ:!P	ÏPÏP	Ï7PÏ;P	ÐPÐP	ÐPÐ
P+	c                 óD   •  S[        U 5      -  $ ! [         a    U s $ f = f)zCSort key for the operation code to ensure that it sorts numericallyz%03d)r˜   r©  )rÛ  s    rY   r  r  L	  s)   € ðØœ˜A›‰ÐøÜó ØŠðús   ‚ �žc                 ó  • U (       d  g[        U 5      S-
  U-  n[        R                  " U5      n[        R                  " U5      nX4:X  a  U [	        U5         $ U [	        U5         XB-
  -  nU [	        U5         X#-
  -  nXV-   $ )zlCalculate the specified percentile from the list of values.

Assumes the list is sorted in ascending order.
r   r_   )r
  rŽ  Úfloorrô  r˜   )rl  r,  r7  r]  r†  Úd0Úd1s          rY   r  r  T	  sx   € ö ØÜ	ˆV‹�q‰˜JÑ&€AÜ�
Š
�1‹€AÜ�	Š	�!‹€AØƒvØ”c˜!“f‰~ÐØ	”�A“‰˜1™5Ñ	!€BØ	”�A“‰˜1™5Ñ	!€BØ‰7€Nr[   c                  óÄ   • [         R                  R                  " U 6 n[         R                  " S5      n[         R                  " U5        [         R                  " U5        U$ )zqIn a testenv we end up with 0777 directories that look an alarming
green colour with ls. Use umask to avoid that.é?   )rÔ  rÕ  r    ÚumaskÚmkdir)rÕ  r£  Úmasks      rY   rR  rR  f	  s>   € ô 	�‰�Š�dÐ€AÜ�8Š8�E‹?€DÜ‡H‚HˆQ„KÜ‡H‚HˆT„NØ€Hr[   rù  )r_   r#   )r_   r�   )	NNNNr   NNr%   F)T)r•  rŒ  )yrÅ   rÔ  r=  r¡  rŽ  rS   r>  rh  r   r   Úcollectionsr   r   r   r   Údns.resolverr	   rX  Úsamba.emulater
   Úsamba.samdbr   r$  r   Úsamba.dcerpcr   r   r   r   r   Úsamba.dcerpc.netlogonr   r   r   Úsamba.drs_utilsr   ra   Úsamba.credentialsr   r   r   Ú
samba.authr   Ú
samba.dsdbr   r   r   r   Úsamba.dcerpc.miscr   Úsambar   r    Úsamba.commonr!   Úsamba.loggerr"   rá  r   r¨  r  rŒ  r¹   rº   rß   r�  r�  r³  rQ   ry   rà   rZ   rf   ru   rÆ   rw   Úobjectr   r×   rç   ré   r»  ró  r1  rt  ry  r~  r€  r‚  rÏ  r  r  r:  r@  rT  rX  r_  rw  ry  r€  r�  r†  r“  r™  rœ  r>  r¤  rª  rƒ  r®  r°  r³  r·  rÇ  r¹  rº  rü  r/  r  r  rR  rq   r[   rY   Ú<module>rI     sM  ðó( Û 	Û Û Û Û 
Û ß ç EÓ EÝ +å )Ý Û 
Ý Ý )ß /Ñ /Ý !Ý 4Ý Ý Ý &Û ß OÑ OÝ %÷ó õ +Ý Ý Ý #Ý )Û àÐ ØÐ Ø€ð €
ð ØØØØØØØØñ
€ð ØØØØØØØñ	€ò ?Ð à€
Ø˜
Ñ"€Ø"Ð ð €á	˜xÑ	(€ò6ò$
òô0	�iô 	ôO<ˆVô O<òdò,.ô$^�Fô ^ôB�&ô ô>d*�6ô d*ôNKW�ô KWõ\2Bòj+òòô_�6ô _õDðØ	ˆ4ðà�Dðð �ðð 
ˆ4ð	ð
 ˆDðð ˆDðð ˆTðð ˆdðð ˆDðð ˆdðð 
ˆ4ðð ˆtðð ˆtðð �Dðð ˆdðð  ˆDð!€ð&_ØÐ3ð_àÐ6ð_ð Ð:ð_ð Ð9ð	_ð
 Ð?ð_ð Ð;ð_ð �Oð_ð �Oð_ð �Yð_ð �fð_ð �jð_ð �jð_ð �oð_ð Ð*ð_ð �gð_ð  �Zð!_ð" �'ñ#_ð$ �*ð%_ð& �hð'_ð( �~ð)_ð* Ð*ð+_ð, �jð-_ð. �oð/_ð0 Ð&ð1_ð2 Ð+ð3_ð4 �%ð5_ð6 �bð7_ð8 �=ð9_ð: �>ð;_ð< �?ð=_ð> �?ð?_ð@ Ð#ðA_ðB �?ðC_ðD Ð#òE_ðF Ð'ðG_ðH Ð&ðI_ðJ Ð7ðK_ðL Ð0ðM_ðN Ð%ðO_ðP Ð'ðQ_ðR Ð(ðS_ðT �7ðU_ðV �:ðW_ðX Ð4ðY_ðZ Ð5ð[_ð\ Ð4ð]_ð^ Ð4ð__ð` Ð1ða_ðb Ð6ðc_ðd Ð8ðe_ðf Ð3òg_ðh �Iði_ðj Ð(ðk_ðl �Mðm_ðn �Lðo_ðp �Kðq_ðr �7ðs_ðt Ð&ðu_ðv �Jðw_ðx �Oðy_ðz Ð&ð{_ð| �?ð}_ð~ �>ð_ð@ �JðA_ðB �=ðC_ðD �<ðE_ðF Ð$ðG_ðH �^òI_ðJ Ð*ðK_ðL Ð'ðM_ðN �_ðO_ðP Ð-ðQ_ðR Ð0ðS_ðT Ð0ðU_ðV Ð)ðW_ðX Ð/ðY_ðZ Ð,ð[_ð\ Ð&ð]_ð^ �Gð__ð` �Fða_ðb �Iðc_ðd �Gðe_ðf �>ðg_ðh �?ði_ðj �=ñk_ðl $ØØØØDð 5à'Ø%ò}_€òDòõ<õ~ðF ØØØØØØØØ"õP7òfòEóñ: "Ñ"8ñ#/ó0Ð óð ,0ö ó22ó$	ó+ö
,óö-ð  /3öó"+ó
ó	ð BFö*%öZQ�vô QóhHó0ó(óDóô$r[   