
    h,u                       d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZmZmZmZmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZH ddlImJZJ ddlKmLZL ddlMmNZNmOZO ddlPmQZQmRZRmSZSmTZT ddlUmVZV ddlWmXZXmYZYmZZZm[Z[ ddl\m]Z] dZ^dZ_i ddddddddddd d!d"d#d$d%dd&d'd(d)d*d+d,d-d.d/d0d1d2d3d4dd5d6d7d8d9Z`g d:Zag d;Zb ed<          d= ed>          d? ed@          dA edB          dCiZci Zdi Ze G dD dEe          ZfdF Zg G dG dHeX          Zh G dI dJe          Zi eeVeidKL            eeVeidKM            G dN dOe          Zj e dPdddQdRg           e dSdddTdUg           e"dVdg dW           e#dXd          gZk G dY dZei          Zl G d[ d\e          Zm G d] d^e          Zn G d_ d`e          Zo G da dbe          ZpepZq G dc dde          ZrdeZs G df dge          Zt G dh die          Zu G dj dke          Zv G dl dme          Zw G dn doe          Zx G dp dqe2          ZydrdsdtdudvdwdxdydzZzez{                                Z|d{e|d<   i d|d}d~dddddddddddddddddddddddddddddddi dddddddddddddddddddddddddddddddddddddddddddddddddΜZ}dddddddddddٜ
Z~ G dڄ dei          Z G d܄ deY          Z G dބ deY          Z G d deY          Z G d deY          Z G d deY          Z G d dej          Z eeed+            G d dej          Z eeed-            G d deY          Z G d dej          Z eeed/            G d dej          Z eeed1            G d dej          Z eeed3            G d de          Z eeed            G d dej          Z eeed            G d dej          Z eeed            G d dej          Z eeed            ej        dddg          Zi Z G d d          Zd Zd Zi Z G d  d          Zd Zd Zd Z G d de          Z G d d          Z G d	 d
ee6          Z G d de&          Z G d de
          Z G d dee          Z G d d          Z G d dee&          Z G d dee#          Z G d dee9          Z G d de          Z G d de          Z G d de          Z G d  d!e          Z G d" d#e          Z G d$ d%e          Z G d& d'e          Z G d( d)e          Z G d* d+e          Z G d, d-ee%          Z G d. d/e          Z G d0 d1ee          Z G d2 d3e          Z G d4 d5e          Z G d6 d7e          Z G d8 d9e          Z G d: d;e          Z G d< d=e          Z G d> d?ee2          Z G d@ dAee          Z G dB dCee4          Z G dD dEee(          Z G dF dGe          Z G dH dIe          Z G dJ dKe          Z G dL dMe          Z G dN dOe          Z G dP dQee          Z G dR dSee          Z G dT dUeee          Z G dV dWee          Z G dX dYeee          Z G dZ d[e&          Z G d\ d]eee<          Z G d^ d_eee=eŦ          Z G d` daee<          Z G db dceee=eŦ          Z G dd deeeee<          Z G df dgeeee=eŦ          Z G dh dieeee>          Z G dj dkeeee?eŦ          Z G dl dme          Z G dn doe1          Z G dp dqeeϦ          Z G dr dse&          Z G dt due          ZҐdv Z G dw dxe          Z G dy dze          ZՐdd|Z֐d} Z G d~ d          Z G d dee2          Z G d dee3          Z G d dee4          Z G d deJ          Z G d deL          Z G d de          Z eeleަ           dS (  a  
DCE/RPC
Distributed Computing Environment / Remote Procedure Calls

Based on [C706] - aka DCE/RPC 1.1
https://pubs.opengroup.org/onlinepubs/9629399/toc.pdf

And on [MS-RPCE]
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rpce/290c38b1-92fe-4229-91e6-4fc376610c15

.. note::
    Please read the documentation over
    `DCE/RPC <https://scapy.readthedocs.io/en/latest/layers/dcerpc.html>`_
    )partialN)IntEnum)UUID)Packet_metaclass)conf)bytes_encode	plain_str)log_runtime)DNSStrField)NTLM_HeaderNTLMSSP_MESSAGE_SIGNATURE)PacketRawbind_bottom_upbind_layersbind_top_down	NoPayload)*_FieldContainerBitEnumFieldBitFieldByteEnumField	ByteFieldConditionalField	EnumFieldFieldFieldLenFieldFieldListField
FlagsFieldIntFieldLEIntEnumField
LEIntFieldLELongFieldLEShortEnumFieldLEShortFieldLenFieldMultipleTypeFieldPacketFieldPacketLenFieldPacketListFieldPadFieldReversePadFieldShortEnumField
ShortFieldSignedByteFieldStrFieldStrFixedLenFieldStrLenFieldStrLenFieldUtf16StrNullFieldStrNullFieldUtf16TrailerFieldUUIDEnumField	UUIDField
XByteFieldXLEIntFieldXLELongFieldXLEShortFieldXShortFieldXStrFixedLenField)DefaultSession)StreamSocket)KRB_InnerTokenKerberos)GSS_S_COMPLETEGSSAPI_BLOB_SIGNATUREGSSAPI_BLOBSSP)TCP)EFieldEPacketEPacketFieldEPacketListField)Optional      request   ping   response   fault   working   no_call   reject   acknowledgeconnectionless_cancel	   frag_ack
   
cancel_ack   bind   bind_ack   bind_nak   alter_context   alter_context_respauth3shutdown	co_cancelorphaned)         )reserved_01	last_fragfragno_frag_ackmaybe
idempotent	broadcast
reserved_7)
reserved_0cancel_pending
reserved_2
reserved_3
reserved_4
reserved_5
reserved_6rz   z$00000000-0000-0000-0000-000000000000NULLz$6cb71c2c-9812-4540-0300-000000000000zBind Time Feature Negotiationz$8a885d04-1ceb-11c9-9fe8-08002b104860zNDR 2.0z$71710533-beba-4937-8319-b5dbef9ccc36NDR64c                       e Zd ZdZdZdS )DCERPC_TransportrO   rQ   N)__name__
__module____qualname__NCACN_IP_TCPNCACN_NP     W/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/dcerpc.pyr   r      s        LHHHr   r   c                 :    | j         dk    rdS | j         dk    rdS dS )zH
    Determine the right endianness sign for a given DCE/RPC packet
    r   >rO   <!)endianpkts    r   _dce_rpc_endiannessr      s)     zQs	qssr   c                        e Zd Z fdZ xZS )_EFieldc                 f    t          t          |                               |t                     d S )Nendianness_from)superr   __init__r   )selffld	__class__s     r   r   z_EField.__init__   s-    gt%%c;N%OOOOOr   r   r   r   r   __classcell__r   s   @r   r   r      sA        P P P P P P P P Pr   r   c                   *    e Zd ZdZedd            ZdS )DceRpczDCE/RPC packetNc                     |rDt          |          dk    r1t          |dd                   }|dk    rt          S |dk    rt          S t          S )NrO   r   rU   rW   )lenordDceRpc4DceRpc5)cls_pktargskargsvers        r   dispatch_hookzDceRpc.dispatch_hook   sL     	CIINNd1Q3i..Caxxr   N)r   r   r   __doc__classmethodr   r   r   r   r   r      s8           [  r   r      )sport)dportc                   $    e Zd Zed             ZdS )_DceRpcPayloadc                 <    | j         sdS t          | j                   S )Nr   )
underlayerr   r   s    r   
endiannessz_DceRpcPayload.endianness   s!     	3"4?333r   N)r   r   r   propertyr   r   r   r   r   r      s-        4 4 X4 4 4r   r   r   biglittleencodingASCIIEBCDICfloat)IEEEVAXCRAYIBM	reserved1c                      e Zd ZdZdZ eddddd           edd	e           ed
d	de           edd	de	          ge
z    edd	           e edd                     e edd                     e edd                     e edd	                     e edd                     e edd	                     e edd	                     e edd                     e edd                     e eddd                     e edd	                     edd	dd g           ed!d	          gz   ZdS )"r   z-
    DCE/RPC v4 'connection-less' packet
    z
DCE/RPC v4rpc_versrU   4 (connection-less)5 (connection-oriented)rU   rW   ptyper   flags1rM   flags2	serial_hiobjectNif_idact_idserver_bootif_versrO   seqnumopnumihint  ahintr   Hfmtfragnum
auth_protononezOSF DCE Private Key	serial_lo)r   r   r   r   namer   DCE_RPC_TYPEr   _DCE_RPC_4_FLAGS1_DCE_RPC_4_FLAGS2_drepr8   r   r7   r   r-   r<   r%   fields_descr   r   r   r   r      s         D MA#8=VWW  M'1l33JxA'899JxA'899	
 	 J{A&&GIIh--..GIIgt,,--GIIh--..GHH]A..//GHHY**++GHHXq))**GJJw**++GKK0011GKK0011GHHUDc22233GJJy!,,--M,F4I+JKKJ{A&&
	
 KKr   r   c                   .   e Zd Zd Z eddddd           edddg d           e ed	d
          d            e edd
          d            e edd
          d            e edd
          d            e edd
          d           gZ	dS )NL_AUTH_MESSAGEMessageTyper   RequestResponser   rO   Flagsi)NETBIOS_DOMAIN_NAMENETBIOS_COMPUTER_NAMEDNS_DOMAIN_NAMEDNS_HOST_NAMENETBIOS_COMPUTER_NAME_UTF8NetbiosDomainName c                     | j         j        S r   )r   r   r   s    r   <lambda>zNL_AUTH_MESSAGE.<lambda>.  s    	5 r   NetbiosComputerNamec                     | j         j        S r   )r   r   r   s    r   r   zNL_AUTH_MESSAGE.<lambda>2  s    	7 r   DnsDomainNamec                     | j         j        S r   )r   r   r   s    r   r   zNL_AUTH_MESSAGE.<lambda>6  s    	1 r   DnsHostNamec                     | j         j        S r   )r   r   r   s    r   r   zNL_AUTH_MESSAGE.<lambda>:  s    	/ r   NetbiosComputerNameUtf8c                     | j         j        S r   )r   r   r   s    r   r   zNL_AUTH_MESSAGE.<lambda>@  s    	< r   N)
r   r   r   r   r    r   r   r3   r   r   r   r   r   r   r     s1       D%& 	
 	
 	
  		
 	
 	L,b1155	
 	
 	L.3377	
 	
 	K,,11	
 	
 	Kr**//	
 	
 	 K1266<<		
 	
K+KKKr   r   c                   .   e Zd ZdZ eddddd           eddd	d
dd           edd           edd           eddd           eddd           e eddd          d            e	 e
ddd          d fg edd                    gZdS )NL_AUTH_SIGNATUREzNL_AUTH_(SHA2_)SIGNATURESignatureAlgorithmw   zHMAC-MD5zHMAC-SHA256)r  rr   SealAlgorithmr   UnencryptedRC4zAES-128)r   z      Padr   r   SequenceNumberr   rM   lengthChecksum
Confounderc                     | j         dk    S )Nr   )r  r   s    r   r   zNL_AUTH_SIGNATURE.<lambda>`  s    )V3 r   	Reserved2   c                     | j         dk    S )Nrr   )r  r   s    r   r   zNL_AUTH_SIGNATURE.<lambda>f  s     6& @ r   N)r   r   r   r   r#   r;   r-   r=   r   r&   r0   r/   r   r   r   r   r  r  E  s+       %D "% 	
 	
 	%! 	
 	
 	eV$$
7A*C:::*c!444lC:::33	
 	
 	 %$[#bAAA@@ H[#&&	
 	
5#KKKr   r  c                   b    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdS )RPC_C_AUTHNr   rO   rQ   rU   r^   r`   rh   rL   rp   rq                   #   $   D   R   d   l    N)r   r   r   NONEDCE_PRIVATE
DCE_PUBLIC
DEC_PUBLICGSS_NEGOTIATEWINNTGSS_SCHANNELGSS_KERBEROSDPAMSNKERNELDIGESTNEGO_EXTENDEDPKU2ULIVE_SSP
LIVEXP_SSPCLOUD_APNETLOGONMSONLINEMQDEFAULTr   r   r   r  r  s  sw        DKJJMELL
C
CFFMEHJHHH	BGGGr   r  c                   *    e Zd ZdZdZdZdZdZdZdZ	dS )	RPC_C_AUTHN_LEVELr   rO   rQ   rS   rU   rW   rY   N)
r   r   r   r3  r  CONNECTCALLPKTPKT_INTEGRITYPKT_PRIVACYr   r   r   r5  r5    s1        GDGD
CMKKKr   r5  c                   v   e Zd ZdZ edde           edde           edd           edd           edd           e	 e
d	 e            ed
           d f e
d	 e            ed           d f e
d	 e            ed           d f e
d	 e            ed           d f e
d	 e            ed           d f e
d	 e            ed           d f e
d	 e            ed           d f e
d	 e            ed           d fg e
d	dej        d                     gZd Zd Zd ZdS )CommonAuthVerifierzCommon Authentication Verifier	auth_typer   
auth_levelauth_pad_lengthNauth_reservedauth_context_id
auth_valuec                     | j         j        S r   parentauth_lenr   s    r   r   zCommonAuthVerifier.<lambda>      
0C r   length_fromc                 B    | j         dk    o| j        o| j        j        dv S Nr^   rb   rd   rf   rh   rj   rL   r=  rE  r   r   s    r   r   zCommonAuthVerifier.<lambda>  .     5 !A#* !AJ$(@@ r   c                     | j         j        S r   rD  r   s    r   r   zCommonAuthVerifier.<lambda>  rG  r   c                 R    | j         dk    o| j        o| j         p| j        j        dvS rK  rM  r   s    r   r   zCommonAuthVerifier.<lambda>  <     5 !
!  J L:+3KK r   c                     | j         j        S r   rD  r   s    r   r   zCommonAuthVerifier.<lambda>  rG  r   c                 B    | j         dk    o| j        o| j        j        dv S NrL   rL  rM  r   s    r   r   zCommonAuthVerifier.<lambda>  rN  r   c                     | j         j        S r   rD  r   s    r   r   zCommonAuthVerifier.<lambda>  rG  r   c                 R    | j         dk    o| j        o| j         p| j        j        dvS rT  rM  r   s    r   r   zCommonAuthVerifier.<lambda>  rQ  r   c                     | j         j        S r   rD  r   s    r   r   zCommonAuthVerifier.<lambda>  rG  r   c                 >    | j         dv o| j        o| j        j        dv S N)r`      rL  rM  r   s    r   r   zCommonAuthVerifier.<lambda>  s.     = !A#* !AJ$(@@ r   c                     | j         j        S r   rD  r   s    r   r   zCommonAuthVerifier.<lambda>  rG  r   c                 N    | j         dv o| j        o| j         p| j        j        dvS rY  rM  r   s    r   r   zCommonAuthVerifier.<lambda>  s<     = !
!  J L:+3KK r   c                     | j         j        S r   rD  r   s    r   r   zCommonAuthVerifier.<lambda>   rG  r   c                 B    | j         dk    o| j        o| j        j        dv S Nr  )rb   rd   rf   rh   rj   rM  r   s    r   r   zCommonAuthVerifier.<lambda>  s,     5 !=#* !=J$(<< r   c                     | j         j        S r   rD  r   s    r   r   zCommonAuthVerifier.<lambda>  rG  r   c                 D    | j         dk    o| j         p| j        j        dvS r_  rM  r   s    r   r   zCommonAuthVerifier.<lambda>  s2     5 !  J H:+3GG	 r   c                 ,    | j         r| j         j        pdS Nr   rD  r   s    r   r   zCommonAuthVerifier.<lambda>  s    
(Jsz7J(Oa r   c                 F    | j         sdS | j        r| j        j        dv rdS dS NFrL  TrB  rE  r   r   s    r   is_protectedzCommonAuthVerifier.is_protected  s5     	5; 	4;,0HHH5tr   c                 F    | j         sdS | j        r| j        j        dvrdS dS re  rf  r   s    r   is_sspzCommonAuthVerifier.is_ssp%  s5     	5; 	4;,4LLL5tr   c                     t           j        S r   r   padding_layerr   r   s     r   default_payload_classz(CommonAuthVerifier.default_payload_class,      !!r   )r   r   r   r   r   r  r5  r   r9   r&   r(   rD   rC   rA   r@   r   r   r   r  r   	raw_layerr   rg  ri  rn  r   r   r   r<  r<    s       +D	
 	

 	lA'899	#T**	/1%%%q)) #N$##$C$C	  A A
 #N$--//-$C$C	   " #N$ 

 $C$C	  A A
 #N$&((&$C$C	   " #N$##$C$C	  A A
 #N$11331$C$C	   " #N$'))'$C$C	  = =
 #N$))++)$C$C	   }lZ NOO	  ]t	
 t	
KB    " " " " "r   r<  s   q6qc                       e Zd ZdZ edddd           eddd           eddd	d
dddd           edd          gZd ZdS )DceRpcSecVTCommandzVerification trailer commandSEC_VT_MUST_PROCESS_COMMANDr   rO   )tot_sizeSEC_VT_COMMAND_ENDCommandiSEC_VT_COMMAND_BITMASK_1SEC_VT_COMMAND_PCONTEXTSEC_VT_COMMAND_HEADER2)rO   rQ   rS   )end_tot_sizeLengthNc                     | j         dk    rt          S | j         dk    rt          S | j         dk    rt          S t          j        S )NrO   rQ   rS   )rw  DceRpcSecVTBitmaskDceRpcSecVTPcontextDceRpcSecVTHeader2r   raw_payloadr   payloads     r   guess_payload_classz&DceRpcSecVTCommand.guess_payload_classG  sD    <6!!%%\V##&&\V##%%r   )	r   r   r   r   r   r   r$   r   r  r   r   r   rr  rr  4  s        )D.1rBBB%q!,,210 
 
	
 
	
 
	
 	Xt$$K"         r   rr  c                   2    e Zd ZdZ edd          gZd ZdS )r~  rpc_sec_vt_bitmaskbitsrO   c                     t           j        S r   rk  rm  s     r   rn  z(DceRpcSecVTBitmask.default_payload_classZ  ro  r   N)r   r   r   r   r!   r   rn  r   r   r   r~  r~  T  s>        D
61K" " " " "r   r~  c                       e Zd ZdZ eddej        d fej                   e	dd           edde
ej                   e	d	d          gZd
 ZdS )r  rpc_sec_vt_pcontextInterfaceIdNc                 Z    t                               |                                           S r   DCE_RPC_INTERFACES_NAMES_revgetlowerxs    r   r   zDceRpcSecVTPcontext.<lambda>i  s    6::17799EE r   )uuid_fmtVersionr   TransferSyntaxTransferVersionc                     t           j        S r   rk  rm  s     r   rn  z)DceRpcSecVTPcontext.default_payload_classw  ro  r   )r   r   r   r   r6   DCE_RPC_INTERFACES_NAMESr  r7   	FORMAT_LEr!   DCE_RPC_TRANSFER_SYNTAXESr   rn  r   r   r   r  r  a  s         D(,EE (	
 	
 	
 	
9a  %(		
 	
 	
 	
$a((#K(" " " " "r   r  c            
           e Zd ZdZ edd           edd           edd           edd           edd           edd           ed	d          gZd
 ZdS )r  rpc_sec_vt_header2PTYPEr   	Reserved1r  drepcall_id	p_cont_idr   c                     t           j        S r   rk  rm  s     r   rn  z(DceRpcSecVTHeader2.default_payload_class  ro  r   N)	r   r   r   r   r   r$   r!   r   rn  r   r   r   r  r  ~  s        D	'1	+q!![!$$
61
9a  [!$$Wa  K" " " " "r   r  c                   H    e Zd ZdZ eded           edg e          gZdS )DceRpcSecVTzVerification trailerrpc_sec_verification_trailerrM   r  commandsN)	r   r   r   r   r=   _SECTRAILER_MAGICr)   rr  r   r   r   r   r  r    sD        !D8:KTUVVV
B(:;;KKKr   r  c                       e Zd Zd ZdS )_VerifTrailerFieldc                     t           |v r|                    t                     }t          |d |                    t          || d                    }}|                     ||          }t	          |j        t                    s|d fS ||fS |d fS r   )r  indexbytesm2i
isinstancer  r   )r   r   sindsectrailer_bytesremain
vt_trailers          r   getfieldz_VerifTrailerField.getfield  s    
 !!''+,,C',QuuXahf#'788Jj0)<< $w:%%$wr   N)r   r   r   r  r   r   r   r  r    s#            r   r  PFC_FIRST_FRAGPFC_LAST_FRAGPFC_PENDING_CANCELPFC_RESERVED_1PFC_CONC_MPXPFC_DID_NOT_EXECUTE	PFC_MAYBEPFC_OBJECT_UUID)rO   rQ   rU   rM   rL   r  @      PFC_SUPPORT_HEADER_SIGNi nca_s_comm_failurei nca_s_op_rng_errori nca_s_unk_ifi nca_s_wrong_boot_timei	 nca_s_you_crashedi nca_s_proto_errori nca_s_out_args_too_bigi nca_s_server_too_busyi nca_s_fault_string_too_longi nca_s_unsupported_typei  nca_s_fault_int_div_by_zeroi  nca_s_fault_addr_errori  nca_s_fault_fp_div_zeroi  nca_s_fault_fp_underflowi  nca_s_fault_fp_overflowi  nca_s_fault_invalid_tagi  nca_s_fault_invalid_boundi  nca_s_rpc_version_mismatchi	  nca_s_unspec_rejecti
  nca_s_bad_actidi  nca_s_who_are_you_failedi  nca_s_manager_not_enteredi  nca_s_fault_canceli  nca_s_fault_ill_insti  nca_s_fault_fp_errori  nca_s_fault_int_overflowi  nca_s_fault_unspeci  nca_s_fault_remote_comm_failurei  nca_s_fault_pipe_emptyi  nca_s_fault_pipe_closedi  nca_s_fault_pipe_orderi  nca_s_fault_pipe_disciplinei  nca_s_fault_pipe_comm_errori  nca_s_fault_pipe_memorynca_s_fault_context_mismatchnca_s_fault_remote_no_memorynca_s_invalid_pres_context_idnca_s_unsupported_authn_levelnca_s_invalid_checksumnca_s_invalid_crcnca_s_fault_user_definednca_s_fault_tx_open_failednca_s_fault_codeset_conv_errornca_s_fault_object_not_foundnca_s_fault_no_client_stubRPC_S_UNKNOWN_AUTHN_SERVICERPC_X_BAD_STUB_DATAEPT_S_CANT_PERFORM_OP)i  i  i  i  i  i   i!  i"  i#  i$  i%  i  i  i  REASON_NOT_SPECIFIEDTEMPORARY_CONGESTIONLOCAL_LIMIT_EXCEEDEDCALLED_PADDR_UNKNOWNPROTOCOL_VERSION_NOT_SUPPORTEDDEFAULT_CONTEXT_NOT_SUPPORTEDUSER_DATA_NOT_READABLENO_PSAP_AVAILABLE"AUTHENTICATION_TYPE_NOT_RECOGNIZEDINVALID_CHECKSUM)
r   rO   rQ   rS   rU   rW   rY   r[   rM   r^   c                   D    e Zd ZdZdZ eddddd           edd	           ed
d	e           e e	ddde
          d fg e	ddde                    gez    edd	           e edd                     e eddddd                      e edd                     e e edded                     d            e e eddd                     d            e edde                    gz   Z fdZd  Zd! Zd" Zed#             Z xZS )$r   z1
    DCE/RPC v5 'connection-oriented' packet
    z
DCE/RPC v5r   rW   r   r   r   rpc_vers_minorr   r   	pfc_flagsrS   rM   c                     | j         dv S )NrL  r   r   s    r   r   zDceRpc5.<lambda>  s    CI1I$I r   	reserved2frag_lenNrF  r   auth_verifierc                     |sdn|dz
  S )Nr   rM   r   )r   r  s     r   r   zDceRpc5.<lambda>"  s    1*A!!1q5 r   )r   	length_ofadjustr  c                     | j         dz   S )NrM   rF  r   s    r   r   zDceRpc5.<lambda>2  s    q0@ r   rH  c                     | j         dk    S rc  r  r   s    r   r   zDceRpc5.<lambda>5      CLA- r   auth_paddingc                     | j         j        S r   )r  r?  r   s    r   r   zDceRpc5.<lambda><  s    0A0Q r   c                     | j         dk    S rc  r  r   s    r   r   zDceRpc5.<lambda>?  r  r   r  c                     |                      d                              | |dd                   d         }|d |         ||d          }}t          t          |                               |          |z   S )Nr   rM   r`   rO   )	get_fieldr  r   r   
do_dissect)r   r  r   r  r   s       r   r  zDceRpc5.do_dissectG  so     >>*--66tQqtWEEaHixiL!HII,6Wd##..q11F::r   c                     | j         t          | j                  z
  t          |          z   }|d |         ||d          fS r   )r   r   original)r   r  pay_lens      r   extract_paddingzDceRpc5.extract_paddingO  s@     -#dm"4"44s1vv='{AghhK''r   c                    | j         r| j        | j         j        |                     d                              | |dd                   d         dz   }|| d          |d |          }}t          |          }| j        r)|t          | j                                                  z  }| t          z  }|d d         t          j
        d|          z   |dd          z   }||d	z  z   |z   }| j        _t          |          t          |          z   }|d d         |                     d
                              | d|          z   |dd          z   }||z   S )NrF  r`   rd   rO   rM   rQ   BrS       r   r   )r  r	  r?  r  r  r   r  
self_build_COMMON_AUTH_PADstructpackr   addfield)r   r   payrF  r  pdu_lenpadlenr  s           r   
post_buildzDceRpc5.post_buildV  sn   	;!)"2: ~~j11::4RULLQORSSH!$hYZZ#jyj/3M#hhG| :3t|6688999h"22Fbqb!FKV$<$<<}QRR?PP  ')*]:C= XXC(FBQB..,,55dCHHIbcc( 
 Syr   c                 b    t          |t                    o|t                   j        | j        k    S r   )r  r   r  rm  s     r   answerszDceRpc5.answersq  s%    #w''PCL,@DL,PPr   c                    |dd         dk    rd S t          j        d|dd                   d         dz	  }|dvrd S t          j        |rdnd	d
z   |dd                   d         }t          |          |k    r]t          j        rBd|vrt                      x|d<   }n|d         }|                    t          |                    S t          |          S d S )Nr   rO      z!BrU   rW   r   r   r   r   rM   r`   
dcerpcsess)r  unpackr   r   dcerpc_session_enableDceRpcSessionprocessr   )r   data_sessionr   r  r#  s          r   tcp_reassemblezDceRpc5.tcp_reassemblet  s    !9FtT!A#Y//2a7Fv 63#=tAbDzJJ1Mt99) 9w..9FHGL)JJ!(!6J!))'$--8884==  r   ) r   r   r   r   r   r   r   r   r&   r   _DCE_RPC_5_FLAGS_2_DCE_RPC_5_FLAGSr   r   r-   r   r   r   r5   r(   r<  r1   r  r  r   r  r  r  r   r   r+  r   r   s   @r   r   r      sw         D MA#8=VWW  I&**M'1l33 #
;Q8JKKII 
;Q0@AA	 		
" #	& Ik1%%GJJz40011G-AA    GHHY--.. "N'*$@$@	    .-
 
 K&$Q$Q    .-	 	 L""<{CC Q+
%=	
 B; ; ; ; ;( ( (  6Q Q Q ! ! [! ! ! ! !r   r   c                   x    e Zd ZdZ e eddej        d f                     e edd                    gZ	dS )DceRpc5AbstractSyntaxz#Presentation Syntax (p_syntax_id_t)if_uuidNc                 Z    t                               |                                           S r   r  r  s    r   r   zDceRpc5AbstractSyntax.<lambda>  s    :>>qwwyyII r   
if_versionrS   )
r   r   r   r   r   r6   r  r  r   r   r   r   r   r/  r/    sl        0DM -0II 
	
 
	
 	q))**KKKr   r/  c                   h    e Zd ZdZ e edde                     e edd                    gZdS )DceRpc5TransferSyntaxz,Presentation Transfer Syntax (p_syntax_id_t)r0  Nr2  rS   )	r   r   r   r   r   r6   r  r   r   r   r   r   r4  r4    s\        9DM) 	
 	
 	q))**	KKKr   r4  c                       e Zd ZdZ e edd                     edddd           ed	d           ed
de	           e
dded e          gZdS )DceRpc5Contextz$Presentation Context (p_cont_elem_t)cont_idr   n_transfer_synNtransfer_syntaxesr  count_ofr   reservedabstract_syntaxc                     | j         S r   )r8  r   s    r   r   zDceRpc5Context.<lambda>  	    3#5 r   
count_fromr   )r   r   r   r   r   r-   r   r   rI   r/  rJ   r4  r   r   r   r   r   r6  r6    s        1D

9a(())&7JPSTTT	*a  &.CDD!55/	
 	
 	
KKKr   r6  c                       e Zd ZdZ e eddg d                     e edde                     edde          gZ	dS )DceRpc5ResultzContext negotiation Resultresultr   )
acceptanceuser_rejectionprovider_rejectionreasontransfer_syntaxN)
r   r   r   r   r   r,   _DCE_RPC_REJECTION_REASONSrI   r4  r   r   r   r   rC  rC    s        'DN!SSS 	
 	

 	N* 	
 	
 	&.CDDKKKr   rC  c                   r    e Zd ZdZ e edddd                     e eddd 	                    gZdS )
DceRpc5PortAnyzPort Any (port_any_t)r  N	port_specr   )r  r   r   c                     | j         S r   r  r   s    r   r   zDceRpc5PortAny.<lambda>  s    cj r   rH  )r   r   r   r   r   r   r1   r   r   r   r   rL  rL    s\        "DhMMMNNK:P:PQQQRRKKKr   rL  c                       e Zd ZdZ e edd                     e edd                     e edd                     e edd	d
d                     eddd           e	d
g e
ed           gZd	S )DceRpc5BindzDCE/RPC v5 - Bindmax_xmit_frag  max_recv_frag    assoc_group_idr   n_context_elemNcontext_elemr  r:  r<  rS   r  c                     | j         S r   )rV  r   s    r   r   zDceRpc5Bind.<lambda>  r?  r   r   rA  )r   r   r   r   r   r-   r   r   r0   rJ   r6  r   r   r   r   r   rP  rP    s        D

?D1122

?D1122)1--..M*D>sSSS	
 	
 	Qq111/55	
 	
 	
KKKr   rP  r  c                   $   e Zd ZdZ e edd                     e edd                     e edd                     e edd	e	          d
           e e
dd	dd                     eddd           edg eed           gZd	S )DceRpc5BindAckzDCE/RPC v5 - Bind AckrQ  rR  rS  rT  rU  r   sec_addrNrU   align	n_resultsresultsr  r:  r<  rS   r  c                     | j         S r   )r_  r   s    r   r   zDceRpc5BindAck.<lambda>  s    3= r   rY  )r   r   r   r   r   r-   r   r*   rI   rL  r   r0   rJ   rC  r   r   r   r   r   r[  r[    s        "D

?D1122

?D1122)1--..LT>::	
 	
 	

 	k4)MMMNNQq111/00	
 	
 	
KKKr   r[  c                   B    e Zd ZdZ edd           edd          gZdS )DceRpc5Version	version_tmajorr   minorN)r   r   r   r   r   r   r   r   r   rc  rc    s8        D	'1	'1KKKr   rc  c                       e Zd ZdZ e edde                     e edddd                     edg e	d	 e

           e e e edd ed          di                    d          d           gZdS )DceRpc5BindNakzDCE/RPC v5 - Bind Nakprovider_reject_reasonr   n_protocolsN	protocolsr  r:  c                     | j         S r   )rj  r   s    r   r   zDceRpc5BindNak.<lambda>#  s    3? r   r@  	signaturez$90740320-fad0-11d3-82d7-009027b130abzExtended ErrorrM   r]  c                     | j                             dd           p$| j        o| j        j        d| j        dz  z   dz   k    S )Nrm  r  rQ   rL   )fieldsr  r   r   rj  r   s    r   r   zDceRpc5BindNak.<lambda>6  sG    
{D99  MN+rCOa4G/G"/LL r   )r   r   r   r   r   r,   rJ  r   rJ   rc  r   r   r+   r6   r   r   r   r   r   rh  rh    s        "DN3Q8RSS	
 	
 	mTKSQQQRR22/	
 	
 	
 	O!M# D F / 
 
    	
 	
#KKKr   rh  c                        e Zd ZdZej        ZdS )DceRpc5AlterContextzDCE/RPC v5 - AlterContextN)r   r   r   r   rP  r   r   r   r   rq  rq  E  s        &D)KKKr   rq  c                        e Zd ZdZej        ZdS )DceRpc5AlterContextRespzDCE/RPC v5 - AlterContextRespN)r   r   r   r   r[  r   r   r   r   rs  rs  P  s        *D ,KKKr   rs  c                   0    e Zd ZdZ eddd          gZdS )DceRpc5Auth3zDCE/RPC v5 - Auth3padr   rU   r  N)r   r   r   r   r0   r   r   r   r   ru  ru  Z  s-        D##E3q999:KKKr   ru  c                       e Zd ZdZ e edd                     e edd                     edd           eddddd	i           e e	d
de
                     edd          gZdS )DceRpc5FaultzDCE/RPC v5 - Fault
alloc_hintr   r7  cancel_countr<  irO   zRPC extended errorstatusr  N)r   r   r   r   r   r   r-   r   r   r    _DCE_RPC_ERROR_CODESr   r   r   r   rx  rx  d  s        Dq))**

9a(())	.!$$
:q"s,@&ABBx,@AABBa  KKKr   rx  c                       e Zd ZdZ e edd                     e edd                     e edd                     e e e e	dd                    d	          d
           gZ
dS )DceRpc5RequestzDCE/RPC v5 - Requestry  r   r7  r   r   NrM   r]  c                 2    | j         o| j         j        j        S r   )r   r  r  r   s    r   r   zDceRpc5Request.<lambda>  s    S3>+C+S r   )r   r   r   r   r   r   r-   r   r*   r7   r   r   r   r   r~  r~  v  s        !Dq))**

9a(())

7A&&''H		(D1122   TS	
 	
	KKKr   r~  c                       e Zd ZdZ e edd                     e edd                     edd           edd          gZdS )DceRpc5ResponsezDCE/RPC v5 - Responsery  r   r7  rz  r<  N)	r   r   r   r   r   r   r-   r   r   r   r   r   r  r    sj        "Dq))**

9a(())	.!$$	*a  	KKKr   r  DceRpcOpc                       e Zd Zd Zd ZdS )DceRpcInterfacec                 \    || _         || _        |\  | _        | _        || _        || _        d S r   )r   uuidmajor_versionminor_versionr2  opnums)r   r   r  version_tupler2  r  s         r   r   zDceRpcInterface.__init__  s2    		1>.D.$r   c                 8    d| j         d| j        d| j        dS )Nz<DCE/RPC Interface z v.r   )r   r  r  r   s    r   __repr__zDceRpcInterface.__repr__  s/     III
 	
r   Nr   r   r   r   r  r   r   r   r  r    s2          
 
 
 
 
r   r  c                    t          t          t          |                    d                              }t	          |          dk    s
J d            |d         dz  |d         z   }||ft
          v rt
          ||f         }|j        | k    rp|j        |k    r@t          |          t          |j	                  z
  r|j	        
                    |           dS |j        |k    rn+t          j        d|z             dS t          d	|z            | t          |<   |t          |                                 <   t#          | ||||          t
          ||f<   |                                D ]!\  }}t'          t(          |j        |
           "dS )z&
    Register a DCE/RPC interface
    r  rQ   z#Version should be in format 'X.X' !rO   rL   r   Nz.This interface is already registered: %s. Skipz9An interface with the same UUID is already registered: %s)r   )tuplemapintsplitr   DCE_RPC_INTERFACESr   r2  setr  updater
   warning
ValueErrorr  r  r  r  itemsr   r~  rN   )	r   r  versionr  r  r2  	interfacer   
operationss	            r   register_dcerpc_interfacer    s    #c7==#5#56677M}"""$I""""b(M!,<<Jj///&j'9:	>T!!#z11c&kkC E E 71  ''///%33#DyP   KiW   &*T"15 .-<. .j)* $\\^^ G Gznj&8FFFFFG Gr   c                      	 t           fdt                                          D                       S # t          $ r t	          d          w xY w)z>
    Find an interface object through the name in the IDL
    c              3   2   K   | ]}|j         k    |V  d S r   r   ).0r  r   s     r   	<genexpr>z(find_dcerpc_interface.<locals>.<genexpr>  s)      MM!afnnAnnnnMMr   zUnknown interface !)nextr  valuesStopIterationAttributeErrorr  s   `r   find_dcerpc_interfacer    sb    4MMMM188::MMMMMM 4 4 423334s	   15 Ac                       e Zd Zd Zd ZdS )ComInterfacec                 0    || _         || _        || _        d S r   r   r  r  )r   r   r  r  s       r   r   zComInterface.__init__  s    		r   c                     d| j         dS )Nz<COM Interface r   r  r   s    r   r  zComInterface.__repr__  s     '+yyy22r   Nr  r   r   r   r  r    s2          
3 3 3 3 3r   r  c                 8    t          | ||          t          |<   dS )z"
    Register a COM interface
    N)r  COM_INTERFACESr  s      r   register_com_interfacer    s'     ( N4r   c                     t          | t                    r|j        | _        |j        | _        t          | t                    r2| D ]1}t          |t                    r|j        |_        |j        |_        0d S d S r   )r  
_NDRPacketndr64	ndrendianlist)fobjr  s      r   _set_ctx_onr    s    !Z   $)m!T , 	, 	,A!Z(( ,)!m	, ,	, 	,r   c                     ddd|          S )Nr   r   r   r   r   )r  s    r   _er    s    #&&y11r   c                   n     e Zd Zg dZ fdZ fdZd Z fdZd Z fdZ	 fdZ
ddZd Zd Z xZS )r  )r  r  deferred_pointersrequest_packetc                     |                     dd          | _        |                     dd          | _        |                     dd           | _        g | _         t          t          |           j        |i | d S )Nr  Fr  r   r  )popr  r  r  r  r   r  r   r   r   kwargsr   s      r   r   z_NDRPacket.__init__  sv    ZZ//
K:: %jj)94@@!#(j$($9&99999r   c                 b   | j         p| j        }|r.t          |t                    r|j        | _        |j        | _        nIt          g                               | t          t          |           	                    |                    S t          t          |           	                    |          S r   )
rE  r   r  r  r  r  NDRConstructedTyperead_deferred_pointersr   r  )r   r  _upr   s      r   r  z_NDRPacket.do_dissect  s    k,T_ 	:c:.. 	DJ ]DNN &b))@@eJ--88;;   Z&&11!444r   c                 "    | j         rd | _        |S r   )r  raw_packet_cache)r   r  s     r   post_dissectz_NDRPacket.post_dissect$  s    ! 	)$(D!r   c                    | j         p| j        }| j                                        D ]}t	          ||            |rt          |t                    sHt          g                               | t          t          |           
                                          S t          t          |           
                                S r   )rE  r   ro  r  r  r  r  r  add_deferred_pointersr   do_build)r   r  r  r   s      r   r  z_NDRPacket.do_build*  s    k,T_##%% 	! 	!A4     	*S*55 	%b))??eJ--6688   Z&&//111r   c                     t           j        S r   rk  rm  s     r   rn  z _NDRPacket.default_payload_class5  ro  r   c                      t          t          |           j        |i |}| j        |_        | j        |_        | j        |_        |S r   )r   r  
clone_withr  r  r  )r   r   r  r   r   s       r   r  z_NDRPacket.clone_with8  sH    0eJ%%0$A&AA !% 6J	
r   c                     t          t          |                                           }| j        |_        | j        |_        | j        |_        |S r   )r   r  copyr  r  r  r   r   r   s     r   r  z_NDRPacket.copyA  s@    J%%**,, $ 6J	
r   FrS   r   c                     |                      t          |           | j        | j                                      ||||          S )Nr  r  )r   r  r  r  show)r   dumpindentlvl	label_lvls        r   show2z_NDRPacket.show2H  sA    ~~$KKtzT^  
 

$tVS)
,
,	-r   c                     	 t          j        | |          S # t          $ r6 | j        r-	 | j                            |          cY S # t          $ r Y nw xY w w xY wr   )r   getfield_and_valr  r  r  )r   attrs     r   r  z_NDRPacket.getfield_and_valM  s    		*4666 	 	 	" .??EEEEE%   D	s,    AAA
AAAAc                     | }|                     d          D ]0}|                    |          \  }}|                    ||          }1|S )zV
        Util to get the value of a NDRField, ignoring arrays, pointers, etc.
        r  )r  r  valueof)r   rN   val	ndr_fieldr   fvals         r   r  z_NDRPacket.valueofY  sU      s++ 	) 	)I,,Y77IC++c4((CC
r   )FrS   r   r   )r   r   r   	__slots__r   r  r  r  rn  r  r  r  r  r  r   r   s   @r   r  r    s        MMMI: : : : :
5 
5 
5 
5 
5  	2 	2 	2 	2 	2" " "        - - - -

 
 
      r   r  c                       e Zd Zd Zd ZdS )	_NDRAlignc                 .    | | j         |j                 z  S r   )_alignr  )r   flenr   s      r   r  z_NDRAlign.padlene  s    ut{39---r   c                     |r+|j         p|j        }|rt          |t                    r|}nn|+t	          |j                  S r   )rE  r   r  r  r   r  )r   r   pars      r   original_lengthz_NDRAlign.original_lengthh  sW     	*.C z#z22   	 3<   r   N)r   r   r   r  r  r   r   r   r  r  d  s2        . . .! ! ! ! !r   r  c                   $     e Zd ZdZd fd	Z xZS )NDRAlignz
    ReversePadField modified to fit NDR.

    - If no align size is specified, use the one from the inner field
    - Size is calculated from the beginning of the NDR stream
    Nc                 ^    t          t          |                               |||           d S )N)r^  padwith)r   r  r   )r   r   r^  r  r   s       r   r   zNDRAlign.__init__{  s.    h&&s%&IIIIIr   r   )r   r   r   r   r   r   r   s   @r   r  r  s  sQ         J J J J J J J J J Jr   r  c                       e Zd Zd Zd ZdS )_VirtualFieldc                     |S r   r   )r   r   r  r  s       r   r  z_VirtualField.addfield      r   c                 
    |d fS r   r   r   r   r  s      r   r  z_VirtualField.getfield  s    $wr   N)r   r   r   r  r  r   r   r   r  r    s2              r   r  c                        e Zd Z fdZ xZS )_NDRPacketMetaclassc                    t          t          |                               | |||          }|                    dg           }|r|t	          |          dk    r*|j                            dt          dd                      n=|j                            dt          dg t          dd          fd                     |S )	NDEPORTED_CONFORMANTSrO   r   	max_count
max_countsr   c                     S r   r   )r)  amounts    r   r   z-_NDRPacketMetaclass.__new__.<locals>.<lambda>  s    V r   rA  )	r   r  __new__r  r   r   insertr  r   )r   r   basesdctnewclsconformantsr  r   s         @r   r  z_NDRPacketMetaclass.__new__  s    *C0088dE3OOgg4b99 	%%F{{"))!+t44   
 "))"$%b!,,#3#3#3#3	     r   )r   r   r   r  r   r   s   @r   r  r    s8                r   r  c                        e Zd ZdZdgZdZg ZdS )	NDRPacketz9
    A NDR Packet. Handles pointer size & endianness
    r  )rO   rO   N)r   r   r   r   r  	ALIGNMENTr  r   r   r   r  r    s0          
I Ir   r  )	metaclassc                       e Zd Zd ZdS )_NDRValueOfc                     |S r   r   r   r   r  s      r   r  z_NDRValueOf.valueof  r  r   N)r   r   r   r  r   r   r   r	  r	    s#            r   r	  c                   0     e Zd ZdZddgZ fdZd Z xZS )_NDRLenFieldz
    Field similar to FieldLenField that takes size_of and adjust as arguments,
    and take the value of a size on build.
    size_ofr  c                     |                     dd           | _        |                     dd           | _         t          t          |           j        |i | d S )Nr  r  c                     |S r   r   )r)  r  s     r   r   z'_NDRLenField.__init__.<locals>.<lambda>  s     r   )r  r  r  r   r  r   r  s      r   r   z_NDRLenField.__init__  sW    zz)T22jj>>::*lD!!*D;F;;;;;r   c                     |S|Q| j         J|                    | j                   \  }}|                    ||          }|                     ||          }n|d}|S rc  )r  r  i2lenr  )r   r   r  r   r  r  s         r   i2mz_NDRLenField.i2m  sb    9T\-E,,T\::IC		#t$$AC##AAYAr   )r   r   r   r   r  r   r  r   r   s   @r   r  r    s]         
 H%I< < < < <
      r   r  c                       e Zd ZdS )NDRByteFieldNr   r   r   r   r   r   r  r            Dr   r  c                       e Zd ZdS )NDRSignedByteFieldNr  r   r   r   r  r    r  r   r  c                   "    e Zd ZdZdZd Zd ZdS )	_NDRFieldr   )r   r   c           	          t          t          ddt          |j                  | j        z             | j                                      ||          S Nr   r   r   r]  )r  r   r  r  FMTALIGNr  r  s      r   r  z_NDRField.getfield  sO    "aR..9:::$*
 
 

(3

	r   c           	          t          t          ddt          |j                  | j        z             | j                                      |||                     ||                    S r  )r  r   r  r  r  r  r  r  r   r   r  r  s       r   r  z_NDRField.addfield  s_    "aR..9:::$*
 
 

(3488C--
.
.	/r   N)r   r   r   r  r  r  r  r   r   r   r  r    s<        
CE  
/ / / / /r   r  c                       e Zd ZdZdZdS )NDRShortFieldr   rQ   rQ   Nr   r   r   r  r  r   r   r   r#  r#            
CEEEr   r#  c                       e Zd ZdZdZdS )NDRSignedShortFieldhr$  Nr%  r   r   r   r(  r(    r&  r   r(  c                       e Zd ZdZdZdS )NDRIntFieldIrU   rU   Nr%  r   r   r   r+  r+    r&  r   r+  c                       e Zd ZdZdZdS )NDRSignedIntFieldir-  Nr%  r   r   r   r/  r/    r&  r   r/  c                       e Zd ZdZdZdS )NDRLongFieldQrM   rM   Nr%  r   r   r   r2  r2    r&  r   r2  c                       e Zd ZdZdZdS )NDRSignedLongFieldqr4  Nr%  r   r   r   r6  r6    r&  r   r6  c                       e Zd ZdZdZdS )NDRIEEEFloatFieldr  r-  Nr%  r   r   r   r9  r9    r&  r   r9  c                       e Zd ZdZdZdS )NDRIEEEDoubleFielddr4  Nr%  r   r   r   r;  r;    r&  r   r;  c                   "    e Zd ZddgZd Zd ZdS )_NDREnumFieldr   r,  c                     t          |j                  | j        |j                 z   }t	          t          dd|          d                              ||          S Nr   r   r   rQ   rU   r]  r  r  FMTSr  r  r   r  r   r   r  r   s       r   r  z_NDREnumField.getfield  Q    $)CI"66b!---V<<<EEc1MMMr   c                     t          |j                  | j        |j                 z   }t	          t          dd|          d                              |||                     ||                    S r@  r  r  rC  r  r  r   r  r  r   r   r  r  r   s        r   r  z_NDREnumField.addfield  h    $)CI"66b!---V<<<EEDHHS#&&
 
 	
r   Nr   r   r   rC  r  r  r   r   r   r>  r>    s>        :DN N N
 
 
 
 
r   r>  c                        e Zd Z fdZ xZS )NDRInt3264EnumFieldc                 p    t          t          |                               t          |i |d           d S )NrA  r]  )r   rL  r   r>  r  s      r   r   zNDRInt3264EnumField.__init__  sG    !4((114*6**& 	2 	
 	
 	
 	
 	
r   r   r   s   @r   rL  rL    s8        
 
 
 
 
 
 
 
 
r   rL  c                        e Zd Z fdZ xZS )NDRIntEnumFieldc                 p    t          t          |                               t          |i |d           d S )Nr-  r]  )r   rO  r   r    r  s      r   r   zNDRIntEnumField.__init__'  sF    ot$$--D+F++6 	. 	
 	
 	
 	
 	
r   r   r   s   @r   rO  rO  %  s8        
 
 
 
 
 
 
 
 
r   rO  c                   "    e Zd ZddgZd Zd ZdS )NDRInt3264Fieldr,  r3  c                     t          |j                  | j        |j                 z   }t	          t          dd|          d                              ||          S Nr   r   r   rU   rM   r]  rB  rD  s       r   r  zNDRInt3264Field.getfield3  rE  r   c                     t          |j                  | j        |j                 z   }t	          t          dd|          d                              |||                     ||                    S rT  rG  rH  s        r   r  zNDRInt3264Field.addfield7  rI  r   NrJ  r   r   r   rR  rR  0  s>        :DN N N
 
 
 
 
r   rR  c                       e Zd ZddgZdS )NDRSignedInt3264Fieldr0  r7  N)r   r   r   rC  r   r   r   rX  rX  >  s        :DDDr   rX  c                   z    e Zd Z e edd          d fg edd                     eddej                  gZ	dS )
NDRPointerreferent_idrO   c                     | o| j         S r   r  r   s    r   r   zNDRPointer.<lambda>H      #:K#) r   valueN)
r   r   r   r&   r:   r9   r'   r   rp  r   r   r   r   rZ  rZ  E  sd        l=!,,.K.KLMKq))	
 	
 	GT4>22KKKr   rZ  c                   N    e Zd ZdZdZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd ZdS )NDRFullPointerFielda  
    A NDR Full/Unique pointer field encapsulation.

    :param deferred: This pointer is deferred. This means that it's representation
                     will not appear after the pointer.
                     See [C706] 14.3.12.3 - Algorithm for Deferral of Referents
    Fr,  c                 0    || _         d | _        || _        d S r   )r   defaultdeferred)r   r   rd  r   s       r   r   zNDRFullPointerField.__init__Z  s     r   c                    t          |j                  ddg|j                 z   }t          t	          dd|          d                              ||          \  }}| j        s
|dk    r|d fS | j        rTt          |j        |j        |          }|j	        
                    |t          | j        j        |          f           ||fS | j                            ||          \  }}|t          |j        |j        ||	          fS )
Nr,  r3  r   r   r   rU  r]  )r  r  r[  )r  r  r[  r_  )r  r  r  r  r   r  EMBEDDEDrd  rZ  r  appendr   r   )r   r   r  r   r  r[  ptrr  s           r   r  zNDRFullPointerField.getfield_  s#   3*SY"77&uR'<'<'<FKKKTT
 
 } 	 !1!14<= 	i3=k  C !((#wtx7H#/N/N)OPPP3;h''V44z)s}+UX
 
 
 
 	
r   c                 &    ,t          t                    st          d j        z            t	          j                  ddgj                 z   }t          t          dd|          d          } j	        s|
                    |d          S t          j                   |
                    |j                  } j        r#j                             fd	f           |S  j        
                    |j                  S )
Nz2Expected NDRPointer in %s. You are using it wrong!r,  r3  r   r   r   rU  r]  c                 F    j                             | j                  S r   )r   r  r_  )r  r   r   r  s    r   r   z.NDRFullPointerField.addfield.<locals>.<lambda>  s    DH--c1ci@@ r   )r  rZ  r  r   r  r  r  r  r   rf  r  r  r_  r[  rd  r  rg  r   )r   r   r  r  r   r   s   `` `  r   r  zNDRFullPointerField.addfieldr  s"   ?:c:#>#>?DtyP   3*SY"77uR,,,F;;;} 	6<<Q***	3'''S!S_55A= 	!((@@@@@@3G   Hx  a333r   c                     |?t          |t                    s*t          d| j                            ||                    S |S )Ni   )r[  r_  )r  rZ  r   any2ir  s      r   rl  zNDRFullPointerField.any2i  sI    =Az!:!:=#hnnS!,,    r   c                      t          |          S r   reprr   r   r  s      r   i2reprzNDRFullPointerField.i2repr      Cyyr   c                     |S r   r   r  s      r   i2hzNDRFullPointerField.i2h  r  r   c                     |S r   r   r  s      r   h2izNDRFullPointerField.h2i  r  r   c                 J    |dS | j                             ||j                  S rc  )r   r  r_  r  s      r   r  zNDRFullPointerField.i2len  s$    91x~~c17+++r   c                 J    ||S | j                             ||j                  S r   )r   r  r_  r  s      r   r  zNDRFullPointerField.valueof  s&    9HxQW---r   N)Fr,  )r   r   r   r   rf  r   r  r  rl  rq  rt  rv  r  r  r   r   r   ra  ra  O  s          H! ! ! !

 
 
&4 4 4(        , , ,
. . . . .r   ra  c                       e Zd ZdZdZdS )NDRRefEmbPointerFieldz*
    A NDR Embedded Reference pointer
    TN)r   r   r   r   rf  r   r   r   rz  rz    s          HHHr   rz  c                   @     e Zd Zd Zd Z fdZd Z fdZd Z xZ	S )r  c                 J    d| _         || _        |                                  d S )NF)handles_deferred
ndr_fieldsrec_check_deferral)r   ro  s     r   r   zNDRConstructedType.__init__  s)     % !!!!!r   c                     | j         D ]c}t          |t                    r|j        rd| _        t          |t
                    r)|                                 |j        rd| _        d|_        dd S )NTF)r~  r  ra  rd  r}  r  r  )r   r  s     r   r  z%NDRConstructedType.rec_check_deferral  s      	/ 	/A!011 -aj -(,%!/00 /$$&&&% /,0D)).A&	/ 	/r   c                    t          t          |                               ||          \  }}t          |t                    r)|j                            |j                   |j        d d = | j        r|                     ||          }||fS r   )	r   r  r  r  r  r  extendr}  r  )r   r   r  r  r   s       r   r  zNDRConstructedType.getfield  s    *D11::3BB4dJ'' 	* !(()?@@@&qqq)  	4++C33A$wr   c                 F   t          j                    }|                    |j                   |j        d d = |rg|                                \  }} ||          \  }}||_        t          |t                    r$|                    |j                   |j        d d = |g|S r   )collectionsdequer  r  popleftr_  r  r  )r   r   r  r7  rh  getfldr  s          r   r  z)NDRConstructedType.read_deferred_pointers  s    	&'''!!!!$ 	-))++KCVAYYFAsCI#z** -.///)!!!,  	- r   c                    t          t          |                               |||          }t          |t                    r)|j                            |j                   |j        d d = | j        r|                     ||          }|S r   )	r   r  r  r  r  r  r  r}  r  )r   r   r  r  r   s       r   r  zNDRConstructedType.addfield  s    $d++44S!SAAc:&& 	) !(()>???%aaa(  	3**322Ar   c                 z   t          j                    }|                    |j                   |j        d d = |r|                                \  }} ||          }t          |t                    rHt          |j        t                    r.|                    |j        j                   |j        j        d d = ||S r   )	r  r  r  r  r  r  rZ  r_  r  )r   r   r  r7  addfldr  s         r   r  z(NDRConstructedType.add_deferred_pointers  s    	&'''!!!!$ 	499;;LFDq		A$
++ 4
4:z0R0R 45666J03  	4 r   )
r   r   r   r   r  r  r  r  r  r   r   s   @r   r  r    s        " " "
/ / /
 
 
 
 
   
 
 
 
 
      r   r  c                       e Zd Zd ZdS )_NDRPacketFieldc                 H    |                      ||j        |j        |          S )N)r  r  _parent)r   r  r  )r   r   ms      r   r  z_NDRPacketField.m2i  s     xxcmSxQQQr   N)r   r   r   r  r   r   r   r  r    s(        R R R R Rr   r  c                   .     e Zd Zd Z fdZ fdZ xZS )NDRPacketFieldc                     |j         | _         t          ||fd|i|| _        t                              | | j        |j                   t                              | |j                   d S )Npkt_clsr]  )r  r  r   r  r   r  r  r   r   r   rc  r  r  s        r   r   zNDRPacketField.__init__  sy    $+$@!"4LL'LVLL H# 	 	
 	
 	
 	##D'*=>>>>>r   c                    | j         rt          dd          }g }| j         D ]0}|                    ||          \  }}|                    |           1t	          t
          |                               ||          \  }}t          |          dk    r|d         |_        n||_        ||fS t	          t
          |                               ||          S Nr   r   rO   )	r  rR  r  rg  r   r  r   r  r  )
r   r   r  r   r  r)  r  resr  r   s
            r   r  zNDRPacketField.getfield)  s    $ 	 ""a((CJ. - -"||C339!!),,,,^T22;;CCCHC:!## *1!+8O^T**33C;;;r   c                    | j         rt          dd          }t          | j                   dk    r	|j        g}n|j        }t          | j         |          D ]L\  }}|.|                    |          \  }}	|                    ||	          }|                    |||          }Mt          t          |                               |||          S t          t          |                               |||          S r  )r  rR  r   r  r  zipr  r  r  r   r  )r   r   r  r  mcfldr  fldnamer  r   r  r   s             r   r  zNDRPacketField.addfield;  s    $ 	C#B**E4,--22k]

\
&)$*CZ&P&P 6 6"$ 11'::HC #		!S 1 1INN3955..77QBBB^T**33CA>>>r   )r   r   r   r   r  r  r   r   s   @r   r  r    s`        
? 
? 
?< < < < <$? ? ? ? ? ? ? ? ?r   r  c                   P     e Zd ZdZdZdZddgZd Zd Z fdZ	d Z
d	 Zd
 Z xZS )_NDRPacketListFieldzY
    A PacketListField for NDR that can optionally pack the packets into NDRPointers
    rO   ptr_packr   c                 0   |                     dd          | _        | j        r&t          t          dd |          d          | _        nt          dd |          | _        t          j        | ||fd|i| t                              | | j        g           d S )Nr  Fr   Trd  r  )r  r  ra  r  r   r)   r   r  r  s        r   r   z_NDRPacketListField.__init__Y  s    

:u55= 	9*r411D  DHH &b$88DH tWPPgPPPP##D48*55555r   c                     | j                             ||          \  }}|                    t          j        |                     |S r   )r   r  add_payloadr   rl  )r   r   r  r  r  s        r   r  z_NDRPacketListField.m2id  sA    h''Q// 	*622333
r   c                      t          |t                    r fd|D             }t          t                                         |          S )Nc                 F    g | ]}j                             |          S r   )r   rl  r  yr   r   s     r   
<listcomp>z-_NDRPacketListField.any2i.<locals>.<listcomp>n  s)    333AQ''333r   )r  r  r   r  rl  r   r   r  r   s   `` r   rl  z_NDRPacketListField.any2ik  sT    a 	433333333A($//55c1===r   c                 :    | j                             |d|          S Nr   )r   r  rp  s      r   r  z_NDRPacketListField.i2mq  s    x  c3///r   c                      t          |          S r   r   r  s      r   r  z_NDRPacketListField.i2lent      1vvr   c                 $      fd|D             S )Nc                 F    g | ]}j                             |          S r   )r   r  r  s     r   r  z/_NDRPacketListField.valueof.<locals>.<listcomp>x  s+    444Q  a((444r   r   r  s   `` r   r  z_NDRPacketListField.valueofw  s!    44444!4444r   )r   r   r   r   islistholds_packetsr  r   r  rl  r  r  r  r   r   s   @r   r  r  O  s          FMU#I	6 	6 	6  > > > > >0 0 0  5 5 5 5 5 5 5r   r  c                   (    e Zd ZdZdZd Zd Zd ZdS )NDRFieldListFieldz"
    A FieldListField for NDR
    rO   c                    |                     dd            d|v r|                     d          |d<   nd|v r|                     d          |d<   t          j        | g|R i | t                              | | j        g           d S )Nr  	length_isrA  size_is)r  r   r   r  field)r   r   r  s      r   r   zNDRFieldListField.__init__  s    

:t$$$&  #)::k#:#:F<  &  #)::i#8#8F< 6t666v666##D4:,77777r   c                      t          |          S r   r  r  s      r   r  zNDRFieldListField.i2len  r  r   c                 $      fd|D             S )Nc                 F    g | ]}j                             |          S r   )r  r  r  s     r   r  z-NDRFieldListField.valueof.<locals>.<listcomp>  s+    666q
""3**666r   r   r  s   `` r   r  zNDRFieldListField.valueof  s!    66666A6666r   N)r   r   r   r   r  r   r  r  r   r   r   r  r  {  sR          F8 8 8  7 7 7 7 7r   r  c                       e Zd Z e edd          d fg edd                     e edd          d fg edd                     eddej                  gZ	dS )NDRVaryingArrayoffsetr   c                     | o| j         S r   r]  r   s    r   r   zNDRVaryingArray.<lambda>  s    C4ECI r   actual_countNc                     | o| j         S r   r]  r   s    r   r   zNDRVaryingArray.<lambda>  s     1	 r   r_  )
r   r   r   r&   r"   r!   r'   r   rp  r   r   r   r   r  r    s        k(A&&(E(EFGJx##	
 	
 	  K5511 J~t,,	
 	
 	GT4>22KKKr   r  c                   n     e Zd ZdZdZdZ fdZ fdZ fdZ fdZ	 fdZ
d Zd	 Zd
 Z fdZ xZS )_NDRVarFieldz*
    NDR Varying Array / String field
    Fc                     d|v| _         |                    dd           }| j        r||d<   n| j        r||d<    t	          t
          |           j        |i | d S )Nr  c                     | j         S r   )r  r   s    r   r   z'_NDRVarField.__init__.<locals>.<lambda>  s	    8H r   rI  rA  )from_actualr  LENGTH_FROM
COUNT_FROMr   r  r   )r   r   r  r  r   s       r   r   z_NDRVarField.__init__  s{    &f4JJ{,H,HII	 	-$-F=!!_ 	-#,F< *lD!!*D;F;;;;;r   c                    t          |j                  ddg|j                 z   }t          t	          dd|          d                              ||          \  }}t          t	          dd|          d                              ||          \  }}t          |j        |j        ||          }| j        r-t          t          |                               ||          \  }}n,t          t          |                               ||          \  }}t          t          |           
                    ||          |_        ||fS )	Nr,  r3  r   r   r   rU  r]  )r  r  r  r  )r  r  r  r  r   r  r  r  r   r  rt  r_  )
r   r   r  r   r  r  r  finalr  r   s
            r   r  z_NDRVarField.getfield  s;   3*SY"77!%A3"7"7"7vFFFOOPSUVWW'b!(=(=(=VLLLUU 
  
  )m%	
 
 
  	Jd33<<UFKKKFCCd33<<S&IIKFCL$//33C==u}r   c                    t          |t                    st          d| j        z            t	          |j                  ddg|j                 z   }t          |j        |           t          t          dd|          d                              |||j                  }t          t          dd|          d                              |||j        d u r.t          t          |                               ||j                  p|j                  }t          t          |                               ||t          t          |                               ||j                            S )	Nz7Expected NDRVaryingArray in %s. You are using it wrong!r,  r3  r   r   r   rU  r]  )r  r  r  r   r  r  r  r  r_  r  r   r  r  r  r   r  r  rv  r   r   r  r  r   r   s        r   r  z_NDRVarField.addfield  sR   #// 	IDIU   3*SY"77CIs###U2qc***&999BB33:VVU2qc***&999BB$ @lD))//SY?? 
 
 \4((11E,--11#syAA
 
 	
r   c                 `    t          t          |                               ||j                  S r   )r   r  r  r_  r  s      r   r  z_NDRVarField.i2len  s%    \4((..sAG<<<r   c                     t          |t                    s7t          t          t          |                               ||                    S |S N)r_  )r  r  r   r  rl  r  s      r   rl  z_NDRVarField.any2i  sP    !_-- 	"L$//55c1==    r   c                      t          |          S r   rn  rp  s      r   rq  z_NDRVarField.i2repr  rr  r   c                     |S r   r   r  s      r   rt  z_NDRVarField.i2h  r  r   c                     |S r   r   r  s      r   rv  z_NDRVarField.h2i  r  r   c                 `    t          t          |                               ||j                  S r   )r   r  r  r_  r  s      r   r  z_NDRVarField.valueof  s%    \4((00ag>>>r   )r   r   r   r   r  r  r   r  r  r  rl  rq  rt  rv  r  r   r   s   @r   r  r    s          KJ< < < < <    &
 
 
 
 
&= = = = =          ? ? ? ? ? ? ? ? ?r   r  c                       e Zd Z e edd          d fg edd                     e edg ej        d           d d ffg e	dg  ed	d
          d                     gZ
dS )NDRConformantArrayr  Nc                     | o| j         S r   r]  r   s    r   r   zNDRConformantArray.<lambda>  r^  r   r_  c                     | j         S r   r  r   s    r   r   zNDRConformantArray.<lambda>  s    s} r   r  c                     | j                             dd           o%t          | j         d         d         t                    S )Nr_  r   )ro  r  r  r   r   s    r   r   zNDRConformantArray.<lambda>  s8    CJNN7D$A$A %G&sz'':1'=vFF r   c                 <    |ot          |d         t                    S rc  )r  r   )r)  r  s     r   r   zNDRConformantArray.<lambda>  s    s'Iz#a&&/I/I r   r   r   c                     | j         S r   r  r   s    r   r   zNDRConformantArray.<lambda>  s    s} r   )r   r   r   r&   r"   r!   r)   r   rp  r   r   r   r   r   r  r    s        k+t,,.K.KLMJ{D))	
 	
 	 $O#<#<	  G GII NZZA..;T;T  !	
 	
KKKr   r  c                   n    e Zd Z e edd          d fg edd                     edd          gZdS )NDRConformantStringr  Nc                     | o| j         S r   r]  r   s    r   r   zNDRConformantString.<lambda>  r^  r   r_  r   )r   r   r   r&   r"   r!   r/   r   r   r   r   r  r    s`        k+t,,.K.KLMJ{D))	
 	
 	"KKKr   r  c                   x     e Zd ZdZdZdZdZ fdZ fdZ fdZ	d Z
 fdZ fdZd	 Zd
 Zd Z fdZ xZS )_NDRConfFieldz-
    NDR Conformant Array / String field
    Fc                     |                     dd          | _        d|v r.|                     d          }| j        r||d<   n| j        r||d<    t	          t
          |           j        |i | d S )Nconformant_in_structFr  rI  rA  )r  r  r  r  r   r  r   )r   r   r  r  r   s       r   r   z_NDRConfField.__init__&  s    $*JJ/Eu$M$M!jj++G /(/}%% /'.|$+mT""+T<V<<<<<r   c                    t          |j                  ddg|j                 z   }| j        r)t	          t
          |                               ||          S t          t          dd|          d                              ||          \  }}t	          t
          |                               ||          \  }}| | j	        rt          nt          |j        |j        ||          fS )	Nr,  r3  r   r   r   rU  r]  )r  r  r  r_  )r  r  r  r  r   r  r  r  r   CONFORMANT_STRINGr  r  )r   r   r  r   r  r  r  r   s          r   r  z_NDRConfField.getfield1  s    3*SY"77$ 	?--66sA>>>$U2qc%:%:%:&IIIRR
 
	 M40099#vFFQ4#9Q?Q	S]isT T T T 	Tr   c                 J   | j         r*t          t          |                               |||          S | j        r,t          |t                    st          d| j        z            | j        s,t          |t                    st          d| j        z            t          |j                  ddg|j                 z   }t          |j        |           |j        r.t          |j        d         t                    r|j        d         }n|j        }t!          t#          dd|          d	                              |||j        d u r)t          t          |                               ||          p|j                  }t          t          |                               |||          S )
Nz;Expected NDRConformantString in %s. You are using it wrong!z:Expected NDRConformantArray in %s. You are using it wrong!r,  r3  r   r   r   rU  r]  )r  r   r  r  r  r  r  r  r   r  r  r  r  r  r_  r  r  r   r  r  )r   r   r  r  r   r_  r   s         r   r  z_NDRConfField.addfield>  s   $ 	D--66sAsCCC! 	*S:M*N*N 	M)   ' 	
3@R0S0S 	LtyX   3*SY"77CIs###9 	CIaL/BB 	IaLEEIEU2qc***&999BBMT! =mT**00e<<}
 
 ]D))2235AAAr   c                     | j         r|}nC| j        s5|j        r.t          |j        d         t                    r|j        d         }n|j        }|S rc  )r  r  r_  r  r  )r   r  r_  s      r   _subvalz_NDRConfField._subvalY  s^    $ 		EE&		 171:77	
 GAJEEGEr   c                 |    t          t          |                               ||                     |                    S r   )r   r  r  r  r  s      r   r  z_NDRConfField.i2lenf  s-    ]D))//T\\!__EEEr   c                    | j         r)t          t          |                               ||          S | j        rLt          |t                    s7t          t          t          |                               ||                    S t          |t                    s7t          t          t          |                               ||                    S |S r  )r  r   r  rl  r  r  r  r  r  s      r   rl  z_NDRConfField.any2ii  s    $ 	<--33C;;;! 	*Q8K*L*L 	&M40066sA>>    A122 	%M40066sA>>    r   c                      t          |          S r   rn  rp  s      r   rq  z_NDRConfField.i2reprx  rr  r   c                     |S r   r   r  s      r   rt  z_NDRConfField.i2h{  r  r   c                     |S r   r   r  s      r   rv  z_NDRConfField.h2i~  r  r   c                 |    t          t          |                               ||                     |                    S r   )r   r  r  r  r  s      r   r  z_NDRConfField.valueof  s-    ]D))11#t||AGGGr   )r   r   r   r   r  r  r  r   r  r  r  r  rl  rq  rt  rv  r  r   r   s   @r   r  r    s%         KJ	= 	= 	= 	= 	=T T T T TB B B B B6  F F F F F          H H H H H H H H Hr   r  c                       e Zd ZdZdZdS )NDRVarPacketListFieldz-
    NDR Varying PacketListField. Unused
    TNr   r   r   r   r  r   r   r   r  r              JJJr   r  c                       e Zd ZdZdZdS )NDRConfPacketListFieldz(
    NDR Conformant PacketListField
    TNr  r   r   r   r  r    r  r   r  c                       e Zd ZdZdZdS )NDRConfVarPacketListFieldz0
    NDR Conformant Varying PacketListField
    TNr  r   r   r   r  r    r  r   r  c                       e Zd ZdZdZdS )NDRConfFieldListFieldz'
    NDR Conformant FieldListField
    TNr  r   r   r   r  r    r  r   r  c                       e Zd ZdZdZdS )NDRConfVarFieldListFieldz/
    NDR Conformant Varying FieldListField
    TNr  r   r   r   r  r    r  r   r  c                       e Zd Zd Zd ZdS )	_NDRUtf16c                 f    ddd|j                  }t          |                              |          S )Nutf-16beutf-16ler  )r  r	   encoder   r   r  r   s       r   rv  z_NDRUtf16.h2i  s0    %<<S]K||""8,,,r   c                 j    ddd|j                  }t          |                              |d          S )Nr  r  r  replace)errors)r  r   decoder  s       r   rt  z_NDRUtf16.i2h  s5    %<<S]KA%%hy%AAAr   N)r   r   r   rv  rt  r   r   r   r  r    s7        - - -B B B B Br   r  c                       e Zd ZdZdZdZdS )NDRConfStrLenFieldz
    NDR Conformant StrLenField.

    This is not a "string" per NDR, but an a conformant byte array
    (e.g. tower_octet_string)
    TN)r   r   r   r   r  r  r   r   r   r  r    s%          KKKr   r  c                       e Zd ZdZdZdZdZdS )NDRConfStrLenFieldUtf16zN
    NDR Conformant StrLenField.

    See NDRConfLenStrField for comment.
    TFN)r   r   r   r   r  ON_WIRE_SIZE_UTF16r  r   r   r   r  r    s+          KKKr   r  c                       e Zd ZdZdZdS )NDRVarStrLenField!
    NDR Varying StrLenField
    TNr   r   r   r   r  r   r   r   r
  r
              KKKr   r
  c                       e Zd ZdZdZdZdS )NDRVarStrLenFieldUtf16r  FTNr   r   r   r   r  r  r   r   r   r  r    s%          KKKr   r  c                       e Zd ZdZdZdS )NDRConfVarStrLenField,
    NDR Conformant Varying StrLenField
    TNr  r   r   r   r  r    r  r   r  c                       e Zd ZdZdZdZdS )NDRConfVarStrLenFieldUtf16r  FTNr  r   r   r   r  r    s%          KKKr   r  c                       e Zd ZdZdZdS )NDRConfVarStrNullFieldz-
    NDR Conformant Varying StrNullField
    TN)r   r   r   r   	NULLFIELDr   r   r   r  r    s          IIIr   r  c                       e Zd ZdZdZdZdS )NDRConfVarStrNullFieldUtf16z2
    NDR Conformant Varying StrNullFieldUtf16
    FTN)r   r   r   r   r  r  r   r   r   r  r    s%          IIIr   r  c                   J    e Zd Z edd           eddej                  gZdS )NDRUniontagr   r_  N)r   r   r   r   r'   r   rp  r   r   r   r   r  r  	  s7        GT4>22KKKr   r  c                   \     e Zd ZddgZ fdZ fdZ fdZ fdZd Zd Z	d	 Z
d
 Z xZS )_NDRUnionField
switch_fmtr^  c                 v    || _         || _        t          t          |                               ||           d S r   )r   r^  r   r  r   )r   fldsdfltr^  r   r   s        r   r   z_NDRUnionField.__init__	  s7    $
nd##,,T488888r   c                    t          |j                  | j        |j                 z   }t	          t          dd|          | j                                      ||          \  }}t          t          |           
                    |t          |                    \  }}|                    ||          \  }}|t          |||j        |j        |          fS )Nr   r   r   r]  )r  )r  r_  r  r  r  )r  r  r   r  r  r   r^  r  r   r  _find_fld_pkt_valr  )
r   r   r  r   r  r  r   r)  r  r   s
            r   r  z_NDRUnionField.getfield	  s    $/#)"<<uR444DJGGGPPQTVWXX~t,,>>sHQTDUDUDUVVQll3//x3ci3=RU
 
 
 
 	
r   c                    t          |j                  | j        |j                 z   }t	          |t
                    st          d| j        z            t          |j	        |           t          t          dd|          | j                                      |||j                  }t          t           |                               |||          S )Nz0Expected NDRUnion in %s. You are using it wrong!r   r   r   r]  )r  r  r   r  r  r  r  r   r  r_  r  r   r^  r  r  r   r  r  s        r   r  z_NDRUnionField.addfield$	  s    $/#)"<<#x(( 	BTYN   	CIs###U2qc***$*===FFsAswWW^T**33CC@@@r   c                 n    t          t          |                               ||          \  }}||j        fS r   )r   r  r%  r_  )r   r   r  r   r   s       r   r%  z _NDRUnionField._find_fld_pkt_val0	  s2    ..@@cJJSCI~r   c                      t          |          S r   rn  rp  s      r   rq  z_NDRUnionField.i2repr5	  rr  r   c                     |S r   r   r  s      r   rt  z_NDRUnionField.i2h8	  r  r   c                     |S r   r   r  s      r   rv  z_NDRUnionField.h2i;	  r  r   c                 j    |                      ||          \  }}|                    ||j                  S r   )r%  r  r_  )r   r   r  r   r  s        r   r  z_NDRUnionField.valueof>	  s1    ))#q11S{{3(((r   )r   r   r   r  r   r  r  r%  rq  rt  rv  r  r   r   s   @r   r  r  	  s        w'I9 9 9 9 9

 
 
 
 

A 
A 
A 
A 
A    
      ) ) ) ) ) ) )r   r  c                       e Zd Zd Zd ZdS )NDRUnionFieldc                     t                               | ||||           t                              | d |D             |gz              d S )N)r^  r   c                     g | ]
}|d          S )r   r   )r  r  s     r   r  z*NDRUnionField.__init__.<locals>.<listcomp>F	  s    *>*>*>A1Q4*>*>*>r   )r  r   r  )r   r"  r#  r^  r   s        r   r   zNDRUnionField.__init__D	  sS    dD*UUU##D*>*>*>*>*>$*GHHHHHr   c                     |rMt          |t                    st          d| j        z            t                              | ||          |_        |S )Nz(Invalid value for %s; should be NDRUnion)r  r  r  r   r  rl  r_  r  s      r   rl  zNDRUnionField.any2iH	  sP     	=a** = !Kdi!WXXX(..tS!<<r   N)r   r   r   r   rl  r   r   r   r-  r-  C	  s5        I I I    r   r-  c                   0     e Zd ZdZd fd	Zd Zd Z xZS )NDRRecursiveFieldz<
    A special Field that is used for pointer recursion
    r,  c                 ^    t          t          |                               |d |           d S )Nr   )r   r2  r   )r   r   r   r   s      r   r   zNDRRecursiveField.__init__Z	  s/    &&//d/DDDDDr   c                 t    t          t          dd |j                  d                              ||          S Nr   Tr  )ra  r  r   r  r  s      r   r  zNDRRecursiveField.getfield]	  s;    "2tS]33d
 
 

(3

	r   c                 v    t          t          dd |j                  d                              |||          S r5  )ra  r  r   r  r!  s       r   r  zNDRRecursiveField.addfieldb	  s=    "2tS]33d
 
 

(33

	 r   )r,  )r   r   r   r   r   r  r  r   r   s   @r   r2  r2  U	  sk         E E E E E E  
             r   r2  c                   L    e Zd ZdZ edd           eddd          gZd Zd	S )
NDRContextHandler-  
attributesr   r  r   rL   r  c                     t           j        S r   rk  r  s     r   r  z$NDRContextHandle.guess_payload_classr	  ro  r   N)r   r   r   r  r!   r0   r   r  r   r   r   r8  r8  k	  sS        I
<##R000K
" " " " "r   r8  c                 Z    | j         dS ddd                    | j         j        d          S )Nr   r   r   rL   )r   r  
Endiannessr   s    r   _get_ndrtype1_endianr>  y	  s2    
~sS!!%%cn&?EEEr   c                   r    e Zd Z edd           eddddd           edd	           ed
d          gZdS )NDRSerialization1Headerr  rO   r=  rL   r   r   r<  CommonHeaderLengthrM   Fillerl   L N)r   r   r   r   r   r$   r9   r   r   r   r   r@  r@  	  s\        	)QlDh*G*GHH)1--Hj))	KKKr   r@  c                   T    e Zd Z e edd          e           edd          gZdS )NDRSerialization1PrivateHeaderObjectBufferLengthr   r   rB  N)r   r   r   rG   r!   r>  r9   r   r   r   r   rD  rD  	  sM        J+Q//AU	
 	
 	
 	Ha  	KKKr   rD  Fc                    t          t                    r G fddt                    }t          | dd                   t          | dd                   z  }ddd|j                 }|j         t          z  }| || dd	|j        z            ||
          j        z  t          j	        | d	|z   |j        z   d                   z  S t          | dd                    | dd                   z  S )zT
    Deserialize Type Serialization Version 1 according to [MS-RPCE] sect 2.2.6
    c                   >    e Zd Z e edd                     gZdS )ndr_deserialize1.<locals>._clsr   Nr   r   r   ra  r  r   r   s   r   _clsrH  	  s2        ##NN5$$D$DEEKKKr   rK  NrM   rL   r   r   r<  r  r  )

issubclassr  r@  rD  r=  rE  _TYPE1_S_PADr   r   rl  )br   r  rK  hdrr   r  s    `     r   ndr_deserialize1rP  	  s<    #y!! 
	 	 	 	 	 	 	9 	 	 	
 &ae,,/MaPQRTPTg/V/VVX..s~>))\9 d"rC2223      2;1G#G#I#I!JKKL	
 #1RaR5))CC!""JJ66r   c                    |                                  } t          | dd          }t          | t                    st          | t                    s t          t          |          | z            S t          | t                    r| j        j        n| j        | }t          |           }t          |          t          || t          z  z             z  } n1| j        j        | j        j        }| j                                          G fddt                    }t          |  ||          z            }|t          |           t          z  dz  z   S )	z0
    Serialize Type Serialization Version 1
    r  r   )r=  )rE  c                   >    e Zd Z e edd                     gZdS )ndr_serialize1.<locals>._clsr   NrI  rJ  s   r   rK  rS  	  s2        udC @ @AA
r   rK  r   r  )r  getattrr  r@  r  r  rZ  r_  r   r   rD  rM  r  remove_payload)r   r   r  pkt_lenrK  retr   s         @r   ndr_serialize1rX  	  sw    ((**CS+x00Fc233 %#y)) 	K0FCCCcIJJJc:&& 	 )%CC-Cc(( &
 
 
*&7(l)BB
 
 

 i!k!""$$$
 
 
 
 
 
 
y 
 
 

 ddsmmm#
$
$C3s88)l*g555r   c                   0     e Zd Z fdZd Zd Zd Z xZS )_NDRSerializeType1c                 H     t          t          |           j        |i | d S r   )r   rZ  r   r  s      r   r   z_NDRSerializeType1.__init__	  s,    0 $''0$A&AAAAAr   c                      t          |          S r   )rX  rp  s      r   r  z_NDRSerializeType1.i2m	  s    c"""r   c                 0    t          || j        d          S )NFr]  )rP  r   r  s      r   r  z_NDRSerializeType1.m2i	  s    4859999r   c                 H    t          |                     ||                    S r   )r   r  rp  s      r   r  z_NDRSerializeType1.i2len	  s    488C%%&&&r   )r   r   r   r   r  r  r  r   r   s   @r   rZ  rZ  	  sj        B B B B B# # #: : :' ' ' ' ' ' 'r   rZ  c                       e Zd ZdgZdS )NDRSerializeType1PacketFieldrh  Nr   r   r   r  r   r   r   r`  r`  	          IIIr   r`  c                       e Zd ZdgZdS )NDRSerializeType1PacketLenFieldrh  Nra  r   r   r   rd  rd  	  rb  r   rd  c                       e Zd ZdgZdS ) NDRSerializeType1PacketListFieldrh  Nra  r   r   r   rf  rf  	  rb  r   rf  c                   `     e Zd ZdZ fdZd Zd Zd Zd Zd Z	de
d	ee
         f fd
Z xZS )r&  z0
    A DCE/RPC session within a TCP socket.
    c                 T   d | _         d| _        d| _        |                    dd          | _        t
          j        | _        |                    dd           | _        |                    dd           | _	        |                    dd           | _
        |                    dd	          | _        i | _        t          j        d
           | _        i | _        t
          j        r%t
          j        rt
          j        D ]}d | j        |<    t'          t(          |           j        |i | d S )NFr   support_header_signingTssp
sspcontextr>  rA  r   c                      dS r  r   r   r   r   r   z(DceRpcSession.__init__.<locals>.<lambda>
  s    S r   )rpc_bind_interfacer  r  r  ri  r   dcerpc_force_header_signingheader_signrj  rk  r>  rA  map_callid_opnumr  defaultdictfragssniffsspcontextsr%  winssps_passiver   r&  r   )r   r   r  rj  r   s       r   r   zDceRpcSession.__init__	  s   "&
!&,jj1I4&P&P#;::eT** **\488 **\488%zz*;Q?? " ,[[99
 "% 	2$*> 	2+ 2 2-1%c**+mT""+T<V<<<<<r   c                 b   d}i }t           |v s	t          |v rf|j        D ]]}|j        j        }|j        j        }	 t          ||f         | _        0# t          $ r! d| _        t          j
        d|z             Y Zw xY wnt          |v s	t          |v r[|j        D ]R}|j        dk    rEddd|t                   j                 | _        |j                            d          dk    rd	| _        Snt*          |v r)|j        }||t*                   j        f| j        |j        <   n\t4          |v rS	 | j        |j                 \  }|d
<   | j        |j        = n,# t          $ r t          j        d|j        z             Y nw xY wt           |v st          |v st          |v s	t          |v r|j        dz  rd	| _        ||fS )zo
        Common function to handle the DCE/RPC session: what interfaces are bind,
        opnums, etc.
        Nz-Unknown RPC interface %s. Try loading the IDLr   r   r   r   z	%if_uuid%r   Tr  z%Unknown call_id %s in DCE/RPC sessionrU   )rP  rq  rW  r=  r0  r2  r  rm  KeyErrorr
   r  r[  rs  r`  rD  r   r   r  rI  sprintfr  r~  r   r  rp  r  r  infor  ro  )r   r   r   optsctxr0  r2  r  s           r   _up_pktzDceRpcSession._up_pkt
  s*   
 #!4!;!;' 	 	-5 0;
.@':AV.WD++   .2D+'G'Q    	 s""&=&D&D{ * *:??).8%<%<S\=P%QDN*22;??7JJ%)
	*
 s""IE16N8K8S1SD!#+..##X040Eck0R-t,-)#+66 X X X !H3;!VWWWWWX 3"c))$$&#-- }t# (#' d{s#   A(A98A9&%E &E54E5c                    |j         }|j        j        r|j        j        r|S |j        j        s	|| j        v r| j        |xx         |t
                   j        j        j        z  cc<   |j        j        rL|t
                   j                                         |t
                   xj        | j        |         z  c_        |S dS |S )z9
        Function to defragment DCE/RPC packets.
        N)	r  r  r  r  rr  r   r  r  rU  )r   r   uids      r   _defragmentzDceRpcSession._defragment=
  s     k=' 	CM,G 	J=' 		3$*+<+<JsOOOs7|3;DDOOO}* G$33555G$$
37$$
  Jr   c                     dS )z7
        Function to fragment DCE/RPC packets.
        Nr   rm  s     r   	_fragmentzDceRpcSession._fragmentP
  s	    
 	r   c                 
   |                      |          }|sd S |                     |          \  }}d }t          j        |j        v r$t          |j        t          j                           }t          j        r$t          j        r|j        r|j        	                                r| j
        D ]}|                    | j
        |         |j        j                  \  | j
        |<   }|t          k    rNt          t          |j        j                            | _        || _        | j
        |         | _        d | j
        |<   n]| j        rV|j        rO|j                                        r6|r4| j        j        r(| j                            | j        t,          |v            |j        r|j                                        r|r| j        |S | j        t.          j        t.          j        fv rb|j        r|t          |j                  z  }|j        r
||j        z  }|                                }|j        }t;          |j                  }	d |_        d |_        t=                      |j        _        d |_        | j        t.          j        k    r| j                            | j        tA          j!        d| j"        t          |                    tA          j!        dd|          tA          j!        d| j"        t          |          d |	                    g|j        j                  }
|
d         j#        }n| j        t.          j        k    r| j        $                    | j        tA          j%        | j"        t          |                    tA          j%        d|          tA          j%        | j"        t          |          d |	                    g|j        j                   |j        r0t;          |j                  }|d |          || d          c}|_        |j        r0t;          |j                  }|d |          || d          c}|_        || j&        rt,          |v }	 | j&        j'        |         |         }nM# tP          $ r@ tS          j*        d|d| j&                   ||j        t          j                 _+        |cY S w xY w|rJ ||f| j,        | j-        d	|}|j        t          j                 j.        /                                 ||z  }n>|j0        s| |d
| j,        | j-        d	|z  }n|r||j        t          j                 _+        |S )N)
IsAcceptorFconf_req_flagsignr(  TrO   r  r(  zUnknown opnum z for interface r  r   )1r~  r{  r   rp  r  r  r%  rt  r  ri  rs  GSS_PassiverB  rB   DCE_C_AUTHN_LEVELr  r>  rj  rk  rg  passiveGSS_Passive_set_Directionr  r5  r9  r:  r  r	  r  r   r   GSS_UnwrapExrE   WRAP_MSGro  r(  GSS_VerifyMICExMIC_MSGrm  r  rv  r
   r  loadr  r  r   rU  r   )r   r   r   ry  bodyrj  r{  
pdu_headersec_trailerauthval_len_msgsr  vtlenis_responser   r  s                   r   in_pktzDceRpcSession.in_pktf
  s   s## 	Fll3''t>S[((T^455D% 	$*> 	  S%6%=%=%?%? 0 : :C9<-c2)4: :6D)#. //*; 1 <==+ + $'*.*?*D59-c2: % %2244 	 ?* H66#2c#9 7     W	H!2!?!?!A!A W	Hd W	H&
!/!-#   > 2E#.111D# -C,,D !XXZZ
(6!+"899*.
'+/
(-6[[
"*(,
% ?&7&CCC H11  L.3%)%5%*:%6%6    L.2%)%)    L.3%)%5%*;%7%7+%F  ( )4- E0 !8=DD_(9(GGGH,,  K%)%5%*:%6%6  
  K%)%)  
  K%)%5%*;%7%7+%F  " )4'  , # L !122F-1(F7(^T6'((^*D#*> H//E+/%=$vww-(D#.!8)S0K-4U;KH   ##uud557   48DN+0


  O#dW$*WWRVWWDN+6EEGGGw_ OssNt~NNNNN 	4/3CK',
s   Q8 8ASSc                    t           |v sJ |                     |           |j        |gS | j        rt	          |j        t          t          f          r|t          |j        j                  }d }| j	        t          j        t          j        fv r
|j        #t          |           t          z  }d|z  |_        nt          |j                  }|j        r|t          |j                  z  }||j        z  }t#          | j        j        | j	        | j        |d| j                            | j                  z            |_        |                                }t          |j                  dz
  |_        t          |          |_        |j        }t          |j                  }d |_        d |_        t5                      |j        _        d |_        d }| j	        t          j        k    r| j                            | j        t9          j        d| j        t          |                    t9          j        dd|          t9          j        d| j        t          |          d |                    g          \  }}|d         j        }	n| j	        t          j        k    r| j                             | j        t9          j!        | j        t          |                    t9          j!        d|          t9          j!        | j        t          |          d |                    g|j        j                  }|}	ntE          d	          |r|	d |          |	| d          c}	|_        |j        r0t          |j                  }
|	d |
          |	|
 d          c}	|_        n|}	tG          j$        |	
          |j        _        |r||j        _        nd |_        |gS )Nr  )r=  r>  rA  r?  rB  rM   Fr  TrO   r  
Impossible)r  )%r   r{  r  rk  r  r  r~  r  r  r>  r5  r9  r:  r	  r   r  r  r<  rj  r=  rA  MaximumSignatureLengthr  rF  r   rB  r   
GSS_WrapExrE   r  ro  r(  GSS_GetMICExr  r  r   rp  )r   r   r  rm  r  r  r  r  r  r  r  s              r   out_pktzDceRpcSession.out_pkt
  s   #~~~~S(5L? u	)zK./: 
  
 u	) ,--DI!/!-#  
 #+"4yyj,<<F'.'7C$$ !122F> 2E#.111D(($6"h0#$($8$*  'h55doFF G% % %!  !XXZZ
&)**B&C&Ca&G
#&)*oo
#(6!+"899 +/
'+/
(-6[[
"*(,
% 	?&7&CCC'+x':':  L.3%)%5%*:%6%6    L.2%)%)    L.3%)%5%*;%7%7+%F  ( ($E9. aAA_(9(GGG $ 5 5  K%)%5%*:%6%6  
  K%)%)  
  K%)%5%*;%7%7+%F  " )4'! !I* AA$\222 C*+HfWH+q&{'As'> ?//E()'E6'
AufggJ%As~ #'.a"8"8"8CK )/8!,,$(!ur   r   returnc                     t          t          |                               |          }|t          |v r|                     |          S |S r   )r   r&  r'  r   r  r  s     r   r'  zDceRpcSession.process}  sD    M4((0055?w#~~;;s###
r   )r   r   r   r   r   r{  r~  r  r  r  r   rK   r'  r   r   s   @r   r&  r&  	  s         = = = = =$/ / /j  &  ,W W Wr| | ||6 hv&6          r   r&  c                   8     e Zd ZdZ fdZ fdZd fd	Z xZS )DceRpcSocketzA
    A Wrapper around StreamSocket that uses a DceRpcSession
    c           	         t          |                    dd           |                    dd           |                    dd           |                    dd                    | _         t          t          |           j        |i | d S )Nrj  r>  rA  ri  T)rj  r>  rA  ri  )r&  r  r*  r   r  r   r  s      r   r   zDceRpcSocket.__init__  s    $

5$''zz,55"JJ'8$??#)::.F#M#M	
 
 
 	+lD!!*D;F;;;;;r   c                     | j                             |          D ]$} t          t          |           j        |fi |c S d S r   )r*  r  r   r  send)r   r  r  r   r   s       r   r  zDceRpcSocket.send  s[    <''** 	A 	AC15t,,1#@@@@@@@	A 	Ar   Nc                     t          t          |                               |          }|| j                            |          S d S r   )r   r  recvr*  r  )r   r  r   r   s      r   r  zDceRpcSocket.recv  sB    L$'',,Q//?<&&s+++ ?r   r   )r   r   r   r   r   r  r  r   r   s   @r   r  r    s~         < < < < <A A A A A, , , , , , , , , ,r   r  c                   D    e Zd ZdZg Zedd            Zed             ZdS )DceRpc4PayloadzADummy class which use the dispatch_hook to find the payload classNc                     | j         D ],}t          |d          r|                    ||          r|c S -t          j        d           t
          S )z;dispatch_hook to choose among different registered payloads
can_handlez8DCE/RPC payload class not found or undefined (using Raw))_payload_classhasattrr  r
   r  r   )r   r   _underlayerr   r   klasss         r   r   zDceRpc4Payload.dispatch_hook  s`     ' 	 	Eul++ 0@0@{0S0S VWWW
r   c                 :    | j                             |           dS )zXMethod to call from possible DCE/RPC endpoint to register it as
        possible payloadN)r  rg  )r   r  s     r   register_possible_payloadz(DceRpc4Payload.register_possible_payload  s!     	!!#&&&&&r   r   )r   r   r   r   r  r   r   r  r   r   r   r  r    sX        KKN   [ ' ' [' ' 'r   r  )F)r   	functoolsr   r  r  enumr   r  r   scapy.base_classesr   scapy.configr   scapy.compatr   r	   scapy.errorr
   scapy.layers.dnsr   scapy.layers.ntlmr   r   scapy.packetr   r   r   r   r   r   scapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   scapy.sessionsr>   scapy.supersocketr?   scapy.layers.kerberosr@   rA   scapy.layers.gssapirB   rC   rD   rE   scapy.layers.inetrF   scapy.contrib.rtps.common_typesrG   rH   rI   rJ   typingrK   r  rM  r   r   r   r  r  r  r   r   r   r   r   r   r   r   r  r  r5  r  r<  r  rr  r~  r  r  r  r  r-  r  r,  r|  rJ  r   r/  r4  r6  rC  rL  rP  r[  rc  rh  rq  rs  ru  rx  r~  r  
namedtupler  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r#  r(  r+  r/  r2  r6  r9  r;  r>  rL  rO  rR  rX  rZ  ra  rz  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r-  r2  r8  r>  r@  rD  rP  rX  rZ  r`  rd  rf  r&  r  r  r   r   r   <module>r     sZ                           / / / / / /       0 0 0 0 0 0 0 0 # # # # # # ( ( ( ( ( (                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +X * ) ) ) ) ) * * * * * *                   " ! ! ! ! !                   yv z w	
 y y x }  z   
 
   !" #$ 	)  ,	 	 	 	 	 	  	D	/00&D	/002QD	/00)D	/00'	   !     w   	 	 	P P P P Pf P P P
    V    sF# & & & & Cs # # # #4 4 4 4 4V 4 4 4 L1a%!233LQGX#677M'1<<<==Ik1		         f      L. . . . .f . . .b& & & & & & & &\    '   0        & R" R" R" R" R" R" R" R"l 8                @" " " " " " " "" " " " "& " " ":" " " " " " " "     &          , 






	 	  &**,, 4 4 4$4 $4 	4
 '4 #4 #4 (4 '4 -4 (4 -4 (4 )4 *4  )!4" )#4$ +%4 4& ,'4( %)4* !+4, *-4. +/40 $142 &344 &546 *748 $94: 1;4< (=4> )?4@ (A4B -C4D -E4F )G4 4H /.//(#*,0.,-%'g4 4 4 n '&+  D! D! D! D! D!f D! D! D!T    G   $    G       W   "    G   &    W       .   * G[ + + + +
    ^   . G^2 . . . .
    W   % % % % %^ % % %P G^2 . . . .* * * * *. * * *
 G( 3 3 3 3- - - - -n - - -
 G,B 7 7 7 7
; ; ; ; ;6 ; ; ;
 G\ , , , ,
	 	 	 	 	> 	 	 	 G\ + + + +    ^     G^1 - - - -
    n    G_A . . . . ";!*y*.EFF 
 
 
 
 
 
 
 
 (G (G (GV4 4 4 3 3 3 3 3 3 3 3  , , ,2 2 2U U U U U U U Up! ! ! ! ! ! ! !	J 	J 	J 	J 	Jy/ 	J 	J 	J    E       *   0    
&9    "       
    ;   .	 	 	 	 	< 	 	 		 	 	 	 	 	 	 	/ / / / / / / /    I   
    )   
    )   
    	   
    9   
       
    	   
       
 
 
 
 
K 
 
 

 
 
 
 
( 
 
 

 
 
 
 
k8 
 
 

 
 
 
 
l 
 
 
    O          R. R. R. R. R./ R. R. R.j    /   DF F F F F F F FRR R R R Rk; R R R-? -? -? -? -?' -? -? -?f)5 )5 )5 )5 )5,o )5 )5 )5X7 7 7 7 7*N 7 7 7.    j   &N? N? N? N? N?6 N? N? N?b       :    *   eH eH eH eH eHF eH eH eHP    L*=       ],?       |=P       M+<       }l<M   B B B B B B B B	 	 	 	 	[ 	 	 		 	 	 	 	m[:JI 	 	 	    k       \;8H)       M<k       <.>	      ]L+|       <.?      z   -) -) -) -) -)& -) -) -)`    &   $               ," " " " "y " " "F F F    f       V   7 7 7 7<"6 "6 "6J' ' ' ' ' ' ' '    #5{       &8.       '9?   P P P P PN P P Pf, , , , ,< , , ,R' ' ' ' 'V ' ' '* G^ $ $ $ $ $r   