Ë
    ÄÓ^jú¬  ã                   óv  — d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	  e	dd«      Z
ej                  ej                  ej                  ej                  ej                  gZej"                  ej$                  gZeD � ci c];  } |  ej(                  | «      j*                   ej(                  | «      j,                  f“Œ= c} Zej1                  eD � ci c]G  } |  e ej4                  | «      j*                  «       e ej4                  | «      j,                  «      f“ŒI c} «       d„ Ze
j9                  d«        ee
d	d
«      dej:                  dededededej>                  dej:                  fd„«       Z  ee
d	d«      dej:                  dededededej>                  dej:                  fd„«       Z!e
j9                  d«        ee
dd
«      dej:                  dej:                  dej:                  dededej>                  dej:                  fd„«       Z" ee
dd«      dej:                  dej:                  dej:                  dededej>                  dej:                  fd„«       Z#e
j9                  d«        ee
dd
«      dej:                  dej:                  dej:                  dej:                  dej:                  dej>                  dej:                  fd„«       Z$ ee
dd«      dej:                  dej:                  dej:                  dej:                  dej:                  dej>                  dej:                  fd„«       Z%e
j9                  d«        ee
dd
«      ddœdej:                  dededededej>                  d ej>                  dz  dej:                  fd!„«       Z& ee
dd«      ddœdej:                  dej:                  dej:                  dededej>                  d ej>                  dz  dej:                  fd"„«       Z'e
j9                  d#«        ee
d$d
«      ddœdej:                  dej:                  dej:                  dededej>                  d ej>                  dz  dej:                  fd%„«       Z( ee
d$d«      ddœdej:                  dej:                  dej:                  dededej>                  d ej>                  dz  dej:                  fd&„«       Z)e
j9                  d'«        ee
d(d
«      ddœdej:                  dej:                  dej:                  dej:                  dej:                  dej>                  d ej>                  dz  dej:                  fd)„«       Z* ee
d(d«      ddœd ej>                  dz  dej:                  fd*„«       Z+e
j9                  d+«        ee
d,d
«      dej:                  d-ed.ed/edej>                  de,ej:                  ej:                  f   fd0„«       Z-e
j9                  d1«        ee
d2d
«      dej:                  d-ed.ed/edej>                  de,ej:                  ej:                  f   fd3„«       Z. ee
d,d«      dej:                  deded/edej>                  de,ej:                  ej:                  f   fd4„«       Z/ ee
d2d«      dej:                  deded/edej>                  de,ej:                  ej:                  f   fd5„«       Z0d6„ Z1e
j9                  d7«        ee
d8d
«      dej:                  d9ej:                  d:ej:                  d;edededej>                  dej:                  fd<„«       Z2 ee
d8d«      dej:                  d9ej:                  d:ej:                  d;edededej>                  dej:                  fd=„«       Z3e
j9                  d>«        ee
d?d
«      ddœdej:                  d9ej:                  d:ej:                  dz  d;edededej>                  d ej>                  dz  dej:                  fd@„«       Z4 ee
d?d«      ddœdej:                  d9ej:                  d:ej:                  dz  d;edededej>                  d ej>                  dz  dej:                  fdA„«       Z5e
j9                  dB«        ee
dCd
«      dej:                  dej>                  de,ej:                  ej:                  f   fdD„«       Z6 ee
dCd«      dej:                  dej>                  de,ej:                  ej:                  f   fdE„«       Z7e
j9                  dF«        ee
dGdH«      dej:                  dej>                  de,ej:                  ej:                  f   fdI„«       Z8e
j9                  dJ«        ee
dKd
«      dej:                  dej>                  de,ej:                  ej:                  f   fdL„«       Z9 ee
dKd«      dej:                  dej>                  de,ej:                  ej:                  f   fdM„«       Z:dN„ Z;e
j9                  dO«        ee
dPd
«      dej:                  d9ej:                  d:ej:                  dededej>                  fdQ„«       Z< ee
dPd«      dej:                  d9ej:                  d:ej:                  dededej>                  fdR„«       Z=e
j9                  dS«        ee
dTd
«      ej|                  fdej:                  d9ej:                  d:ej:                  dededej>                  dUej>                  fdV„«       Z? ee
dTd«      ej|                  fdej:                  d9ej:                  d:ej:                  dededej>                  dUej>                  fdW„«       Z@e
j9                  dX«        ee
dYd
«      	 dmdej:                  d9ej:                  d:ej:                  dededej>                  fd[„«       ZA ee
dYd«      	 dmdej:                  d9ej:                  d:ej:                  dededej>                  fd\„«       ZBe
j9                  d]«        ee
d^d
«      dZej|                  fd_ej:                  d9ej:                  d:ej:                  dz  dededej>                  d`edUej>                  fda„«       ZCe
j9                  db«        G dc„ ddejˆ                  jŠ                  «      ZF ee
dedf«      dej:                  d9ej:                  d:ej:                  d;edededej:                  fdg„«       ZG ee
ded«      dej:                  d9ej:                  d:ej:                  d;edededej:                  fdh„«       ZHe
j9                  di«        ee
djd
«      dej:                  dej>                  dej:                  fdk„«       ZI ee
djd«      dej:                  dej>                  dej:                  fdl„«       ZJyc c} w c c} w )né    N)Ú_unsqueeze_multiple)Údetermine_qparamsÚvalidate_qmin_qmax)ÚimplÚLibraryÚquantized_decomposedÚDEFc                 ó    — |t         vrt        d|› �«      ‚t         |   \  }}| |k  rt        d|› d| › �«      ‚||kD  rt        d|› d|› �«      ‚y )NzUnsupported dtype: z:quant_min out of bounds for dtype, quant_min_lower_bound: z quant_min: z:quant_max out of bounds 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        úo/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/ao/quantization/fx/_decomposed.pyÚ_quant_min_max_bounds_checkr      s�   € ØÔ+Ñ+ÜÐ.¨u¨gÐ6Ó7Ð7Ü3JÈ5Ñ3QÑ0ÐÐ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                 ó¤  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } | j                   t        j
                  k7  rt        d| j                   › �«      ‚t        |||«       d|z  }t        j                  t        j                  | |z  «      |z   ||«      j	                  |«      S )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ó
ð 	
ô   	¨9°eÔ<à�e‘€IÜ�;‰;Ü�‰�E˜IÑ%Ó&¨Ñ3°YÀ	óç�bˆƒiðr   ÚMetac                 ó0  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } | j                   t        j
                  k7  rt        d| j                   › �«      ‚t        j                  | |¬«      S )Nr   ©r   )r   r   r    r!   r"   r#   r   Ú
empty_like©r   r   r   r   r   r   s         r   Úquantize_per_tensor_metar,   X   so   € ð ‡{�{”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                 ó  — |j                  «       dk7  rt        d|j                  «       › �«      ‚|j                  «       dk7  rt        d|j                  «       › �«      ‚t        | |j                  «       |j                  «       |||«      S ©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                 óì  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } |j                  «       dk7  rt        d|j                  «       › �«      ‚|j                  «       dk7  rt        d|j                  «       › �«      ‚| j                   t        j
                  k7  rt        d| j                   › �«      ‚t        j                  | |¬«      S )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                 óN  — |j                  «       dk7  rt        d|j                  «       › �«      ‚|j                  «       dk7  rt        d|j                  «       › �«      ‚t        | |j                  «       |j                  «       |j                  «       |j                  «       |«      S r.   r2   r+   s         r   Úquantize_per_tensor_tensor2r9   ³   sŸ   € ð  ×ÑÓ˜QÒÜØLÈZ×M]ÑM]ÓM_ÐL`Ðaó
ð 	
ð ‡{�{ƒ}˜ÒÜØGÈÏÉËÀÐWó
ð 	
ô ØØ�
‰
‹Ø�‰ÓØ�‰ÓØ�‰ÓØóð r   c                 ó"   — t        | |||||«      S ©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                óÔ   — | j                   |k7  rt        d|› d| j                   › �«      ‚|€t        j                  }|t        v r| j                  |«      |z
  |z  S t        d|› �«      ‚)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                óT   — |€t         j                  }t        j                  | |¬«      S ©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          	      ó  — |j                  «       dk7  rt        d|j                  «       › �«      ‚|j                  «       dk7  rt        d|j                  «       › �«      ‚t        | |j                  «       |j                  «       ||||¬«      S ©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                ó�  — |€t         j                  }|j                  «       dk7  rt        d|j                  «       › �«      ‚|j                  «       dk7  rt        d|j                  «       › �«      ‚| j                  |k7  rt        d|› d| j                  › �«      ‚|t
        v rt        j                  | |¬«      S t        d|› �«      ‚)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ó
ð 	
ð Ô'Ñ'Ü×Ñ ¨YÔ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          	      óR  — |j                  «       dk7  rt        d|j                  «       › �«      ‚|j                  «       dk7  rt        d|j                  «       › �«      ‚t        | |j                  «       |j                  «       |j                  «       |j                  «       ||¬«      S rI   rJ   rD   s          r   Údequantize_per_tensor_tensor2rO   ‰  s¢   € ð( ×ÑÓ˜QÒÜØLÈZ×M]ÑM]ÓM_ÐL`Ðaó
ð 	
ð ‡{�{ƒ}˜ÒÜØGÈÏÉËÀÐWó
ð 	
ô !ØØ�
‰
‹Ø�‰ÓØ�‰ÓØ�‰ÓØØôð r   c          	      ó&   — t        | ||||||¬«      S )Nr>   )rM   rD   s          r   Ú"dequantize_per_tensor_tensor2_metarQ   °  s    € ô -Øˆu�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           
      ó’  — | j                   t        j                  t        j                  t        j                  fvrt        d| j                   › �«      ‚|t        vr#t        dt        j                  «       › d|› �«      ‚t        ||«       t        j                  | «      \  }}t        |||||t        j                  |g«      d¬«      S )á[  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˜TÔ"ä—}‘} UÓ+Ñ€GˆWäØØØØØÜ�‰�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           
      ó°  — | j                   t        j                  t        j                  t        j                  fvrt        d| j                   › �«      ‚|t        vr#t        dt        j                  «       › d|› �«      ‚t        ||«       t        j                  | «      \  }}t        |||||t        j                  |g«      dt        j                  ¬«      S )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˜TÔ"ä—}‘} UÓ+Ñ€GˆWÜØØØØØÜ�‰�c�UÓØ#Ü×*Ñ*ô	ð 	r   c                 ó”  — | j                   t        j                  t        j                  t        j                  fvrt        d| j                   › �«      ‚||k\  rt        d|› d|› �«      ‚t        j                  dt        j                  | j                  ¬«      t        j                  dt        j                  | j                  ¬«      fS )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^Ð_ó
ð 	
ð �IÒÜØQÐR[ÐQ\Ð\bÐclÐbmÐnó
ð 	
ô �;‰;�q¤§¡°U·\±\ÔBÄEÇKÁKØ	”—‘ U§\¡\ôEð ð r   c                 óÂ   — t        j                  dt         j                  | j                  ¬«      t        j                  dt         j                  | j                  ¬«      fS )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                 ó–   — t        t        | j                  «       «      «      }d||<   ||d<   | j                  t	        |«      «      }||fS )Nr   )ÚlistÚrangeÚdimÚpermuteÚtuple)ÚxÚaxisÚnew_axis_listÚys       r   Ú_permute_to_axis_zerorz   G  sH   € Üœ˜qŸu™u›w›Ó(€MØ€M�$ÑØ€M�!ÑØ	�	‰	”%˜Ó&Ó'€AØˆmÐÐ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                 óä  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } | j                   t        j
                  k7  rt        d| j                   › �«      ‚|| j                  «       k\  rt        d| j                  «       › �«      ‚t        |||«       t        | |«      \  } }dg| j                  «       z  }|j                  d   |d<   |j                  |«      }|j                  |«      }t        j                  t        j                  | d|z  z  «      |z   ||«      }	|	j                  t        |«      «      }
|
j	                  |«      S )at  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  s2  € ð6 ‡{�{”u—}‘}¤e§n¡nÐ5Ñ5Ø—‘œŸ™Ó'ˆØ‡{�{”e—m‘mÒ#ÜØJÈ5Ï;É;È-ÐXó
ð 	
ð ˆu�y‰y‹{ÒÜÐ6°u·y±y³{°mÐDÓEÐEÜ 	¨9°eÔ<Ü4°U¸DÓAÑ€EÐà��e—i‘i“kÑ!€IØ—<‘< ‘?€Iˆa�LØ�[‰[˜Ó#€FØ×"Ñ" 9Ó-€Kä
�+‰+Ü�‰�E˜S 6™\Ñ*Ó+¨kÑ9¸9Àió€Cð �+‰+”eÐ-Ó.Ó
/€CØ�6‰6�%‹=Ðr   c                 ó¨  — | j                   t        j                  t        j                  fv r| j	                  t        j
                  «      } | j                   t        j
                  k7  rt        d| j                   › �«      ‚|| j                  «       k\  rt        d| j                  «       › �«      ‚t        |||«       t        j                  | |¬«      S )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ó
ð 	
ð ˆu�y‰y‹{ÒÜÐ6°u·y±y³{°mÐDÓEÐEÜ 	¨9°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                ó  — | j                   |k7  rt        d|› d| j                   › �«      ‚|€t        j                  }|| j	                  «       k\  rt        d| j	                  «       › �«      ‚t        |||«       t        | |«      \  } }dg| j	                  «       z  }	|j                  d   |	d<   |j                  |	«      }|�| |j                  |	«      z
  |z  }
n| |z  }
|
j                  |«      }
|
j                  t        |«      «      }|S )a›  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ˆ	Øˆu�y‰y‹{ÒÜÐ6°u·y±y³{°mÐDÓEÐEÜ 	¨9°eÔ<Ü4°U¸DÓAÑ€EÐà��e—i‘i“kÑ!€IØ—<‘< ‘?€Iˆa�LØ�[‰[˜Ó#€FØÐØ�{×'Ñ'¨	Ó2Ñ2°fÑ<‰à�f‰nˆà
�&‰&�Ó
€Cà
�+‰+”eÐ-Ó.Ó
/€CØ€Jr   c                ó   — | j                   |k7  rt        d|› d| j                   › �«      ‚|€t        j                  }|| j	                  «       k\  rt        d| j	                  «       › �«      ‚t        |||«       t        j                  | |¬«      S )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ˆ	Øˆu�y‰y‹{ÒÜÐ6°u·y±y³{°mÐDÓEÐEÜ 	¨9°eÔ<Ü×Ñ˜E¨Ô3Ð3r   zLchoose_qparams_per_token(Tensor input, ScalarType dtype) -> (Tensor, Tensor)Úchoose_qparams_per_tokenc                 óp  — | j                  «       j                  dd¬«      }|j                  t        j                  k(  r|j                  «       }|t        j                  k(  rd}d|dz
  z  dz
  }nt        d|› �«      ‚|j                  d¬	«      j                  |«      }t        j                  |«      }||fS )
á  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                 óú   — t        | j                  d d «      dgz   }t        j                  |t        j                  | j
                  ¬«      t        j                  |t        j                  | j
                  ¬«      fS ©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                 óê  — d\  }}t        j                  | dd¬«      }t        j                  | dd¬«      }t        j                  |t        j                  |«      «      }t        j
                  |t        j                  |«      «      }t        j                  t         j                  «      j                  }||z
  t        ||z
  «      z  }	|	j                  |¬«      }	||	z  }
||	z  }||
z   }||z   }t        j                  ||z   dkD  ||
z
  ||z
  «      }t        j                  |||«      j                  «       }|	j                  t         j                  «      |j                  t         j                  «      fS )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  sC  € ð, �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ð ˜;Ñ&¬%°°t±Ó*<Ñ<€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                 ó   — t        | |«      S r;   )r¦   ©r   r   s     r   rµ   rµ   v  s   € ô 5°U¸EÓBÐBr   c                 óú   — t        | j                  d d «      dgz   }t        j                  |t        j                  | j
                  ¬«      t        j                  |t        j                  | j
                  ¬«      fS r    r¡   r¢   s      r   Ú(choose_qparams_per_token_asymmetric_metar¹   ‚  r¥   r   c                 ó*  — t        j                  t        | j                  «       «      d d «      }||j	                  «       k7  rt        d|› d|j                  «       › �«      ‚||j	                  «       k7  rt        d|› d|j                  «       › �«      ‚y )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Ø�V—\‘\“^Ò#Ü˜|¨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                 óÚ   — t        |||«       t        | ||«       | j                  d|z  «      j                  |«      j	                  «       j                  ||«      j                  |«      } | S )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¿   ¡  s^   € ô6   	¨9°eÔ<Ü% e¨V°[ÔAà�	‰	�#˜‘,Óß	‰ˆ[Ó	ß	‰‹ß	‰ˆy˜)Ó	$ß	‰ˆE‹ð 
ð €Lr   c                 óJ   — t        |||«       t        j                  | |¬«      S rF   ©r   r   r*   rÃ   s         r   Úquantize_per_token_metarÆ   È  s#   € ô   	¨9°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                 ó8   — | |z
  } | |z  } | j                  |«      S )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 �KÑ€EØ�F‰N€Eà�8‰8�LÓ!Ð!r   c                 óJ   — t        |||«       t        j                  | |¬«      S rF   rÅ   rÊ   s          r   Údequantize_per_token_metarÌ   ý  s#   € ô   	¨9°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                 ó”  — |dk  rt        d«      ‚|| j                  d   kD  r!|j                  d   dk(  r| j                  d   }| j                  d   |z  dk7  rt        d«      ‚| j                  «       dk7  rt        d«      ‚| j                  d|«      }t	        j
                  |«      j                  «       dk7  rt        d«      ‚|j                  dd«      }|j                  dd«      }|j                  d	|z  «      j                  |«      j                  «       j                  ||«      j                  |«      j                  | «      }|S )
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à�E—K‘K ‘OÒ#¨¯©°RÑ(8¸AÒ(=Ø—[‘[ ‘_ˆ
à‡{�{�2�˜Ñ# qÒ(ÜÐNÓOÐOØ‡y�yƒ{�aÒÜÐ:Ó;Ð;ð �}‰}˜R Ó,€HÜ‡{�{�8Ó× Ñ Ó" aÒ'ÜÐ=Ó>Ð>à�^‰^˜B Ó"€FØ×%Ñ% b¨!Ó,€Kð 	�‰�S˜6‘\Ó"ß	‰ˆ[Ó	ß	‰‹ß	‰�	˜9Ó	%ß	‰ˆE‹ß	‰�EÓ	ð ð Ðr   c                 ó2  — |dk  rt        d«      ‚|| j                  d   kD  r!|j                  d   dk(  r| j                  d   }| j                  d   |z  dk7  rt        d«      ‚| j                  «       dk7  rt        d«      ‚t        j                  | |¬«      S )	aX  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à�E—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                 óV  — |dk  rt        d«      ‚|| j                  d   kD  r!|j                  d   dk(  r| j                  d   }| j                  d   |z  dk7  rt        d«      ‚| j                  «       dk7  rt        d«      ‚| j                  d|«      }|j                  dd«      }|�|j                  dd«      }	n0t	        j
                  g t        j                  |j                  ¬«      }	|j                  |	«      j                  |«      j                  | «      j                  |«      }
|
S )	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à�F—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                   ó,   — e Zd Zed„ «       Zed„ «       Zy)ÚFakeQuantPerChannelc                 ó,  — |j                   t        j                  k7  r|j                  t        j                  «      }|j                   t        j                  k7  r|j                  t        j                  «      }|j                   t        j                  k7  rt        d|j                   › �«      ‚||j                  «       k\  rt        d|j                  «       › �«      ‚t        t        |«      «      t        t        |dz   |j                  «      «      z   }t        ||«      }t        ||«      }	t        j                  |d|z  z  «      |	z   }
t        j                  |
||«      |	z
  |z  }t        j                  |
|k\  |
|k  «      }| j                  |«       |S )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   ÚforwardzFakeQuantPerChannel.forwardª  sO  € ð �<‰<œ5Ÿ=™=Ò(Ø—Y‘YœuŸ}™}Ó-ˆFØ×Ñ¤§¡Ò+Ø%Ÿ.™.¬¯©Ó5ˆKØ�;‰;œ%Ÿ-™-Ò'Ü ØNÈuÏ{É{ÈmÐ\óð ð �5—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˜˜i¨Ó3Ð6KÑKØñˆô × Ñ  $¨)Ñ"3°t¸yÑ7HÓJˆà×Ñ˜dÔ#Øˆ
r   c                 ó4   — | j                   \  }||z  d d d d d fS r;   )Úsaved_tensors)rì   Úgyrñ   s      r   ÚbackwardzFakeQuantPerChannel.backwardÃ  s(   € ð ×#Ñ#‰ˆØ�D‰y˜$  d¨D°$Ð6Ð6r   N)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodrò   rö   © r   r   rç   rç   ©  s(   „ Øñó ðð. ñ7ó ñ7r   rç   Úfake_quant_per_channelÚAutogradc                 ó6   — t         j                  | |||||«      S r;   )rç   Úapply©r   r|   r}   rw   r   r   s         r   rü   rü   Ê  s$   € ô ×$Ñ$Øˆv�{ D¨)°Yóð r   c                 ó,   — t        j                  | «      S 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                 ój   — t         j                  j                  j                  j	                  | |«      S r;   )r   ÚopsÚprimsÚconvert_element_typeÚdefaultr·   s     r   r  r  é  s%   € ô �9‰9�?‰?×/Ñ/×7Ñ7¸¸uÓEÐEr   c                 ó0   — t        j                  | |¬«      S 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öØ45€Aˆˆ�‰�A‹×Ñ˜K˜EŸK™K¨›N×.Ñ.Ð/Ñ/òÐ ð × Ñ ØDQÖR¸q€Q‰ˆ[ˆU�[‰[˜‹^×ÑÓ	 ¡# k e§k¡k°!£n×&8Ñ&8Ó"9Ð:Ñ:Ò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 v1ÃAv6