
    +j'                    X   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Zd dl	Z	d dl
Zd dlmZmZ d dlmZ d dlmZmZ d dlZ G d dej                  Z G d dej                  Z G d	 d
ej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Zd ZdMdej         dee!e!f         de!fdZ"dZ#d Z$dNd ej%        d!ej%        d"e!fd#Z&d$ej%        d%ej%        d&ej%        fd'Z'd(ej(        d)ej(        d*e)d+e*d,e!f
d-Z+	 	 	 dOd(ej(        d)ej(        d*e)d+e*d,e!f
d1Z, G d2 d3ej                  Z-dPd4Z.	 dPd5Z/dQd9Z0dRd:Z1 G d; d<ej                  Z2 G d= d>ej                  Z3dSd?Z4 G d@ dAej                  Z5 G dB dCej                  Z6 G dD dEej                  Z7d dFl8m9Z9m:Z:m;Z;m<Z<  G dG dHej                  Z= G dI dJe          Z>dKe>fdLZ?dS )T    N)Tuple	TypedDict)override)ComfyExtensionioc                   L    e Zd Zed             Zeddej        fd            ZdS )WanImageToVideoc                 r   t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j	                            dd          g	t           j        
                    d          t           j        
                    d          t           j        
                    d          g          S )Nr	   model/conditioning/video_modelspositivenegativevaewidth@     defaultminmaxstepheight  lengthQ         
batch_size   r   r   r   clip_vision_outputToptionalstart_imagedisplay_namelatentnode_idcategoryinputsoutputsr   SchemaConditioningInputVaeIntnodesMAX_RESOLUTIONClipVisionOutputImageOutputLatentclss    6/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_wan.pydefine_schemazWanImageToVideo.define_schema   sK   y%6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF#))*>)NN}t<<
 &&J&??&&J&??	  h 77
 
 
 	
    Nreturnc
                    t          j        |d|dz
  dz  dz   |dz  |dz  gt          j                                                  }
|Xt          j                            |d |                             dd          ||dd                              dd          }t          j        ||||j	        d         f|j
        |j        	          d
z  }||d |j	        d         <   |                    |d d d d d d d df                   }t          j        dd|
j	        d         |j	        d         |j	        d         f|j
        |j        	          }d|d d d d d |j	        d         dz
  dz  dz   f<   t          j        |||d          }t          j        |||d          }|	.t          j        |d|	i          }t          j        |d|	i          }i }|
|d<   t          j        |||          S )Nr   r   r      devicebilinearcenterrA   dtype      ?r                 concat_latent_imageconcat_maskr    samples)torchzeroscomfymodel_managementintermediate_deviceutilscommon_upscalemovedimonesshaperA   rF   encodenode_helpersconditioning_set_valuesr   
NodeOutput)r9   r   r   r   r   r   r   r   r#   r    r&   imagerM   mask
out_latents                  r:   executezWanImageToVideo.execute(   s   j"
q/@A.EvQR{TY]^T^_hmh~  iS  iS  iU  iU  V  V  V"+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NKJ{7H7LMVaVhp{  qB  C  C  C  FI  IE+6E';$Q''("%**U111aaaBQB;-?"@"@:q!V\!_6I6OPR6SUhUnoqUrs  }H  }O  Wb  Wh  i  i  iDADDAAA=++A.2q8A===>#;H^q  CG  GH  GH  I  IH#;H^q  CG  GH  GH  I  IH)#;HG[]oFpqqH#;HG[]oFpqqH
 &
9}Xx<<<r<   NN__name__
__module____qualname__classmethodr;   r   r]   ra    r<   r:   r	   r	      se        
 
 [
, = =  @B  @M = = = [= = =r<   r	   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanFunControlToVideoc                    t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j	                            dd          t           j	                            dd          g
t           j        
                    d          t           j        
                    d          t           j        
                    d          g          S )Nrj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    Tr!   r#   control_videor$   r&   r'   r,   r8   s    r:   r;   z"WanFunControlToVideo.define_schemaA   s`   y*6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF#))*>)NN}t<<>> &&J&??&&J&??	  h 77
 
 
 	
r<   Nr=   c                 `   t          j        |d|dz
  dz  dz   |dz  |dz  gt          j                                                  }t          j        |d|dz
  dz  dz   |dz  |dz  gt          j                                                  }t          j                                                            |          }|                    ddddd          }|t          j	        
                    |d |                             dd          ||dd	                              dd          }|                    |d d d d d d d d
f                   }|d d d d d |j        d         f         |d d dd d |j        d         f<   |
t          j	        
                    |
d |                             dd          ||dd	                              dd          }
|                    |
d d d d d d d d
f                   }|d d d d d |j        d         f         |d d d dd |j        d         f<   t          j        |d|i          }t          j        |d|i          }|	.t          j        |d|	i          }t          j        |d|	i          }i }||d<   t!          j        |||          S )Nr   r   r   r?   r@   rI   rB   rC   rD   rH   rM   r    rO   )rP   rQ   rR   rS   rT   latent_formatsWan21process_outrepeatrU   rV   rW   rZ   rY   r[   r\   r   r]   )r9   r   r   r   r   r   r   r   r#   r    rl   r&   concat_latentrM   r`   s                  r:   ra   zWanFunControlToVideo.executeY   sp   j"
q/@A.EvQR{TY]^T^_hmh~  iS  iS  iU  iU  V  V  VZvza6G15LfXYk[`de[e$fot  pF  pZ  pZ  p\  p\  ]  ]  ],2244@@OO%,,Q1a;;"+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NK"%**[AAAqqq"1"-E"F"FATUVUVUVWXWXWXYpZgZmnoZpYpUpAqM!!!BCC =!4!:1!= ==>$!K66}WfW7M7U7UVXZ[7\7\^cekmw  zB  C  C  K  K  LM  OQ  R  RM"%**]111aaaBQB;-G"H"HATUVUVUVWXWXWXYpZgZmnoZpYpUpAqM!!!CRC =!4!:1!= ==>7CXZgBhii7CXZgBhii)#;HG[]oFpqqH#;HG[]oFpqqH
 &
9}Xx<<<r<   NNNrc   rh   r<   r:   rj   rj   @   se        
 
 [
. = =  TV  Ta = = = [= = =r<   rj   c                   L    e Zd Zed             Zeddej        fd            ZdS )Wan22FunControlToVideoc                 r   t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j                            dd          g	t           j        	                    d          t           j        	                    d          t           j
        	                    d          g          S )Nru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	ref_imageTr!   rl   r$   r&   r'   r   r-   r.   r/   r0   r1   r2   r3   r5   r6   r7   r8   s    r:   r;   z$Wan22FunControlToVideo.define_schemav   sF   y,6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF{T::>>
 &&J&??&&J&??	  h 77
 
 
 	
r<   Nr=   c                 j   |                                 }|j        }t          j        |||dz
  dz  dz   ||z  ||z  gt          j                                                  }t          j        |||dz
  dz  dz   ||z  ||z  gt          j                                                  }|dk    r2t          j                                        	                    |          }n1t          j        
                                	                    |          }|                    ddddd          }t          j        dd|j        d         dz  |j        d         |j        d         f          }|	t          j                            |	d |                             dd          ||dd	                              dd          }	|                    |	d d d d d d d d
f                   }|d d d d d |j        d         f         |d d |d d |j        d         f<   d|d d d d d |	j        d         d
z   f<   d }|zt          j                            |d d                             dd          ||dd	                              dd          }|                    |d d d d d d d d
f                   }|
t          j                            |
d |                             dd          ||dd	                              dd          }
|                    |
d d d d d d d d
f                   }|d d d d d |j        d         f         |d d d |d |j        d         f<   |                    d|j        d         dz  d|j        d
         |j        d                                       dd          }t)          j        ||||d          }t)          j        ||||d          }|4t)          j        |d|gid          }t)          j        |d|gid          }i }||d<   t-          j        |||          S )Nr   r   r@   0   rI   rJ   rB   rC   rD   rH   rK   r   )rM   rN   concat_mask_indexreference_latentsTappendrO   )spacial_compression_encodelatent_channelsrP   rQ   rR   rS   rT   rn   Wan22rp   ro   rq   rX   rY   rU   rV   rW   rZ   view	transposer[   r\   r   r]   )r9   r   r   r   r   r   r   r   rw   r#   rl   spacial_scaler   r&   rr   r_   rM   
ref_latentr`   s                      r:   ra   zWan22FunControlToVideo.execute   sW   6688-j/VaZA<MQR;RTZ^kTkmr  wD  nD  E  NS  Nd  Nx  Nx  Nz  Nz  {  {  {ZFQJSTCTXYBY[aer[rty  ~K  uK  %L  UZ  Uk  U  U  UA  UA  B  B  Bb  !06688DD]SSMM!06688DD]SSM%,,Q1a;;z1aa1!4fl26FUWHXYZZ"+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NK"%**[AAAqqq"1"-E"F"FNabcbcbcdededef}gtgz{|g}f}b}N~M!!!O,,-J.A.G.J-JJK47DAAA0)!,q0001
 229RaR=3H3HQ3O3OQVX^`jltuu}}~  BD  E  EIIaaaAAArrk$:;;J$!K66}WfW7M7U7UVXZ[7\7\^cekmw  zB  C  C  K  K  LM  OQ  R  RM"%**]111aaaBQB;-G"H"HNabcbcbcdededef}gtgz{|g}f}b}N~M!!!,_,-J.A.G.J-JJKyyDJqMQ.4:a=$*Q-PPZZ[\^_``7Zgx|  Tc  Cd  Cd  e  e7Zgx|  Tc  Cd  Cd  e  e!#;HGZ]g\hFirvwwwH#;HGZ]g\hFirvwwwH
 &
9}Xx<<<r<   rs   rc   rh   r<   r:   ru   ru   u   se        
 
 [
, &= &=  KM  KX &= &= &= [&= &= &=r<   ru   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanFirstLastFrameToVideoc                    t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j                            dd          t           j	                            dd          t           j	                            dd          gt           j        
                    d          t           j        
                    d          t           j        
                    d          g          S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   clip_vision_start_imageTr!   clip_vision_end_imager#   	end_imager$   r&   r'   r,   r8   s    r:   r;   z&WanFirstLastFrameToVideo.define_schema   sz   y.6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF#))*Cd)SS#))*AD)QQ}t<<{T:: &&J&??&&J&??	  h 77!
 
 
 	
r<   Nr=   c                    |                                 }t          j        ||j        |dz
  dz  dz   ||z  ||z  gt          j                                                  }|St          j                            |d |         	                    dd          ||dd          	                    dd          }|	Tt          j                            |	| d          	                    dd          ||dd          	                    dd          }	t          j
        |||df          dz  }t          j
        dd|j        d	         dz  |j        d
         |j        d         f          }|.||d |j        d         <   d|d d d d d |j        d         dz   f<   |	-|	||	j        d          d <   d|d d d d |	j        d          d f<   |                    |d d d d d d d df                   }|                    d|j        d	         dz  d|j        d         |j        d                                       dd	          }t          j        |||d          }t          j        |||d          }d }|
|
}|L|Ht          j        |j        |j        gd
          }t          j                                        }||_        n|}|.t          j        |d|i          }t          j        |d|i          }i }||d<   t+          j        |||          S )Nr   r   r@   rB   rC   rD   rH   rG   rI   rJ   r   rK   rL   dimr    rO   )r   rP   rQ   r   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r   r   r[   r\   catpenultimate_hidden_statesclip_visionr6   r   r]   )r9   r   r   r   r   r   r   r   r#   r   r   r   r   r&   r^   r_   rM   r    statesr`   s                       r:   ra   z WanFirstLastFrameToVideo.execute   s   6688j#*=!PQ@QUV?VX^boXoqv  {H  rH  I  RW  Rh  R|  R|  R~  R~      "+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NK 229fWXX3F3N3NrST3U3UW\^dfprz{{  D  D  EF  HJ  K  KI
FFE1566<z1aa1!4fl26FUWHXYZZ"+6E';$Q''(47DAAA0)!,q0001 *3E9?1%%&&'/2DAAA	**+++,!jjqqq!!!QQQ{);<<yyDJqMQ.4:a=$*Q-PPZZ[\^_``7Zm  C  CD  CD  E  E7Zm  C  CD  CD  E  E!".!8 ,!-$6$PRg  SB  $C  IK  L  L  L%*%6%=%=%?%?"?E"<<%:")#;HG[]oFpqqH#;HG[]oFpqqH
 &
9}Xx<<<r<   NNNNrc   rh   r<   r:   r   r      se        
 
 [
0 *= *=  qs  q~ *= *= *= [*= *= *=r<   r   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanFunInpaintToVideoc                    t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j	                            dd          t           j	                            dd          g
t           j        
                    d          t           j        
                    d          t           j        
                    d          g          S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    Tr!   r#   r   r$   r&   r'   r,   r8   s    r:   r;   z"WanFunInpaintToVideo.define_schema   s`   y*6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF#))*>)NN}t<<{T:: &&J&??&&J&??	  h 77
 
 
 	
r<   Nr=   c                 \    t                      }|                    |||||||||	|

  
        S )N)r#   r   r   )r   ra   )r9   r   r   r   r   r   r   r   r#   r   r    flfvs               r:   ra   zWanFunInpaintToVideo.execute  sG    '))||HhUFFJdo  |E  _q|  r  r  	rr<   rs   rc   rh   r<   r:   r   r      sm        
 
 [
. r r  PR  P] r r r [r r rr<   r   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanVaceToVideoc                 <   t          j        dddgdt           j                            d          t           j                            d          t           j                            d          t           j                            dd	d
t          j        d
          t           j                            ddd
t          j        d
          t           j                            dddt          j        d          t           j                            dddd          t           j                            ddddd          t           j	                            dd          t           j
                            dd          t           j	                            dd          gt           j                            d          t           j                            d          t           j                            d           t           j                            d!          g"          S )#Nr   zvideo conditioningzvideo controlr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   strength      ?rK        @@{Gz?rl   Tr!   control_masksreference_imager$   r&   trim_latentr(   search_aliasesr)   r*   r+   )r   r-   r.   r/   r0   r1   r2   r3   Floatr5   Maskr6   r7   r8   s    r:   r;   zWanVaceToVideo.define_schema  s   y$0/B6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FFz3CVRVWW>>o==04@@ &&J&??&&J&??	  h 77=99	#
 
 
 	
r<   Nr=   c                 	   |dz
  dz  dz   }|	t           j                            |	d |                             dd          ||dd                              dd          }	|	j        d         |k     r=t
          j        j                            |	ddddddd||	j        d         z
  fd          }	nt          j	        |||d	f          dz  }	|t           j                            |d d                             dd          ||dd                              dd          }|
                    |d d d d d d d d	f                   }t          j        |t           j                                                            t          j        |                    gd
          }|
t          j	        |||df          }n|
}|j        d	k    r|                    d          }t           j                            |d |         ||dd                              dd          }|j        d         |k     r=t
          j        j                            |ddddddd||j        d         z
  fd          }|	dz
  }	|	d|z
  z  dz   }|	|z  dz   }|
                    |d d d d d d d d	f                   }|
                    |d d d d d d d d	f                   }t          j        ||fd
          }|t          j        ||fd
          }d}||z  }||z  }|                    |||||          }|                    ddddd	          }|                    ||z  |||          }t
          j        j                            |                    d          |||fd                              d          }d}|ft          j        |d d d |j        d         d d d d f                   }t          j        ||fd
          }||j        d         z  }|j        d         }|                    d          }t/          j        ||g|g|gdd          }t/          j        ||g|g|gdd          }t          j        |d||dz  |dz  gt           j                                                  }i }||d<   t9          j        ||||          S )Nr   r   rB   rC   rD   r   rG   )valuerH   r   r   rI   r?   nearest-exactsizemode)vace_frames	vace_maskvace_strengthTr}   r   r@   rO   )rR   rU   rV   rW   rY   rP   nn
functionalpadrX   rZ   r   rn   ro   rp   
zeros_likendim	unsqueezer   permutereshapeinterpolatesqueezer[   r\   rQ   rS   rT   r   r]   )r9   r   r   r   r   r   r   r   r   rl   r   r   latent_lengthr_   inactivereactivecontrol_video_latent
vae_strideheight_mask
width_maskr   mask_padr&   r`   s                           r:   ra   zWanVaceToVideo.execute9  s    1**a/$!K66}WfW7M7U7UVXZ[7\7\^cekmw  zB  C  C  K  K  LM  OQ  R  RM"1%.. % 3 7 71aQRTUWXZ[]cfsfyz{f|]|G}  FI 7  !J  !J!Jq'ABBSHM&#k88!9L9T9TUWYZ9[9[]bdjlv  yA  B  B  J  J  KL  NP  Q  QO!jjAAAqqq"1")EFFO#i%:N:T:T:V:V:b:bchcs  uD  dE  dE  ;F  ;F  )G  MN  O  O  OO :vvua899DD DyA~~~~a((;--d7F7mUFJX`aaiijkmoppDz!}v%%x*..taAq!Q6TXT^_`TaKa5bjm.nn%+!QX.#5!D(C/::hqqq!!!QQQ{344::hqqq!!!QQQ{344$y(H)=1EEE&#(9o?S-TZ[#\#\#\ 

*j(
yyj*jQQ||Aq!Q**||J3V[*UUx"..t~~a/@/@WbdnGo  wF.  G  G  O  O  PQ  R  R&'QQQ0I1Fq1I0I111aaa-O(PQQH9h-1555D_2155M)/2K~~a  7SgRhx|w}  RZ  Q[  C\  C\  ei  j  j  j7SgRhx|w}  RZ  Q[  C\  C\  ei  j  j  jj"mVq[%ST*U^c^t  _I  _I  _K  _K  L  L  L
 &
9}Xx[IIIr<   rs   rc   rh   r<   r:   r   r     sm        
 
 [
4 9J 9J  ]_  ]j 9J 9J 9J [9J 9J 9Jr<   r   c                   J    e Zd Zed             Zedej        fd            ZdS )TrimVideoLatentc                     t          j        ddt           j                            d          t           j                            dddd          gt           j                                        g          S )	Nr   zmodel/latent/videorO   trim_amountr   i r   r'   )r   r-   r7   r/   r1   r6   r8   s    r:   r;   zTrimVideoLatent.define_schemav  sh    y%)		**]A1%HH
 	  ""

 

 

 
	
r<   r=   c                     |                                 }|d         }|d d d d |d f         |d<   t          j        |          S )NrO   )copyr   r]   )r9   rO   r   samples_outs1s        r:   ra   zTrimVideoLatent.execute  sK    llnnY!#AAAqqq+,,$6!7I}[)))r<   Nrc   rh   r<   r:   r   r   u  sV        
 
 [
 *bm * * * [* * *r<   r   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanCameraImageToVideoc                    t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j	                            dd          t           j
                            dd          g
t           j                            d          t           j                            d          t           j                            d          g          S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    Tr!   r#   camera_conditionsr$   r&   r'   )r   r-   r.   r/   r0   r1   r2   r3   r4   r5   WanCameraEmbeddingr6   r7   r8   s    r:   r;   z#WanCameraImageToVideo.define_schema  se   y+6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF#))*>)NN}t<<%++,?$+OO &&J&??&&J&??	  h 77
 
 
 	
r<   Nr=   c                    t          j        |d|dz
  dz  dz   |dz  |dz  gt          j                                                  }t          j        |d|dz
  dz  dz   |dz  |dz  gt          j                                                  }t          j                                                            |          }|t          j        	                    |d |         
                    dd          ||dd          
                    dd          }|                    |d d d d d d d d	f                   }|d d d d d |j        d
         f         |d d d d d |j        d
         f<   t          j        dd|j        d
         dz  |j        d         |j        d         f          }d|d d d d d |j        d         d	z   f<   |                    d|j        d
         dz  d|j        d	         |j        d                                       dd
          }t!          j        |||d          }t!          j        |||d          }|
.t!          j        |d|
i          }t!          j        |d|
i          }|	.t!          j        |d|	i          }t!          j        |d|	i          }i }||d<   t%          j        |||          S )Nr   r   r   r?   r@   rB   rC   rD   rH   rI   rJ   rK   r   rL   r   r    rO   )rP   rQ   rR   rS   rT   rn   ro   rp   rU   rV   rW   rZ   rY   rX   r   r   r[   r\   r   r]   )r9   r   r   r   r   r   r   r   r#   r    r   r&   rr   rM   r_   r`   s                   r:   ra   zWanCameraImageToVideo.execute  sg   j"
q/@A.EvQR{TY]^T^_hmh~  iS  iS  iU  iU  V  V  VZvza6G15LfXYk[`de[e$fot  pF  pZ  pZ  p\  p\  ]  ]  ],2244@@OO"+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NK"%**[AAAqqq"1"-E"F"F?RSTSTSTUVUVUVWnXeXklmXnWnSn?oM!!!AAA;28;;;<:q!V\!_q%8&,r:JFLY[L\]^^D47DAAA0)!,q000199Q
1 2Atz!}djQRmTT^^_`bcddD#;H^k  }A  GB  GB  C  CH#;H^k  }A  GB  GB  C  CH(#;HGZ\mFnooH#;HGZ\mFnooH)#;HG[]oFpqqH#;HG[]oFpqqH
 &
9}Xx<<<r<   rs   rc   rh   r<   r:   r   r     se        
 
 [
. = =  XZ  Xe = = = [= = =r<   r   c                   J    e Zd Zed             Zedej        fd            ZdS )WanPhantomSubjectToVideoc                 p   t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          gt           j        	                    d          t           j        	                    d          t           j        	                    d          t           j
        	                    d          g          S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   imagesTr!   r$   negative_textnegative_img_textr&   r'   rx   r8   s    r:   r;   z&WanPhantomSubjectToVideo.define_schema  sH   y.6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FFx$77	 &&J&??&&O&DD&&4G&HH	  h 77	
 
 
 	
r<   r=   c	           
      <   t          j        |d|dz
  dz  dz   |dz  |dz  gt          j                                                  }	|}
|4t          j                            |d |                             dd          ||dd                              dd          }g }|D ]@}||                    |	                    d	          d d d d d d d d
f                   gz  }At          j
        |d          }t          j        |d|i          }t          j        |d|i          }
t          j        |dt          j                                                            t          j        |                    i          }i }|	|d<   t#          j        ||
||          S )Nr   r   r   r?   r@   rB   rC   rD   r   rH   rI   r   time_dim_concatrO   )rP   rQ   rR   rS   rT   rU   rV   rW   rZ   r   r   r[   r\   rn   ro   rp   r   r   r]   )r9   r   r   r   r   r   r   r   r   r&   cond2latent_imagesirM   r`   s                  r:   ra   z WanPhantomSubjectToVideo.execute  s   j"
q/@A.EvQR{TY]^T^_hmh~  iS  iS  iU  iU  V  V  V[//ww0G0GA0N0NPUW]_ikstt||}~  AC  D  DFM K K#**Q[[^^AAAqqq!!!RaRK-H"I"I!JJ"')Mq"A"A"A#;HGXZmFnooH 8DUWjCkllE#;HGXZ_ZnZtZtZvZv  [C  [C  DI  DT  Uh  Di  Di  [j  [j  Gk  l  lH
 &
9}Xuh
CCCr<   Nrc   rh   r<   r:   r   r     s_        
 
 [
, D\^\i D D D [D D Dr<   r   c                 l   g }	 t          | t                    r>t          j        |                     dd                    }|                    |           nB| D ]?}t          j        |                    dd                    }|                    |           @|r)t          |d         t                    rd|d         v r|g}nX|rUt          |d         t                    r:|d         r2t          |d         d         t                    rd|d         d         v rn	 n# t          j	        $ r g }Y nw xY w|S )z0Parse JSON track data into a standardized format'"r   x)

isinstancestrjsonloadsreplaceextendr~   dictlistJSONDecodeError)trackstracks_dataparsed	track_strs       r:   parse_json_tracksr     s   Kfc"" 	+ZsC 8 899Fv&&&& $ + +	I$5$5c3$?$?@@""6****  	:k!nd;; 	{ST~@U@U&-KK 	ZA== 	+a. 	U_`klm`nop`qswUxUx 	  ~A  EP  QR  ES  TU  EV  ~V  ~V    s   DD D10D1r?   	tracks_np
frame_sizequant_multic                 >   t          j        |                                           }|j        d         dk    rt          j        |d          }|dd df         |dddf         }}t          | }t          j        g |                              |          dz  }||z
  }||z  dz  }|dz  dz
  } t          j        dd|j        d                   	                    dddd          j
        |j         }	t          j        |	||gd	          	                    ddd
          }
|
d d         }|
dd          }dt          j        d|          z  }|t          j        d|          z  }t          j        ||d	          dd |         }t          j        ||gd	          }|S )Nr   y   )r   r   rI   rH   .rI   rH   rB   r   r   r   x   )rP   
from_numpyfloatrY   r   r   tensortype_aslinspacer   expandr   mathgcdrepeat_interleave)r   r   
num_framesr   kwargsr   visibles
short_edgeframe_centertrangeout_out_0out_labfinal_results                   r:   process_tracksr  
  s    i((..00F|A#v|44c2A2gsAaCx(8HFj!J<*..66v>>BLl"Fj 1$F!|aHLU^B6<?3388Q1EELhn]F9ffh/R888==c2qIID!HEHEtxZ(((AdhsJ///A#E1!444QTT:E9eU^333Lr<   r   c                 ^   t          j        d | D             t           j                  }|j        d         }|t          k     rAt          j        t          |z
  dft           j                  }t          j        ||f          }n|dt                   }|                    t          dd          S )zFConvert list of {x,y} to (FIXED_LENGTH,1,3) array, padding/truncating.c                 0    g | ]}|d          |d         dgS )r   yr   rh   ).0ps     r:   
<listcomp>zpad_pts.<locals>.<listcomp>/  s'    444AQsVQsVQ'444r<   )rF   r   rH   Nr   )nparrayfloat32rY   FIXED_LENGTHrQ   vstackr   )trptsnr   s       r:   pad_ptsr  -  s    
(44444BJ
G
G
GC	!A<hq(!,BJ???ic
##-<- ;;|Q***r<   r   targetindr   c           	      B    t          j                  |k    s!J d|t          j                  fz                j        t	           fdt          |          D             dgt           j                  |z
  z  z               }t           j                  |dz   k    rdt          t           j                  |dz   z
            D ]}|                    d          } |j        g d|dz   z   j        |dz   d         R  }t          j         ||          S )z Index selection utility functionz>Index must have the target dim, but get dim: %d, ind shape: %sc                 P    g | ]"}j         |         d k    rj         |         nd#S )r   rB   rY   )r  kr  r  s     r:   r  zind_sel.<locals>.<listcomp>@  s3    NNNaV\!_11SYq\\rNNNr<   rB   r   )rB   N)r   index)	lenrY   r   r   tupleranger   rP   gather)r  r  r   ind_pad_s   ``   r:   ind_selr%  8  sN    	CIG3PSTWT]P^P^J__ 	 V]	NNNNN5::NNN 6<  3&((

 

F G
6<37""s6<((C!G455 	, 	,A''++GG '.R%37"3RflC!G==6QRRR<Cw7777r<   	vert_attrweightvert_assignc                    t          |j                  dz
  }t          | j                  dk    r| j        d         |                                k    sJ dg|z  t          | j                  z   }|                     |          }t          ||                    t          j                  |          }n| j        d         |                                k    sJ | j        d         gdg|dz
  z  z   t          | j        dd                   z   }|                     |          }t          ||                    t          j                  |          }t          j	        ||
                    d          z  d          }|S )z$Merge vertex attributes with weightsr   rI   r   r   NrB   rJ   )r  rY   r   r   r   r%  typerP   longsumr   )r&  r'  r(  
target_dim	new_shaper   sel_attr
final_attrs           r:   merge_finalr1  Q  sb   [&''!+J
9?q  q!KOO$5$55555C*$tIO'<'<<	""9--6;#3#3EJ#?#?ZPPPq!KOO$5$55555_Q'(A3*q.+AADYZY[Y[I\D]D]]	""9--6;#3#3EJ#?#?ZPPP8f&6&6r&:&::CCCJr<   r   vidtemperature
vae_dividetopkc           	      n   |j         \  }}}}| j         d         }	t          j        | g dd          \  }}
}|
t          j        |t	          ||          z  |t	          ||          z  g|
j                  z  }|                    dd          }|                    dd          }t          j        | t	          ||          z  |t	          ||          z  |          }t          j        | t	          ||          z  |t	          ||          z  |          }t          j        t          j	        ||d	          d
d
d         d          
                    |
j                  }|
d
d
dd
f         }|d
d
dd
f         } |j        |dz
  dg|j         dd
         R                      d          } ||z  j        |dz
  dg|j         dd
         R                      d          |dz   z  }|d
d
d
d
f         |d
d
d
d
d
d
f         z
                      d                              d          }t          j        | |z            |                    dd                              |dz
  dd|	          z  }t          j        |t	          ||j         d                   d          \  }}d}t          j        j                            |                    dddd          d
d         |d
d
d
df                             |j                  |dd          }|                    d                              d                              dd          }t/          |||                              dddd          }|                    d          }||d
d
dd
f         d|                    dd          z
  z  z   }t          j        |d
d
d
df         |gd          }t          j        t          j        |d
d                   |gd          }|d
                             |d         ddd          |fS )z%Apply motion patching based on tracksrI   )r   rI   r   rB   r   r@   r   r   ij)indexingNr   gh㈵>)r  r   rC   rH   rQ   F)r   padding_modealign_corners)rY   rP   splitr   r   rA   clampr   stackmeshgridtor   r,  powexpr5  r   r   grid_sampler   r*  rF   r   r1  r   	ones_liker   )r   r2  r3  r4  r5  r$  THWN	tracks_xyvisibletracks_nxxyygrid
tracks_padvisible_padvisible_aligntracks_aligndist_r'  vert_weight
vert_index	grid_modepoint_featureout_feature
out_weightmix_featureout_feature_fullout_mask_fulls                                  r:   _patch_motion_singler\  c  sa    JAq!QQA!K			r  Ay' 5<SAYYC1II(FyO_````H~~b!$$HmmAq!!G	SAYYC1IIq	9	9B	SAYYC1IIq	9	9B;u~b"t<<<TTrTBKKKNN D 111abb5!J!!!QRR%.K$K$QUAF0A!""0EFFFJJ1MMM2J,21q5!Sj>Nqrr>RSSSWW	 		L 
aaatm	$tD!!!QQQ,<'=	=BB1EEII"MM 
 Yv+,,}/B/B1a/H/H/M/M	Aq!Q0 0 F $j#dFL,--2  K IH'33Aq!Q#BQBSY'' 4  M "))!,,44Q77??1EEMm[*EEMMaQRTUWXYYK$$J AAAqrrE
a*2B2B1a2H2H.H IIKy#aaa!e*k!:BBBIuz"1"~>>
KQRSSSM%%jmRR@@BRRRr<        k@r   r   rI   c                 D   t          |           }g }g }t          |          D ]N}t          | |         ||         |||          \  }	}
|                    |	           |                    |
           Ot	          j        |d          }t	          j        |d          }||fS )Nr   r   )r  r!  r\  r~   rP   r=  )r   r2  r3  r4  r5  B	out_masksout_featuresr  r_   featurer[  rZ  s                r:   patch_motionrd    s     	FA IL1XX 	% 	%,1IF
 
g 	G$$$$ K	q111M{<Q777***r<   c                   N    e Zd Zed             Ze	 ddej        fd            ZdS )WanTrackToVideoc                 D   t          j        dg ddt           j                            d          t           j                            d          t           j                            d          t           j                            ddd	
          t           j                            dddt          j        d          t           j                            dddt          j        d          t           j                            dddt          j        d          t           j                            dddd          t           j	                            dddddd          t           j                            dddd d!          t           j
                            d"          t           j                            d#d$          gt           j                            d%          t           j                            d%          t           j                            d&%          g'          S )(Nrf  )zmotion trackingztrajectory videozpoint trackingzkeypoint animationr   r   r   r   r   Tz[])	multiliner   r   r   r   r   r   r   r   r   r   r   r   r   r   r3  r]  r   r   g?)r   r   r   r   advancedr5  rI   
   )r   r   r   ri  r#   r    r!   r$   r&   r   )r   r-   r.   r/   r0   Stringr1   r2   r3   r   r5   r4   r6   r7   r8   s    r:   r;   zWanTrackToVideo.define_schema  s   y%jjj6%%j11%%j11U##	D$GGWcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF}e&WZeijjVQA2MM}--#))*>)NN &&J&??&&J&??	  h 77%
 
 
 	
r<   Nr=   c                    t          |          }|s*t                                          |||||||||	  	        S t          j        |d|dz
  dz  dz   |dz  |dz  gt
          j                                                  }t          |d         d         t                    r|g}g }|D ]}g }|D ]&}t          |          }|                    |           't          j        |d          }|                    t          |||f|dz
                                d                     |t
          j                            |d |                             d	d          ||d
d                              dd	          }t          j        |j        d         ||||j        d	         f|j        |j                  dz  }t/          |j        d                   D ]}||         ||df<   g }t
          j                            ||          }t/          |          D ].}||                    ||d d d d d d d df                   gz  }/t          j        |d          }t
          j                                                            |          }t
          j                            ||          }t?          |||	|
d          }|\  }}t
          j                                                             |          }| dz   }tC          j"        |||d          }tC          j"        |||d          }|.tC          j"        |d|i          }tC          j"        |d|i          }i }||d<   tG          j$        |||          S )N)r#   r    r   r   r   r?   r@   r   )axisrB   rC   rD   rE   rG   rH   r   r^  )r3  r5  r4  r   )rN   rM   r    rO   )%r   r	   ra   rP   rQ   rR   rS   rT   r   r   r  r~   r  r=  r  r   rU   rV   rW   rX   rY   rA   rF   r!  resize_to_batch_sizerZ   r   rn   ro   
process_inresize_list_to_batch_sizerd  rp   r[   r\   r   r]   )r9   r   r   r   r   r   r   r   r   r3  r5  r#   r    r   r&   processed_tracksbatcharrstrackr  r   videosr   latent_videosr  resr_   rM   r`   s                                r:   ra   zWanTrackToVideo.execute  s4    (// 	i"$$,,XxeVU[]g  vA  Vh,  i  i  ij"
q/@A.EvQR{TY]^T^_"'"8"L"L"N"NP P P k!nQ'.. 	(&-K  	i 	iED ! !ennC    A...I##N9ufovXYz$Z$Z$d$def$g$ghhhh"+44[*5M5U5UVXZ[5\5\^cekmw  zB  C  C  K  K  LM  OQ  R  RKZ!21!5vvukN_`bNc dmxm  HS  HY  Z  Z  Z  ]`  `F;,Q/00 . .*1~q!tM[55fjIIF:&& F F#**VAqqq!!!QQQN-C"D"D!EE	-Q///A $**,,77::A${DDEUWabb !4T[  C ),%D%"'"6"<"<">">"J"JK^"_"_53;D#;HLPSf=h =hi iH $;HLPSf=h =hi iH )#;HG[]oFpqqH#;HG[]oFpqqH
 &
9}Xx<<<r<   rb   rc   rh   r<   r:   rf  rf    s`        
 
 [
4 GK<= <=PRP]<= <= <= [<= <= <=r<   rf  c                    |                      dd          } | j        d         t          |          z  }|t          ||z            }t          j        j                            | |dd          }|                     dd          S )z
    features: shape=[1, T, 512]
    input_fps: fps for audio, f_a
    output_fps: fps for video, f_m
    output_len: video length
    r   rI   NTlinear)r   r:  r   )r   rY   r   intrP   r   r   r   )features	input_fps
output_fps
output_lenseq_lenoutput_featuress         r:   linear_interpolationr    s     !!!Q''HnQ%	"2"22G:-..
h)55z 6  O $$Q***r<   c                    ||z  }t          t          j        || z                      }||| z  k    rt          d          |	|dk    r|}n=||z
  }|dk     rt          d          t          j                            d|dz             }|| z  }	|	|z   }
t          j        |	|
|d          }t          j        t          j        |          | z            	                    t                     }t          j
        |d|dz
            }|S )Nz0required_duration must be less than video lengthr   zvideo length is too shortr   F)endpoint)rz  r  ceil
ValueErrorrandomrandintr   roundr  astypeclip)original_fpstotal_frames
target_fps
num_samplefixed_startrequired_durationrequired_origin_framesstart_frame	max_start
start_timeend_timetime_pointsframe_indicess                r:   get_sample_indicesr  -  s   
 #Z/ ):\)I!J!JKK<,666KLLL;!#3#3! #99	q==8999i''9q=99|+J--H+j(JOOOKHRXk22\ABBII#NNMGM1lQ.>??Mr<   r   r      c           	      D   | j         \  }}|dk    rd}nd}||z  }t          ||z  z            dz   }	|	|z  }
t          j        |	|z  |z  |z            z
  }t	          ||z   ||
d          }g }t          ||z            }|D ]}|k     rt          t          |||z  z
  ||dz   |z  z   |                    }d |D             }fd|D             }|r"| d d |f                             dd	
          }nn| d         |                                         }nM|s%t          j	        |d|z  dz   z  g| j
                  n%t          j	        ||d|z  dz   z  g| j
                  }|                    |           t          j        d |D             d          }||	fS )Nr   TFr   )r  r  r  r  r  c                 "    g | ]}|d k     rd n|S r   rh   r  cs     r:   r  z.get_audio_embed_bucket_fps.<locals>.<listcomp>c  s$    @@@q1uu!!!@@@r<   c                 *    g | ]}|k    rd z
  n|S r   rh   )r  r  audio_frame_nums     r:   r  z.get_audio_embed_bucket_fps.<locals>.<listcomp>d  s=        ()O';';!##  r<   rJ   rB   )	start_dimend_dimrI   r@   c                 8    g | ]}|                     d           S r  )r   r  s     r:   r  z.get_audio_embed_bucket_fps.<locals>.<listcomp>r  s"    GGG1AGGGr<   r   )rY   rz  r   r  r  r   r!  flattenrP   rQ   rA   r~   r   )audio_embedfpsbatch_framesm
video_rate
num_layers	audio_dimreturn_all_layersscalemin_batch_num
bucket_numpadd_audio_num	batch_idxbatch_audio_ebaudio_sample_stridebi
chosen_idxframe_audio_embedr  s                     @r:   get_audio_embed_bucket_fpsr  H  sN   -8->*JA~~ !E<%+?@AAAEM-JY}|;cAJNOORaaN"$~5  I Nj3.// 1 1b1222B!a%CV9V4VXklln nJ@@Z@@@J   #  J
 ! I$/:$>$F$F " %G %. %.!! %0N:$>$F$F$H$H!!iz !cY!a%!)-D,EkN` a a a a[*i1q519.E!F{Oabbb /0000YGGGGGQOOON=((r<   c                 ~   |dz
  dz  dz   }|	t          j        |	d                   }d}d}t          |d|          }|dz  }t          |||d|	          \  }}|                    d          }t          |j                  d
k    r|                    ddd          }n0t          |j                  dk    r|                    ddd
d          }|d d d d d d |||z   f         }|j        d
         dk    r6t          j	        | d|i          } t          j	        |d|dz  i          }||z  }|t          j                            |d d                             dd          ||dd                              dd          }|                    |d d d d d d d d
f                   }t          j	        | d|gid          } t          j	        |d|gid          }||j        d         dk    r
|dd          }t          j                            |                    dd          ||dd                              dd          }|j        d         dk     r0t          j        d||d
g          dz  }|||j        d          d <   |}|                    |d d d d d d d d
f                   }|?|d d d d dd f         }t          j	        | d|i          } t          j	        |d|i          }t          j        |d||dz  |dz  gt          j                                                  }t          j                                                            t          j        |                    }|
t          j                            |
d |                             dd          ||dd                              dd          }
|                    |
d d d d d d d d
f                   }
|
|d d d d d |
j        d         f<   t          j	        | d|i          } t          j	        |d|i          }i }||d<   | |||fS )Nr   r   encoded_audio_all_layersr  r   2   r|  r}  r   )r  r  r  r  rH   rI   r  rK   rB   rC   rD   r|   Tr}   I   irG   ireference_motionr?   r@   rl   rO   )rP   r   r  r  r   r  rY   r   r[   r\   rR   rU   rV   rW   rZ   rX   rQ   rS   rT   rn   ro   rp   r   )r   r   r   r   r   r   r   frame_offsetrw   audio_encoder_outputrl   
ref_motionref_motion_latentlatent_tfeatr  r  r  audio_embed_bucket
num_repeatr   rr&   control_video_outr`   s                            r:   wan_sound_to_videor  w  s   !!Q&H'y-.HIJJ
#DB:NNN!|)CDc`lpq  I  *J  *J  *J&J/99!<<!'((A--!3!;!;Aq!!D!D#)**a//!3!;!;Aq!Q!G!G/111aaalUaFa9a0ab#A&**#;H}VhFijjH#;H}VhknVnFoppHL(LK..y!}/D/DR/K/KUTZ\fhpqqyyz{}  A  A	ZZ	!!!QQQ2A2+ 677
7CVYcXdBenrsss7CVYcXdBenrsssA###CDD)J[//
0B0B2q0I0I5RXZdfnoowwxy{}~~
A##
Bq122S8A'1Az""##$JJJz!!!QQQ2A2+'>??$-aaaCDDj97CUWhBijj7CUWhBijj[*b(FaK!LUZUkUU  VB  VB  C  C  CF,2244@@AQRXAYAYZZ 22=&3I3Q3QRTVW3X3XZ_agisu}~~  G  G  HI  KM  N  N

=AAAqqq"1"#=>>;H!!!QQQ 7!4Q!7 778 3HPa>bccH3HPa>bccHJ"JyXz<77r<   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanSoundImageToVideoc                    t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j	                            dd          t           j	                            dd          t           j	                            dd          gt           j        
                    d          t           j        
                    d          t           j        
                    d          g          S )Nr  r   r   r   r   r   r   r   r   r   r   r   M   r   r   r   r   r   r  Tr!   rw   rl   r  r$   r&   r'   r   r-   r.   r/   r0   r1   r2   r3   AudioEncoderOutputr5   r6   r7   r8   s    r:   r;   z"WanSoundImageToVideo.define_schema  su   y*6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF%++,BT+RR{T::>>|d;; &&J&??&&J&??	  h 77!
 
 
 	
r<   Nr=   c                 l    t          |||||||||	|
|          \  }}}}t          j        |||          S )N)rw   r  rl   r  )r  r   r]   )r9   r   r   r   r   r   r   r   rw   r  rl   r  r`   r  s                 r:   ra   zWanSoundImageToVideo.execute  sb    7I(T\^achjprx  {E  QZ  qEXer|8~ 8~ 8~4(J}Xx<<<r<   r   rc   rh   r<   r:   r  r    se        
 
 [
0 = =  eg  er = = = [= = =r<   r  c                   L    e Zd Zed             Zeddej        fd            ZdS )WanSoundImageToVideoExtendc                    t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	
          t           j                            d          t           j	                            dd          t           j
                            dd          t           j
                            dd          gt           j                            d          t           j                            d          t           j                            d          g          S )Nr  r   r   r   r   r   r  r   r   r   video_latentr  Tr!   rw   rl   r$   r&   r'   )r   r-   r.   r/   r0   r1   r2   r3   r7   r  r5   r6   r8   s    r:   r;   z(WanSoundImageToVideoExtend.define_schema  s   y06%%j11%%j11U##Xrqe>RYZ[[	//%++,BT+RR{T::>>	 &&J&??&&J&??	  h 77
 
 
 	
r<   Nr=   c	                     |d         }|j         d         dz  }	|j         d         dz  }
|j         d         }|j         d         dz  }t          ||||	|
||||||d |          \  }}}}t          j        |||          S )	NrO   rB   r?   rJ   r   r   )r  rw   r  rl   r  r  )rY   r  r   r]   )r9   r   r   r   r   r  rw   r  rl   r   r   r   r  r`   s                 r:   ra   z"WanSoundImageToVideoExtend.execute  s    #I."2&*#B'!+!'*
#)"-17I(T\^achjprx  {E  T`  lu  L`Xerv  KW8X 8X 8X4(J}Xx<<<r<   rs   rc   rh   r<   r:   r  r    se        
 
 [
* = =  GI  GT = = = [= = =r<   r  c                     t          j         j        d          j        d         f j         j                  t          j        d j        d          j        d         f j         j                  }d|dz
  dz  z   }g }t          |          D ]}|dk    rZ||z   dz
  }||z   dz   }	t          j         fdt          ||	          D             d          }
t          j        ||
fd          }
nP|dz   d|dz
  z  z   |z
  }|dz   d|z  z   |z   }	t          j         fd	t          ||	          D             d          }
|                    |
           t          j        |d          }||	|z
  fS )
Nr   rI   )rF   rA   rH   r   r   c                 Z    g | ]'}d |cxk    rj         d          k     rn n|         n(S r  r  r  r   	audio_embzero_audio_embeds     r:   r  z(get_audio_emb_window.<locals>.<listcomp>  Z     % % % "#a!<!<!<!<)/!*<!<!<!<!<!<	!CS% % %r<   r   c                 Z    g | ]'}d |cxk    rj         d          k     rn n|         n(S r  r  r  s     r:   r  z(get_audio_emb_window.<locals>.<listcomp>
  r  r<   )	rP   rQ   rY   rF   rA   r!  r=  r   r~   )r  	frame_num
frame0_idxaudio_shiftzero_audio_embed_3iter_audio_emb_windlt_isted	wind_featr  s   `          @r:   get_audio_emb_windowr    s   {IOA$6	8J#KS\Sbktk{|||a);Y_Q=O%PXaXgpy  qA  B  B  BQ1$$ENe ) )199d"Q&Bd"Q&B % % % % %r2% % %   I 	#5y"AqIIIIIa!tax.0;>Ba!d(*[8B % % % % %r2% % %   I 	i(((([Q777N2+++r<   c                   L    e Zd Zed             Zeddej        fd            ZdS )WanHuMoImageToVideoc                 t   t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j	                            dd          g	t           j        
                    d          t           j        
                    d          t           j        
                    d          gd          S )Nr  r   r   r   r   r   r   r   r   r   r   r   a   r   r   r   r   r   r  Tr!   rw   r$   r&   r(   r)   r*   r+   is_experimentalr  r8   s    r:   r;   z!WanHuMoImageToVideo.define_schema  sP   y)6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF%++,BT+RR{T::
 &&J&??&&J&??	  h 77
 !'
 
 
 	
r<   Nr=   c
                 r   |dz
  dz  dz   }
t          j        |d|
|dz  |dz  gt          j                                                  }|t          j                            |d d                             dd          ||dd                              dd          }|                    |d d d d d d d d	f                   }t          j
        |d
|gid          }t          j
        |d
t          j        |          gid          }nqt          j        |dd|dz  |dz  gt          j                                                  }t          j
        |d
|gid          }t          j
        |d
|gid          }|	t          j        |	d         d          }|	d         dz  }|d d d |dz  f         }t          |d d d d ddf                             d          dd          }t          |d d d d ddf                             d          dd          }t          |d d d d ddf                             d          dd          }t          |d d d d ddf                             d          dd          }t          |d d d d df         dd          }t          j        |||||gd          d         }t          ||d          \  }}|                    d          }t          j        |          }t          j
        |d|i          }t          j
        |d|i          }nht          j        ||
dz   dddgt          j                                                  }t          j
        |d|i          }t          j
        |d|i          }i }||d<   t#          j        |||          S )Nr   r   r   r?   r@   rB   rC   rD   rH   r|   Tr}   r  rI   r   audio_samplesi  r   r            )r  r        rO   )rP   rQ   rR   rS   rT   rU   rV   rW   rZ   r[   r\   r   r=  r  meanr  r   r   r]   )r9   r   r   r   r   r   r   r   rw   r  r  r&   r   zero_latentr  	audio_lenfeat0feat1feat2feat3feat4r$  audio_emb_neg
zero_audior`   s                            r:   ra   zWanHuMoImageToVideo.execute-  sc   aZA%*j"h!UaZPY^Yo  ZD  ZD  ZF  ZF  G  G  G 229RaR=3H3HQ3O3OQVX^`jltuu}}~  BD  E  EIIaaaAAArrk$:;;J#;HGZ]g\hFirvwwwH#;HGZ]b]mnx]y]y\zF{  EI  J  J  JHH+z2q&A+uPQz&R[`[q  \F  \F  \H  \H  I  I  IK#;HGZ]h\iFjswxxxH#;HGZ]h\iFjswxxxH+$89S$TZ[\\\I,_=DI!!!!^i!m^"34I(111aaaA:)>)C)C)C)J)JBPRSSE(111aaaB;)?)D)D)D)K)KRQSTTE(111aaaR<)@)E)E!)E)L)LbRTUUE(111aaaR<)@)E)E!)E)L)LbRTUUE(111aaa8)<b"EEEUE5%$GQOOOPQRI/	6aPPPLIq!++A..I!,Y77M#;H}V_F`aaH#;H}VcFdeeHHj(Q,1d%KTYTjT~T~  UA  UA  B  B  BJ#;H}V`FabbH#;H}V`FabbH
 &
9}Xx<<<r<   rb   rc   rh   r<   r:   r  r    se        
 
 [
. &= &=  @B  @M &= &= &= [&= &= &=r<   r  c                   L    e Zd Zed             Zeddej        fd            ZdS )WanAnimateToVideoc                 $   t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddt          j        d	          t           j                            d
ddt          j        d	          t           j                            dddt          j        d	          t           j                            dddd          t           j                            dd          t           j	                            dd          t           j	                            dd          t           j	                            dd          t           j                            dddt          j        d	          t           j	                            dd          t           j
                            dd          t           j	                            dd          t           j                            dddt          j        dd !          gt           j                            d"          t           j                            d"          t           j                            d#"          t           j                            d$"          t           j                            d%"          t           j                            d"          gd&          S )'Nr  r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r    Tr!   r   
face_video
pose_videocontinue_motion_max_framesr  background_videocharacter_maskcontinue_motionvideo_frame_offsetr   zThe amount of frames to seek in all the input videos. Used for generating longer videos by chunk. Connect to the video_frame_offset output of the previous node for extending a video.)r   r   r   r   tooltipr$   r&   r   
trim_imager  )r   r-   r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r7   r8   s    r:   r;   zWanAnimateToVideo.define_schemaW  sE   y'6%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[\1!FF#))*>)NN04@@|d;;|d;;91!QVQelmnn1DAA.>>04@@11!I]de  ph  i  i!& &&J&??&&J&??	  h 77=99<88+?@@ !;
 
 
 	
r<   Nr=   c                 `   d}|dz
  dz  dz   }|dz  }|dz  }d}|
t          j        d||df          }
t          j                            |
d |                             dd          ||dd	                              dd          }|                    |d d d d d d d df                   }t          j        dd|j        d
         |j        d         |j        d         f|j        |j	                  }||j        d         z  }d}|t          j
        |||df          dz  }n|| d          }|	|j        d         z  }	t          d|	          }	t          j                            || d                              dd          ||dd	                              dd          }t          j
        ||||j        d         f|j        |j	                  dz  }||d |j        d         <   ||j        d         dz
  dz  dz   z  }|.t          j        |d|i          }t          j        |d|i          }||j        d         |	k    rd }n
||	d          }|t          j                            |d |                             dd          ||dd	                              dd          }|sE|j        d         |k     r4t          j        |f|dd          f||j        d         z
  z  z   d          }|                    |d d d d d d d df                   }t          j        |d|i          }t          j        |d|i          }|r|j        d         }|dz  dz
  }|d |         }||j        d         |	k    rd }n
||	d          }|t          j                            |d |                             dd          dddd	          dz  dz
  }|                    dd                              d          }t          j        |d|i          }t          j        |d|dz  dz
  i          }t          d|dz  dz
            }||j        d         |	k    r||	d          }t          j                            |d |                             dd          ||dd	                              dd          }|j        d         |k    r||d          |||j        d         <   t          j
        dd|dz  |j        d         |j        d         f|j        |j	                  }|d|d d d d d |dz  f<   |:|j        d         |	k    s|j        d         dk    r|j        d         dk    r%|                    |fd|j        dz
  z  z             }n
||	d          }|j        dk    r+|                    d          }|                    dd          }|j        dk    r|                    d          }t          j                            |d d d d d |f         |j        d         |j        d         dd	          }|j        d         |k    r(|d d d d |d f         |d d d d ||j        d         f<   t          j        ||                    |d d d d d d d df                   fd          }|                    d|j        d         dz  d|j        d         |j        d                                       dd          }t          j        ||fd          }t          j        |||d          }t          j        |||d          }t          j        |d||z   ||gt          j                                                  }i }||d<   t-          j        ||||t          d|dz  dz
            |	|z             S )NFr   r   r?   r   rH   rB   arearD   r  rJ   rE   rI   rG   r    r   pose_video_latenti   g       @r   face_video_pixelsrK   r  r   rL   r   r@   rO   )rP   rQ   rR   rU   rV   rW   rZ   rY   rA   rF   rX   r   r[   r\   r   r   rq   r   r   r   rS   rT   r   r]   )r9   r   r   r   r   r   r   r   r  r	  r   r    r  r  r  r  r  trim_to_pose_videor   latent_widthlatent_heightr   r^   rM   r_   ref_motion_latent_lengthr  ref_images_nummask_refmotionr&   r`   s                                  r:   ra   zWanAnimateToVideo.executey  s+
   " 1**a/z!"#k1feQ*?@@O**?7F7+C+K+KBPQ+R+RTY[acikstt||}~  AC  D  D!jjqqq!!!QQQ{);<<{Aq"5";B"?ATAZ[]A^`s`yz|`}~  H[  Hb  j}  jC  D  D  D*033#$ "Jq9::S@EE-/I.I.J.JKO/"7"::!$Q(:!;!;#k88&9R9Z9Z[]_`9a9achjprx  {C  D  D  L  L  MN  PR  S  SOJ7LR7PQZiZp  yH  yN  O  O  O  RU  UE/>E+?(++,$/*?*BQ*F1)LPQ(QQ$)#;HG[]oFpqqH#;HG[]oFpqqH!"&888!

'(:(;(;<
!33Jww4G4O4OPRTU4V4VX]_egmowxx  A  A  BC  EG  H  HJ% w#A&//!&J=JrssO;MQWZdZjklZmQm;n+ntu!v!v!vJ #

:aaaAAArrk+B C C#;HGZ\mFnooH#;HGZ\mFnooH! ' 1 7 :&*Q.gvg!"&888!

'(:(;(;<
!33Jww4G4O4OPRTU4V4VX[]`bhjrssvyy|J#++Aq11;;A>>J#;HGZ\fFghhH#;HGZ\fil\lor\rFsttHQ 81 <q @AA'%a(+===#34F4G4G#H #(;#=#=>NwPVw>W>_>_`bde>f>fhmouw}  @H  $I  $I  $Q  $Q  RS  UW  $X  $X #)!,~==FVWeWfWfFgE.)9)?)BBCQ=1+<>Q>WXZ>[]p]vwy]z${  EI  EP  X\  Xb  c  c  c&BEN111aaa!>":Q">!>>?%#A&);;;~?STU?VZ[?[?[!'*a//%3%:%:F9t~ObefOfGg;g%h%hNN%34F4G4G%HN!&!++%3%=%=a%@%@N%3%;%;Aq%A%AN!&!++%3%=%=a%@%@N!&!;!;N111aaaQXRXQX=<Y[n[tuw[x  {N  {T  UW  {X  Zi  ks  "t  "t!'*^;;SabcbcbcefefefhvhwhwbwSxN111aaa8LQ8O)O#OP#i)<cjjqqqRSRSRSUVUVUVXZYZXZ{I[>\>\(]cdeee (,,Q0DQ0G10LaQ_QefgQhjxj~  @A  kB  C  C  M  M  NO  QR  S  Sy$/Q7777Zm  C  CD  CD  E  E7Zm  C  CD  CD  E  Ej"mk.I=Zfgpu  qG  q[  q[  q]  q]  ^  ^  ^
 &
9}Xx[#aQilmQmpqQqJrJr  uG  JP  uP  Q  Q  	Qr<   NNNNNNNrc   rh   r<   r:   r  r  V  sv        
 
 [
B fQ fQ  XZ  Xe fQ fQ fQ [fQ fQ fQr<   r  c                   L    e Zd Zed             Zeddej        fd            ZdS )Wan22ImageToVideoLatentc                 :   t          j        ddt           j                            d          t           j                            dddt
          j        d          t           j                            dd	dt
          j        d          t           j                            d
ddt
          j        d          t           j                            dddd          t           j                            dd          gt           j        	                                g          S )Nr  zmodel/conditioning/inpaintr   r   r  r  r   r   i  r   1   r   r   r   r   r   r#   Tr!   r'   )
r   r-   r0   r/   r1   r2   r3   r5   r7   r6   r8   s    r:   r;   z%Wan22ImageToVideoLatent.define_schema  s    y-1U##Wd@T[]^^Xs@T[]^^Xrqe>RYZ[[\1!FF}t<< 	  ""
 
 
 	
r<   Nr=   c                    t          j        dd|dz
  dz  dz   |dz  |dz  gt          j                                                  }|i }||d<   t          j        |          S t          j        |j        d         d|dz
  dz  dz   |j        d         |j        d	         gt          j                                                  }	|t          j	        
                    |d |                             d	d          ||d
d                              dd	          }|                    |          }
|
|d d d d d |
j        d         f<   |	d d d d d |
j        d         fxx         dz  cc<   i }t          j                                        }|                    |          |	z  |d|	z
  z  z   }|                    |fd|j        dz
  z  z             |d<   |	                    |fd|	j        dz
  z  z             |d<   t          j        |          S )Nr   rz   r   r   r@   rO   r   rJ   rB   rC   rD   r  rK   r   r  
noise_mask)rP   rQ   rR   rS   rT   r   r]   rX   rY   rU   rV   rW   rZ   rn   r   rp   rq   r   )r9   r   r   r   r   r   r#   r&   r`   r_   latent_templatent_formats               r:   ra   zWan22ImageToVideoLatent.execute  sr   avza&71%<flEUWKXafaw  bL  bL  bN  bN  O  O  OJ$*Jy!=,,,z6<?A!0AQ/FUWHXZ`ZfgiZjkty  uK  u_  u_  ua  ua  b  b  b"+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NK**[11K3>F111aaa/++B///0AAA-)"---...#5...
,2244**622T9FcDj<QQ &zntv{UV?W.W X X
9#';;
~	TU@V/V#W#W
< }Z(((r<   Nrc   rh   r<   r:   r  r    s]        
 
 [
" ) )RTR_ ) ) ) [) ) )r<   r  )InfiniteTalkOuterSampleWrapperMultiTalkCrossAttnPatchMultiTalkGetAttnMapPatchproject_audio_featuresc                   n    e Zd Z G d de          Zed             Ze	 ddedej        fd            Z	dS )	WanInfiniteTalkToVideoc                   V    e Zd ZU eed<   ej        j        ed<   ej        j        ed<   dS )WanInfiniteTalkToVideo.DCValuesr   audio_encoder_output_2r_   N)	rd   re   rf   r   __annotations__r   r  Typer   rh   r<   r:   DCValuesr'    s=         			 " 5 ::::glr<   r+  c                    t          j        ddt           j                            dt           j                            dg           t           j                            dt           j                            dd          t           j                            d	dd
          t           j                            ddd          g          g          t           j                            d          t           j                            d          t           j	                            d          t           j	                            d          t           j
                            d          t           j                            dddt          j        d          t           j                            dddt          j        d          t           j                            dddt          j        d          t           j                            dd          t           j                            dd          t           j                            d           t           j                            d!d"dd#dd$d%          t           j                            d&d'd(d)d*          t           j                            d+d          gt           j                            d,          t           j	                            d,          t           j	                            d,          t           j                            d-,          t           j                            d.,          g/          S )0Nr%  r   r   single_speakertwo_speakersr(  Tr!   mask_1z?Mask for the first speaker, required if using two audio inputs.)r"   r
  mask_2z@Mask for the second speaker, required if using two audio inputs.)optionsmodelmodel_patchr   r   r   r   r   r   r   r   r   r   r   r   r   r    r#   audio_encoder_output_1motion_frame_count	   !   z3Number of previous frames to use as motion context.)r   r   r   r   r
  ri  audio_scaler   g      $g      $@r   previous_framesr$   r&   r  r'   )r   r-   DynamicCombor/   Optionr  r   Model
ModelPatchr.   r0   r1   r2   r3   r4   r5   r   r6   r7   r8   s    r:   r;   z$WanInfiniteTalkToVideo.define_schema  s   y,6%%f&&'7<<&&~)//0HSW/XXGMM(T  DEM  F  FGMM(T  DFM  G  G8  7%   w''##M22%%j11%%j11U##Wcru?SZ\]]Xs@T[]^^Xrqe>RYZ[[#))*>)NN}t<<%++,DEE11!RS  ^S  ^b  c  c}cu$UYZZ04@@-2 W55&&J&??&&J&??	  h 77<887"
 "
 "
 "	
r<   Nr   r=   c           
         | |j         d         |k     rt          d          |d         dk    r|d         }|d         }|d         }|||t          d          d }|)|'|t          d	          t          j        ||g          }t          j        d
d|	d
z
  dz  d
z   |dz  |dz  gt
          j                                                  }|Xt
          j        	                    |d |	         
                    dd
          ||dd          
                    d
d          }t          j        |	|||j         d         f|j        |j                  dz  }||d |j         d         <   |                    |d d d d d d d df                   }t          j        d
d
|j         d         |j         d         |j         d         f|j        |j                  }d|d d d d d |j         d         d
z
  dz  d
z   f<   t          j        |||d          }t          j        |||d          }|.t          j        |d|i          }t          j        |d|i          }|                                }g }g }|
|fD ]}||d         }t          j        |d                              d
          d
d          }t)          |dd          
                    dd
          }|                    |           |                    |j         d                    d}t-          |          d
k    r|d k    rt/          |          }g } |D ]u}!|!j         d         |k     rMt          j        ||!j         d         z
  g|!j         d
d          R d!|!j        i}"t          j        |!|"gd          }!|                     |!           v| }n||dk    rvt1          |          }#g }$d}%t3          ||          D ]P\  }!}&t          j        |#g|!j         d
d          R d!|!j        i}'|!|'|%|%|&z   <   |$                    |'           |%|&z  }%Q|$}d }(|t          j        j                            |                    d          |j         d         dz  |j         d         dz  fd"#          d         }(|(dk                        |(j         d         d          }(|t
          j        	                    || d          
                    dd
          ||dd          
                    d
d          })|j         d         |z
  }*|*}+|+|	z   },t?          j         d$|+ d%|,            |                    |)d d d d d d d df                   }-|}.ndx}+}.|	},|d d d d d d
f         }-tC          |j"        j#        ||+|,          $                    |%                                          }/|/|j&        d&         d'<   |'                    t
          j(        j)        j*        d(tW          |-||d u)                     |,                    t[          ||          d*           |(#|,                    t]          |(          d+           i }0||0d,<   t_          j0        ||||0|.          S )-Nr   z$Not enough previous frames provided.r   r.  r(  r/  r0  z=Masks must be provided if two audio encoder outputs are used.zCSecond audio encoder output must be provided if two masks are used.r   r   r   r?   r@   rB   rC   rD   rE   rG   rH   rI   rJ   rK   rL   r    r  r   r  r  r  addpararF   nearestr   z&InfiniteTalk: Processing audio frames z - transformer_optionsaudio_embedsinfinite_talk_outer_sample)	is_extendattn2_patchattn1_patchrO   )1rY   r  rP   r   rQ   rR   rS   rT   rU   rV   rW   rX   rA   rF   rZ   r[   r\   cloner=  r   r  r~   r  r   r,  zipr   r   r   r   r   logginginfor#  r2  
audio_projr?  model_dtypemodel_optionsadd_wrapper_with_keypatcher_extension
WrappersMPOUTER_SAMPLEr   set_model_patchr!  r"  r   r]   )1r9   r   r2  r3  r   r   r   r   r   r   r4  r5  r#   r9  r8  r    r(  r/  r0  	ref_masksr&   r^   rM   rN   model_patchedencoded_audio_listseq_lengthsr  
all_layersencoded_audiomulti_audio_typemax_lenpaddedembr   	total_len	full_listoffsetr  fulltoken_ref_target_masksmotion_framesr  audio_start	audio_endmotion_frames_latentr  r  r`   s1                                                    r:   ra   zWanInfiniteTalkToVideo.execute;  s5    &?+@+CFX+X+XCDDD<>))%)*B%C"(^F(^F!-~ !`aaa	&"4%- !fggg	66"233Iavza&71%<fk5TU:V_d_u  `J  `J  `L  `L  M  M  M"+44[&5I5Q5QRTVW5X5XZ_agisu}~~  G  G  HI  KM  N  NKJ{7H7LMVaVhp{  qB  C  C  C  FI  IE+6E';$Q''("%**U111aaaBQB;-?"@"@*aFLO=P=VWY=Z\o\uvx\y%z  DO  DV  ^i  ^o  p  p  pKHKK111D!21!5!9a ?1DDDE#;H^q  CN  GO  GO  P  PH#;H^q  CN  GO  GO  P  PH)#;HG[]oFpqqH#;HG[]oFpqqH%;=S$T 	7 	7 #+-.HIJ!K
:::BB1EEabbIM0"Y[\\\ddefhijjM%%m444}2156666 !!""Q&&6))k**- ' 'Cy|g--#k'CIaL*@b39QRR=bbbX[Xabb#ic
:::MM#&&&&%+""!U**,,		$'(:K$H$H & &LC ;yR39QRR=RRR	RRD25Dw./$$T***g%FF%."!% %*X%8%D%D##A&&fl2.>!.CV\RTEUYZEZ-[bk &E &m &mmn&p"&<q&@%F%FG]GcdeGfhj%k%k" &!K66HZGZG[G[7\7d7degij7k7kmrtz  }G  IQ  R  R  Z  Z  [\  ^`  a  aM*036HHL&K#f,IL]+]]R[]]^^^#&::mAAAqqq!!!RaRK.H#I#I +JJ'((K*I#6qqq!!!RaRx#@ ,[->-IK]_jluvvyy  {H  {T  {T  {V  {V  W  WMX#$9:>J 	**#.;(*$)5  	 	 	 	%%&=k;&W&WYfggg!-))*BCY*Z*Z\ijjj
 &
9}]Hh
JWWWr<   r  )
rd   re   rf   r   r+  rg   r;   r   r]   ra   rh   r<   r:   r%  r%    s            9   
 #
 #
 [#
J  UYtX tX8 tX ^`  ^ktX tX tX [tX tX tXr<   r%  c                   L    e Zd Zedeeej                          fd            ZdS )WanExtensionr=   c                    K   t           t          t          t          t          t
          t          t          t          t          t          t          t          t          t          t          gS r  )rf  r	   rj   ru   r   r   r   r   r   r   r  r  r  r  r  r%  )selfs    r:   get_node_listzWanExtension.get_node_list  sB        " $!$ &#"!
 	
r<   N)	rd   re   rf   r   r   r*  r   	ComfyNoderk  rh   r<   r:   rh  rh    sE        
T$r|*<%= 
 
 
 X
 
 
r<   rh  r=   c                  "   K   t                      S r  )rh  rh   r<   r:   comfy_entrypointrn    s      >>r<   )r?   r  )r]  r^  rI   r  )r   r   r   r  )r   NNNNN)rI   )@r   r2   r[   rP   comfy.model_managementrR   comfy.utilscomfy.latent_formatscomfy.clip_visionr   numpyr  typingr   r   typing_extensionsr   comfy_api.latestr   r   rJ  rl  r	   rj   ru   r   r   r   r   r   r   r   ndarrayrz  r  r  r  Tensorr%  r1  FloatTensorr   r   r\  rd  rf  r  r  r  r  r  r  r  r  r  r  comfy.ldm.wan.model_multitalkr   r!  r"  r#  r%  rh  rn  rh   r<   r:   <module>r{     sN                               # # # # # # # # & & & & & & / / / / / / / / -= -= -= -= -=bl -= -= -=`3= 3= 3= 3= 3=2< 3= 3= 3=j?= ?= ?= ?= ?=R\ ?= ?= ?=BE= E= E= E= E=r| E= E= E=Pr r r r r2< r r r>VJ VJ VJ VJ VJR\ VJ VJ VJp* * * * *bl * * *.4= 4= 4= 4= 4=BL 4= 4= 4=l)D )D )D )D )Dr| )D )D )DV  :   bj  eCHo  `c        D 	+ 	+ 	+8 8EL 8u| 8# 8 8 8 825<  EL    $<S<S		<S <S 	<S
 <S <S <S <SD + ++		+ + 	+
 + + + +<Y= Y= Y= Y= Y=bl Y= Y= Y=x+ + + +* $(	   6,) ,) ,) ,)^;8 ;8 ;8 ;8|= = = = =2< = = =B =  =  =  =  =  =  =  =F, , , ,6@= @= @= @= @=", @= @= @=DJQ JQ JQ JQ JQ JQ JQ JQX)) )) )) )) ))bl )) )) ))X T  T  T  T  T  T  T  T  T  T  T  TaX aX aX aX aXR\ aX aX aXH
 
 
 
 
> 
 
 
,      r<   