
    h&                     ^   S r SSKJrJr  SSKJr  SSKJr  SSKJrJ	r
Jr  SSKJrJr  SSKJrJrJr  SSKJr  SS	KJr  SS
KJrJr  SSKJr  \" \R8                  5       " S S5      5       r\" \R<                  5       " S S5      5       rSr \" \RB                  5       " S S\RD                  5      5       r# " S S\RH                  5      r% " S S\RL                  5      r'\" \RB                  5       " S S\RP                  5      5       r)\RT                  " \'\)5         " S S\RL                  5      r+\" \R8                  5       " S S\RP                  5      5       r,\RT                  " \+\,5         " S S\RL                  5      r-\" \RB                  5       " S S \RL                  5      5       r.\" \.\R<                  \R^                  5         " S! S"\RP                  5      r0\RT                  " \.\05        \" \Rb                  \Rd                  5       " S# S$5      5       r3 " S% S&\35      r4/ S'Qr5g())a  
A module that needs a better name.

Implements new cred things for words.

How does this thing work?

  - Network connection on some port expecting to speak some protocol

  - Protocol-specific authentication, resulting in some kind of credentials object

  - twisted.cred.portal login using those credentials for the interface
    IUser and with something implementing IChatClient as the mind

  - successful login results in an IUser avatar the protocol can call
    methods on, and state added to the realm such that the mind will have
    methods called on it as is necessary

  - protocol specific actions lead to calls onto the avatar; remote events
    lead to calls onto the mind

  - protocol specific hangup, realm is notified, user is removed from active
    play, the end.
    )ctimetime)implementer)	copyright)credentialserrorportal)deferprotocol)failurelogreflect)registerAdapter)pb)ewordsiwords)ircc                   N    \ rS rSrS rS rS rS rSS jrS r	S	 r
S
 rS rSrg)Group,   c                 2    Xl         0 U l        SSS.U l        g )N )topictopic_author)nameusersmetaselfr   s     \/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/words/service.py__init__Group.__init__.   s    	

	    c                 @    [         R                  " [        X!5      5      $ N)r   Failure	Exception)r   errps      r    _ebUserCallGroup._ebUserCall6   s    y011r#   c                     U H;  u  p#U(       a  M  UR                   u  pEU R                  XER                  5       5        M=     g r%   )valueremovegetErrorMessage)r   resultssuccessresultuserr(   s         r    _cbUserCallGroup._cbUserCall9   s3    &OG7"LL	D"5"5"78  'r#   c                 N   [         R                  R                  U5      (       d   SR                  U5      5       eUR                  U R
                  ;  a  / nXR
                  UR                  '   U R
                  R                  5        HU  nX1Ld  M	  [        R                  " UR                  X5      nUR                  U R                  US9  UR                  U5        MW     [        R                  " U5      R                  U R                  5        [        R                   " S 5      $ )Nz{!r} is not a chat clientr)   )r   IChatClient
providedByformatr   r   valuesr
   maybeDeferred
userJoined
addErrbackr*   appendDeferredListaddCallbackr4   succeed)r   r3   	additionsr)   ds        r    add	Group.add?   s    !!,,T22 	
4O4V4V5
 	
2 99DJJ&I$(JJtyy!ZZ&&(=++ALL$EALL!1!1QL7$$Q'	 )
 y)55d6F6FG}}T""r#   Nc                     U R                   UR                  	 / nU R                   R                  5        HV  nXALd  M	  [        R                  " UR
                  XU5      nUR                  U R                  US9  UR                  U5        MX     [        R                  " U5      R                  U R                  5        [        R                  " S 5      $ ! [         a     N"f = fNr7   )r   r   r;   r
   r<   userLeftr>   r*   r?   r@   rA   r4   KeyErrorrB   )r   r3   reasonremovalsr)   rD   s         r    r.   Group.removeN   s    	G

499% HZZ&&(=++AJJFKALL!1!1QL7OOA&	 )
 x(44T5E5EF}}T""  		s   C 
C! C!c                 T    [         R                  " [        U R                  5      5      $ r%   )r
   rB   lenr   r   s    r    size
Group.size]   s    }}S_--r#   c                    X L d   e/ nU R                   R                  5        HV  nXQLd  M	  [        R                  " UR                  XU5      nUR                  U R                  US9  UR                  U5        MX     [        R                  " U5      R                  U R                  5        [        R                  " S 5      $ rH   )r   r;   r
   r<   receiver>   r*   r?   r@   rA   r4   rB   )r   sender	recipientmessagereceivesr)   rD   s          r    rT   Group.receive`   s       ""$A''		6IT--3"	 %
 	8$001A1AB}}T""r#   c                 v   Xl         / nU R                  R                  5        HO  n[        R                  " UR
                  X5      nUR                  U R                  US9  UR                  U5        MQ     [        R                  " U5      R                  U R                  5        [        R                  " S 5      $ rH   )r   r   r;   r
   r<   groupMetaUpdater>   r*   r?   r@   rA   r4   rB   )r   r   setsr)   rD   s        r    setMetadataGroup.setMetadatak   s    	""$A##A$5$5tBALL))QL/KKN % 	4 ,,T-=-=>}}T""r#   c                 H    [        U R                  R                  5       5      $ r%   )iterr   r;   rP   s    r    	iterusersGroup.iterusersu   s    DJJ%%'((r#   )r   r   r   r%   )__name__
__module____qualname____firstlineno__r!   r*   r4   rE   r.   rQ   rT   r]   ra   __static_attributes__ r#   r    r   r   ,   s/    
29##.	##)r#   r   c                   J    \ rS rSrSrSrS rS rS rSS jr	S r
S rS	 rS
rg)Userz   Nc                 <    Xl         / U l        [        5       U l        g r%   )r   groupsr   lastMessager   s     r    r!   User.__init__   s    	6r#   c                 :    Xl         X l        [        5       U l        g r%   )realmmindr   signOn)r   rq   rr   s      r    loggedInUser.loggedIn   s    
	fr#   c                 h   ^ ^ UU 4S jnTR                  T R                  5      R                  U5      $ )Nc                 >   > TR                   R                  T5        U $ r%   )rm   r?   r2   groupr   s    r    cbJoinUser.join.<locals>.cbJoin       KKu%Mr#   )rE   rr   rA   )r   ry   rz   s   `` r    join	User.join   s(    	 yy#//77r#   c                 j   ^ ^ UU 4S jnTR                  T R                  U5      R                  U5      $ )Nc                 >   > TR                   R                  T5        U $ r%   )rm   r.   rx   s    r    cbLeaveUser.leave.<locals>.cbLeave   r|   r#   )r.   rr   rA   )r   ry   rK   r   s   ``  r    leave
User.leave   s*    	 ||DIIv.::7CCr#   c                 X    [        5       U l        UR                  U R                  X5      $ r%   )r   rn   rT   rr   )r   rV   rW   s      r    send	User.send   s#    6  I??r#   c                 ,    [        U R                  5      $ r%   )r`   rm   rP   s    r    
itergroupsUser.itergroups   s    DKK  r#   c                 R    U R                   S S   H  nU R                  U5        M     g r%   )rm   r   )r   gs     r    logoutUser.logout   s    QAJJqM  r#   )rm   rn   rr   r   rq   rs   r%   )rc   rd   re   rf   rq   rr   r!   rt   r}   r   r   r   r   rg   rh   r#   r    rj   rj   z   s1    ED"

8D@!r#   rj   zNickServ!NickServ@servicesc                      \ rS rSrSrSrSrSrSrSr	S r
S rS rS rS/S	 jrS
 rS rSrSrS rS rS rS rS r\R2                  S4\R4                  S4\R6                  S4\R8                  S4/r\R<                  S4\R>                  S4/r S r!S r"S r#S r$S/S jr%S/S jr&S r'S r(S r)S  r*S! r+S" r,S# r-S$ r.S% r/S& r0S' r1S( r2S) r3S* r4S+ r5S, r6S- r7S.r8g)0IRCUser   zE
Protocol instance representing an IRC user connected to the server.
Nutf-8c                     U R                   U l        U R                  R                  U l        U R                  R                  U l        g r%   )irc_NICKSERV_PRIVMSGirc_PRIVMSGfactoryrq   r   hostnamerP   s    r    connectionMadeIRCUser.connectionMade   s0    44\\''


r#   c                 N    U R                   b  U R                  5         S U l        g g r%   )r   avatarr   rK   s     r    connectionLostIRCUser.connectionLost   s!    ;;"KKMDK #r#   c                 t   SU;  a  U R                   US'   SU;  a(  U R                  R                  U R                  5      US'   XUS   /[	        U5      -   n/ nU H:  n[        U[        5      (       a  UR                  S5      nUR                  U5        M<     [        R                  R                  " U0 UD6  g )Nprefixtor   )r   r   encodeencodinglist
isinstancebytesdecoder?   r   IRCsendMessage)r   commandparameter_listkwarglistarglistUnicodeargs          r    r   IRCUser.sendMessage   s    2==BxLr>yy''6BtH"T(+d>.BBC#u%%jj)!!#&  	^2r2r#   c                     U R                  UR                   SUR                   SU R                   3SUR                  -   5        g )N!@#)r}   r   r   r   ry   r3   s      r    r=   IRCUser.userJoined   s6    		TYYKq1T]]O<cEJJ>NOr#   c                     U R                  UR                   SUR                   SU R                   3SUR                  -   U=(       d    S5        g )Nr   r   r   leaving)partr   r   r   ry   r3   rK   s       r    rI   IRCUser.userLeft   sB    		yyk499+Qt}}o6%** y	
r#   c                 H   [         R                  R                  U5      (       a  SUR                  -   nOUR                  nUR	                  SS5      nUR                  5        H<  nU R                  UR                   SUR                   SU R                   3UU5        M>     g )Nr   textz<an unrepresentable message>r   r   )r   IGroupr9   r   get
splitlinesprivmsgr   )r   rU   rV   rW   recipientNamer   Ls          r    rT   IRCUser.receive   s     ==##I..)..0M%NNM{{6#AB"ALL;;-qQt}}o> #r#   c           
          SU;   aU  US   nUR                  SS5      nU R                  U R                  SUR                  -   UU SU SU R                   35        g g )Nr   r   r   r   r   r   )r   r   r   r   )r   ry   r   r   authors        r    r[   IRCUser.groupMetaUpdate   sa    d?MEXXnb1FJJ		ejj (!F81T]]O4	 r#   c                     US   U l         g)z
Password message -- Register a password.

Parameters: <password>

[REQUIRED]

Note that IRC requires the client send this *before* NICK
and USER.
N)passwordr   r   paramss      r    irc_PASSIRCUser.irc_PASS   s     r
r#   c                 (   US   n [        U[        5      (       a  UR                  U R                  5      nX0l
        X0l        U R                   H-  u  pEU R                  XEU R                  R                  -  5        M/     U R                   c  U R                  [        US5        gU R                   nSU l        U R#                  X65        g! [         a=    U R                  [        [        U5      S5        U R                  R                  5          gf = f)zH
Nick message -- Set your nickname.

Parameters: <nickname>

[REQUIRED]
r   z;Your nickname cannot be decoded. Please use ASCII or UTF-8.Nz	Password?)r   r   r   r   UnicodeDecodeErrorr   NICKSERVrepr	transportloseConnectionnicknamer   _motdMessagesr   r   _serverInfor   logInAs)r   r   r   r   coder   r   s          r    irc_NICKIRCUser.irc_NICK  s     !9
	(E**#??4==9 !	,,JDT$,,*B*B#BC - == LL8[9}}H DMLL,) " 	LLXM
 NN))+	s   0C
 
ADDc                     US   U l         g)zS
User message -- Set your realname.

Parameters: <user> <mode> <unused> <realname>
r   N)realnamer   s      r    irc_USERIRCUser.irc_USER/  s     r
r#   c                    US   nUS   nU R                   c  U R                  R                  5         gUR                  5       S:w  a"  U R	                  [
        U R                   S5        gU R                   nSU l         U R                  XT5        g)F
Send a (private) message.

Parameters: <msgtarget> <text to be sent>
r   r   Nnickservz1Denied.  Please send me (NickServ) your password.)r   r   r   lowerr   r   r   )r   r   r   targetr   r   s         r    r   IRCUser.irc_NICKSERV_PRIVMSG:  su     ":== NN))+\\^z)LLC }}H DMLL,r#   c                     U R                   R                  R                  [        R                  " X5      U [
        R                  5      nUR                  U R                  U R                  U4S9  g )N)errbackArgs)
r   r	   loginr   UsernamePasswordr   IUseraddCallbacks_cbLogin_ebLogin)r   r   r   rD   s       r    r   IRCUser.logInAsQ  sP    LL%%((<dFLL
 	
t}}dmm(Mr#   z:connected to Twisted IRCzA:Your host is %(serviceName)s, running version %(serviceVersion)sz,:This server was created on %(creationDate)sz&%(serviceName)s %(serviceVersion)s w nz(:- %(serviceName)s Message of the Day - z:End of /MOTD command.c                     Uu  p#nU[         R                  L d   SU< 35       eU ?X0l        X@l        U R
                   H-  u  pVU R                  XVU R                  R                  -  5        M/     g )NzRealm is buggy, got )	r   r   r   r   r   _welcomeMessagesr   r   r   )r   r2   ifacer   r   r   r   s          r    r   IRCUser._cbLoginn  sl    "($F(<UI&FF$ //JDT$,,*B*B#BC 0r#   c                    UR                  [        R                  5      (       a  U R                  [        US5        OUR                  [
        R                  5      (       a  U R                  [        US5        OC[        R                  " S5        [        R                  " U5        U R                  [        US5        U R                  R                  5         g )Nz*Already logged in.  No pod people allowed!zLogin failed.  Goodbye.zUnhandled error during login:z"Server error during login.  Sorry.)checkr   AlreadyLoggedInr   r   ecredUnauthorizedLoginr   msgr(   r   r   )r   r(   r   s      r    r   IRCUser._ebLoginz  s    99V++,,LL($P YYu..//LL8-FGGG34GGCLLL8-QR%%'r#   c                 X    U R                   b  U R                  SU R                  5        gg)z3
Ping message

Parameters: <server1> [ <server2> ]
NPONG)rq   r   r   r   s      r    irc_PINGIRCUser.irc_PING  s'     ::!VT]]3 "r#   c                 8    U R                   R                  5         g)z&
Quit

Parameters: [ <Quit Message> ]
N)r   r   r   s      r    irc_QUITIRCUser.irc_QUIT  s     	%%'r#   c                     U(       a!  U R                  [        R                  S5        g U R                  U R                  SUR                  -   S5        g )N:Unknown MODE flag.r   +)r   r   ERR_UNKNOWNMODEchannelModer   )r   ry   modesargss       r    _channelModeIRCUser._channelMode  s;    S002GHTYYejj(8#>r#   c                     U(       a!  U R                  [        R                  S5        g XR                  L a!  U R                  [        R                  S5        g U R                  [        R
                  S5        g )Nr  r  z(:You can't look at someone else's modes.)r   r   r  r   RPL_UMODEISERR_USERSDONTMATCH)r   r3   r  s      r    	_userModeIRCUser._userMode  sT    S002GH[[ S__c2&&(Rr#   c           	      2  ^ ^  TS   n[        U[        5      (       a  UR                  T R                  5      nUR                  S5      (       aM  UU 4S jnT R                  R                  USS 5      nUR                  T R                  U[        TSS 5      S9  gU 4S jnT R                  R                  U5      nUR                  T R                  U[        TSS 5      S9  g! [         a'    T R                  [        R                  TS   S5         gf = f)	z`
User mode message

Parameters: <nickname>
*( ( "+" / "-" ) *( "i" / "w" / "o" / "O" / "r" ) )

r   z2:No such nickname (could not decode your unicode!)Nr   c                    > U R                  [        R                  5        TR                  [        R
                  TS   S5        g )Nr   :That channel doesn't exist.trapr   NoSuchGroupr   r   ERR_NOSUCHCHANNELr(   r   r   s    r    ebGroup!IRCUser.irc_MODE.<locals>.ebGroup  s5    ++,  ))6!96Tr#      )callbackArgsc                 F   > TR                  [        R                  S5        g )Nz:No such nickname.r   r   ERR_NOSUCHNICK)r(   r   s    r    ebUser IRCUser.irc_MODE.<locals>.ebUser  s      !3!35IJr#   )r   r   r   r   r   r   r   r  
startswithrq   lookupGroupr   r  tuple
lookupUserr  )r   r   r   channelOrUserr  rD   r  s   ` `    r    irc_MODEIRCUser.irc_MODE  s    
	"1IM-// - 4 4T]] C ##C(( 

&&}QR'89ANN4,,gE&QRQS*DUNVK 

%%m4ANN4>>6fQRj@QNR1 " 	""q	D
 	s   5C% %.DDc                     g)zL
Userhost message

Parameters: <nickname> *( SPACE <nickname> )

[Optional]
Nrh   r   s      r    irc_USERHOSTIRCUser.irc_USERHOST  s     	r#   c                   ^ ^^  US   m[        T[        5      (       a  TR                  T R                  5      mUS   mTR                  S5      (       a  T R                  R                  TSS 5      nO+T R                  R                  T5      R                  S 5      nUU 4S jnU U4S	 jnUR                  XE5        g! [         a'    T R                  [        R                  US   S5         gf = f)
r   r   z6:No such nick/channel (could not decode your unicode!)Nr   r   r  c                     U R                   $ r%   )rr   )r3   s    r    <lambda>%IRCUser.irc_PRIVMSG.<locals>.<lambda>  s    TYYr#   c                 H   > U b  TR                   R                  U ST05      $ g )Nr   )r   r   )targmessageTextr   s    r    cbTarget%IRCUser.irc_PRIVMSG.<locals>.cbTarget  s*    {{''v{.CDD  r#   c                 H   > TR                  [        R                  TS5        g )Nz:No such nick/channel.r  )r(   r   
targetNames    r    ebTarget%IRCUser.irc_PRIVMSG.<locals>.ebTarget  s    S//=UVr#   )r   r   r   r   r   r   r   r  r   rq   r!  r#  rA   r   )r   r   r   r   r1  r5  r0  r4  s   `     @@r    r   IRCUser.irc_PRIVMSG  s    
	J*e,,'..t}}=
 Rj  %%ZZ++JqrN;FZZ**:6BB&F	E	W 	H// " 	""q	H
 	s   5B? ?.C0/C0c                   ^ ^  US   m[        T[        5      (       a  TR                  T R                  5      mTR                  S5      (       a  TSS mU 4S jnUU 4S jnT R                  R                  T5      R                  X45        g! [         a'    T R                  [        R                  US   S5         gf = f)zU
Join message

Parameters: ( <channel> *( "," <channel> ) [ <key> *( "," <key> ) ] )
r   1:No such channel (could not decode your unicode!)Nr   r  c                 h   >^  U U4S jnTR                   R                  T 5      R                  U5      $ )Nc                    > TR                  TT5        TR                  TR                  STR                  -   TR                  5        Vs/ s H  oR                  PM     sn5        TR	                  T5        g s  snf Nr   )r=   namesr   ra   
_sendTopic)ignr3   ry   r   s     r    rz   1IRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin  s`    t,

II%**$+0??+<=+<4YY+<=
 & >s   
A8r   r}   rA   )ry   rz   r   s   ` r    cbGroup!IRCUser.irc_JOIN.<locals>.cbGroup  s*    ' ;;##E*66v>>r#   c                 N   > TR                  [        R                  ST-   S5        g )Nr   z:No such channel.)r   r   r  r(   	groupNamer   s    r    r  !IRCUser.irc_JOIN.<locals>.ebGroup  s#    %%sY8Kr#   )r   r   r   r   r   r   r   r  r   rq   getGroupr   )r   r   r   rB  r  rF  s   `    @r    irc_JOINIRCUser.irc_JOIN  s    
	q	I)U++%,,T]];	 $$!!"I
	?	
 	

I&33GE9 " 	%%q	C
 	   5B .B=<B=c                 
  ^ ^^  US   m[        US   [        5      (       a  US   R                  T R                  5      mTR                  S5      (       a  TSS m[        U5      S:  a,  US   m[        T[        5      (       a  TR                  S5      mOSmUU 4S jnUU 4S jnT R                  R                  T5      R                  X45        g! [         a'    T R                  [        R                  US   S5         gf = f)	zK
Part message

Parameters: <channel> *( "," <channel> ) [ <Part Message> ]
r   z:Could not decode your unicode!Nr   r  r   c                 l   >^  U UU4S jnTR                   R                  T T5      R                  U5      $ )Nc                 ,   > TR                  TTT5        g r%   )rI   )r2   ry   rK   r   s    r    r   2IRCUser.irc_PART.<locals>.cbGroup.<locals>.cbLeave@  s    eT62r#   )r   r   rA   )ry   r   rK   r   s   ` r    rB  !IRCUser.irc_PART.<locals>.cbGroup?  s,    3 ;;$$UF3??HHr#   c                    > U R                  [        R                  5        TR                  [        R
                  ST-   SU R                  5       -   5        g )Nr   :)r  r   r  r   r   ERR_NOTONCHANNELr/   rE  s    r    r  !IRCUser.irc_PART.<locals>.ebGroupE  sB    HHV''($$cIosS=P=P=R7Rr#   )r   r   r   r   r   r   r   rS  r   rO   rq   r!  r   )r   r   r   rB  r  rF  rK   s   `    @@r    irc_PARTIRCUser.irc_PART%  s    	q	I&)U++"1I,,T]];	 $$!!"Iv;?AYF&%((w/F	I	 	

y)66wH9 " 	$$fQi1R 		s   ;C .DDc                   ^ ^  US   m[        T[        5      (       a  TR                  T R                  5      mTR                  S5      (       a  TSS mU 4S jnUU 4S jnT R                  R                  T5      R                  X45        g! [         a'    T R                  [        R                  US   S5         gf = f)zJ
Names message

Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
r   r9  Nr   r  c                    > TR                  TR                  SU R                  -   U R                  5        Vs/ s H  oR                  PM     sn5        g s  snf r<  )r=  r   ra   )ry   r3   r   s     r    rB  "IRCUser.irc_NAMES.<locals>.cbGroupe  s@    JJ		3+EOODU-VDUDiiDU-V-Vs   Ac                    > U R                  [        R                  5        TR                  TR                  ST-   / 5        g r<  )r  r   r  r=  r   r(   channelr   s    r    r  "IRCUser.irc_NAMES.<locals>.ebGroupj  s-    HHV''(JJtyy#-4r#   )r   r   r   r   r   r   r   r  r   rq   r!  r   )r   r   r   rB  r  r\  s   `    @r    	irc_NAMESIRCUser.irc_NAMESM  s    
	RjG'5))!..7 c""abkG	
	5
 	

w'44WF+ " 	%%r
C
 	rK  c                 v    US   n[        US   [        5      (       a  UR                  U R                  5      nUR                  S5      (       a  USS n[        U5      S:  a  U R                  X2S   5        gU R                  U5        g! [         a#    U R                  [        R                  S5         gf = f)z2
Topic message

Parameters: <channel> [ <topic> ]
r   z<:That channel doesn't exist (could not decode your unicode!)Nr   r  )r   r   r   r   r   r   r   r  r   rO   	_setTopic	_getTopic)r   r   r   r\  s       r    	irc_TOPICIRCUser.irc_TOPICq  s    		QiG&)U++!..7 c""abkGv;?NN71I.NN7# " 	%%N 	s   8B *B87B8c                 r   UR                   R                  S5      nU(       a  UR                   R                  S5      =(       d    SnUR                   R                  SS5      nU R                  U R                  SUR                  -   U5        U R	                  U R                  SUR                  -   X45        gg)z@
Send the topic of the given group to this user, if it has one.
r   r   z<noone>
topic_dater   r   N)r   r   r   r   topicAuthor)r   ry   r   r   dates        r    r>  IRCUser._sendTopic  s     

w'ZZ^^N3@yF::>>,2DJJtyy#

"2E:TYYejj(8&G	 r#   c                    ^ ^ UU 4S jnT R                   R                  T5      R                  T R                  U5        g )Nc                    > U R                  [        R                  5        TR                  [        R
                  STS5        g N=r  r  r[  s    r    r  "IRCUser._getTopic.<locals>.ebGroup  3    HHV''(%%sG5Sr#   )rq   r!  r   r>  )r   r\  r  s   `` r    rb  IRCUser._getTopic  s-    	 	

w'44T__gNr#   c                 z   ^ ^^ U U4S jnUU 4S jnT R                   R                  T5      R                  X45        g )Nc                    >^  T R                   R                  5       nTUS'   TR                  US'   [        [	        5       5      US'   U U4S jnT R                  U5      R                  U5      $ )Nr   r   rf  c                 b   > TR                  [        R                  STR                  -   S5        g )Nr   z.:You need to be a channel operator to do that.)r   r   ERR_CHANOPRIVSNEEDEDr   )r(   ry   r   s    r    ebSet1IRCUser._setTopic.<locals>.cbGroup.<locals>.ebSet  s)      ,,%**$Dr#   )r   copyr   intr   r]   r>   )ry   newMetaru  r   r   s   `  r    rB  "IRCUser._setTopic.<locals>.cbGroup  s^    jjoo'G$GG&*iiGN#$'KGL! $$W-88??r#   c                    > U R                  [        R                  5        TR                  [        R
                  STS5        g rl  r  r[  s    r    r  "IRCUser._setTopic.<locals>.ebGroup  ro  r#   )rq   r!  r   )r   r\  r   rB  r  s   ```  r    ra  IRCUser._setTopic  s-    	@	 	

w'44WFr#   c                     U H4  u  p#nU R                  [        R                  U[        U5      SU-   5        M6     U R                  [        R                  S5        g)z
Send a group of LIST response lines

@type channels: C{list} of C{(str, int, str)}
@param channels: Information about the channels being sent:
    their name, the number of participants, and their topic.
rR  z:End of /LISTN)r   r   RPL_LISTstrRPL_LISTEND)r   channelsr   rQ   r   s        r    r   IRCUser.list  sG     "*DS\\4TC%KH "*/:r#   c                 \  ^  U(       a   US   n[        U[        5      (       a  UR                  T R                  5      nUR	                  S5      n/ nU HH  nUR                  S5      (       a  USS nUR                  T R                  R                  U5      5        MJ     [        R                  " USS9nUR                  S	 5        OT R                  R!                  5       nU 4S
 jnUR                  U5        g! [
         a'    T R                  [        R                  US   S5         gf = f)z
List query

Return information about the indicated channels, or about all
channels if none are specified.

Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
r   ,r9  Nr   r  T)consumeErrorsc                 N    U  VVs/ s H  u  pU(       d  M  UPM     snn$ s  snnf r%   rh   )gssrs      r    r,  "IRCUser.irc_LIST.<locals>.<lambda>  s    2*C2!12*C*Cs   !!c           	         > S n[         R                  " U  Vs/ s H!  o"R                  5       R                  X5      PM#     sn5      nUR                  U4S j5        U$ s  snf )Nc                 P    UR                   XR                  R                  S5      4$ )Nr   )r   r   r   )rQ   ry   s     r    gotSize3IRCUser.irc_LIST.<locals>.cbGroups.<locals>.gotSize  s    zz4)@@@r#   c                 n   > TR                  U  VVs/ s H  u  pU(       d  M  UPM     snn5      $ s  snnf r%   )r   )r0   r  r  r   s      r    r,  4IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>  s%    $))W4RW6APQQW4R*S4Rs   1
1
)r
   r@   rQ   rA   )rm   r  ry   rD   r   s       r    cbGroups"IRCUser.irc_LIST.<locals>.cbGroups  sV    A ""GMNve))'9vNA MMSTH Os   (A)r   r   r   r   splitr   r   r   r  r   r?   rq   r!  r
   r@   rA   r   )r   r   r   allChannelsr  rm   chr  s   `       r    irc_LISTIRCUser.irc_LIST  s    $Qik511"-"4"4T]]"CK&,,S1 F==%%ABBdjj44R89 
 ''dCFCD ZZ**,F	 	8$= &   ))1IG
 s   AC: :.D+*D+c                 &   U R                  U R                  SUR                  -   UR                  5        Vs/ s HH  nUR                  U R                  U R                  R                  UR                  SSUR                  4PMJ     sn5        g s  snf )Nr   Hr   )whor   ra   r   rq   )r   ry   ms      r    _channelWhoIRCUser._channelWho  sq    II%** **A 

aP*	
s   ABc                 D    U R                  [        R                  S5        g )Nz:User /WHO not implemented)r   r   RPL_ENDOFWHOr   r3   s     r    _userWhoIRCUser._userWho  s    ))+GHr#   c                 X  ^ ^ U(       d!  T R                  [        R                  S5        g US   m[        T[        5      (       a  TR                  T R                  5      mTR                  S5      (       aB  UU 4S jnT R                  R                  TSS 5      nUR                  T R                  U5        gUU 4S jnT R                  R                  T5      nUR                  T R                  U5        g! [         a'    T R                  [        R                  US   S5         gf = f)	z+
Who query

Parameters: [ <mask> [ "o" ] ]
z:/WHO not supported.Nr   z2:End of /WHO list (could not decode your unicode!)r   c                    > U R                  [        R                  5        TR                  [        R
                  TS5        g Nz:End of /WHO list.)r  r   r  r   r   r  r(   r$  r   s    r    r   IRCUser.irc_WHO.<locals>.ebGroup*  s.    ++,  !1!1=BVWr#   r  c                    > U R                  [        R                  5        TR                  [        R
                  TS5        g r  )r  r   
NoSuchUserr   r   r  r  s    r    r  IRCUser.irc_WHO.<locals>.ebUser2  s.    **+  !1!1=BVWr#   )r   r   r  r   r   r   r   r   r   rq   r!  r   r  r#  r  )r   r   r   r  rD   r  r$  s   `     @r    irc_WHOIRCUser.irc_WHO	  s     S--/EF
	"1IM-// - 4 4T]] C ##C((X 

&&}QR'89ANN4++W5X 

%%m4ANN4==&1/ " 	  q	D
 	s   5C8 8.D)(D)c                 J  ^ ^ U 4S jnUU 4S jn TS   n[        U[        5      (       a  UR                  T R                  5      nT R                  R                  U5      R                  X45        g! [         a'    T R                  [        R                  TS   S5         gf = f)z>
Whois query

Parameters: [ <target> ] <mask> *( "," <mask> )
c                   > TR                  TR                  U R                  U R                  TR                  R                  U R                  TR                  R                  SS[        [	        5       U R
                  -
  5      U R                  U R                  5        Vs/ s H  nSUR                  -   PM     sn5        g s  snf )NzHi mom!Fr   )whoisr   rq   rx  r   rn   rs   r   )r3   ry   r   s     r    cbUser!IRCUser.irc_WHOIS.<locals>.cbUser@  s    JJ						

		

DFT---./3/@A/@euzz!/@A Bs   !Cc                    > U R                  [        R                  5        TR                  [        R
                  TS   S5        g )Nr   :No such nick/channel)r  r   r  r   r   r  r  s    r    r  !IRCUser.irc_WHOIS.<locals>.ebUserO  s2    HHV&&'S//<STr#   r   r  N)r   r   r   r   r   r   r   r  rq   r#  r   )r   r   r   r  r  r3   s   ` `   r    	irc_WHOISIRCUser.irc_WHOIS9  s    		U	!9D$&&{{4==1
 	

d#00@	 " 	S//<ST	s   5A1 1.B"!B"c                 D    U R                  [        R                  S5        g)z-
Oper message

Parameters: <name> <password>
z:O-lines not applicableN)r   r   ERR_NOOPERHOSTr   s      r    irc_OPERIRCUser.irc_OPER^  s     	++-FGr#   )	r   r   r   r   r   r   r   rq   r   r%   )9rc   rd   re   rf   __doc__rm   r   r   rq   r   r   r   r   r=   rI   rT   r[   r   r   r   r   r   r   r   r   RPL_WELCOMERPL_YOURHOSTRPL_CREATED
RPL_MYINFOr   RPL_MOTDSTARTRPL_ENDOFMOTDr   r   r   r   r   r  r  r%  r(  r   rI  rU  r^  rc  r>  rb  ra  r   r  r  r  r  r  r  rg   rh   r#   r    r   r      sl   
 F F F E H(
3P
"	 HH# -D	#-.N 
56O	
 
HI
 NN 5		
& 
		FG			45M

D(4(?$SL!0F&FP&IP"GH$2	H
OG6
;2%h
I.2`"AJHr#   r   c                   "    \ rS rSrSr\rS rSrg)
IRCFactoryig  a  
IRC server that creates instances of the L{IRCUser} protocol.

@ivar _serverInfo: A dictionary mapping:
    "serviceName" to the name of the server,
    "serviceVersion" to the copyright version,
    "creationDate" to the time that the server was started.
c                     Xl         X l        U R                   R                  [        R                  [        5       S.U l        g )N)serviceNameserviceVersioncreationDate)rq   r	   r   r   versionr   r   )r   rq   r	   s      r    r!   IRCFactory.__init__s  s/    
::??'//!G
r#   )r   r	   rq   N)	rc   rd   re   rf   r  r   r   r!   rg   rh   r#   r    r  r  g  s     H
r#   r  c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
PBMindi}  c                     g r%   rh   rP   s    r    r!   PBMind.__init__~      r#   c                     [         R                  " [        5      n[        U[        5      (       a  UR                  S5      nX!R                  R                  U 5      4$ Nr   )r   qualr  r   r  r   invokerregisterReferencer   jellierr  s      r    jellyForPBMind.jellyFor  sC    ||F#dC  ;;w'D__66t<<<r#   c                     g r%   rh   )r   r3   ry   s      r    remote_userJoinedPBMind.remote_userJoined  r  r#   c                     g r%   rh   )r   r3   ry   rK   s       r    remote_userLeftPBMind.remote_userLeft  r  r#   c                     g r%   rh   r   rU   rV   rW   s       r    remote_receivePBMind.remote_receive  r  r#   c                     g r%   rh   r   ry   r   s      r    remote_groupMetaUpdatePBMind.remote_groupMetaUpdate  r  r#   rh   N)rc   rd   re   rf   r!   r  r  r  r  r  rg   rh   r#   r    r  r  }  s     =r#   r  c                   4    \ rS rSrSrS rS rS rS	S jrSr	g)
PBMindReferencei  r   c                 4   [         R                  R                  U5      (       a"  [        U R                  U R
                  U5      nO![        U R                  U R
                  U5      nU R                  S[        U R                  U R
                  U5      XC5      $ )NrT   )r   r   r9   PBGrouprq   r   PBUser
callRemote)r   rU   rV   rW   recs        r    rT   PBMindReference.receive  sl    ==##I..$**dkk9=CT[[)<Cvdjj$++v>
 	
r#   c                 f    U R                  S[        U R                  U R                  U5      U5      $ )Nr[   )r  r  rq   r   r  s      r    r[   PBMindReference.groupMetaUpdate  s+    wtzz4;;F
 	
r#   c           	          U R                  S[        U R                  U R                  U5      [	        U R                  U R                  U5      5      $ )Nr=   r  r  rq   r   r  r   s      r    r=   PBMindReference.userJoined  s>    DJJU34::t{{D1
 	
r#   Nc           	          U R                  S[        U R                  U R                  U5      [	        U R                  U R                  U5      U5      $ )NrI   r  r   s       r    rI   PBMindReference.userLeft  sA    DJJU34::t{{D1	
 	
r#   rh   r%   )
rc   rd   re   rf   r   rT   r[   r=   rI   rg   rh   r#   r    r  r    s    D




r#   r  c                   6    \ rS rSrS rS rS rS	S jrS rSr	g)
r  i  c                 (    Xl         X l        X0l        g r%   )rq   r   ry   )r   rq   r   ry   s       r    r!   PBGroup.__init__  s    

r#   c                     [        U R                  R                  U R                  R                  U R                  R                  45      $ r%   )hashrq   r   r   ry   rP   s    r    processUniqueIDPBGroup.processUniqueID  s.    TZZ__dkk&6&6

HIIr#   c                 @   [         R                  " U R                  5      n[        U[        5      (       a  UR                  S5      nU R                  R                  n[        U[        5      (       a  UR                  S5      nX#UR                  R                  U 5      4$ r  )
r   r  	__class__r   r  r   ry   r   r  r  )r   r  r  ry   s       r    r  PBGroup.jellyFor  sq    ||DNN+dC  ;;w'D

eS!!LL)EGOO==dCCCr#   Nc                 N    U R                   R                  U R                  U5      $ r%   )r   r   ry   r   s     r    remote_leavePBGroup.remote_leave  s    {{  V44r#   c                 N    U R                   R                  U R                  U5      $ r%   )r   r   ry   r   rW   s     r    remote_sendPBGroup.remote_send  s    {{

G44r#   )r   ry   rq   r%   )
rc   rd   re   rf   r!   r  r  r  r  rg   rh   r#   r    r  r    s    
JD55r#   r  c                   R    \ rS rSrS rSS jrS rS rS rS r	SS	 jr
S
 rS rSrg)PBGroupReferencei  c                 z    Uu  p4nUR                  S5      U l        [        R                  R	                  XX5/5      $ r  )r   r   r   RemoteReference
unjellyFor)r   	unjellierunjellyListclsNamer   refs         r    r  PBGroupReference.unjellyFor  s7    (sKK(	!!,,TwnMMr#   Nc                 &    U R                  SU5      $ )Nr   r  r   s     r    r   PBGroupReference.leave  s    w//r#   c                 &    U R                  SU5      $ )Nr   r  r  s     r    r   PBGroupReference.send  s    vw//r#   c                     g r%   rh   r  s     r    rE   PBGroupReference.add      r#   c                     g r%   rh   rP   s    r    ra   PBGroupReference.iterusers  r  r#   c                     g r%   rh   r  s       r    rT   PBGroupReference.receive  r  r#   c                     g r%   rh   )r   r3   rK   s      r    r.   PBGroupReference.remove  r  r#   c                     g r%   rh   )r   r   s     r    r]   PBGroupReference.setMetadata  r  r#   c                     g r%   rh   rP   s    r    rQ   PBGroupReference.size  r  r#   r   r%   )rc   rd   re   rf   r  r   r   rE   ra   rT   r.   r]   rQ   rg   rh   r#   r    r  r    s0    N
00r#   r  c                        \ rS rSrS rS rSrg)r  i  c                 (    Xl         X l        X0l        g r%   )rq   r   r3   )r   rq   r   r3   s       r    r!   PBUser.__init__  s    
	r#   c                     [        U R                  R                  U R                  R                  U R                  R                  45      $ r%   )r  rq   r   r   r3   rP   s    r    r  PBUser.processUniqueID  s.    TZZ__dkk&6&6		GHHr#   )r   rq   r3   N)rc   rd   re   rf   r!   r  rg   rh   r#   r    r  r    s    
Ir#   r  c                   v    \ rS rSrS rS rS r\S 5       r\R                  S 5       rS r
S rS	 rSS jrSrg
)
ChatAvatari  c                     Xl         g r%   r   )r   r   s     r    r!   ChatAvatar.__init__  s    r#   c                     [         R                  " U R                  5      n[        U[        5      (       a  UR                  S5      nX!R                  R                  U 5      4$ r  )r   r  r  r   r  r   r  r  r  s      r    r  ChatAvatar.jellyFor
  sG    ||DNN+dC  ;;w'D__66t<<<r#   c                    ^  U 4S jnT R                   R                  R                  U5      nUR                  U5        U$ )Nc                 p   >^  U U4S jnTR                   R                  T 5      nUR                  U5        U$ )Nc                 Z   > [        TR                  R                  TR                  T5      $ r%   )r  r   rq   )ignoredry   r   s    r    rz   7ChatAvatar.remote_join.<locals>.cbGroup.<locals>.cbJoin  s     t{{00$++uEEr#   rA  )ry   rz   rD   r   s   `  r    rB  'ChatAvatar.remote_join.<locals>.cbGroup  s0    F   'AMM&!Hr#   )r   rq   rH  rA   )r   rF  rB  rD   s   `   r    remote_joinChatAvatar.remote_join  s5    	 KK&&y1	gr#   c                     g r%   rh   rP   s    r    r   ChatAvatar.name       	r#   c                     g r%   rh   )r   r-   s     r    r   r9  "  r:  r#   c                     g r%   rh   r  s      r    r[   ChatAvatar.groupMetaUpdate'  r  r#   c                     g r%   rh   r  s       r    rT   ChatAvatar.receive+  r  r#   c                     g r%   rh   r   s      r    r=   ChatAvatar.userJoined/  r  r#   Nc                     g r%   rh   r   s       r    rI   ChatAvatar.userLeft3  r  r#   r,  r%   )rc   rd   re   rf   r!   r  r6  propertyr   setterr[   rT   r=   rI   rg   rh   r#   r    r*  r*    sQ    =   
[[ r#   r*  c                        \ rS rSrS rS rSrg)AvatarReferencei;  c                 &    U R                  SU5      $ )Nr}   r  )r   rF  s     r    r}   AvatarReference.join<  s    vy11r#   c                    ^ [         R                  " 5       mU R                  R                  U4S j5        U R                  R                  R                  5         T$ )Nc                  &   > T R                  S 5      $ r%   )callback)rD   s   r    r,  &AvatarReference.quit.<locals>.<lambda>A  s    qzz$/?r#   )r
   DeferredbrokernotifyOnDisconnectr   r   )r   rD   s    @r    quitAvatarReference.quit?  s=    NN&&'?@,,.r#   rh   N)rc   rd   re   rf   r}   rQ  rg   rh   r#   r    rG  rG  ;  s    2r#   rG  c                   t    \ rS rSrSrS rS rS rS rS r	S r
S	rS
rS rS rS rS rS rS rS rS rSrg)
WordsRealmiI  r   c                     Xl         g r%   r#  r   s     r    r!   WordsRealm.__init__M  s    	r#   c                     [        U5      $ r%   )rj   r   s     r    userFactoryWordsRealm.userFactoryP  s    Dzr#   c                     [        U5      $ r%   )r   r   s     r    groupFactoryWordsRealm.groupFactoryS  s    T{r#   c                    ^^ UU4S jnU$ )Nc                  H   > [        TSS 5      " 5         S =T l        T l        g )Nr   c                      g r%   rh   rh   r#   r    r,  :WordsRealm.logoutFactory.<locals>.logout.<locals>.<lambda>Y  s    Tr#   )getattrrq   rr   )r   facets   r    r   (WordsRealm.logoutFactory.<locals>.logoutW  s     E8\24)--FL6;r#   rh   )r   r   rb  r   s    `` r    logoutFactoryWordsRealm.logoutFactoryV  s    	.
 r#   c                    ^ ^^^ [        T[        5      (       a  TR                  T R                  5      mUUUU 4S jnT R	                  T5      R                  U5      $ )Nc                   > U R                   b  [        R                  " 5       eT HK  nU" U S 5      nUc  M  U R                  TT5        TTl        TTl         U Tl        XTR                  X5      4s  $    [        TT5      er%   )rq   r   r   rt   r   r   rd  NotImplementedError)r   r   rb  avatarId
interfacesrr   r   s      r    	gotAvatar+WordsRealm.requestAvatar.<locals>.gotAvatarb  s    ||',,..#fd+$OOD$/ (DI!%DJ"(DK ););F)JJJ $ &dJ77r#   )r   r   r   	_encodinggetUserrA   )r   ri  rr   rj  rk  s   ```` r    requestAvatarWordsRealm.requestAvatar^  sH    h&&t~~6H	8 	8 ||H%11)<<r#   c                     g r%   rh   rP   s    r    r   WordsRealm.itergroupsq  r  r#   FTc                     [         er%   rh  r   s     r    r#  WordsRealm.lookupUsery      !!r#   c                     [         er%   rt  r   ry   s     r    r!  WordsRealm.lookupGroup|  rv  r#   c                     [         e)a  
Add the given user to this service.

This is an internal method intended to be overridden by
L{WordsRealm} subclasses, not called by external code.

@type user: L{IUser}

@rtype: L{twisted.internet.defer.Deferred}
@return: A Deferred which fires with L{None} when the user is
added, or which fails with
L{twisted.words.ewords.DuplicateUser} if a user with the
same name exists already.
rt  r  s     r    addUserWordsRealm.addUser  s
     "!r#   c                     [         e)a  
Add the given group to this service.

@type group: L{IGroup}

@rtype: L{twisted.internet.defer.Deferred}
@return: A Deferred which fires with L{None} when the group is
added, or which fails with
L{twisted.words.ewords.DuplicateGroup} if a group with the
same name exists already.
rt  rx  s     r    addGroupWordsRealm.addGroup  s
     "!r#   c                    ^ ^ T R                   (       a'  UU 4S jnT R                  T5      R                  U5      $ T R                  T5      $ )Nc                 d   > U R                  [        R                  5        TR                  T5      $ r%   )r  r   DuplicateGroupr!  r(   r   r   s    r    r  $WordsRealm.getGroup.<locals>.ebGroup  s&    ../''--r#   )createGroupOnRequestcreateGroupr>   r!  )r   r   r  s   `` r    rH  WordsRealm.getGroup  s@    $$. ##D)44W==%%r#   c                    ^ ^ T R                   (       a'  UU 4S jnT R                  T5      R                  U5      $ T R                  T5      $ )Nc                 d   > U R                  [        R                  5        TR                  T5      $ r%   )r  r   DuplicateUserr#  r  s    r    r  "WordsRealm.getUser.<locals>.ebUser  s$    --.t,,r#   )createUserOnRequest
createUserr>   r#  )r   r   r  s   `` r    rn  WordsRealm.getUser  s<    ##- ??4(33F;;t$$r#   c                    ^ ^ U4S jnUU 4S jnTR                  5       mT R                  T5      nUR                  X#5        UR                  T R                  5        U$ )Nc                 X   > [         R                  " [        R                  " T5      5      $ r%   )r   r&   r   r  )r3   r   s    r    cbLookup'WordsRealm.createUser.<locals>.cbLookup  s    ??6#7#7#=>>r#   c                 d   > U R                  [        R                  5        TR                  T5      $ r%   )r  r   r  rX  r  s    r    ebLookup'WordsRealm.createUser.<locals>.ebLookup  s&    HHV&&'##D))r#   )r   r#  r   rA   r{  r   r   r  r  rD   s   ``   r    r  WordsRealm.createUser  sI    	?	* zz|OOD!	x*	dll#r#   c                    ^ ^ U4S jnUU 4S jnTR                  5       mT R                  T5      nUR                  X#5        UR                  T R                  5        U$ )Nc                 X   > [         R                  " [        R                  " T5      5      $ r%   )r   r&   r   r  )ry   r   s    r    r  (WordsRealm.createGroup.<locals>.cbLookup  s    ??6#8#8#>??r#   c                 d   > U R                  [        R                  5        TR                  T5      $ r%   )r  r   r  r[  r  s    r    r  (WordsRealm.createGroup.<locals>.ebLookup  s&    HHV''($$T**r#   )r   r!  r   rA   r~  r  s   ``   r    r  WordsRealm.createGroup  sL    	@	+ zz|T"	x*	dmm$r#   r#  N)rc   rd   re   rf   rm  r!   rX  r[  rd  ro  r   r  r  r#  r!  r{  r~  rH  rn  r  r  rg   rh   r#   r    rT  rT  I  s[    I=&
 !"""""&%r#   rT  c                   F   ^  \ rS rSrU 4S jrS rS rS rS rS r	Sr
U =r$ )	InMemoryWordsRealmi  c                 B   > [         TU ]  " U0 UD6  0 U l        0 U l        g r%   )superr!   r   rm   )r   ar   r  s      r    r!   InMemoryWordsRealm.__init__  s#    !"r"
r#   c                 ^    [         R                  " U R                  R                  5       5      $ r%   )r
   rB   rm   r;   rP   s    r    r   InMemoryWordsRealm.itergroups  s    }}T[[//122r#   c                    UR                   U R                  ;   a=  [        R                  " [        R
                  " [        R                  " 5       5      5      $ XR                  UR                   '   [        R                  " U5      $ r%   )	r   r   r
   failr   r&   r   r  rB   r  s     r    r{  InMemoryWordsRealm.addUser  sR    99

"::goof.B.B.DEFF $

499}}T""r#   c                    UR                   U R                  ;   a=  [        R                  " [        R
                  " [        R                  " 5       5      5      $ XR                  UR                   '   [        R                  " U5      $ r%   )	r   rm   r
   r  r   r&   r   r  rB   rx  s     r    r~  InMemoryWordsRealm.addGroup  sR    ::$::goof.C.C.EFGG"'EJJ}}U##r#   c                 
   UR                  5       n U R                  U   n[        R                  " U5      $ ! [         aA    [        R
                  " [        R                  " [        R                  " U5      5      5      s $ f = fr%   )
r   r   r
   rB   rJ   r  r   r&   r   r  )r   r   r3   s      r    r#  InMemoryWordsRealm.lookupUser  sg    zz|	'::d#D ==&&  	H::goof.?.?.EFGG	H   7 ABBc                 
   UR                  5       n U R                  U   n[        R                  " U5      $ ! [         aA    [        R
                  " [        R                  " [        R                  " U5      5      5      s $ f = fr%   )
r   rm   r
   rB   rJ   r  r   r&   r   r  )r   r   ry   s      r    r!  InMemoryWordsRealm.lookupGroup  sg    zz|	(KK%E ==''  	I::goof.@.@.FGHH	Ir  )rm   r   )rc   rd   re   rf   r!   r   r{  r~  r#  r!  rg   __classcell__)r  s   @r    r  r    s&    
3#$'( (r#   r  )r   rj   rT  r  N)6r  r   r   zope.interfacer   twistedr   twisted.credr   r   r   r	   twisted.internetr
   r   twisted.pythonr   r   r   twisted.python.componentsr   twisted.spreadr   twisted.wordsr   r   twisted.words.protocolsr   r   r   r   rj   r   r8   r   r   ServerFactoryr  Referenceabler  r
  r  setUnjellyableForClassr  r  r  r*  IPerspectiverG  IRealmIChatServicerT  r  __all__rh   r#   r    <module>r     s!  
2  &  < < , 0 0 5  ( ' V]]J) J) J)Z V\\% % %P ( V }
Hcgg }
H !}
H@
'' 
,R . V 
b(( 
 !
B   &/ 25b 52 V]]"r)) " "J   '#3 4IR I V /!! / !/d 
FLL"// :b((    *o 6 V]]F//0B B 1BJ%( %(Pr#   