
    
3jm                        S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJ	r	  S SK
Jr  S SKrS SKrS SKrS SKJr  S SKJr  SSKJr  SSKJrJrJrJrJrJr  S	 r " S
 S5      r " S S5      r  " S S5      r! " S S5      r" " S S5      r# " S S5      r$ " S S5      r% " S S5      r& " S S5      r' " S S5      r( " S S5      r) " S  S!5      r* " S" S#5      r+ " S$ S%5      r, " S& S'5      r- " S( S)5      r.\(\*\&\'\+\)\\ \!\%\$\"\#\,\.\-/r/g)*    N)pi)Any)IO)Image   )log)EASINGSapply_easingget_server_info
numpy_NFOV
pil2tensor	tensor2npc           	         [         R                  " SU  SU SU(       a  SU 3OS 35        XUS.n[        5       u  pE[        R                  R                  U5      nSU SU S	U 3n[         R                  " S
U 35        [        R                  R                  U5       n[        R                  " UR                  5       5      sS S S 5        $ ! , (       d  f       g = f)NzGetting image z from foldertype  zin subfolder:  )filename	subfoldertypehttp://:z/view?zFetching image from )r   debugr   urllibparse	urlencoderequesturlopenioBytesIOread)	r   r   folder_typedatabase_urlport
url_valuesurlresponses	            H/home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/nodes/graph_utils.py	get_imager(      s    II

"3K=bkNS\R]B^qsAtu !+ND$&NH''-JH:QtfF:,
7CII$SE*+				$zz(--/* 
%	$	$s   $C
Cc            
           \ rS rSrSr\S 5       rSrSrSr	Sr
SS	S
S
S.S\S\S\R                  S
-  S\R                  S
-  4S jjrSrg
)MTB_ToDevice)   z0Send a image or mask tensor to the given device.c                    S/n[         R                  R                  R                  5       (       a  UR	                  S5        [         R
                  R                  5       (       ae  UR	                  S5        [        S[         R
                  R                  5       5       H  nUR	                  SU 35        M     UR	                  S5        SSS	04US[         R
                  R                  5       (       a  SOS04S
.SSS.S.$ )Ncpumpszcuda:0   cuda:cudaBOOLEANdefaultF)ignore_errorsdeviceIMAGE)MASK)imagemaskrequiredoptional)torchbackendsr.   is_availableappendr1   rangedevice_count)clsdevicesis      r'   INPUT_TYPESMTB_ToDevice.INPUT_TYPES,   s    '>>**,,NN5!::""$$NN8$1ejj5578qc{+ 9NN6" #,i-?!@! ::2244 $*"
 $!
 	
    )r7   r8   )imagesmasks	mtb/utils	to_deviceFr1   N)r4   r5   r9   r:   r4   r5   r9   r:   c          	         U(       d  Uc  Uc  [        S5      eUR                  S5      (       a  SU;  a  US:w  a  SUSS   3n Ub  UR                  U5      nUb  UR                  U5      nX44$ ! [         aS  nU(       d  [        SU S[	        U5       35      Ue[
        R                  " SU S[	        U5       35         S nAX44$ S nAff = f)	NzKYou must either provide an image or a mask, use ignore_error to passthroughr1   r   r0      z Failed to move tensor to device z: z, ignoring: )
ValueError
startswithtoRuntimeErrorstrr   warning)selfr4   r5   r9   r:   es         r'   rM   MTB_ToDevice.to_deviceN   s     4<5 
 f%%6!& VABZL)F	 (wwv }  	 "6vhbQI KK26(,s1vhO  }	s   (A/ /
C9ACC )__name__
__module____qualname____firstlineno____doc__classmethodrG   RETURN_TYPESRETURN_NAMESCATEGORYFUNCTIONboolrT   r>   TensorrM   __static_attributes__rY   rI   r'   r*   r*   )   s    :
 
8 %L&LHH
 $%)$(! ! 	!
 ||d"! llT!! !rI   r*   c                   F    \ rS rSrSr\S 5       rSrSrSr	Sr
S\4S	 jrS
rg)MTB_ApplyTextTemplates   z
Experimental node to interpolate strings from inputs.

Interpolation just requires {}, for instance:

Some string {var_1} and {var_2}
c                     SSSSSS.400$ )Nr<   templateSTRINGr   Tr3   	multilinerY   rD   s    r'   rG   !MTB_ApplyTextTemplate.INPUT_TYPES|   s%     X2D'IJ
 	
rI   rl   )stringrL   executerk   c                n    U nUR                  5        H  u  pEUR                  SU S3U 5      nM     U4$ )N{})itemsreplace)rV   rk   kwargsreskvs         r'   rs   MTB_ApplyTextTemplate.execute   s>    
LLNDA++1#RjQC1C # vrI   rY   N)rZ   r[   r\   r]   r^   r_   rG   r`   ra   rb   rc   rT   rs   rf   rY   rI   r'   rh   rh   s   s=     
 
 LLHH3 rI   rh   c                   v    \ rS rSrSr\S 5       rSrSrSr	Sr
S\R                  S	\R                  S
\4S jrSrg)MTB_MatchDimensions   zKMatch images dimensions along the given dimension, preserving aspect ratio.c                     SSSSS/SS04S.0$ )Nr<   r6   heightwidthr3   )source	referencematchrY   ro   s    r'   rG   MTB_MatchDimensions.INPUT_TYPES   s.     $'#W-	8/DE
 	
rI   )r7   INTr   )r9   	new_width
new_heightrL   rs   r   r   r   c           
         SS K Js  Jn  UR                  u  pVpxUR                  u  ppXv-  nUR	                  SSSS5      nUR	                  SSSS5      nUS:X  a  U
n[        X-  5      nOUn[        X-  5      n[        U5       Vs/ s H'  nUR                  UU   X4S[        R                  S9PM)     nn[        R                  " USS9nUR	                  SSSS5      nUX4$ s  snf )	Nr      r/   r   r   T)	antialiasinterpolationdim)!torchvision.transforms.functional
transforms
functionalshapepermuteintrB   resizer   BICUBICr>   stack)rV   r   r   r   VF_batch_sizer   r   	_channels_rbatch_sizerheightrwidth
_rchannelssource_aspect_ratior   r   rF   resized_imagesresized_sources                      r'   rs   MTB_MatchDimensions.execute   s    	7606-U4=OO1v#n 1a+%%aAq1	H JG9:IIV9:J ;'
 ( IIq	'#mm	   ( 	 
 ^;'//1a;	66
s   .C#rY   N)rZ   r[   r\   r]   r^   r_   rG   r`   ra   rb   rc   r>   re   rT   rs   rf   rY   rI   r'   r   r      sR    U
 
 +L7LHH!7ll!7/4||!7DG!7rI   r   c                   F    \ rS rSrSr\S 5       rSrSrSr	Sr
S\4S	 jrS
rg)MTB_FloatToFloats   wConversion utility for compatibility with other extensions (AD, IPA, Fitz are using FLOAT to represent list of floats.)c                     SSSSSS.400$ )Nr<   floatFLOAT        Tr3   
forceInputrY   ro   s    r'   rG   MTB_FloatToFloats.INPUT_TYPES   s%     's$#GH
 	
rI   FLOATS)floatsrL   convertr   c                     U4$ NrY   )rV   r   s     r'   r   MTB_FloatToFloats.convert   s	    xrI   rY   N)rZ   r[   r\   r]   r^   r_   rG   r`   ra   rb   rc   r   r   rf   rY   rI   r'   r   r      s<     B
 
 LLHHU rI   r   c                   H    \ rS rSrSr\S 5       rSrSrSr	S\
\   4S jrS	rg
)MTB_FloatsToInts   z>Conversion utility for compatibility with frame interpolation.c                     SSSSS0400$ )Nr<   r   r   r   TrY   ro   s    r'   rG   MTB_FloatsToInts.INPUT_TYPES   s%     8lD%9:
 	
rI   )INTSr   rL   r   r   c                 H    U Vs/ s H  n[        U5      PM     nnX34$ s  snf r   )r   )rV   r   xvalss       r'   r   MTB_FloatsToInts.convert   s'     &'1A'| (s   rY   N)rZ   r[   r\   r]   r^   r_   rG   r`   rb   rc   listr   r   rf   rY   rI   r'   r   r      s8    H
 
 #LHHd5k rI   r   c                   >    \ rS rSrSr\S 5       rSrSrSr	Sr
S rS	rg
)MTB_FloatsToFloat   r   c                     SSS00$ )Nr<   r   r   rY   ro   s    r'   rG   MTB_FloatsToFloat.INPUT_TYPES   s     +
 	
rI   r   )r   rL   r   c                     U4$ r   rY   )rV   r   s     r'   r   MTB_FloatsToFloat.convert   s
    yrI   rY   N)rZ   r[   r\   r]   r^   r_   rG   r`   ra   rb   rc   r   rf   rY   rI   r'   r   r      s5     B
 
 LLHHrI   r   c                       \ rS rSrSr\S 5       rSrSrSr	Sr
S\\   S	-  S
\4S jr   SS\R                   S\S\S\S\S\S\S\\   S	-  S\\   S	-  S\\   S	-  4S jjrSrg	)MTB_AutoPanEquilaterali  z7Generate a 360 panning video from an equilateral image.c           	      T    SSSS04SSS04SSS04SSS04SSS04SSS	04S
.SSSS.S.$ )Nr6   r   r3   g     F@g      ?r   d   i   i   )equilateral_imagefovXfovY	elevationframe_countr   r   r   )floats_fovXfloats_fovYfloats_elevationr;   rY   ro   s    r'   rG   "MTB_AutoPanEquilateral.INPUT_TYPES  st     &0 9d"34 9d"34%	3'78 %	3'78)S!12 9c"23  +*$/
 	
rI   r6   )r9   rL   generate_framesfNexpected_countc                 4    U(       a  [        U5      U:X  a  ggg)NTF)len)rV   r   r   s      r'   check_floats#MTB_AutoPanEquilateral.check_floats  s    1v'rI   r   r   r   r   r   r   r   r   r   r   c           	         [        U5      n[        U5      S:  a  [        R                  " S5        [	        XU
4 Vs/ s H  nU R                  X5      PM     sn5      (       d  [        S5      eUS   n/ n[        R                  R                  U5      n[        U5       H  nX-  S-  [        -  nU
(       a  X   nU(       a  X   nU	(       a  X   nUS-  US-  /nUS[        -  -  U/n[        UXv5      nUR                  UUS9nUR                  U5        [        R                   " 5         UR#                  S5        M     [%        U5      4$ s  snf )Nr/   z]You provided more than one image in the equilateral_image input, only the first will be used.zNYou provided less than the expected number of fovX, fovY, or elevation values.r   r   r   )center_point)r   r   r   warnallr   rP   comfyutilsProgressBarrB   r   r   to_nfovrA   model_management)throw_exception_if_processing_interruptedupdater   )rV   r   r   r   r   r   r   r   r   r   r   r   r   framespbarrF   rotation_anglefovr   nfovframes                        r'   r   &MTB_AutoPanEquilateral.generate_frames%  sW    ,-v;?HHo  &4DEEA !!!1E
 
 `  {{&&{3{#Ao2R7N,/	"~"~#:tcz*C*a"f5yALc61DLLlLCEMM% FFHKKN+ $. 6"$$Is   ErY   )NNN)rZ   r[   r\   r]   r^   r_   rG   r`   ra   rb   rc   r   r   r   r   r>   re   r   rf   rY   rI   r'   r   r     s    A
 
$ LLH Hd5kD0 #   +/*./38% <<8% 8% 	8%
 8% 8% 8% 8% %[4'8% %[4'8% u+,8% 8%rI   r   c                   T    \ rS rSrSr\S 5       rSrSrSr	Sr
SS	S	S	S
S.S jrS rSrg
)MTB_GetBatchFromHistoryi`  z|Very experimental node to load images from the history of the server.

Queue items without output are ignored in the count.
c                 @    SSS04SSSS.4SSSS	S
.4SSS04S.SS0S.$ )Nr2   r3   Tr   r/   r   )r3   ming    eg    eA)r3   r   max)enablecountoffsetinternal_countpassthrough_imager6   r;   rY   ro   s    r'   rG   #MTB_GetBatchFromHistory.INPUT_TYPESf  sT     %y$&78Qq!9: aS"IJ#(9a."9	 $Z

 
	
rI   r6   )rJ   zmtb/animationload_from_historyTr   N)r   r   r   r   r   c                ,   U(       a  US:X  aI  Ub  [         R                  " S5        U4$ [         R                  " S5        [        R                  " S5      4$ / n[	        5       u  pxSU SU S3n	[         R                  " SU	 35        [        R                  " S5      n
[
        R                  R                  U	5       nU R                  XX&5      n
S S S 5        U
R                  S5      S:X  a  [         R                  " S5        U
4$ ! , (       d  f       N<= f)	Nr   zUsing passthrough imagez0Load from history is disabled for this iterationr   r   z/historyzFetching history from zNo output found in history)r   r   r>   zerosr   r   r   r   load_batch_framessizer   )rV   r   r   r   r   r   r   r"   r#   history_urloutputr&   s               r'   r   )MTB_GetBatchFromHistory.load_from_historyy  s     ! ,		34)++IIHIKKN$$(*z4&9		*;-89Q^^##K0H++HeLF 1 ;;q>QHH12y 10s   <D
Dc           	         [         R                  " UR                  5       5      n/ nUR                  5        HX  nUS   R                  5        H>  nSU;   d  M  US    H*  n	[	        U	S   U	S   U	S   5      n
UR                  U
5        M,     M@     MZ     U(       d  [        R                  " S5      $ [        [        U5      U-
  U-
  S5      n[        U5      U-
  nXkU nU V	s/ s H  n	[        R                  " U	5      PM     nn	U(       d  [        R                  " S5      $ [        U5      U:w  a&  [        R                  " SU S[        U5       S	35        [        U5      $ s  sn	f )
NoutputsrJ   r   r   r   r   z	Expected z images, got z instead)jsonloadsr   valuesr(   rA   r>   r   r   r   r   openr   rU   r   )rV   r&   r   r   r   historyoutput_imagesrunnode_outputr9   
image_datastart_index	end_indexselected_imagess                 r'   r   )MTB_GetBatchFromHistory.load_batch_frames  s>   **X]]_->>#C"9~446{*!,X!6%.!*-!+.!&M&

 &,,Z8 "7  7 $ ;;q>! #m,v5=qA&/	'I>1@A%**U#A;;q>![E!KK)E7-F}HMN&!! Bs   ! E rY   )rZ   r[   r\   r]   r^   r_   rG   r`   ra   rb   rc   r   r   rf   rY   rI   r'   r   r   `  sL    
 
 
 LLH"H
 <"rI   r   c                   :    \ rS rSrSr\S 5       rSrSrSr	S r
Srg	)
MTB_AnyToStringi  z3Tries to take any input and convert it to a string.c                     SSS00$ )Nr<   input)*rY   ro   s    r'   rG   MTB_AnyToString.INPUT_TYPES  s     &)
 	
rI   rq   do_strzmtb/convertersc                 N   [        U[        5      (       a  U4$ [        U[        R                  5      (       a  SUR                   SUR
                   34$ [        U[        R                  5      (       a  SUR                   SUR                   34$ [        U[        R                  5      (       a  SUR                   SUR
                   34$ [        U[        5      (       a   S[        U5       SUR                  5        34$ [        R                  " SU 35        [        U5      4$ )	NzTensor of shape z and dtype zPIL Image of size z
 and mode zNumpy array of shape zDictionary of z items, with keys z%Falling back to string conversion of )
isinstancerT   r>   re   r   dtyper   r   modenpndarraydictr   keysr   r   )rV   r  s     r'   r  MTB_AnyToString.do_str  s    eS!!8Ou||,,&u{{m;u{{mLNNu{{++(JuzzlKMMrzz**'}K}M  t$$ U,>uzz|nM 
 II=eWEFJ= rI   rY   N)rZ   r[   r\   r]   r^   r_   rG   r`   rc   rb   r  rf   rY   rI   r'   r  r    s-    =
 

 LHH!rI   r  c                   N    \ rS rSrSr\S 5       rSrSrSr	S\
S\
S	\
S
\4S jrSrg)MTB_StringReplacei  z,Basic string replacement with regex support.c                 4    SSSS04SSS04SSS04SSS04S	.0$ )
Nr<   rl   r   Tr3   r   r2   F)rr   oldnew	use_regexrY   ro   s    r'   rG   MTB_StringReplace.INPUT_TYPES  sH     #lD%9: 9b/2 9b/2')U);<	
 	
rI   replace_strrq   z
mtb/stringrr   r%  r&  r'  c                    [         R                  " SU 35        [         R                  " SU 35        [         R                  " SU 35        [         R                  " SU 35        U(       a   [        R                  " X#U5      nOUR                  X#5      n[         R                  " SU 35        U4$ ! [        R                   a  n[        SU 35      UeS nAff = f)NzCurrent string: zFind string: zReplace string: zUse regex: zRegex error: zNew string: )r   r   resuberrorrP   rx   )rV   rr   r%  r&  r'  rW   s         r'   r)  MTB_StringReplace.replace_str  s    		$VH-.		M#'(		$SE*+		K	{+,=&1 ^^C-F		L)*y 88 = =!451<=s   -B2 2CCCrY   N)rZ   r[   r\   r]   r^   r_   rG   rc   r`   rb   rT   rd   r)  rf   rY   rI   r'   r#  r#    sI    6
 
 HLH# C c d rI   r#  c                   J    \ rS rSrSr\S 5       rSrSrSr	Sr
SrS	\4S
 jrSrg)MTB_MathExpressioni  z0Node to evaluate a simple math expression stringc                     SSSSSS.400$ )Nr<   
expressionrl   r   Trm   rY   ro   s    r'   rG   MTB_MathExpression.INPUT_TYPES  s%     xRd)KL
 	
rI   eval_expression)r   r   )zresult (float)zresult (int)mtb/mathzDevaluate a simple math expression string, only supports literal_evalr2  c                 d   SSK Jn  UR                  5        H@  u  pE[        R                  " SU SU 35        UR                  SU S3[        U5      5      nMB     Sn U" U5      nU[        U5      4$ ! [         a  n[        SU S	U 35      UeS nAf[         a  n[        S
U 35      eS nAff = f)Nr   )literal_evalzReplacing placeholder <z> with value <>z The expression syntax is wrong 'z': z/Math expression only support literal_eval now: )astr7  rw   r   r   rx   rT   SyntaxErrorrP   	Exceptionr   )rV   r2  ry   r7  keyvalueresultrW   s           r'   r4  "MTB_MathExpression.eval_expression  s    $ ,,.JCII/uM%IJ#++auAJE
CJ ) 
	!*-F F$$  	2:,c!E  	A!E 	s$   A3 3
B/=BB/B**B/rY   N)rZ   r[   r\   r]   r^   r_   rG   rc   r`   ra   rb   DESCRIPTIONrT   r4  rf   rY   rI   r'   r0  r0    sA    :
 
 !H#L5LHN %# %rI   r0  c                   ^    \ rS rSrSr\S 5       rSrSrSr	Sr
S\S\S	\S
\S\S\S\4S jrSrg)MTB_FitNumberi+  z3Fit the input float using a source and target rangec                 l    SSSSS.4SSS04SS	S
SS.4SSS
SS.4SS	S
SS.4SSS
SS.4[         SS04S.0$ )Nr<   r   r   Tr   r2   r3   Fr   {Gz?g     j)r3   stepr         ?Linear)r?  clamp
source_min
source_max
target_min
target_maxeasing)r	   ro   s    r'   rG   MTB_FitNumber.INPUT_TYPES.  s     !q#EF#i%78 #T$?
  #T$?
  #T$?
  #T$?
 )'
 	
rI   	set_ranger   r5  r?  rJ  rK  rL  rM  rN  rO  c                     X4:X  a  SnO	X-
  XC-
  -  nU(       a  [        [        US5      S5      n[        X5      n	XVU-
  U	-  -   n
U
4$ )Nr   r/   )r   r   r
   )rV   r?  rJ  rK  rL  rM  rN  rO  normalized_valueeased_valuerz   s              r'   rQ  MTB_FitNumber.set_rangeP  s_     #  % 2z7NO"3'7#;Q?"#3< 3{BBvrI   rY   N)rZ   r[   r\   r]   r^   r_   rG   rc   r`   rb   rB  r   rd   rT   rQ  rf   rY   rI   r'   rD  rD  +  sv    =
 
8 HLHGK  	
    rI   rD  c            
           \ rS rSrSrSrSrSr\S 5       r	 SS\
S\S	\R                  S
\\R                     4S jjrSrg)MTB_ConcatImagesii  zAdd images to batch.r6   concatenate_tensorsz	mtb/imagec                 (    SSSS040S/ SQSS040S.$ )	Nreverser2   r3   Fon_mismatch)ErrorSmallestLargestr]  r;   rY   ro   s    r'   rG   MTB_ConcatImages.INPUT_TYPESp  s8     #YE0B$CD4
+ 
 	
rI   rZ  r[  ry   returnc           	        ^ [        UR                  5       5      nUS:X  aB  U Vs/ s H  oUR                  PM     snm[        U4S jT 5       5      (       d  [	        S5      eOSS KJs  Jn  US:X  a  [        S U 5       S S9nO[        S	 U 5       S
 S9nUS   US   p/ n
U H  nUR                  S   U:w  d  UR                  S   U	:w  aL  UR                  UR                  SSSS5      X4SSS9nUR                  SSSS5      nU
R                  U5        Mu  U
R                  U5        M     U
n[        R                  " USS9nU4$ s  snf )Nr\  c              3   2   >#    U  H  oTS    :H  v   M     g7f)r   NrY   ).0r   shapess     r'   	<genexpr>7MTB_ConcatImages.concatenate_tensors.<locals>.<genexpr>  s     >veq	)vs   zGAll input tensors must have the same shape when on_mismatch is 'Error'.r   r]  c              3   8   #    U  H  oR                   v   M     g 7fr   r   rc  tensors     r'   re  rf         8f\\   c                     U S   U S   4$ Nr/   r   rY   ss    r'   <lambda>6MTB_ConcatImages.concatenate_tensors.<locals>.<lambda>      1Q41,rI   )r>  c              3   8   #    U  H  oR                   v   M     g 7fr   rh  ri  s     r'   re  rf    rk  rl  c                     U S   U S   4$ rn  rY   ro  s    r'   rq  rr    rs  rI   r/   r   r   bilinearF)r   r  align_cornersr   )r   r  r   r   rP   torch.nn.functionalnnr   r   r   interpolater   rA   r>   cat)rV   rZ  r[  ry   tensorsrj  Ftarget_shapetarget_heighttarget_widthresized_tensorsresized_tensorconcatenatedrd  s                @r'   rX  $MTB_ConcatImages.concatenate_tensors|  s_    v}}''!189vll9F>v>>> ]  ? ,+j("88. 
  #88. 
 +7q/<?< O!LLO}4||A,6%&]]q!Q2+:'&+	 &3 &N &4%;%;Aq!Q%GN#**>:#**62 "  &Gyya0W :s   ErY   N)r]  )rZ   r[   r\   r]   r^   r`   rc   rb   r_   rG   rd   rT   r>   re   tuplerX  rf   rY   rI   r'   rW  rW  i  sh    L$HH	
 	
 &44 4 ,,	4
 
u||	4 4rI   rW  c                   L    \ rS rSr\S 5       rSrSrSr         S	S jr	Sr
g)
MTB_TensorOpsi  c                     S/ SQSS04SSSSS	S
.4SSSSS	S
.4SSSSS	S
.4SSSSS	S
.4SSSSS	S
.4/ SQSS04SSS04S.	SS0S.$ )Nr6   )multiplydivideaddsubtractpowerrJ  absr   expconvert_dtypenormalize_rangenormalize_per_channelr3   r  r   rH  g    .g    .ArF  )r3   r   r   rG  r   g      0@)uint8float32float16bfloat16r  r2   F)	rj  	operationr?  rK  rL  rM  rN  r  use_meantarget_tensorr;   rY   ro   s    r'   rG   MTB_TensorOps.INPUT_TYPES  s     % 
+$ #&)( $	 #&)( $	 #&)( $	 #&)( $	 #')( $	 @	* 'E(:;IEN  OJ
 J	
rI   r6   applyzmtb/tensor_opsNc                    [         R                  " SUR                   SUR                   SUR	                  5       R                  5       S SUR                  5       R                  5       S S3	5        US:X  Ga   U
c  [        S5      eUR                  5       n[        UR                  S	   5       H  nU	(       a>  US
U4   R                  5       nU
S
U4   R                  5       nX-  nUS
U4   U-  US
U4'   OrUS
U4   R	                  5       nUS
U4   R                  5       nU
S
U4   R	                  5       nU
S
U4   R                  5       nUS
U4   U-
  XT-
  -  nUXv-
  -  U-   US
U4'   [         R                  " SU SUS SUS SUS SUS S35        M     GOUS:X  as  U
b[  U
R	                  5       R                  5       nU
R                  5       R                  5       n[         R                  " SUS SUS S35        X-
  XT-
  -  nUXv-
  -  U-   nGOxUS:X  aH  US:X  a  UR                  5       nGOZUS:X  a  UR                  5       nGOBUS:X  a  UR                  5       nGO*UnUS:X  a  X-  nGOUS:X  a  US:w  a  X-  OUnGOUS:X  a  X-   nOUS:X  a  X-
  nOUS:X  a  [        R                  " X5      nOUS:X  al  U
bQ  [        R                   " UU
R	                  5       R                  5       U
R                  5       R                  5       5      nO{[        R                   " XU5      nOcUS:X  a  [        R"                  " U5      nOFUS:X  a$  [        R                   " UR!                  SS95      nOUS:X  a  [        R$                  " U5      n[         R                  " S WR                   SUR                   SUR	                  5       R                  5       S SUR                  5       R                  5       S S3	5        U4$ )!NzInput tensor stats: shape=z, dtype=z	, range=[z.6fz, ]r  z4Target tensor required for per-channel normalizationr:  .zChannel z - Scale: source=[z], target=[r  zUsing target tensor range: [r  r  r  r  r  r  r   r  r  r  rJ  r  r   g|=)r   r  zOutput tensor stats: shape=)r   r   r   r  r   itemr   rP   clonerB   meanr   halfr  r>   powrJ  r  r  )rV   rj  r  r?  rK  rL  rM  rN  r  r  r  r@  csource_meantarget_meanscale
normalizeds                    r'   r  MTB_TensorOps.apply  sa    			(hv||nIV\V`V`VbVgVgVijmUnnpqwq{q{q}  rC  rC  rE  FI  qJ  JK  L	
 //$ J  \\^F6<<+,"(a."5"5"7K"/Q"7"<"<">K'5E%+CF^e%;F36N!'Q!3!3!5J!'Q!3!3!5J!.sAv!6!:!:!<J!.sAv!6!:!:!<J"(a.:"="/"J #j&=>K 36N 		qc!3Js3C2jQTEUU`aklo`pprs}  B  sC  CD  E' -. ++(*..0557
*..0557
		2:c2B"ZPSDTTUV !-*2IJJ:#:;jHF/)	!)#*$* FJ&h&+0A:6e#j(g%61g% ,"[[%))+002%))+002F #[[ZHFe#6*e#6<<E<#:;e#6*		)&,,x~YW]WaWaWcWhWhWjknVooqrxr|r|r~  sD  sD  sF  GJ  rK  KL  M	
 yrI   rY   )	r  rH  r   rH  r   rH  r  FN)rZ   r[   r\   r]   r_   rG   r`   rc   rb   r  rf   rY   rI   r'   r  r    sK    K
 K
Z LHH
 _rI   r  c                   `    \ rS rSrSr\S 5       r\R                  4r	Sr
SrSrS\S\4S	 jrS
rg)MTB_GetItemih  z+Generic index based getter for common typesc                 6    S[         R                  4SSS04S.0$ )Nr<   r   r3   r   )	containerindex)CIOANYro   s    r'   rG   MTB_GetItem.INPUT_TYPESk  s+     !ggZ)Q0
 	
rI   )r  get_itemrL   r  r  c                     S[        U5      ;   aV  [        R                  " S[        U5       35        X   n[        U5      [        R
                  L a  UR                  S5      nU4$ g )N__getitem__zContainer is r   )dirr   r   r   r>   re   	unsqueeze)rV   r  r  rz   s       r'   r  MTB_GetItem.get_itemy  sX    C	N*IId9o%678"CCyELL(mmA&6M +rI   rY   N)rZ   r[   r\   r]   r^   r_   rG   r  r  r`   ra   rc   rb   r   r   r  rf   rY   rI   r'   r  r  h  sF    5
 
 GG:LLHH# c rI   r  c                   F    \ rS rSrSr\S 5       rSrSrSr	Sr
S\4S	 jrS
rg)MTB_BooleanNoti  zInverts a boolean.c                     SSSSS0400$ )Nr<   bool_inr2   r3   FrY   ro   s    r'   rG   MTB_BooleanNot.INPUT_TYPES  s%     I	5'9:
 	
rI   )r2   )inverted_boolinvertrL   r  c                     U(       + 4$ r   rY   )rV   r  s     r'   r  MTB_BooleanNot.invert  s    ~rI   rY   N)rZ   r[   r\   r]   r^   r_   rG   r`   ra   rc   rb   rd   r  rf   rY   rI   r'   r  r    s9    
 
  L%LHHd rI   r  )0r   r  r+  urllib.parser   urllib.requestmathr   typingr   comfy.model_managementr   comfy.utilsr   numpyr  r>   comfy.comfy_types.node_typingr   r  PILr   r   r   r	   r
   r   r   r   r   r(   r*   rh   r   r   r   r   r   r   r  r#  r0  rD  rW  r  r  r  	__nodes__rY   rI   r'   <module>r     s+   	  	     1    3   +F FT <37 37l ( ( (Z% Z%zV" V"r !  !F" "J'% '%T; ;|G GTr rj 6 * !	rI   