
    E0j6z                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlZddlmZ ddl	m
Z
 d dlmZmZ d dlmZ erddlmZ ddlmZ  G d	 d
e          Ze G d dee                      Z G d de          ZdS )    N   )DINGTALK_OPENAPI_ENDPOINT)setup_default_logger)Enumunique)TYPE_CHECKING)ChatbotMessage)DingTalkStreamClientc                   T   e Zd Z	 	 	 	 ddZedd            Zed             Z	 	 	 	 	 	 d dedededede	de	de
de	defdZ	 	 	 	 	 	 d dedededede	de	de
de	defdZ	 	 	 	 	 	 d dedededede	de	de
de	defdZ	 	 	 	 	 	 d dedededede	de	de
de	defdZdedefdZdedefdZdS )!CardReplierdingtalk_clientr
   incoming_messager	   c                 J    || _         || _        t          d          | _        d S )Nzdingtalk_stream.card_replier)r   r   r   logger)selfr   r   s      d/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/dingtalk_stream/card_replier.py__init__zCardReplier.__init__   s)    
 8G2B*+IJJ    msgc                 $   | j         d| j        d| j        d| j        dt	          t          j                              	}t          j                    }|	                    |
                    d                     |                                S )N_zutf-8)	sender_idsender_corp_idconversation_id
message_idstruuiduuid1hashlibsha256updateencode	hexdigest)r   factorms      r   gen_card_idzCardReplier.gen_card_id!   s     MMMNNN

 N	w''((({{}}r   c                 8    dd| dt          j                    z  dS )Nzapplication/jsonz*/*zeDingTalkStream/1.0 SDK/0.1.0 Python/%s (+https://github.com/open-dingtalk/dingtalk-stream-sdk-python))zContent-TypeAcceptzx-acs-dingtalk-access-tokenz
User-Agent)platformpython_version)access_tokens    r   get_request_headerzCardReplier.get_request_header.   s5     /+7Q %''	(		
 	
 		
r   STREAM FNTcard_template_id	card_datacallback_typecallback_route_key	at_senderat_all
recipientssupport_forwardreturnc	                    | j                                         }	|	s| j                            d           dS |                     | j                  }
||
d|i|d|id|id}|dk    r
d|d<   ||d<   t          d	z   }	 d}t          j        || 	                    |	          |
          }|j
        }|                                 n8# t          $ r+}| j                            d| d|            Y d}~dS d}~ww xY w|
dd}| j        j        dk    rd                    d| j        j                  |d<   d| j         j        j        i|d<   |rddi|d         d<   n#|r!| j        j        | j        j        i|d         d<   |||d         d<   | j        j        0dt+          j        d| j        j        j        i          i|d         d<   nw| j        j        dk    rgd                    d| j        j                  |d<   ddi|d <   | j        j        0dt+          j        d| j        j        j        i          i|d          d<   t          d!z   }	 d}t          j        || 	                    |	          |
          }|j
        }|                                 |
S # t          $ r+}| j                            d"| d|            Y d}~dS d}~ww xY w)#2  
        发送卡片，两步骤：创建+投放。
        https://open.dingtalk.com/document/orgapp/interface-for-creating-a-card-instance
        :param support_forward: 卡片是否支持转发
        :param callback_route_key: HTTP 回调时的 route key
        :param callback_type: 卡片回调模式
        :param recipients: 接收者
        :param card_template_id: 卡片模板 ID
        :param card_data: 卡片数据
        :param at_sender: 是否@发送者
        :param at_all: 是否@所有人
        :return: 卡片的实例ID
        @CardResponder.send_card failed, cannot get dingtalk access tokenr.   cardParamMapsupportForwardcardTemplateId
outTrackIdcardDatacallbackTypeimGroupOpenSpaceModelimRobotOpenSpaceModelHTTPrA   callbackRouteKey/v1.0/card/instancesheadersjsonzLCardReplier.create_and_send_card failed, create card instance failed, error=, response.text=Nr   r?   
userIdType2 dtv1.card//{spaceType}.{spaceId}IM_GROUP	spaceTypespaceIdopenSpaceId	robotCodeimGroupOpenDeliverModel@ALL	atUserIdsr5   hostingRepliedContextuserId	extension1IM_ROBOTrQ   imRobotOpenDeliverModel/v1.0/card/instances/deliverzACardReplier.create_and_send_card failed, send card failed, error=)r   get_access_tokenr   errorr&   r   r   requestspostr,   textraise_for_status	Exceptionconversation_typeformatr   
credential	client_idsender_staff_idsender_nickhosting_contextrI   dumpsuser_id)r   r/   r0   r1   r2   r3   r4   r5   r6   r+   card_instance_idbodyurlresponse_textresponsees                   r   create_and_send_cardz CardReplier.create_and_send_card;   s   0 +<<>> 	KR   2++D,ABB.*'3)&6%H&6%H
 
 F""#)D '9D#$ (*@@	M}T44\BB  H %MM%%'''' 	 	 	K B_`  B  Br  B  B   22222		 /a@@  2c99"D"K"K$d.C.S #L # #D T1<F/D*+  F@./<<  )94;P;\@./< %@J./= $4@+TZ!4#8#H#PQ. .@./<
 "4;;"D"K"K$d.C.S #L # #D 0;J.GD*+ $4@+TZ!4#8#H#PQ. .@./< (*HH	M}T44\BB  H %MM%%'''## 	 	 	KvTUvvgtvv   22222		s2   <AC 
C9 C44C9
AJ 
K KKc	           	      z  K   | j                                         }	|	s| j                            d           dS |                     | j                  }
||
d|i|d|id|id}|dk    r
d|d<   ||d<   t          d	z   }	 d}t          j                    4 d
{V }|	                    || 
                    |	          |          4 d
{V 	 }|                                 d
{V }|                                 d
d
d
          d
{V  n# 1 d
{V swxY w Y   d
d
d
          d
{V  n# 1 d
{V swxY w Y   ns# t          j        $ r2}| j                            d|j         d| d|            Y d
}~n7d
}~wt          $ r'}| j                            d|            Y d
}~nd
}~ww xY w|
dd}| j        j        dk    rd                    d| j        j                  |d<   d| j         j        j        i|d<   |rddi|d         d<   n#|r!| j        j        | j        j        i|d         d<   |||d         d<   | j        j        0dt1          j        d| j        j        j        i          i|d         d<   nw| j        j        dk    rgd                    d | j        j                  |d<   d!d i|d"<   | j        j        0dt1          j        d| j        j        j        i          i|d"         d<   t          d#z   }	 d}t          j                    4 d
{V }|	                    || 
                    |	          |          4 d
{V 	 }|                                 d
{V }|                                 d
d
d
          d
{V  n# 1 d
{V swxY w Y   d
d
d
          d
{V  n# 1 d
{V swxY w Y   |
S # t          j        $ r3}| j                            d$|j         d| d|            Y d
}~d
S d
}~wt          $ r(}| j                            d%|            Y d
}~d
S d
}~ww xY w)&r9   r:   r.   r;   r<   r=   rD   rA   rE   rF   NrG   zXCardReplier.async_create_and_send_card failed, create card instance failed, HTTP Error: , URL: , response.text: zWCardReplier.async_create_and_send_card create card instance unexpected error occurred: r   rK   rM   rN   rO   rP   rS   rT   rU   rV   rW   r5   rX   rY   rZ   r[   r\   rQ   r]   r^   zMCardReplier.async_create_and_send_card failed, send card failed, HTTP Error: zLCardReplier.async_create_and_send_card send card unexpected error occurred: )r   r_   r   r`   r&   r   r   aiohttpClientSessionrb   r,   rc   rd   ClientResponseErrorstatusre   rf   rg   r   rh   ri   rj   rk   rl   rI   rm   rn   )r   r/   r0   r1   r2   r3   r4   r5   r6   r+   ro   rp   rq   rr   sessionrs   rt   s                    r   async_create_and_send_cardz&CardReplier.async_create_and_send_card   s     0 +<<>> 	KR   2++D,ABB.*'3)&6%H&6%H
 
 F""#)D '9D#$ (*@@	M,.. 0 0 0 0 0 0 0'"<<!8!8!F!FT (   0 0 0 0 0 0 0 0*2--//$9$9$9$9$9$9M--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 	 	 	K bklks  b  b|  b  b  S`  b  b         	 	 	Kmjkmm       	
 /a@@  2c99"D"K"K$d.C.S #L # #D T1<F/D*+  F@./<<  )94;P;\@./< %@J./= $4@+TZ!4#8#H#PQ. .@./<
 "4;;"D"K"K$d.C.S #L # #D 0;J.GD*+ $4@+TZ!4#8#H#PQ. .@./< (*HH	M,.. 0 0 0 0 0 0 0'"<<!8!8!F!FT (   0 0 0 0 0 0 0 0*2--//$9$9$9$9$9$9M--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $#* 	 	 	K W`a`h  W  Wqt  W  W  HU  W  W          	 	 	Kb_`bb        	s   >E 2D0/D;D0
D	D0D	D0E 0
D::E =D:>E F2(E>>F2F--F2O 2N5/N N5
N	N5N	 N5#O 5
N??O N?O P:(PP:P55P:c	                    | j                                         }
|
s| j                            d           dS |                     | j                  }||d|i|d|id|id}|dk    r
d|d<   ||d<   | j        j        d	k    rd
                    d| j        j                  |d<   d| j         j	        j
        i|d<   |rddi|d         d<   n#|r!| j        j        | j        j        i|d         d<   |||d         d<   | j        j        0dt          j        d| j        j        j        i          i|d         d<   nw| j        j        dk    rgd
                    d| j        j                  |d<   ddi|d<   | j        j        0dt          j        d| j        j        j        i          i|d         d<   t"          dz   }	 d}i ||	}t%          j        ||                     |
          |          }|j        }|                                 n7# t.          $ r*}| j                            d| d|            Y d}~nd}~ww xY w|S )  
        创建并发送卡片一步到位，支持传入其他参数以达到投放吊顶场域卡片的效果等等。
        https://open.dingtalk.com/document/orgapp/create-and-deliver-cards
        :param support_forward: 卡片是否支持转发
        :param callback_route_key: HTTP 回调时的 route key
        :param callback_type: 卡片回调模式
        :param recipients: 接收者
        :param card_template_id: 卡片模板 ID
        :param card_data: 卡片数据
        :param at_sender: 是否@发送者
        :param at_all: 是否@所有人
        :param kwargs: 其他参数，如覆盖 openSpaceId，配置动态数据源 openDynamicDataConfig，配置吊顶场域 topOpenSpaceModel、topOpenDeliverModel 等等
        :return: 卡片的实例ID
        r:   r.   r;   r<   r=   rD   rA   rE   rM   rN   rO   rP   rS   rT   rU   rV   rW   Nr5   rX   rY   rZ   r[   r\   rQ   r]   %/v1.0/card/instances/createAndDeliverrG   z2CardReplier.create_and_deliver_card failed, error=rJ   )r   r_   r   r`   r&   r   rf   rg   r   rh   ri   rj   rk   rl   rI   rm   rn   r   ra   rb   r,   rc   rd   re   )r   r/   r0   r1   r2   r3   r4   r5   r6   kwargsr+   ro   rp   rq   rr   rs   rt   s                    r   create_and_deliver_cardz#CardReplier.create_and_deliver_card9  s$   4 +<<>> 	KR   2++D,ABB.*'3)&6%H&6%H
 
 F""#)D '9D#$  2c99"D"K"K$d.C.S #L # #D T1<F/D*+  F@./<<  )94;P;\@./< %@J./= $4@+TZ!4#8#H#PQ. .@./<
 "4;;"D"K"K$d.C.S #L # #D 0;J.GD*+ $4@+TZ!4#8#H#PQ. .@./< (*QQ	M%d%f%D}T44\BB  H %MM%%'''' 	 	 	KgQggXegg       	
  s   :AH 
H< H77H<c	           
        K   | j                                         }
|
s| j                            d           dS |                     | j                  }||d|i|d|id|id}|dk    r
d|d<   ||d<   | j        j        d	k    rd
                    d| j        j                  |d<   d| j         j	        j
        i|d<   |rddi|d         d<   n#|r!| j        j        | j        j        i|d         d<   |||d         d<   | j        j        0dt          j        d| j        j        j        i          i|d         d<   nw| j        j        dk    rgd
                    d| j        j                  |d<   ddi|d<   | j        j        0dt          j        d| j        j        j        i          i|d         d<   t"          dz   }i ||	}t%          j                    4 d{V }	 d}|                    ||                     |
          |          4 d{V 	 }|                                 d{V }|                                 ddd          d{V  n# 1 d{V swxY w Y   ns# t$          j        $ r2}| j                            d|j         d| d|            Y d}~n7d}~wt4          $ r'}| j                            d |            Y d}~nd}~ww xY wddd          d{V  n# 1 d{V swxY w Y   |S )!r   r:   r.   r;   r<   r=   rD   rA   rE   rM   rN   rO   rP   rS   rT   rU   rV   rW   Nr5   rX   rY   rZ   r[   r\   rQ   r]   r   rG   z>CardReplier.async_create_and_deliver_card failed, HTTP Error: rw   rx   zECardReplier.async_create_and_deliver_card unexpected error occurred: )r   r_   r   r`   r&   r   rf   rg   r   rh   ri   rj   rk   rl   rI   rm   rn   r   ry   rz   rb   r,   rc   rd   r{   r|   re   )r   r/   r0   r1   r2   r3   r4   r5   r6   r   r+   ro   rp   rq   r}   rr   rs   rt   s                     r   async_create_and_deliver_cardz)CardReplier.async_create_and_deliver_card  s.     4 +<<>> 	KR   2++D,ABB.*'3)&6%H&6%H
 
 F""#)D '9D#$  2c99"D"K"K$d.C.S #L # #D T1<F/D*+  F@./<<  )94;P;\@./< %@J./= $4@+TZ!4#8#H#PQ. .@./<
 "4;;"D"K"K$d.C.S #L # #D 0;J.GD*+ $4@+TZ!4#8#H#PQ. .@./< (*QQ!$!&!(** 	 	 	 	 	 	 	g ""<<!8!8!F!FT (   0 0 0 0 0 0 0 0*2--//$9$9$9$9$9$9M--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .   !! LUVU]  L  Lfi  L  L  }J  L  L           !!_\]__       	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	$  sr   K(3I#/I?I#
I	I#I	I#"K(#K2(JK(K,K	K(KK((
K25K2ro   c                    | j                                         }|s| j                            d           dS |d|id|}t          dz   }	 d}t          j        ||                     |          |          }|j        }|	                                 dS # t          $ r+}	| j                            d|	 d	|            Y d}	~	dS d}	~	ww xY w)
  
        更新卡片内容
        https://open.dingtalk.com/document/orgapp/interactive-card-update-interface
        :param card_instance_id:
        :param card_data:
        :param kwargs: 其他参数，如 privateData、cardUpdateOptions、userIdType
        :return:
        BCardReplier.put_card_data failed, cannot get dingtalk access tokenNr;   r?   r@   rF   r.   rG   z<CardReplier.put_card_data failed, update card failed, error=rJ   )r   r_   r   r`   r   ra   putr,   rc   rd   re   )
r   ro   r0   r   r+   rp   rq   rr   rs   rt   s
             r   put_card_datazCardReplier.put_card_data  s&    +<<>> 	KT   F +'3
 
 
 (*@@	M|T44\BB  H %MM%%''''' 	 	 	Kqqqqboqq   FFFFF		s   AB 
C
 CC
c           	        K   | j                                         }|s| j                            d           dS |d|id|}t          dz   }	 d}t          j                    4 d{V }|                    ||                     |          |          4 d{V 	 }	|		                                 d{V }|	
                                 ddd          d{V  n# 1 d{V swxY w Y   ddd          d{V  dS # 1 d{V swxY w Y   dS # t
          j        $ r3}
| j                            d|
j         d	| d
|            Y d}
~
dS d}
~
wt          $ r(}
| j                            d|
            Y d}
~
dS d}
~
ww xY w)r   r   Nr;   r   rF   r.   rG   z4CardReplier.async_put_card_data failed, HTTP Error: rw   rx   z;CardReplier.async_put_card_data unexpected error occurred: )r   r_   r   r`   r   ry   rz   r   r,   rc   rd   r{   r|   re   )r   ro   r0   r   r+   rp   rq   rr   r}   rs   rt   s              r   async_put_card_datazCardReplier.async_put_card_data8  s3      +<<>> 	KT   F +'3
 
 
 (*@@	M,.. 0 0 0 0 0 0 0'";;!8!8!F!FT '   0 0 0 0 0 0 0 0*2--//$9$9$9$9$9$9M--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 	 	 	K}qx}}X[}}n{}}          	 	 	KQaQQ        	sl   D )2D/CD
C'	'D*C'	+D.D 
DD DD F#(EFFF)r   r
   r   r	   )r   r	   )r-   r.   FFNT)__name__
__module____qualname__r   staticmethodr&   r,   r   dictboollistru   r~   r   r   r   r    r   r   r   r      s       K/K +K K K K 
 
 
 \
 

 

 \

  &"$ $y yy y 	y
  y y y y y 
y y y y~ &"$ $A AA A 	A
  A A A A A 
A A A AN &"$ $h  h h  h  	h 
  h  h  h  h  h  
h  h  h  h \ &"$ $n  n n  n  	n 
  n  n  n  n  n  
n  n  n  n `#c #d # # # #J) #)04) ) ) ) ) )r   r   c                   V    e Zd ZU dZeed<   dZeed<   dZeed<   dZeed<   d	Z	eed
<   dS )AICardStatusr   
PROCESSING   INPUTING   	EXECUTING   FINISHED   FAILEDN)
r   r   r   r   r   __annotations__r   r   r   r   r   r   r   r   r   d  s]         JHcIsHcFCOOOOOr   r   c                        e Zd Z fdZ	 	 ddededededef
d	Z	 	 ddededededef
d
Z	dedefdZ
dedefdZdedefdZdedefdZdedededededefdZdedededededefdZ xZS )AICardReplierc                 Z    t          t          |                               ||           d S )N)superr   r   )r   r   r   	__class__s      r   r   zAICardReplier.__init__o  s*    mT""++O=MNNNNNr   NTr/   r0   r5   r6   r7   c                 ~    t          j        |          }t          j        |d<   |                     ||dd||          S )   
        AI卡片的创建接口
        :param support_forward:
        :param recipients:
        :param card_template_id:
        :param card_data:
        :return:
        
flowStatusFr3   r4   r5   r6   )copydeepcopyr   r   ru   r   r/   r0   r5   r6   card_data_with_statuss         r   startzAICardReplier.startr  sQ     !%i 8 8.:.El+((!!+ ) 
 
 	
r   c                    K   t          j        |          }t          j        |d<   |                     ||dd||           d{V S )r   r   Fr   N)r   r   r   r   r~   r   s         r   async_startzAICardReplier.async_start  ss       !%i 8 8.:.El+44!!+ 5 
 
 
 
 
 
 
 
 	
r   ro   c                 x    t          j        |          }t          j        |d<   |                     ||           dS u   
        AI卡片执行完成的接口，整体更新
        :param card_instance_id:
        :param card_data:
        :return:
        r   N)r   r   r   r   r   r   ro   r0   r   s       r   finishzAICardReplier.finish  s@     !%i 8 8.:.Cl++-BCCCCCr   c                    K   t          j        |          }t          j        |d<   |                     ||           d{V  dS r   )r   r   r   r   r   r   s       r   async_finishzAICardReplier.async_finish  sV       !%i 8 8.:.Cl+&&'79NOOOOOOOOOOOr   c                 x    t          j        |          }t          j        |d<   |                     ||           dS u   
        AI卡片变成失败状态的接口，整体更新，非streaming
        :param card_instance_id:
        :param card_data:
        :return:
        r   N)r   r   r   r   r   r   s       r   failzAICardReplier.fail  s@     !%i 8 8.:.Al++-BCCCCCr   c                    K   t          j        |          }t          j        |d<   |                     ||           d{V  dS r   )r   r   r   r   r   r   s       r   
async_failzAICardReplier.async_fail  sV       !%i 8 8.:.Al+&&'79NOOOOOOOOOOOr   content_keycontent_valueappendfinishedfailedc                    | j                                         }|s| j                            d           dS |t	          t          j                              ||| ||d}t          dz   }		 d}
t          j	        |	| 
                    |          |          }|j        }
|                                 dS # t          $ r+}| j                            d| d|
            Y d}~dS d}~ww xY w)	   
        AI卡片的流式输出
        :param card_instance_id:
        :param content_key:
        :param content_value:
        :param append:
        :param finished:
        :param failed:
        :return:
        @AICardReplier.streaming failed, cannot get dingtalk access tokenNr?   guidkeycontentisFull
isFinalizeisError/v1.0/card/streamingr.   rG   z&AICardReplier.streaming failed, error=rJ   )r   r_   r   r`   r   r   r   r   ra   r   r,   rc   rd   re   )r   ro   r   r   r   r   r   r+   rp   rq   rr   rs   rt   s                r   	streamingzAICardReplier.streaming  s5   & +<<>> 	KR   4 +
%%$ j"
 
 (*@@	M|T44\BB  H %MM%%''''' 	 	 	K[[[M[[   FFFFF		s   ,AB5 5
C*? C%%C*c           	      R  K   | j                                         }|s| j                            d           dS |t	          t          j                              ||| ||d}t          dz   }		 d}
t          j	                    4 d{V }|
                    |	|                     |          |          4 d{V 	 }|                                 d{V }
|                                 ddd          d{V  n# 1 d{V swxY w Y   ddd          d{V  dS # 1 d{V swxY w Y   dS # t          j        $ r3}| j                            d|j         d|	 d	|
            Y d}~dS d}~wt           $ r(}| j                            d
|            Y d}~dS d}~ww xY w)r   r   Nr   r   r.   rG   z2AICardReplier.async_streaming failed, HTTP Error: rw   rJ   z7CardReplier.async_streaming unexpected error occurred: )r   r_   r   r`   r   r   r   r   ry   rz   r   r,   rc   rd   r{   r|   re   )r   ro   r   r   r   r   r   r+   rp   rq   rr   r}   rs   rt   s                 r   async_streamingzAICardReplier.async_streaming  sC     & +<<>> 	KR   4 +
%%$ j"
 
 (*@@	M,.. 0 0 0 0 0 0 0'";;!8!8!F!FT '   0 0 0 0 0 0 0 0*2--//$9$9$9$9$9$9M--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 	 	 	KzQXzzVYzzkxzz          	 	 	KM!MM        	sl   .D4 	2D!</C=+D!=
D	D!
D	D!D4 !
D++D4 .D+/D4 4F&(E11F&>F!!F&)NT)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r   m  s       O O O O O   $
 

 
 	

 
 

 
 
 
<   $
 

 
 	

 
 

 
 
 
4	Ds 	Dt 	D 	D 	D 	D	P3 	P4 	P 	P 	P 	P	DS 	DT 	D 	D 	D 	D	P 	P 	P 	P 	P 	P11 1 	1
 1 1 1 1 1 1f55 5 	5
 5 5 5 5 5 5 5 5 5 5r   r   )rI   r   r   r   r)   ra   ry   utilsr   logr   enumr   r   typingr   chatbotr	   streamr
   objectr   r   r   r   r   r   r   <module>r      sg          , , , , , , % % % % % %                     -'''''',,,,,,K	 K	 K	 K	 K	& K	 K	 K	\     3   M M M M MK M M M M Mr   