ó
    Eñiø¬  ã                   óØ  • S SK r S SKrS SKJr  S SKJrJr  S SKJrJ	r	  \	" SS5      r
\R                  \R                  \R                  \R                  \R                  /r\R"                  \R$                  /r\ V s0 s H9  o \R)                  U 5      R*                  \R)                  U 5      R,                  4_M;     sn r\R1                  \ V s0 s HE  o \" \R5                  U 5      R*                  5      \" \R5                  U 5      R,                  5      4_MG     sn 5        S r\
R9                  S5        \" \
S	S
5      S\R:                  S\S\S\S\S\R>                  S\R:                  4S j5       r \" \
S	S5      S\R:                  S\S\S\S\S\R>                  S\R:                  4S j5       r!\
R9                  S5        \" \
SS
5      S\R:                  S\R:                  S\R:                  S\S\S\R>                  S\R:                  4S j5       r"\" \
SS5      S\R:                  S\R:                  S\R:                  S\S\S\R>                  S\R:                  4S j5       r#\
R9                  S5        \" \
SS
5      S\R:                  S\R:                  S\R:                  S\R:                  S\R:                  S\R>                  S\R:                  4S j5       r$\" \
SS5      S\R:                  S\R:                  S\R:                  S\R:                  S\R:                  S\R>                  S\R:                  4S j5       r%\
R9                  S5        \" \
SS
5      SS.S\R:                  S\S\S\S\S\R>                  S \R>                  S-  S\R:                  4S! jj5       r&\" \
SS5      SS.S\R:                  S\R:                  S\R:                  S\S\S\R>                  S \R>                  S-  S\R:                  4S" jj5       r'\
R9                  S#5        \" \
S$S
5      SS.S\R:                  S\R:                  S\R:                  S\S\S\R>                  S \R>                  S-  S\R:                  4S% jj5       r(\" \
S$S5      SS.S\R:                  S\R:                  S\R:                  S\S\S\R>                  S \R>                  S-  S\R:                  4S& jj5       r)\
R9                  S'5        \" \
S(S
5      SS.S\R:                  S\R:                  S\R:                  S\R:                  S\R:                  S\R>                  S \R>                  S-  S\R:                  4S) jj5       r*\" \
S(S5      SS.S \R>                  S-  S\R:                  4S* jj5       r+\
R9                  S+5        \" \
S,S
5      S\R:                  S-\S.\S/\S\R>                  S\,\R:                  \R:                  4   4S0 j5       r-\
R9                  S15        \" \
S2S
5      S\R:                  S-\S.\S/\S\R>                  S\,\R:                  \R:                  4   4S3 j5       r.\" \
S,S5      S\R:                  S\S\S/\S\R>                  S\,\R:                  \R:                  4   4S4 j5       r/\" \
S2S5      S\R:                  S\S\S/\S\R>                  S\,\R:                  \R:                  4   4S5 j5       r0S6 r1\
R9                  S75        \" \
S8S
5      S\R:                  S9\R:                  S:\R:                  S;\S\S\S\R>                  S\R:                  4S< j5       r2\" \
S8S5      S\R:                  S9\R:                  S:\R:                  S;\S\S\S\R>                  S\R:                  4S= j5       r3\
R9                  S>5        \" \
S?S
5      SS.S\R:                  S9\R:                  S:\R:                  S-  S;\S\S\S\R>                  S \R>                  S-  S\R:                  4S@ jj5       r4\" \
S?S5      SS.S\R:                  S9\R:                  S:\R:                  S-  S;\S\S\S\R>                  S \R>                  S-  S\R:                  4SA jj5       r5\
R9                  SB5        \" \
SCS
5      S\R:                  S\R>                  S\,\R:                  \R:                  4   4SD j5       r6\" \
SCS5      S\R:                  S\R>                  S\,\R:                  \R:                  4   4SE j5       r7\
R9                  SF5        \" \
SGSH5      S\R:                  S\R>                  S\,\R:                  \R:                  4   4SI j5       r8\
R9                  SJ5        \" \
SKS
5      S\R:                  S\R>                  S\,\R:                  \R:                  4   4SL j5       r9\" \
SKS5      S\R:                  S\R>                  S\,\R:                  \R:                  4   4SM j5       r:SN r;\
R9                  SO5        \" \
SPS
5      S\R:                  S9\R:                  S:\R:                  S\S\S\R>                  4SQ j5       r<\" \
SPS5      S\R:                  S9\R:                  S:\R:                  S\S\S\R>                  4SR j5       r=\
R9                  SS5        \" \
STS
5      \R|                  4S\R:                  S9\R:                  S:\R:                  S\S\S\R>                  SU\R>                  4SV jj5       r?\" \
STS5      \R|                  4S\R:                  S9\R:                  S:\R:                  S\S\S\R>                  SU\R>                  4SW jj5       r@\
R9                  SX5        \" \
SYS
5       SmS\R:                  S9\R:                  S:\R:                  S\S\S\R>                  4S[ jj5       rA\" \
SYS5       SmS\R:                  S9\R:                  S:\R:                  S\S\S\R>                  4S\ jj5       rB\
R9                  S]5        \" \
S^S
5      SZ\R|                  4S_\R:                  S9\R:                  S:\R:                  S-  S\S\S\R>                  S`\SU\R>                  4Sa jj5       rC\
R9                  Sb5         " Sc Sd\Rˆ                  RŠ                  5      rF\" \
SeSf5      S\R:                  S9\R:                  S:\R:                  S;\S\S\S\R:                  4Sg j5       rG\" \
SeS5      S\R:                  S9\R:                  S:\R:                  S;\S\S\S\R:                  4Sh j5       rH\
R9                  Si5        \" \
SjS
5      S\R:                  S\R>                  S\R:                  4Sk j5       rI\" \
SjS5      S\R:                  S\R>                  S\R:                  4Sl j5       rJgs  sn f s  sn f )né    N)Ú_unsqueeze_multiple)Údetermine_qparamsÚvalidate_qmin_qmax)ÚimplÚLibraryÚquantized_decomposedÚDEFc                 ó¢   • U[         ;  a  [        SU 35      e[         U   u  p4X:  a  [        SU SU  35      eX:”  a  [        SU SU 35      eg )NzUnsupported dtype: z9quant_min out of bound for dtype, quant_min_lower_bound: z quant_min: z9quant_max out of bound for dtype, quant_max_upper_bound: z quant_max: )Ú_DTYPE_TO_QVALUE_BOUNDSÚ
ValueErrorÚAssertionError)Ú	quant_minÚ	quant_maxÚdtypeÚquant_min_lower_boundÚquant_max_upper_bounds        Úa/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/ao/quantization/fx/_decomposed.pyÚ_quant_min_max_bounds_checkr      s‡   € ØÔ+Ó+ÜÐ.¨u¨gÐ6Ó7Ð7Ü3JÈ5Ñ3QÑ0ÐàÓ(Üð&Ø&;Ð%<¸LÈÈðUó
ð 	
ð
 Ó(Üð&Ø&;Ð%<¸LÈÈðUó
ð 	
ð )ó    zxquantize_per_tensor(Tensor input, float scale, int zero_point, int quant_min, int quant_max, ScalarType dtype) -> TensorÚquantize_per_tensorÚCompositeExplicitAutogradÚinputÚscaleÚ
zero_pointr   r   r   Úreturnc                 ó¨  • U R                   [        R                  [        R                  4;   a  U R	                  [        R
                  5      n U R                   [        R
                  :w  a  [        SU R                    35      e[        X4U5        SU-  n[        R                  " [        R                  " X-  5      U-   X45      R	                  U5      $ )a¼  Affine quantization for the Tensor using the same quantization parameters to map
from floating point to quantized values

Args:
   input (torch.Tensor): original float32 or bfloat16 Tensor
   scale (float): quantization parameter for affine quantization
   zero_point (int): quantization parameter for affine quantization
   quant_min (int): minimum quantized value for output Tensor
   quant_max (int): maximum quantized value for output Tensor
   dtype (torch.dtype): requested dtype (e.g. torch.uint8) for output Tensor

Returns:
   Tensor with requested dtype (e.g. torch.uint8), note the quantization parameters
   are not stored in the Tensor, we are storing them in function arguments instead
ú<Expecting input to have dtype torch.float32, but got dtype: ç      ð?)
r   ÚtorchÚfloat16Úbfloat16ÚtoÚfloat32r   r   ÚclampÚround)r   r   r   r   r   r   Ú	inv_scales          r   r   r   2   sŸ   € ð0 ‡{�{”u—}‘}¤e§n¡nÐ5Ó5Ø—‘œŸ™Ó'ˆØ‡{�{”e—m‘mÓ#ÜØJÈ5Ï;É;È-ÐXó
ð 	
ô   	°eÔ<à�e‘€IÜ�;Š;Ü�Š�EÑ%Ó&¨Ñ3°Yóç�bˆƒiðr   ÚMetac                 ó0  • U R                   [        R                  [        R                  4;   a  U R	                  [        R
                  5      n U R                   [        R
                  :w  a  [        SU R                    35      e[        R                  " XS9$ )Nr   ©r   )r   r   r    r!   r"   r#   r   Ú
empty_like©r   r   r   r   r   r   s         r   Úquantize_per_tensor_metar,   X   sm   € ð ‡{�{”u—}‘}¤e§n¡nÐ5Ó5Ø—‘œŸ™Ó'ˆØ‡{�{”e—m‘mÓ#ÜØJÈ5Ï;É;È-ÐXó
ð 	
ô ×Ò˜EÑ/Ð/r   zƒquantize_per_tensor.tensor(Tensor input, Tensor scale, Tensor zero_point, int quant_min, int quant_max, ScalarType dtype) -> Tensorzquantize_per_tensor.tensorc                 ó  • UR                  5       S:w  a  [        SUR                  5        35      eUR                  5       S:w  a  [        SUR                  5        35      e[        U UR                  5       UR                  5       UUU5      $ ©zÛAffine quantization for the Tensor using the same quantization parameters to map
from floating point to quantized values
Same as `quantize_per_tensor` but scale and zero_point are Scalar Tensor instead of
scalar values
é   ú>Expecting zero_point tensor to be one element, but received : ú9Expecting scale tensor to be one element, but received : ©Únumelr   r   Úitemr+   s         r   Úquantize_per_tensor_tensorr5   p   s‘   € ð  ×ÑÓ˜QÓÜØLÈZ×M]ÑM]ÓM_ÐL`Ðaó
ð 	
ð ‡{�{ƒ}˜ÓÜØGÈÏÉËÀÐWó
ð 	
ô ØØ�
‰
‹Ø�‰ÓØØØóð r   c                 óð  • U R                   [        R                  [        R                  4;   a  U R	                  [        R
                  5      n UR                  5       S:w  a  [        SUR                  5        35      eUR                  5       S:w  a  [        SUR                  5        35      eU R                   [        R
                  :w  a  [        SU R                    35      e[        R                  " XS9$ )Nr/   r0   r1   r   r)   )	r   r   r    r!   r"   r#   r3   r   r*   r+   s         r   Úquantize_per_tensor_tensor_metar7   ’   sÎ   € ð ‡{�{”u—}‘}¤e§n¡nÐ5Ó5Ø—‘œŸ™Ó'ˆØ×ÑÓ˜QÓÜØLÈZ×M]ÑM]ÓM_ÐL`Ðaó
ð 	
ð ‡{�{ƒ}˜ÓÜØGÈÏÉËÀÐWó
ð 	
ð ‡{�{”e—m‘mÓ#ÜØJÈ5Ï;É;È-ÐXó
ð 	
ô ×Ò˜EÑ/Ð/r   zŠquantize_per_tensor.tensor2(Tensor input, Tensor scale, Tensor zero_point, Tensor quant_min, Tensor quant_max, ScalarType dtype) -> Tensorzquantize_per_tensor.tensor2c                 óR  • UR                  5       S:w  a  [        SUR                  5        35      eUR                  5       S:w  a  [        SUR                  5        35      e[        U UR                  5       UR                  5       UR                  5       UR                  5       U5      $ r.   r2   r+   s         r   Úquantize_per_tensor_tensor2r9   ³   sŸ   € ð  ×ÑÓ˜QÓÜØLÈZ×M]ÑM]ÓM_ÐL`Ðaó
ð 	
ð ‡{�{ƒ}˜ÓÜØGÈÏÉËÀÐWó
ð 	
ô ØØ�
‰
‹Ø�‰ÓØ�‰ÓØ�‰ÓØóð r   c                 ó"   • [        U UUUUU5      $ ©N)r7   r+   s         r   Ú quantize_per_tensor_tensor2_metar<   Õ   s#   € ô +ØØØØØØóð r   z™dequantize_per_tensor(Tensor input, float scale, int zero_point, int quant_min, int quant_max, ScalarType dtype, *, ScalarType? out_dtype=None) -> TensorÚdequantize_per_tensor©Ú	out_dtyper?   c                óÜ   • U R                   U:w  a  [        SU SU R                    35      eUc  [        R                  nU[        ;   a  U R                  U5      U-
  U-  $ [        SU 35      e)aº  Affine dequantization for the Tensor using the same quantization parameters to map
from quantized values to floating point values

Args:
   input (torch.Tensor): Tensor with dtype matching `dtype` argument,
   e.g. (`torch.uint8`), it is a per tensor quantized Tensor if combined with
   quantization parameters in the argument of this function (scale/zero_point)

   scale (float): quantization parameter for affine quantization

   zero_point (int): quantization parameter for affine quantization

   quant_min (int): minimum quantized value for input Tensor (not used in computation,
   reserved for pattern matching)

   quant_max (int): maximum quantized value for input Tensor (not used in computation,
   reserved for pattern matching)

   dtype (torch.dtype): dtype for input Tensor (not used in computation,
   reserved for pattern matching)

   out_dtype (torch.dtype?): optional dtype for output Tensor

Returns:
   dequantized float32 Tensor
úExpecting input to have dtype: ú
, but got ú,Unsupported dtype in dequantize_per_tensor: )r   r   r   r#   r   r"   r   ©r   r   r   r   r   r   r?   s          r   r=   r=   ò   sz   € ðJ ‡{�{�eÓÜØ-¨e¨W°J¸u¿{¹{¸mÐLó
ð 	
ð ÑÜ—M‘Mˆ	ØÔ'Ó'ð —‘˜Ó# jÑ0°EÑ9Ð9äÐGÈÀwÐOÓPÐPr   c                óP   • Uc  [         R                  n[         R                  " XS9$ ©Nr)   )r   r#   r*   rD   s          r   Údequantize_per_tensor_metarG   &  s$   € ð ÑÜ—M‘Mˆ	Ü×Ò˜EÑ3Ð3r   z¤dequantize_per_tensor.tensor(Tensor input, Tensor scale, Tensor zero_point, int quant_min, int quant_max, ScalarType dtype, *, ScalarType? out_dtype=None) -> Tensorzdequantize_per_tensor.tensorc          
      ó  • UR                  5       S:w  a  [        SUR                  5        35      eUR                  5       S:w  a  [        SUR                  5        35      e[        U UR                  5       UR                  5       UUUUS9$ ©zæAffine dequantization for the Tensor using the same quantization parameters to map
from quantized values to floating point values
Same as `dequantize_per_tensor` but scale and zero_point are Scalar Tensor instead of
scalar values
r/   r0   r1   r>   ©r3   r   r=   r4   rD   s          r   Údequantize_per_tensor_tensorrK   <  s”   € ð( ×ÑÓ˜QÓÜØLÈZ×M]ÑM]ÓM_ÐL`Ðaó
ð 	
ð ‡{�{ƒ}˜ÓÜØGÈÏÉËÀÐWó
ð 	
ô !ØØ�
‰
‹Ø�‰ÓØØØØñð r   c                ó–  • Uc  [         R                  nUR                  5       S:w  a  [        SUR                  5        35      eUR                  5       S:w  a  [        SUR                  5        35      eU R                  U:w  a  [        SU SU R                   35      eU[
        ;   a  [         R                  " XS9$ [        SU 35      e)Nr/   r0   r1   rA   rB   r)   rC   )r   r#   r3   r   r   r   r*   r   rD   s          r   Ú!dequantize_per_tensor_tensor_metarM   c  sÐ   € ð ÑÜ—M‘Mˆ	Ø×ÑÓ˜QÓÜØLÈZ×M]ÑM]ÓM_ÐL`Ðaó
ð 	
ð ‡{�{ƒ}˜ÓÜØGÈÏÉËÀÐWó
ð 	
ð ‡{�{�eÓÜØ-¨e¨W°J¸u¿{¹{¸mÐLó
ð 	
ð Ô'Ó'Ü×Ò Ñ7Ð7äÐGÈÀwÐOÓPÐPr   z«dequantize_per_tensor.tensor2(Tensor input, Tensor scale, Tensor zero_point, Tensor quant_min, Tensor quant_max, ScalarType dtype, *, ScalarType? out_dtype=None) -> Tensorzdequantize_per_tensor.tensor2c          
      óP  • UR                  5       S:w  a  [        SUR                  5        35      eUR                  5       S:w  a  [        SUR                  5        35      e[        U UR                  5       UR                  5       UR                  5       UR                  5       UUS9$ rI   rJ   rD   s          r   Údequantize_per_tensor_tensor2rO   ‰  s¢   € ð( ×ÑÓ˜QÓÜØLÈZ×M]ÑM]ÓM_ÐL`Ðaó
ð 	
ð ‡{�{ƒ}˜ÓÜØGÈÏÉËÀÐWó
ð 	
ô !ØØ�
‰
‹Ø�‰ÓØ�‰ÓØ�‰ÓØØñð r   c          
      ó   • [        XX#XEUS9$ )Nr>   )rM   rD   s          r   Ú"dequantize_per_tensor_tensor2_metarQ   °  s   € ô -Ø�j¨YÈñð r   zrchoose_qparams.tensor(Tensor input, int quant_min, int quant_max, float eps, ScalarType dtype) -> (Tensor, Tensor)zchoose_qparams.tensorÚqminÚqmaxÚepsc           
      ó”  • U R                   [        R                  [        R                  [        R                  4;  a  [        SU R                    35      eU[        ;  a#  [        S[        R                  5        SU 35      e[        X5        [        R                  " U 5      u  pV[        UUUUU[        R                  " U/5      SS9$ )á3  Given an input Tensor, derive the per tensor affine quantization parameter
(scale and zero_point) for target quantized Tensor from the Tensor

Args:
   input (torch.Tensor): floating point input Tensor
   quant_min (int): minimum quantized value for target quantized Tensor
   quant_max (int): maximum quantized value for target quantized Tensor
   dtype (torch.dtype): dtype for target quantized Tensor

Returns:
   scale (float): quantization parameter for the target quantized Tensor
   zero_point (int): quantization parameter for the target quantized Tensor
úCExpecting input to have dtype torch.float32/16/b16, but got dtype: ú$Expecting target dtype to be one of ú, but got: F)Úhas_customized_qrange)r   r   r#   r    r!   r   r   Úkeysr   Úaminmaxr   ÚTensor©r   rR   rS   rT   r   Úmin_valÚmax_vals          r   Úchoose_qparams_tensorra   Æ  sÉ   € ð" ‡{�{Ü�‰Ü�‰Ü�‰ðó ô
 ØQÐRW×R]ÑR]ÐQ^Ð_ó
ð 	
ð Ô+Ó+ÜØ2Ô3J×3OÑ3OÓ3QÐ2RÐR]Ð^cÐ]dÐeó
ð 	
ô �tÔ"ä—}’} UÓ+Ñ€GäØØØØØÜ�Š�c�UÓØ#ñð r   z|choose_qparams_symmetric.tensor(Tensor input, int quant_min, int quant_max, float eps, ScalarType dtype) -> (Tensor, Tensor)zchoose_qparams_symmetric.tensorc                 ó²  • U R                   [        R                  [        R                  [        R                  4;  a  [        SU R                    35      eU[        ;  a#  [        S[        R                  5        SU 35      e[        X5        [        R                  " U 5      u  pV[        UUUUU[        R                  " U/5      S[        R                  S9$ )rV   rW   rX   rY   F)rZ   Úqscheme)r   r   r#   r    r!   r   r   r[   r   r\   r   r]   Úper_tensor_symmetricr^   s          r   Úchoose_qparams_symmetric_tensorre   ø  sÒ   € ð* ‡{�{Ü�‰Ü�‰Ü�‰ðó ô
 ØQÐRW×R]ÑR]ÐQ^Ð_ó
ð 	
ð Ô+Ó+ÜØ2Ô3J×3OÑ3OÓ3QÐ2RÐR]Ð^cÐ]dÐeó
ð 	
ô �tÔ"ä—}’} UÓ+Ñ€GÜØØØØØÜ�Š�c�UÓØ#Ü×*Ñ*ñ	ð 	r   c                 ó�  • U R                   [        R                  [        R                  [        R                  4;  a  [        SU R                    35      eX:¼  a  [        SU SU 35      e[        R                  " S[        R                  U R                  S9[        R                  " S[        R                  U R                  S94$ )NrW   zCExpecting quant_min to be smaller than quant_max but received min: z max: r/   ©r   Údevice)
r   r   r#   r    r!   r   ÚemptyÚdoublerh   Úint64©r   r   r   rT   r   s        r   Úchoose_qparams_tensor_metarm   (  s´   € ð ‡{�{Ü�‰Ü�‰Ü�‰ðó ô
 ØQÐRW×R]ÑR]ÐQ^Ð_ó
ð 	
ð ÓÜØQÐR[ÐQ\Ð\bÐclÐbmÐnó
ð 	
ô �;Š;�q¤§¡°U·\±\ÑBÄEÇKÂKØ	”—‘ U§\¡\ñEð ð r   c                 óº   • [         R                  " S[         R                  U R                  S9[         R                  " S[         R                  U R                  S94$ )Nr/   rg   )r   ri   rj   rh   rk   rl   s        r   Ú$choose_qparams_symmetric_tensor_metaro   =  sA   € ô �;Š;�q¤§¡°U·\±\ÑBÄEÇKÂKØ	”—‘ U§\¡\ñEð ð r   c                 ó�   • [        [        U R                  5       5      5      nSX!'   XS'   U R                  [	        U5      5      nX24$ )Nr   )ÚlistÚrangeÚdimÚpermuteÚtuple)ÚxÚaxisÚnew_axis_listÚys       r   Ú_permute_to_axis_zerorz   G  sB   € Üœ˜qŸu™u›w›Ó(€MØ€MÑØ�!ÑØ	�	‰	”%˜Ó&Ó'€AØÐÐr   z‰quantize_per_channel(Tensor input, Tensor scales, Tensor zero_points, int axis, int quant_min, int quant_max, ScalarType dtype) -> TensorÚquantize_per_channelÚscalesÚzero_pointsrw   c                 óæ  • U R                   [        R                  [        R                  4;   a  U R	                  [        R
                  5      n U R                   [        R
                  :w  a  [        SU R                    35      eX0R                  5       :¼  a  [        SU R                  5        35      e[        XEU5        [        X5      u  pS/U R                  5       -  nUR                  S   US'   UR                  U5      nUR                  U5      n[        R                  " [        R                  " U SU-  -  5      U-   XE5      n	U	R                  [        U5      5      n
U
R	                  U5      $ )a<  Affine per channel quantization for the Tensor using the same quantization
parameters for each channel/axis to map from floating point to quantized values

Args:
   input (torch.Tensor): original float32 or bfloat16 Tensor
   scales (torch.Tensor): a list of scale quantization parameter for
   affine quantization, one per channel
   zero_point (torch.Tensor): a list of zero_point quantization parameter for
   affine quantization, one per channel
   quant_min (int): minimum quantized value for output Tensor
   quant_max (int): maximum quantized value for output Tensor
   dtype (torch.dtype): requested dtype (e.g. torch.uint8) for output Tensor

Returns:
   Tensor with requested dtype (e.g. torch.uint8), note the quantization parameters
   are not stored in the Tensor, we are storing them in function arguments instead
r   úExpecting axis to be < r/   r   r   )r   r   r    r!   r"   r#   r   rs   r   rz   ÚshapeÚviewr$   r%   rt   ru   )r   r|   r}   rw   r   r   r   Úpermute_axis_listÚ	new_shapeÚresÚouts              r   r{   r{   U  s'  € ð6 ‡{�{”u—}‘}¤e§n¡nÐ5Ó5Ø—‘œŸ™Ó'ˆØ‡{�{”e—m‘mÓ#ÜØJÈ5Ï;É;È-ÐXó
ð 	
ð �y‰y‹{ÓÜÐ6°u·y±y³{°mÐDÓEÐEÜ 	°eÔ<Ü4°UÓAÑ€Eà��e—i‘i“kÑ!€IØ—<‘< ‘?€Iˆa�LØ�[‰[˜Ó#€FØ×"Ñ" 9Ó-€Kä
�+Š+Ü�Š�E˜S 6™\Ñ*Ó+¨kÑ9¸9ó€Cð �+‰+”eÐ-Ó.Ó
/€CØ�6‰6�%‹=Ðr   c                 ó¦  • U R                   [        R                  [        R                  4;   a  U R	                  [        R
                  5      n U R                   [        R
                  :w  a  [        SU R                    35      eX0R                  5       :¼  a  [        SU R                  5        35      e[        XEU5        [        R                  " XS9$ )Nr   r   r)   )
r   r   r    r!   r"   r#   r   rs   r   r*   )r   r|   r}   rw   r   r   r   s          r   Úquantize_per_channel_metar‡   ‡  sœ   € ð ‡{�{”u—}‘}¤e§n¡nÐ5Ó5Ø—‘œŸ™Ó'ˆØ‡{�{”e—m‘mÓ#ÜØJÈ5Ï;É;È-ÐXó
ð 	
ð �y‰y‹{ÓÜÐ6°u·y±y³{°mÐDÓEÐEÜ 	°eÔ<Ü×Ò˜EÑ/Ð/r   z«dequantize_per_channel(Tensor input, Tensor scales, Tensor? zero_points, int axis, int quant_min, int quant_max, ScalarType dtype, *, ScalarType? out_dtype=None) -> TensorÚdequantize_per_channelc                ó  • U R                   U:w  a  [        SU SU R                    35      eUc  [        R                  nX0R	                  5       :¼  a  [        SU R	                  5        35      e[        XEU5        [        X5      u  pS/U R	                  5       -  n	UR                  S   U	S'   UR                  U	5      nUb  XR                  U	5      -
  U-  n
OX-  n
U
R                  U5      n
U
R                  [        U5      5      nU$ )aO  Affine per channel dequantization for the Tensor using the same quantization
parameters for each channel/axis to map from quantized values to floating point values

Args:
   input (torch.Tensor): Tensor with dtype matching `dtype` argument,
   e.g. (`torch.uint8`), it is a per channel quantized Tensor if combined with
   quantization parameter in the argument of this function (scales/zero_points/axis)

   scales (torch.Tensor): a list of scale quantization parameter for
   affine quantization, one per channel

   zero_points (torch.Tensor): a list of zero_point quantization parameter for
   affine quantization, one per channel

   quant_min (int): minimum quantized value for output Tensor (not used in computation,
   reserved for pattern matching)

   quant_max (int): maximum quantized value for output Tensor (not used in computation,
   reserved for pattern matching)

   dtype (torch.dtype): requested dtype for output Tensor (not used in computation,
   reserved for pattern matching)

   out_dtype (torch.dtype?): optional dtype for output Tensor

Returns:
   dequantized float32 Tensor
rA   ú, but got dtype: r   r/   r   )r   r   r   r#   rs   r   rz   r€   r�   r"   rt   ru   )r   r|   r}   rw   r   r   r   r?   r‚   rƒ   r„   r…   s               r   rˆ   rˆ   §  sý   € ðP ‡{�{�eÓÜØ-¨e¨WÐ4EÀeÇkÁkÀ]ÐSó
ð 	
ð ÑÜ—M‘Mˆ	Ø�y‰y‹{ÓÜÐ6°u·y±y³{°mÐDÓEÐEÜ 	°eÔ<Ü4°UÓAÑ€Eà��e—i‘i“kÑ!€IØ—<‘< ‘?€Iˆa�LØ�[‰[˜Ó#€FØÑØ×'Ñ'¨	Ó2Ñ2°fÑ<‰à‰nˆà
�&‰&�Ó
€Cà
�+‰+”eÐ-Ó.Ó
/€CØ€Jr   c                ó  • U R                   U:w  a  [        SU SU R                    35      eUc  [        R                  nX0R	                  5       :¼  a  [        SU R	                  5        35      e[        XEU5        [        R                  " XS9$ )NzExpecting input to have dtype rŠ   r   r)   )r   r   r   r#   rs   r   r*   )r   r|   r}   rw   r   r   r   r?   s           r   Údequantize_per_channel_metarŒ   è  sƒ   € ð ‡{�{�eÓÜØ,¨U¨GÐ3DÀUÇ[Á[ÀMÐRó
ð 	
ð ÑÜ—M‘Mˆ	Ø�y‰y‹{ÓÜÐ6°u·y±y³{°mÐDÓEÐEÜ 	°eÔ<Ü×Ò˜EÑ3Ð3r   zLchoose_qparams_per_token(Tensor input, ScalarType dtype) -> (Tensor, Tensor)Úchoose_qparams_per_tokenc                 óh  • U R                  5       R                  SSS9nUR                  [        R                  :X  a  UR                  5       nU[        R                  :X  a  SnSUS-
  -  S-
  nO[        SU 35      eUR                  SS	9R                  U5      n[        R                  " U5      nX%4$ )
áè  Choose quantization parameters for per token quantization. This means for a N dimension Tensor
(M1, M2, ...Mn, N), we calculate scales/zero_points for each N elements and quantize
every N elements with the same quantization parameter. The dimension for scales/zero_points
will be (M1 * M2 ... * Mn)

Args:
   input (torch.Tensor): original float32/float16 Tensor
   dtype (torch.dtype): dtype (e.g. torch.uint8) for input Tensor

Returns:
    scales and zero_points, both float32 Tensors
éÿÿÿÿT©rs   Úkeepdimé   é   r/   z/unsupported dtype in choose_qparams_per_token: gñhãˆµøä>©Úmin)ÚabsÚamaxr   r   r    ÚfloatÚint8Ú	Exceptionr$   ÚdivÚ
zeros_like)r   r   r|   Ún_bitsr   r}   s         r   r�   r�     s°   € ð, �Y‰Y‹[×Ñ "¨dÐÐ3€FØ‡|�|”u—}‘}Ó$à�L‰L‹Nð 	ð ”—
‘
ÓØˆØ˜& 1™*Ñ%¨Ñ)‰	äØ=¸e¸WÐEó
ð 	
ð �\‰\˜dˆ\Ð#×'Ñ'¨	Ó2€FÜ×"Ò" 6Ó*€KØÐÐr   c                 óò   • [        U R                  S S 5      S/-   n[        R                  " U[        R                  U R
                  S9[        R                  " U[        R                  U R
                  S94$ ©Nr�   r/   rg   ©rq   r€   r   ri   rj   rh   rk   ©r   r   Úsizes      r   Úchoose_qparams_per_token_metar¤   -  ó]   € ô �—‘˜C˜RÐ Ó! Q CÑ'€DÜ�;Š;�t¤5§<¡<¸¿¹ÑEÄuÇ{Â{Ø”E—K‘K¨¯©ñHð ð r   z]_choose_qparams_per_token_asymmetric_impl(Tensor input, ScalarType dtype) -> (Tensor, Tensor)Ú)_choose_qparams_per_token_asymmetric_implÚCompositeImplicitAutogradc                 óÔ  • Su  p#[         R                  " U SSS9n[         R                  " U SSS9n[         R                  " U[         R                  " U5      5      n[         R
                  " U[         R                  " U5      5      n[         R                  " [         R                  5      R                  nXv-
  [        X2-
  5      -  n	U	R                  US9n	Xi-  n
Xy-  nX*-   nX;-   n[         R                  " XÍ-   S:„  X*-
  X;-
  5      n[         R                  " XâU5      R                  5       nU	R                  [         R                  5      UR                  [         R                  5      4$ )r�   )i€ÿÿÿé   r�   Tr‘   r•   r   )r   Úaminr˜   r–   r�   ÚmaxÚfinfor#   rT   r™   r$   Úwherer%   r"   Úfloat64rk   )r   r   rR   rS   r_   r`   Úmin_val_negÚmax_val_posrT   r   Údescaled_minÚdescaled_maxÚzero_point_from_min_errorÚzero_point_from_max_errorr   s                  r   r¦   r¦   A  s,  € ð, �J€DÜ�jŠj˜ B°Ñ5€GÜ�jŠj˜ B°Ñ5€GÜ—)’)˜G¤U×%5Ò%5°gÓ%>Ó?€KÜ—)’)˜G¤U×%5Ò%5°gÓ%>Ó?€KÜ
�+Š+”e—m‘mÓ
$×
(Ñ
(€Cð Ñ&¬%°±Ó*<Ñ<€EØ�K‰K˜CˆKÐ €Eð Ñ&€LØÑ&€LØ $Ñ 3ÐØ $Ñ 3ÐÜ—’Ø!Ñ=ÀÑAØÑØÑó€Jô
 —’˜Z¨tÓ4×:Ñ:Ó<€Jà�8‰8”E—M‘MÓ" J§M¡M´%·+±+Ó$>Ð>Ð>r   zWchoose_qparams_per_token_asymmetric(Tensor input, ScalarType dtype) -> (Tensor, Tensor)Ú#choose_qparams_per_token_asymmetricc                 ó   • [        X5      $ r;   )r¦   ©r   r   s     r   rµ   rµ   v  s   € ô 5°UÓBÐBr   c                 óò   • [        U R                  S S 5      S/-   n[        R                  " U[        R                  U R
                  S9[        R                  " U[        R                  U R
                  S94$ r    r¡   r¢   s      r   Ú(choose_qparams_per_token_asymmetric_metar¹   ‚  r¥   r   c                 ó,  • [         R                  " [        U R                  5       5      S S 5      nX1R	                  5       :w  a  [        SU SUR                  5        35      eX2R	                  5       :w  a  [        SU SUR                  5        35      eg )Nr�   znum_tokens: z	 scales: z zero_points: )ÚmathÚprodrq   r£   r3   r   )r   r|   r}   Ú
num_tokenss       r   Ú!_per_token_quant_qparam_dim_checkr¾   ‘  s‡   € Ü—’œ4 §
¡
£Ó-¨c¨rÐ2Ó3€JØ—\‘\“^Ó#Ü˜|¨J¨<°yÀÇÁÃÀÐPÓQÐQØ×&Ñ&Ó(Ó(ÜØ˜:˜, n°[×5EÑ5EÓ5GÐ4HÐIó
ð 	
ð )r   z}quantize_per_token(Tensor input, Tensor scales, Tensor zero_points, int quant_min, int quant_max, ScalarType dtype) -> TensorÚquantize_per_tokenc                 óÔ   • [        X4U5        [        XU5        U R                  SU-  5      R                  U5      R	                  5       R                  X45      R                  U5      n U $ )aß  Per token quantization for the Tensor using the quantization parameters to map
from floating point to quantized values. This means for a N dimension Tensor
(M1, M2, ...Mn, N), we calculate scales/zero_points for each N elements and quantize
every N elements with the same quantization parameter. The dimension for scales/zero_points
will be (M1 * M2 ... * Mn)

Args:
   input (torch.Tensor): original float32 or bfloat16 Tensor
   scales (float32 torch.Tensor): quantization parameter for per token affine quantization
   zero_points (int32 torch.Tensor): quantization parameter for per token affine quantization
   quant_min (int): minimum quantized value for output Tensor
   quant_max (int): maximum quantized value for output Tensor
   dtype (torch.dtype): requested dtype (e.g. torch.uint8) for output Tensor

Returns:
   Tensor with requested dtype (e.g. torch.uint8), note the quantization parameters
   are not stored in the Tensor, we are storing them in function arguments instead
r   )r   r¾   ÚmulÚaddr%   r$   r"   ©r   r|   r}   r   r   r   s         r   r¿   r¿   ¡  sX   € ô6   	°eÔ<Ü% e°[ÔAà�	‰	�#˜‘,Óß	‰ˆ[Ó	ß	‰‹ß	‰ˆyÓ	$ß	‰ˆE‹ð 
ð €Lr   c                 óB   • [        X4U5        [        R                  " XS9$ rF   ©r   r   r*   rÃ   s         r   Úquantize_per_token_metarÆ   È  s   € ô   	°eÔ<Ü×Ò˜EÑ/Ð/r   z˜dequantize_per_token(Tensor input, Tensor scales, Tensor zero_points, int quant_min, int quant_max, ScalarType dtype, ScalarType output_dtype) -> TensorÚdequantize_per_tokenÚoutput_dtypec                 ó4   • X-
  n X-  n U R                  U5      $ )a©  Per token dequantization for the Tensor using the quantization parameters to map
from floating point to quantized values. This means for a N dimension Tensor
(M1, M2, ...Mn, N), we calculate scales/zero_points for each N elements and quantize
every N elements with the same quantization parameter. The dimension for scales/zero_points
will be (M1 * M2 ... * Mn)

Args:
   input (torch.Tensor): quantized Tensor (uint8, int8 etc.)
   scales (float64 torch.Tensor): quantization parameter for per token affine quantization
   zero_points (int64 torch.Tensor): quantization parameter for per token affine quantization
   quant_min (int): minimum quantized value for input Tensor
   quant_max (int): maximum quantized value for input Tensor
   dtype (torch.dtype): dtype (e.g. torch.uint8) for input Tensor
   output_dtype (torch.dtype): dtype (e.g. torch.float32) for output Tensor

Returns:
   dequantized Tensor with dtype `output_dtype`
)r"   ©r   r|   r}   r   r   r   rÈ   s          r   rÇ   rÇ   Û  s"   € ð8 Ñ€EØ‰N€Eà�8‰8�LÓ!Ð!r   c                 óB   • [        X4U5        [        R                  " XS9$ rF   rÅ   rÊ   s          r   Údequantize_per_token_metarÌ   ý  s   € ô   	°eÔ<ä×Ò˜EÑ6Ð6r   z•quantize_per_channel_group(Tensor input, Tensor scales, Tensor zero_points, int quant_min, int quant_max, ScalarType dtype, int group_size) -> TensorÚquantize_per_channel_groupé€   c                 óž  • US::  a  [        S5      eX`R                  S   :”  a"  UR                  S   S:X  a  U R                  S   nU R                  S   U-  S:w  a  [        S5      eU R                  5       S:w  a  [        S5      eU R                  SU5      n[        R
                  " U5      R                  5       S:w  a  [        S5      eUR                  SS5      nUR                  SS5      nUR                  S	U-  5      R                  U5      R                  5       R                  X45      R                  U5      R                  U 5      nU$ )
Nr/   úgroup_size must be > 1r�   r   ú/input.shape[-1] must be divisible by group_sizer”   úinput must be 2-dimensionalzto_quant must not contain NaNsr   )r   r€   rs   Úreshaper   ÚisnanÚsumrÁ   rÂ   r%   Úclamp_r"   Ú
reshape_as)	r   r|   r}   r   r   r   Ú
group_sizeÚto_quantÚ
input_int8s	            r   rÍ   rÍ     s$  € ð �QƒÜÐ5Ó6Ð6à—K‘K ‘OÓ#¨¯©°RÑ(8¸AÓ(=Ø—[‘[ ‘_ˆ
à‡{�{�2�˜Ñ# qÓ(ÜÐNÓOÐOØ‡y�yƒ{�aÓÜÐ:Ó;Ð;ð �}‰}˜R Ó,€HÜ‡{‚{�8Ó× Ñ Ó" aÓ'ÜÐ=Ó>Ð>à�^‰^˜B Ó"€FØ×%Ñ% b¨!Ó,€Kð 	�‰�S˜6‘\Ó"ß	‰ˆ[Ó	ß	‰‹ß	‰�	Ó	%ß	‰ˆE‹ß	‰�EÓ	ð ð Ðr   c                 ó4  • US::  a  [        S5      eX`R                  S   :”  a"  UR                  S   S:X  a  U R                  S   nU R                  S   U-  S:w  a  [        S5      eU R                  5       S:w  a  [        S5      e[        R                  " XS9$ )	a  Groupwise quantization within each channel for an 2-d Tensor using the quantization parameters
to map from floating point to quantized values. This means for each row of a 2-d Tensor
(M, N), we calculate scales/zero_points for each `group_size` elements
and quantize every `group_size` elements with the same quantization parameter.
The dimension for scales/zero_points will be (M * ceil(N, group_size),)

Args:
   input (torch.Tensor): original float32 or bfloat16 Tensor
   scales (float32 torch.Tensor): quantization parameter for per channel group affine quantization
   zero_points (int32 torch.Tensor): quantization parameter for per channel group affine quantization
   quant_min (int): minimum quantized value for output Tensor
   quant_max (int): maximum quantized value for output Tensor
   dtype (torch.dtype): requested dtype (e.g. torch.uint8) for output Tensor

Returns:
   Tensor with requested dtype (e.g. torch.uint8), note the quantization parameters
   are not stored in the Tensor, we are storing them in function arguments instead
r/   rÐ   r�   r   rÑ   r”   rÒ   r)   )r   r€   rs   r   r*   )r   r|   r}   r   r   r   rØ   s          r   Úquantize_per_channel_group_metarÜ   >  sŽ   € ð8 �QƒÜÐ5Ó6Ð6à—K‘K ‘OÓ#¨¯©°RÑ(8¸AÓ(=Ø—[‘[ ‘_ˆ
à‡{�{�2�˜Ñ# qÓ(ÜÐNÓOÐOØ‡y�yƒ{�aÓÜÐ:Ó;Ð;Ü×Ò˜EÑ/Ð/r   z±dequantize_per_channel_group(Tensor input, Tensor scales, Tensor? zero_points, int quant_min, int quant_max, ScalarType dtype, int group_size, ScalarType output_dtype) -> TensorÚdequantize_per_channel_groupÚw_int8rØ   c                 ó\  • US::  a  [        S5      eX`R                  S   :”  a"  UR                  S   S:X  a  U R                  S   nU R                  S   U-  S:w  a  [        S5      eU R                  5       S:w  a  [        S5      eU R                  SU5      nUR                  SS5      nUb  UR                  SS5      n	O.[        R
                  " / [        R                  UR                  S9n	UR                  U	5      R                  U5      R                  U 5      R                  U5      n
U
$ )	aå  Groupwise dequantization within each channel for an 2-d Tensor using the quantization parameters
to map from floating point to quantized values. This means for each row of a 2-d Tensor
(M, N), we calculate scales/zero_points for each `group_size` elements
and quantize every `group_size` elements with the same quantization parameter.
The dimension for scales/zero_points will be (M * ceil(N, group_size),)

Args:
   input (torch.Tensor): quantized Tensor (uint8/int8 etc.)
   scales (float32 torch.Tensor): quantization parameter for per channel group affine quantization
   zero_points (int32 torch.Tensor): quantization parameter for per channel group affine quantization
   quant_min (int): minimum quantized value for input Tensor
   quant_max (int): maximum quantized value for input Tensor
   dtype (torch.dtype): dtype (e.g. torch.uint8) for input Tensor
   output_dtype (torch.dtype): dtype (e.g. torch.float32) for output Tensor

Returns:
   dequantized Tensor with dtype `output_dtype`
r/   rÐ   r�   r   z0w_int8.shape[-1] must be divisible by group_sizer”   zw_int8 must be 2-dimensionalrg   )r   r€   rs   rÓ   r   ÚzerosÚint32rh   ÚsubrÁ   r×   r"   )rÞ   r|   r}   r   r   r   rØ   rÈ   Úw_int8_groupedÚzpÚw_dqs              r   rÝ   rÝ   m  s	  € ðD �QƒÜÐ5Ó6Ð6à—L‘L Ñ$Ó$¨¯©°bÑ)9¸QÓ)>Ø—\‘\ "Ñ%ˆ
Ø‡|�|�BÑ˜*Ñ$¨Ó)ÜÐOÓPÐPØ‡z�zƒ|�qÓÜÐ;Ó<Ð<à—^‘^ B¨
Ó3€NØ�^‰^˜B Ó"€FØÑØ× Ñ   QÓ'‰ä�[Š[˜¤5§;¡;°v·}±}ÑEˆØ×Ñ˜bÓ!×%Ñ% fÓ-×8Ñ8¸Ó@×CÑCÀLÓQ€DØ€Kr   zyfake_quant_per_channel(Tensor input, Tensor scales, Tensor zero_points, int axis, int quant_min, int quant_max) -> Tensorc                   ó4   • \ rS rSr\S 5       r\S 5       rSrg)ÚFakeQuantPerChanneli©  c                 ó.  • UR                   [        R                  :w  a  UR                  [        R                  5      nUR                   [        R                  :w  a  UR                  [        R                  5      nUR                   [        R                  :w  a  [        SUR                    35      eXAR                  5       :¼  a  [        SUR                  5        35      e[        [        U5      5      [        [        US-   UR                  5      5      -   n[        X'5      n[        X75      n	[        R                  " USU-  -  5      U	-   n
[        R                  " X¥U5      U	-
  U-  n[        R                  " X¥:¬  X¦:*  5      nU R                  U5        U$ )Nr   r   r/   r   )r   r   r#   r"   rá   r   rs   rq   rr   Úndimr   r%   r$   Úlogical_andÚsave_for_backward)Úctxr   r|   r}   rw   r   r   Úbroadcast_dimsÚunsqueeze_scalesÚunsqueeze_zero_pointsÚtempr…   Úmasks                r   ÚforwardÚFakeQuantPerChannel.forwardª  sC  € ð �<‰<œ5Ÿ=™=Ó(Ø—Y‘YœuŸ}™}Ó-ˆFØ×Ñ¤§¡Ó+Ø%Ÿ.™.¬¯©Ó5ˆKØ�;‰;œ%Ÿ-™-Ó'Ü ØNÈuÏ{É{ÈmÐ\óð ð —9‘9“;ÓÜ Ð#:¸5¿9¹9»;¸-Ð!HÓIÐIÜœe D›kÓ*¬T´%¸¸q¹À%Ç*Á*Ó2MÓ-NÑNˆÜ.¨vÓFÐÜ 3°KÓ PÐÜ�{Š{˜5 CÐ*:Ñ$:Ñ;Ó<Ð?TÑTˆä�KŠK˜¨Ó3Ð6KÑKØñˆô × Ò  $Ñ"3°tÑ7HÓJˆà×Ñ˜dÔ#Øˆ
r   c                 ó2   • U R                   u  nX-  S S S S S 4$ r;   )Úsaved_tensors)rì   Úgyrñ   s      r   ÚbackwardÚFakeQuantPerChannel.backwardÃ  s&   € ð ×#Ñ#‰ˆØ‰y˜$  d¨D°$Ð6Ð6r   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ústaticmethodrò   r÷   Ú__static_attributes__rù   r   r   rç   rç   ©  s(   † Øñó ðð. ñ7ó ó7r   rç   Úfake_quant_per_channelÚAutogradc                 ó0   • [         R                  XX#XE5      $ r;   )rç   Úapply©r   r|   r}   rw   r   r   s         r   r   r   Ê  s   € ô ×$Ñ$Ø�{¨)óð r   c                 ó.   • [         R                  " U 5      $ r;   ©r   r*   r  s         r   Úfake_quant_per_channel_metar  Ø  s   € ô ×Ò˜EÓ"Ð"r   zFconvert_element_type.no_fuse(Tensor input, ScalarType dtype) -> Tensorzconvert_element_type.no_fusec                 óh   • [         R                  R                  R                  R	                  X5      $ r;   )r   ÚopsÚprimsÚconvert_element_typeÚdefaultr·   s     r   r  r  é  s#   € ô �9‰9�?‰?×/Ñ/×7Ñ7¸ÓEÐEr   c                 ó*   • [         R                  " XS9$ rF   r  r·   s     r   Úconvert_element_type_metar  ò  s   € ä×Ò˜EÑ/Ð/r   )rÎ   )Kr»   r   Útorch._refsr   Útorch.ao.quantization.utilsr   r   Útorch.libraryr   r   Úquantized_decomposed_libÚuint8rš   Úuint16Úint16rá   Ú_INTEGER_DTYPESÚfloat8_e5m2Úfloat8_e4m3fnÚ_FLOAT_DTYPESÚiinfor–   r«   r   ÚupdateÚintr¬   r   Údefiner]   r™   r   r   r,   r5   r7   r9   r<   r=   rG   rK   rM   rO   rQ   ru   ra   re   rm   ro   rz   r{   r‡   rˆ   rŒ   r�   r¤   r¦   rµ   r¹   r¾   r¿   rÆ   r#   rÇ   rÌ   rÍ   rÜ   rÝ   ÚautogradÚFunctionrç   r   r  r  r  )Úks   0r   Ú<module>r!     sõ  ðã ã Ý +ß Mß 'ñ
 #Ð#9¸5ÓAÐ à—;‘; §
¡
¨E¯L©L¸%¿+¹+ÀuÇ{Á{ÐS€Ø×"Ñ" E×$7Ñ$7Ð8€ñ :IóÚ9H°Aˆ�‰�A‹×Ñ˜EŸK™K¨›N×.Ñ.Ð/Ò/¹ñÐ ð × Ñ ÙDQÓRÂM¸q‰ˆU�[‰[˜‹^×ÑÓ	 ¡# e§k¡k°!£n×&8Ñ&8Ó"9Ð:Ò:ÁMÑRôò
ð$ × Ñ ð@ôñ ÐÐ 5Ð7RÓSð"Ø�<‰<ð"àð"ð ð"ð ð	"ð
 ð"ð �;‰;ð"ð ‡\�\ó"ó Tð"ñJ ÐÐ 5°vÓ>ð0Ø�<‰<ð0àð0ð ð0ð ð	0ð
 ð0ð �;‰;ð0ð ‡\�\ó0ó ?ð0ð" × Ñ ð@ôñ ØÐ:Ð<WóðØ�<‰<ðà�<‰<ðð —‘ðð ð	ð
 ðð �;‰;ðð ‡\�\óóðñ> ÐÐ <¸fÓEð0Ø�<‰<ð0à�<‰<ð0ð —‘ð0ð ð	0ð
 ð0ð �;‰;ð0ð ‡\�\ó0ó Fð0ð4 × Ñ ðFôñ ØÐ;Ð=XóðØ�<‰<ðà�<‰<ðð —‘ðð �|‰|ð	ð
 �|‰|ðð �;‰;ðð ‡\�\óóðñ> ÐÐ =¸vÓFðØ�<‰<ðà�<‰<ðð —‘ðð �|‰|ð	ð
 �|‰|ðð �;‰;ðð ‡\�\óó Gðð, × Ñ ð_ôñ ÐÐ 7Ð9TÓUð %)ò0QØ�<‰<ð0Qàð0Qð ð0Qð ð	0Qð
 ð0Qð �;‰;ð0Qð �{‰{˜TÑ!ð0Qð ‡\�\ô0Qó Vð0Qñf ÐÐ 7¸Ó@ð %)ò4Ø�<‰<ð4à�<‰<ð4ð —‘ð4ð ð	4ð
 ð4ð �;‰;ð4ð �{‰{˜TÑ!ð4ð ‡\�\ô4ó Að4ð × Ñ ð_ôñ ØØ"Øóð %)òØ�<‰<ðà�<‰<ðð —‘ðð ð	ð
 ðð �;‰;ðð �{‰{˜TÑ!ðð ‡\�\ôóð
ñD ÐÐ >ÀÓGð %)òQØ�<‰<ðQà�<‰<ðQð —‘ðQð ð	Qð
 ðQð �;‰;ðQð �{‰{˜TÑ!ðQð ‡\�\ôQó HðQð> × Ñ ðeôñ ØØ#Øóð %)òØ�<‰<ðà�<‰<ðð —‘ðð �|‰|ð	ð
 �|‰|ðð �;‰;ðð �{‰{˜TÑ!ðð ‡\�\ôóð
ñD ÐÐ ?ÀÓHð %)òð �{‰{˜TÑ!ðð ‡\�\ôó Iðð × Ñ ð7ôñ ÐÐ 7Ð9TÓUð(Ø�<‰<ð(Ø"ð(Ø*-ð(Ø49ð(ØBGÇ+Á+ð(à
ˆ5�<‰<˜Ÿ™Ð%Ñ&ó(ó Vð(ðV × Ñ ð7ôñ ØØ%Øóð
(Ø�<‰<ð(Ø"ð(Ø*-ð(Ø49ð(ØBGÇ+Á+ð(à
ˆ5�<‰<˜Ÿ™Ð%Ñ&ó(óð
(ñV ÐÐ 7¸Ó@ðØ�<‰<ðØ$'ðØ47ðØ>CðØLQÏKÉKðà
ˆ5�<‰<˜Ÿ™Ð%Ñ&óó Aðñ( ÐÐ AÀ6ÓJðØ�<‰<ðØ$'ðØ47ðØ>CðØLQÏKÉKðà
ˆ5�<‰<˜Ÿ™Ð%Ñ&óó Kðòð × Ñ ð@ôñ ÐÐ 6Ð8SÓTð.Ø�<‰<ð.à�L‰Lð.ð —‘ð.ð ð	.ð
 ð.ð ð.ð �;‰;ð.ð ‡\�\ó.ó Uð.ñb ÐÐ 6¸Ó?ð0Ø�<‰<ð0à�L‰Lð0ð —‘ð0ð ð	0ð
 ð0ð ð0ð �;‰;ð0ð ‡\�\ó0ó @ð0ð2 × Ñ ð_ôñ ÐÐ 8Ð:UÓVð %)ò=Ø�<‰<ð=à�L‰Lð=ð —‘ Ñ$ð=ð ð	=ð
 ð=ð ð=ð �;‰;ð=ð �{‰{˜TÑ!ð=ð ‡\�\ô=ó Wð=ñ@ ÐÐ 8¸&ÓAð %)ò4Ø�<‰<ð4à�L‰Lð4ð —‘ Ñ$ð4ð ð	4ð
 ð4ð ð4ð �;‰;ð4ð �{‰{˜TÑ!ð4ð ‡\�\ô4ó Bð4ð. × Ñ ØRôñ
 ØØØóð
 Ø�<‰<ð à�;‰;ð ð ˆ5�<‰<˜Ÿ™Ð%Ñ&ó óð
 ñF ØØØ
óð
Ø�<‰<ðà�;‰;ðð ˆ5�<‰<˜Ÿ™Ð%Ñ&óóð
ð × Ñ Øcôñ
 ØØ/Øóð
(?Ø�<‰<ð(?à�;‰;ð(?ð ˆ5�<‰<˜Ÿ™Ð%Ñ&ó(?óð
(?ðV × Ñ Ø]ôñ
 ØØ)Øóð
CØ�<‰<ðCà�;‰;ðCð ˆ5�<‰<˜Ÿ™Ð%Ñ&óCóð
Cñ ØØ)Ø
óð
Ø�<‰<ðà�;‰;ðð ˆ5�<‰<˜Ÿ™Ð%Ñ&óóð
ò
ð × Ñ ð@ôñ ÐÐ 4Ð6QÓRð#Ø�<‰<ð#à�L‰Lð#ð —‘ð#ð ð	#ð
 ð#ð �;‰;ó#ó Sð#ñL ÐÐ 4°fÓ=ð	0Ø�<‰<ð	0à�L‰Lð	0ð —‘ð	0ð ð		0ð
 ð	0ð �;‰;ó	0ó >ð	0ð × Ñ ðYôñ ÐÐ 6Ð8SÓTð !&§¡ñ"Ø�<‰<ð"à�L‰Lð"ð —‘ð"ð ð	"ð
 ð"ð �;‰;ð"ð —+‘+ô"ó Uð"ñB ÐÐ 6¸Ó?ð !&§¡ñ7Ø�<‰<ð7à�L‰Lð7ð —‘ð7ð ð	7ð
 ð7ð �;‰;ð7ð —+‘+ô7ó @ð7ð × Ñ ðAôñ ØÐ:Ð<Wóð ñ%Ø�<‰<ð%à�L‰Lð%ð —‘ð%ð ð	%ð
 ð%ð �;‰;ô%óð%ñP ÐÐ <¸fÓEð ñ%0Ø�<‰<ð%0à�L‰Lð%0ð —‘ð%0ð ð	%0ð
 ð%0ð �;‰;ô%0ó Fð%0ðP × Ñ ðZôñ ØØ"Øóð Ø %§¡ñ.Ø�L‰Lð.à�L‰Lð.ð —‘ Ñ$ð.ð ð	.ð
 ð.ð �;‰;ð.ð ð.ð —+‘+ô.óð
.ðb × Ñ ð.ôô7˜%Ÿ.™.×1Ñ1ô 7ñB ÐÐ 8¸*ÓEð
Ø�<‰<ð
à�L‰Lð
ð —‘ð
ð ð	
ð
 ð
ð ð
ð ‡\�\ó
ó Fð
ñ ÐÐ 8¸&ÓAð#Ø�<‰<ð#à�L‰Lð#ð —‘ð#ð ð	#ð
 ð#ð ð#ð ‡\�\ó#ó Bð#ð × Ñ ØLôñ
 ØØ"Øóð
F §¡ð F°U·[±[ð FÀUÇ\Á\ó Fóð
Fñ ÐÐ >ÀÓGð0 U§\¡\ð 0¸%¿+¹+ð 0È%Ï,É,ó 0ó Hñ0ùòE'ùò Ss   Á=A w"ÃAw'