ó
    EñiJW ã                   ó†  • S SK r S SKrS SKJr  S SKrS SKJr  S SKJrJ	r	J
r
  S SKJrJrJr  S SKJrJrJr  S SKJr  S SKJrJr  S S	KJr  S S
KJrJr  S SKJrJrJ r J!r!J"r"  S SK#J$r$  S SK%J&r&J'r'  S SK(J)r)  SSK*J+r+J,r,  SSK-J.r.J/r/  SSK0J1r1J2r2  SSK3J4r4  SSK5J6r6J7r7J8r8J9r9  SSK:J;r;J<r<J=r=  SSK>J?r?J@r@JArAJBrBJCrCJDrDJErEJFrFJGrGJHrHJIrIJJrJJKrK  / SQrL\M\N\Rž                  S/rP\R¢                  \R¤                  \R¦                  \R¨                  \Rª                  \R¬                  \R®                  \R°                  \R²                  \R´                  /
r[\
R¸                  " \Rœ                  S9r]\R¼                  R¾                  RÀ                  RÂ                  RÄ                  \R¼                  R¾                  RÀ                  RÂ                  RÄ                  S.rc\R¼                  R¾                  RÀ                  RÈ                  RÄ                  \R¼                  R¾                  RÀ                  RÈ                  RÄ                  S.re SiS\S\OS\S\OS\OS\OS \O4S! jjrfS"\'S#\g\h\RÒ                  RÔ                  4   S \O4S$ jrkS%\	S-  S \l\RÚ                  S-  \O4   4S& jrnS'\)S"\'S(\S)\S*\S \O4S+ jroS"\'S(\S)\S \O4S, jrpS S-KJqrq  S S.K#J'r'  \q\l\'\'4   \'-  S4   rrS"\'S#\g\h\RÒ                  RÔ                  4   S/\g\r\	4   4S0 jrsS1\"S-  S2\t\'   S-  S(\S*\S \O4
S3 jruS"\'S#\g\h\RÒ                  RÔ                  4   S4\.S5\S6\S-  S \l\\l\S74   \.\S-  4   4S8 jrvS9\RÒ                  RÔ                  S:\g\"\w\RÒ                  RÔ                     4   S S4S; jrxS2\!S<\y\h   4S= jrz SjS"\'S%\	S>\RÒ                  RÔ                  S#\g\h\RÒ                  RÔ                  4   S?\&S@\Rö                  S-  S \'4SA jjr|S2\!SB\'S(\SC\=S-  S*\S#\g\h\RÒ                  RÔ                  4   SD\g\'\O4   SE\y\'   S S4SF jr}S"\'S(\SC\=S-  S#\g\h\RÒ                  RÔ                  4   S*\SD\g\'\O4   S \g\h\4   4SG jr~S'\'S#\g\h\RÒ                  RÔ                  4   S/\g\r\	4   SH\OS \	S-  4
SI jrS'\'S#\g\h\RÒ                  RÔ                  4   S/\g\r\	4   SH\OS \RÚ                  S-  4
SJ jr€S'\'S"\'S#\g\h\RÒ                  RÔ                  4   S/\g\r\	4   SH\OS \	S-  4SK jr�  SkS"\'\-  S'\)S(\S>\RÒ                  RÔ                  S#\g\h\RÒ                  RÔ                  4   S?\&SC\=S-  S4\.S/\g\r\	4   SH\OS*\S-  S@\Rö                  S-  S \)4SL jjr‚  SkS"\'S(\S>\RÒ                  RÔ                  S#\g\h\RÒ                  RÔ                  4   S?\&SC\=S-  S4\.S/\g\r\	4   SH\OS*\S-  S@\Rö                  S-  S S4SM jjrƒS"\'SN\S>\RÒ                  RÔ                  S#\g\h\RÒ                  RÔ                  4   S?\&SO\OS S4SP jr„S"\'S>\RÒ                  RÔ                  S#\g\h\RÒ                  RÔ                  4   S?\&S/\g\r\	4   SH\OS \'S-  4SQ jr…SR\'S>\RÒ                  RÔ                  S#\g\h\RÒ                  RÔ                  4   S?\&S/\g\r\	4   SH\OS S4SS jr†S"\'ST\RÚ                  \w-  SU\g\h\24   S S4SV jr‡S?\&SU\g\h\24   S S4SW jrˆS"\'S>\RÒ                  RÔ                  S#\g\h\RÒ                  RÔ                  4   S \O4SX jr‰S"\'S>\RÒ                  RÔ                  S#\g\h\RÒ                  RÔ                  4   4SY jrŠS"\'S(\S#\g\h\RÒ                  RÔ                  4   S4\.4SZ jr‹S>\$SU\g\h\24   S[\g\h\4   S4\.S\\g\h\4   S*\S]\y\h   SH\OS \'S-  4S^ jrŒS>\RÒ                  RÔ                  SH\OS#\g\h\RÒ                  RÔ                  4   SU\S4\.S*\S S4S_ jr�S`\$S[\g\h\4   Sa\g\h\l\h\w4   4   S4\.Sb\g\h\4   Sc\SH\OS]\y\h   S S4Sd jrŽ    SlS>\$Sc\\g\h\4   -  SH\OSa\g\h\l\h\w4   4   Se\l\S74   S4\.\g\h\4   -  S-  Sf\\g\h\4   -  S-  S*\\g\h\4   -  S-  Sg\OS \$4Sh jjr�g)mé    N)ÚAny)Ú
FakeTensor)ÚObserverBaseÚObserverOrFakeQuantizeÚPlaceholderObserver)ÚBackendConfigÚDTypeConfigÚget_native_backend_config)Ú&get_fusion_pattern_to_root_node_getterÚget_module_to_qat_moduleÚget_pattern_to_dtype_configs)Ú_is_activation_post_process)Ú_is_reuse_input_qconfigÚ
QConfigAny)ÚQConfigMapping)ÚconvertÚpropagate_qconfig_)Ú_parent_nameÚget_qconfig_dtypesÚget_swapped_custom_module_classÚNodePatternÚPattern)ÚGraphModule)ÚGraphÚNode)ÚArgumenté   )Úis_equalization_observerÚnode_supports_equalization)ÚPrepareCustomConfigÚStandaloneModuleConfigEntry)Ú_find_matchesÚ_MatchResultWithQConfig)Ú_sorted_patterns_dict)Ú_generate_node_name_to_qconfigÚ_get_flattened_qconfig_dictÚ_update_qconfig_for_fusionÚ_update_qconfig_for_qat)Ú_default_root_node_getterÚ!_get_pattern_to_quantize_handlersÚQuantizeHandler)Ú3_insert_dequant_stubs_for_custom_module_lstm_outputÚ_is_custom_module_lstmÚ+_maybe_get_custom_module_lstm_from_node_argÚ+_qconfig_satisfies_dtype_config_constraintsÚall_node_args_have_no_tensorsÚassert_and_get_unique_deviceÚget_custom_module_class_keysÚget_new_attr_name_with_prefixÚ(get_non_observable_arg_indexes_and_typesÚnode_arg_is_biasÚnode_arg_is_weightÚNON_QUANTIZABLE_WEIGHT_OPSÚObservedGraphModuleAttrs)Úinsert_observers_for_modelÚprepareÚ propagate_dtypes_for_known_nodes©Údtype©Úinput_act_obs_or_fq_ctrÚoutput_act_obs_or_fq_ctrÚprev_output_dtypeÚprev_output_is_dynamicÚcur_target_dtypeÚcur_target_is_dynamicÚreuse_input_obs_or_fqÚis_zeroth_argÚreturnc                 óà   • U(       a/  U[         ;  a  [        SU 35      eU [        ;   a  [        S5      eU$ U(       a  gU[         ;   a&  U [         [        R                  /-   ;   =(       a    X :g  $ g)a·  
note: we will treat "not specified" as torch.float for now
utility function that checks if we should insert an observer or fake quant node
base on the requested dtype for the nodes from user

is_zeroth_arg: we only dynamically quantize the first arg of the node right now
  this should be removed when we enable configuring dynamic quantization
  for a specific argument, this can be removed if we deprecate fx graph mode
  quantization

z6Expected cur_target_dtype to be torch.float, but got: z7prev_output_dtype must not be in _DO_NOT_OBS_DTYPE_LISTF)Ú_OBS_DTYPE_LISTÚAssertionErrorÚ_DO_NOT_OBS_DTYPE_LISTÚtorchÚfloat)rA   rB   rC   rD   rE   rF   s         Ú]/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/ao/quantization/fx/prepare.pyÚ_needs_obs_or_fqrO   k   s�   € ö, Ø¤?Ó2Ü ØHÐIYÐHZÐ[óð ð Ô 6Ó6Ü ØIóð ð ÐÞØàœ?Ó*à¤´E·K±K°=Ñ!@Ñ@÷ 6Ø Ñ5ð	
ð ó    ÚnodeÚnamed_modulesc                 óÆ   • [        U [        R                  R                  5      =(       a7    U R                  S:H  =(       a!    [        U[        U R                  5         5      $ )NÚcall_module)Ú
isinstancerL   Úfxr   Úopr   ÚstrÚtarget)rQ   rR   s     rN   Ú _is_activation_post_process_noderZ   ˜   sI   € ô 	�4œŸ™Ÿ™Ó'÷ 	IØ�G‰G�}Ñ$÷	Iä'¨´c¸$¿+¹+Ó6FÑ(GÓHðrP   Ú	obs_or_fqc                 ó<   • U c  gU R                   [        U SS5      4$ )z_Given a constructor for observer or fake quant module, returns
a Tuple of dtype and is_dynamic
)NFÚ
is_dynamicF)r=   Úgetattr)r[   s    rN   Ú_get_dtype_and_is_dynamicr_   ¢   s%   € ð ÑØà�‰¤¨	°<ÀÓ GÐGÐGrP   ÚargÚqconfigÚdtype_configÚbackend_configc                 óü  ^^^^• [        U [        [        45      (       a  [        UUUU4S jU  5       5      $ [        U [        5      (       d  g[        TU 5      n[        TU 5      nU(       + =(       a    U(       + nU(       a¤  TR                  S   R                  S5      nU(       a  U" 5       OSn	[        U	5      u  p«TR                  SL =(       dT    TR                  U
:H  =(       a>    [        TR                  5      [        U5      :H  =(       a    [        TTR                  5      $ U(       ax  TR                  S   R                  SS5      nU(       a  U" 5       OSn[        U5      u  pïTR                  nUU:H  n[        TTR                   SS9nUSL =(       d    U=(       a    U$ TR                  S   R                  S	S5      nU(       a  U" 5       OSn[        U5      u  nnTR"                  nUSL =(       d    UU:H  $ )
zTCheck if the configured qconfig for the argument
is supported by the backend or not
c              3   óB   >#   • U  H  n[        UTTTT5      v •  M     g 7f©N)Ú(_is_input_arg_dtype_supported_by_backend)Ú.0Úarc   rb   rQ   ra   s     €€€€rN   Ú	<genexpr>Ú;_is_input_arg_dtype_supported_by_backend.<locals>.<genexpr>º   s5   øé € ð 

ò �ô 5àØØØØ÷ð ò ùs   ƒTÚtarget_dtype_infor?   NÚweight_obs_or_fq_ctrF)Úis_activationÚbias_obs_or_fq_ctr)rU   ÚlistÚtupleÚallr   r6   r5   ÚmetaÚgetr_   Úinput_dtypeÚboolr]   r/   Úinput_dtype_with_constraintsÚweight_dtypeÚweight_dtype_with_constraintsÚ
bias_dtype)r`   rQ   ra   rb   rc   Ú	is_weightÚis_biasrn   r?   Úinput_act_obs_or_fqÚqconfig_dtypeÚqconfig_is_dynamicrm   Úweight_obs_or_fqÚqconfig_weight_dtypeÚ_Úbackend_config_weight_dtypeÚdtype_matchesÚqconfig_satisfies_constraintsro   Úbias_obs_or_fqÚqconfig_bias_dtypeÚbackend_config_bias_dtypes    ````                  rN   rg   rg   ¯   s	  û€ ô �#œœe�}×%Ñ%Ü÷ 

ñ ó

ó 

ð 
	
ô �cœ4× Ñ Øä" 4¨Ó-€IÜ˜t SÓ)€GØ!”M×1¨'¤k€MÞØ"&§)¡)Ð,?Ñ"@×"DÑ"DØ%ó#
Ðö *AÑ#Ô%Àdð 	ô -FØó-
Ñ)ˆð
 ×(Ñ(¨DÐ0÷ 
Ø×$Ñ$¨Ñ5÷ Ü�\×,Ñ,Ó-´Ð6HÓ1IÑI÷ä;Ø˜×BÑBóð	
ö 
à#Ÿy™yÐ)<Ñ=×AÑAØ" Dó 
Ðö 6JÑ/Ô1ÈtÐÜ";Ð<LÓ"MÑÐØ&2×&?Ñ&?Ð#Ø,Ð0KÑKˆÜ(SØ�\×?Ñ?Èuñ)
Ð%ð +¨dÐ2÷ 
Ø×;Ð;ð	
ð
 "ŸY™YÐ':Ñ;×?Ñ?Ø  $ó
Ðö 2DÑ+Ô-ÈˆÜ 9¸.Ó IÑÐ˜AØ$0×$;Ñ$;Ð!à%¨Ð-÷ ?Ø!Ð%>Ñ>ð	
rP   c                 ó*  • UR                   nSnU R                  S   R                  S[        5      nU(       a  U" 5       OSn[	        U5      u  pGU(       a  [
        R                  nXC:H  n[        XR                  5      n	USL =(       d    U=(       a    U	$ )zRCheck if the configured qconfig for the output
is supported by the backend or not
Nrl   r@   )	Úoutput_dtypers   rt   Ú_DEFAULT_FP32_OBS_OR_FQ_CTRr_   rL   Úfloat32r/   Úoutput_dtype_with_constraints)
rQ   ra   rb   Úbackend_config_output_dtypeÚqconfig_output_dtyper@   Úoutput_act_obs_or_fqÚqconfig_output_is_dynamicr„   r…   s
             rN   Ú%_is_output_dtype_supported_by_backendr’   û   s§   € ð #/×";Ñ";Ðð  ÐØ#Ÿy™yÐ)<Ñ=×AÑAØ"Ô$?ó Ðö '?Ñ Ô"ÀDð ô 7PØó7Ñ3Ðö !Ü$Ÿ}™}ÐØ(ÑG€MÜ$OØ×;Ñ;ó%Ð!ð '¨$Ð.÷ Ø×7Ð7ðrP   )Ú	Annotated)r   Úobs_or_fq_mapc                 ó  • [        XX#5      n[        U R                  5      S:”  ad  [        U R                  S   [        5      (       aB  U[
        R                  [
        R                  4;   a  U R                  S   R                  S:X  a  gg)zÃCheck if observer in same graph
when the node output is not fp32 and input is 'placeholder'
the input is assumed to be quantized, so it is observed
in a different place rather than not observed.
r   ÚplaceholderFT)	Ú_get_arg_target_dtype_as_outputÚlenÚargsrU   r   rL   Úquint8Úuint8rW   )rQ   rR   r”   Úis_qatÚnode_output_dtypes        rN   Ú_is_observer_in_same_graphrž   (  si   € ô 8Ø˜]óÐô ˆ4�9‰9ƒ~˜Óœj¨¯©°1©´t×<Ñ<à¤%§,¡,´·±Ð!<Ó<Ø—	‘	˜!‘—‘ =Ó0àØrP   ÚpatternÚmatched_node_patternc           	      óä  • Ub  U c  gUb  [        U5      S:  a  [        S5      e[        U5      nUR                  U / 5      n[	        U5      nUR                  U [
        5      nU" U5      nUn	US   n
U Hy  nSn[        U	R                  5      [        U	R                  R                  5       5      -    H  nU=(       a    [        XÙX+U5      nM     U=(       a    [        X¢U5      nU(       d  My    g   g)z­Check if the dtype configuration of a pattern is supported by
the backend or not, and whether the qconfig satisfies constraints
specified in the corresponding dtype config.
Tr   z&matched_node_pattern must be non-emptyr   F)r˜   rJ   r   rt   r   r)   rp   r™   ÚkwargsÚvaluesrg   r’   )rŸ   r    ra   rc   Úpattern_to_dtype_configsÚdtype_configsÚpattern_to_root_node_getterÚroot_node_getterÚ	root_nodeÚ
input_nodeÚoutput_noderb   Ú	supportedr`   s                 rN   Ú9_is_pattern_dtype_config_and_qconfig_supported_by_backendr¬   ?  s  € ð Ñ ¡ØØÑ#¤sÐ+?Ó'@À1Ó'DÜÐEÓFÐFÜ;¸NÓKÐØ'?×'CÑ'CÀGÈRÓ'P€MÜ"HÈÓ"XÐà2×6Ñ6ØÔ*óÐñ !Ð!5Ó6€IØ€JØ& qÑ)€KÛ%ˆàˆ	Ü˜
Ÿ™Ó(¬4°
×0AÑ0A×0HÑ0HÓ0JÓ+KÔKˆCØ!÷ Ô&NØ ¸ó'ŠIñ Lð
 ÷ 
Ô"GØ ,ó#
ˆ	÷ ˆ9Ùñ &ð rP   Úprepare_custom_configÚparent_qconfigÚparent_backend_config.c                 óª  • [        U R                  5      n[        X   5      n[        SSSS5      nUR                  R                  Xg5      nUR                  R                  XW5      nUR                  =(       d    [        5       R                  U5      nUR                  n	UR                  =(       d
    [        5       nUR                  =(       d    Un
X‰X*4$ )z™
Returns the standalone module QConfigMapping and PrepareCustomConfig
for `node`, assuming that the module pointed to by `node` is
a standalone modules.
N© )rX   rY   Útyper!   Ústandalone_module_classesrt   Ústandalone_module_namesÚqconfig_mappingr   Ú
set_globalÚexample_inputsr­   r    rc   )rQ   rR   r­   r®   r¯   Úmodule_nameÚmodule_typeÚconfig_entryrµ   r·   rc   s              rN   Ú_get_standalone_module_configsr»   g  sÇ   € ô �d—k‘kÓ"€KÜ�}Ñ1Ó2€Kä.¨t°R¸¸tÓD€LØ(×BÑB×FÑFØó€Lð )×@Ñ@×DÑDØó€Lð #×2Ñ2÷ ´nÓ6F×6QÑ6QØó7€Oð "×0Ñ0€NØ(×>Ñ>×WÔBUÓBWÐØ!×0Ñ0×IÐ4I€NØÐ-BÐSÐSrP   ÚrootÚmodule_to_qat_modulec                 ó   • [        XSSS9  g )NTF)ÚmappingÚinplaceÚremove_qconfig)r   )r¼   r½   s     rN   Ú_qat_swap_modulesrÂ   ‡  s   € ô ˆD¸ÈUÓSrP   Úsc                 óÆ   • [        U [        5      (       a  UR                  U R                  5        g [        U [        [
        45      (       a  U  H  n[        X!5        M     g g rf   )rU   r   ÚaddÚnamerp   rq   Ú_add_matched_node_name_to_set)r    rÃ   Ú
maybe_nodes      rN   rÇ   rÇ   �  sL   € ÜÐ&¬×-Ñ-Ø	�‰Ð"×'Ñ'Õ(Ü	Ð(¬4´¨-×	8Ñ	8Û.ˆJÜ)¨*Ö8ò /ð 
9rP   ÚmodelÚgraphÚmodel_devicec                 ó\  • Uc  [        U5      nU(       a  UR                  U5        [        U5      (       a  U R                  S-   nOSn[	        U5      nU" U5      n[        X(U5        XU'   UR                  U 5         UR                  SX€40 5      n	SSS5        U	$ ! , (       d  f       W	$ = f)z¡
Attaches `obs_or_fq` to `model`, and creates a node which calls
`obs_or_fq` on the output of `node`.

obs_or_fq: an instance of Observer or FakeQuantize module
NÚ_equalization_process_Úactivation_post_process_rT   )r1   Útor   rÆ   r3   ÚsetattrÚinserting_afterÚcreate_node)
rQ   r[   rÉ   rR   rÊ   rË   ÚprefixÚget_new_obs_or_fq_nameÚobs_or_fq_nameÚnew_obss
             rN   Ú_insert_obs_or_fqr×   •  s¥   € ð ÑÜ3°EÓ:ˆÞØ�‰�\Ô"ä 	×*Ñ*Ø—‘Ð5Ñ5‰à+ˆÜ:¸6ÓBÐÙ+¨EÓ2€NÜˆE 9Ô-Ø$-�.Ñ!Ø	×	Ñ	˜tÕ	$Ø×#Ñ# M°>À7ÈBÓOˆ÷ 
%à€N÷ 
%Ô	$à€Nús   Á=BÂ
B+Ú	last_nodeÚqhandlerÚcache_for_no_tensor_checkÚprocessed_nodesc                 óT  • [        U [        [        45      (       a  U  H  n[        UUUUUUUU5        M     g[        U [        5      (       a\  [        U [        5      (       d  [        S5      eU n	X—;   a  gUR                  U	5        Uc  g[        U	UUUUU5      n
X©R                  S'   gg)zˆSets the target_dtype_info for each node in matched_node_pattern
Note: processed_nodes is used to ensure we only process each node once
z#matched_node_pattern must be a NodeNrl   )	rU   rp   rq   Ú/_set_target_dtype_info_for_matched_node_patternr   rJ   rÅ   Ú%_get_target_activation_dtype_for_noders   )r    rØ   ra   rÙ   rc   rR   rÚ   rÛ   Únode_patternrQ   rl   s              rN   rÝ   rÝ   µ  sÂ   € ô Ð&¬¬u¨×6Ñ6Û0ˆLÜ;ØØØØØØØ)Øö	ò 1ô 
Ð(¬$×	/Ñ	/äÐ.´×5Ñ5Ü Ð!FÓGÐGØ#ˆØÓ"ØØ×Ñ˜DÔ!à‰?Øô -RØØØØØØ%ó-
Ðð *;�	‰	Ð%Ò&ð3 
0rP   c           
      óê  • [        XU5      nU(       a  SSS.$ UGb¾  [        U5      u  pxn	U[        R                  :X  a+  U[        R                  :X  a  U	(       d  [        R                  O[        R                  n
USL=(       a    UR                  5       nUSL=(       a    UR                  5       nSn[        U [        5      (       a\  U R                  S:X  aL  U R                  UR                  ;   a2  UR                  U R                     R                  R                  S5      nSn[        U [        5      (       a\  U R                  S:X  aL  U R                  UR                  ;   a2  UR                  U R                     R                  R                  S5      nUR                  UR                  [         R"                  " U
S9UUUR                  [%        U5      UUS.	$ [&        R&                  " [(        5      $ )aü  
For each op attribute in the op's input activation, output activation,
weight, bias - returns the settings of dtype and is_dynamic we expect
for the `quantize` call in the reference model representation, or None
if there is no `quantize` call needed.

For example, if we have a node corresponding to `op0` in

  x0 -> op0 -> x1

And we want a reference quantized representation to be

  x0 -> quant_static -> dequant -> op0 -> quant_dynamic -> dequant -> x1

Then this function will return

  {
    "input_act_obs_or_fq_ctr": MinMaxObserver.with_args(dtype=torch.quint8, is_dynamic=False),
    "output_act_obs_or_fq_ctr": MinMaxObserver.with_args(dtype=torch.quint8, is_dynamic=False),
  }

TODO(future PR, if needed): explicitly spell out the non-Tensor
dtypes.
Nr>   Úcall_functionÚweightÚbiasr<   )	r?   rm   ro   Úweight_indexÚ
bias_indexr@   rE   Úinput_output_share_observersÚ_is_standalone_module)r0   r   rL   Úfloat16rM   Úis_general_tensor_value_opÚis_standalone_modulerU   r   rW   rY   Ú!_pattern_complex_format_to_configÚ_input_type_to_indexrt   Ú
activationrâ   r   Ú	with_argsr   ÚcopyÚ+_DEFAULT_FP32_QCONFIG_FOR_TARGET_DTYPE_INFO)rQ   ra   rÙ   rR   rc   rÚ   Úargs_have_no_tensorsÚ	act_dtyperx   Úinput_act_is_dynamicrz   ré   rç   rä   rå   s                  rN   rÞ   rÞ   í  sº  € ô@ 9ØÐ6óÐö à'+Ø(,ñ
ð 	
ð
 ÒÜ8JÈ7Ó8SÑ5ˆ	Ð!5ð œUŸ]™]Ó*Ø ¤E§M¡MÓ1Þ-ô	 �MŠMô —‘ð 	ð ˜DÐ ×J X×%HÑ%HÓ%Jð 	#ð !)°Ð 4× X¸×9VÑ9VÓ9XÐàˆä�tœT×"Ñ"Ø—‘˜?Ó*Ø—‘˜~×OÑOÓOà)×KÑKØ—‘ñç"Ñ"§3¡3 x£=ð ð ˆ
ä�tœT×"Ñ"Ø—‘˜?Ó*Ø—‘˜~×OÑOÓOà'×IÑIØ—‘ñç"Ñ"§3¡3 v£;ð ð
 (/×'9Ñ'9Ø$+§N¡NÜ"5×"?Ò"?ÀjÑ"QØ(Ø$Ø(/×(:Ñ(:Ü%<¸WÓ%EØ,FØ%:ñ

ð 
	
ô �9Š9Ô@ÓAÐArP   rœ   c                 ó²  • [        U [        5      (       d  [        S5      eSU R                  ;   a  [	        S5      e[        X5      nSnUb&  UR                  S   S   nU(       a	  U" 5       nU$ SnU$ [        X5      (       a‹  U R                  S   n[        U[        5      (       d  [        S5      eSUR                  ;   a  [	        S5      eSUR                  ;  a  [        S	5      eUR                  S   S   nU(       a	  U" 5       nU$ SnU$ SU R                  ;   a$  U R                  S   R                  S[        5      nO[        nU(       a  U" 5       OSnU$ )
a/  Get the constructor for observer or fake quant object for
the argument in the original graph as the output of previous node,
skipping inserted observers

We are assuming that the observers are inserted correctly, and the dtype for
argument in quantized graph will match what is specified by the qconfig
úarg must be a NodeÚquantization_annotationúMPlease use torchao (https://github.com/pytorch/ao) for pt2e quantization flowNrl   r@   r   z(Currently we only support observing Nodez1expected 'target_dtype_info' in observed_arg.meta)
rU   r   rJ   rs   ÚNotImplementedErrorr.   rZ   r™   rt   r‹   )r`   rR   r”   rœ   Úcustom_module_lstm_noder@   r�   Úobserved_args           rN   Ú_get_output_act_obs_or_fqrû   R  s¥  € ô �cœ4× Ñ ÜÐ1Ó2Ð2à  C§H¡HÓ,Ü!Ø[ó
ð 	
ô JØóÐð  $ÐØÑ*Ø#:×#?Ñ#?Ð@SÑ#TØ&ñ$
Ð ö +CÑ$Ó&ð 	ð@  Ðð? IMð 	ð@  Ðô; 
*¨#×	=Ñ	=Ø—x‘x ‘{ˆÜ˜,¬×-Ñ-Ü Ð!KÓLÐLà$¨×(9Ñ(9Ó9Ü%Ø_óð ð  l×&7Ñ&7Ó7Ü Ð!TÓUÐUØ#/×#4Ñ#4Ð5HÑ#IØ&ñ$
Ð ö +CÑ$Ó&ð 	ð  Ðð IMð 	ð  Ðð  #§(¡(Ó*Ø'*§x¡xÐ0CÑ'D×'HÑ'HØ*Ô,Gó(Ñ$ô (CÐ$æ*BÑ$Ô&Èð 	ð  ÐrP   c                 ó8   • [        XX#5      n[        U5      u  pVU$ rf   )rû   r_   )r`   rR   r”   rœ   Úarg_as_output_act_obs_or_fqÚarg_as_output_target_dtyper‚   s          rN   r—   r—   —  s/   € ô #<Ø˜Mó#Ðô %>Ø#ó%Ñ!Ðð &Ð%rP   c                 ó  • [        U [        5      (       d  [        S5      eSUR                  ;   a  [	        S5      e[        X5      n[        X5      nU(       + =(       a    U(       + nSnU(       a$  UR                  S   R                  S[        5      nObU(       a8  UR                  [        ;  a#  UR                  S   R                  S[        5      nO#UR                  S   R                  S[        5      nU(       a  U" 5       $ S$ )	z[Get the observer or fake quant constructor for the Argument `arg`, as input
to Node `node`
rõ   rö   r÷   Nrl   r?   rm   ro   )rU   r   rJ   rs   rø   r6   r5   rt   r‹   rY   r7   )	r`   rQ   rR   r”   rœ   r{   r|   rn   Úobs_or_fq_ctrs	            rN   Ú_get_arg_as_input_act_obs_or_fqr  ¦  së   € ô �cœ4× Ñ ÜÐ1Ó2Ð2à  D§I¡IÓ-Ü!Ø[ó
ð 	
ô # 4Ó-€IÜ˜tÓ)€GØ!”M×1¨'¤k€MØ€MÞØŸ	™	Ð"5Ñ6×:Ñ:Ø%Ô'Bó
‰ö 
Ø�;‰;Ô8Ó8Ø ŸI™IÐ&9Ñ:×>Ñ>Ø&Ô(CóˆMøð Ÿ	™	Ð"5Ñ6×:Ñ:Ø Ô"=ó
ˆö ,‰=‹?Ð5°Ð5rP   c                 óÌ  • [        U[        [        45      (       aC  / nU H*  n[        U UUUUUUUUU	U
U5      nUR	                  U5        M,     [        U5      " U5      $ [        U[        5      (       d  U$ [        U[        5      (       d  [        S5      eUnUSL=(       a    UR                  5       nU(       dÈ  SU R                  ;   a  [        S5      eSU R                  ;  a  [        S5      eU R                  S   nUR                  SS5      n[        XXHU	5      n[        U5      u  nn[        XX‰5      n[        U5      u  nn[        UUUUU[!        U R"                  5      S	:„  =(       a    XR"                  S	   L S
9nOÉUc  [        S5      e[%        XXrU
5      u    nnnUR&                  nSn[)        U R"                  5       H  u  nnUUL d  M  Un  O   Uc  SnOQ[+        XX‰5      nUU;   a  [,        R.                  O[,        R0                  nUU:g  =(       a    U[,        R0                  :g  nUR2                  n U (       a  U " 5       OSnU(       a’  Sn!UR4                   HS  n"U"R6                  S:X  d  M  UU"R8                     n#[        U#5      [        U5      L d  M=  U#R:                  W:X  d  MO  U#nU"n!  O   Uc  [        S5      eUX�U 4'   U!c  [=        UUUUUU5      n$U$nU$ U!nU$ )z_
Given a `node` and an `arg`, inserts an input observer between
`node` and `arg` if necessary.
rõ   Nrö   r÷   rl   ú)expected 'target_dtype_info' in node.metarE   Fr   )rF   zqconfig must not be NonerT   z+arg_as_input_act_obs_or_fq must not be None)rU   rp   rq   Ú-_maybe_insert_input_observer_for_arg_or_kwargÚappendr²   r   rJ   rê   rs   rø   rt   r  r_   rû   rO   r˜   r™   r»   Úinput_quantized_indexesÚ	enumerater—   rL   rš   rM   rí   ÚusersrW   rY   r=   r×   )%rQ   r`   ra   rÉ   rR   rÊ   rÙ   r­   r”   rœ   rc   rË   Únew_arg_to_returnÚ	inner_argÚnew_inner_argÚnew_argrê   rl   rE   Úarg_as_input_act_obs_or_fqÚarg_as_input_target_dtypeÚarg_as_input_target_is_dynamicrý   rþ   Úarg_as_output_target_is_dynamicÚneeds_obs_or_fqr‚   Úsm_prepare_custom_configÚsm_input_quantized_idxsÚcur_input_idxÚarg_idxÚarg_to_checkÚact_post_process_ctrÚexisting_obs_nodeÚmaybe_obs_nodeÚmaybe_obs_modÚnew_obs_nodes%                                        rN   r  r  Î  s[  € ô( �#œœe�}×%Ñ%ØÐÛˆIÜIØàØØØØØØ%ØØØØóˆMð ×$Ñ$ ]Ö3ñ! ô" �CŒyÐ*Ó+Ð+ä�cœ4× Ñ Øˆ
Ü�cœ4× Ñ ÜÐ1Ó2Ð2à€Gà#¨4Ð/×S°H×4QÑ4QÓ4SÐæð
 %¨¯	©	Ó1Ü%Ø_óð ð  d§i¡iÓ/Ü Ð!LÓMÐMð !ŸI™IÐ&9Ñ:Ðð !2× 5Ñ 5Ð6MÈuÓ UÐÜ%DØ�}°Vó&
Ð"ô &Ð&@ÓAñ	
Ø%Ø*ô '@Ø ó'
Ð#ô &Ð&AÓBñ	
Ø&Ø+ô +Ø&Ø+Ø%Ø*Ø!Ü˜dŸi™i›.¨1Ñ,×D°¿	¹	À!¹Ð1Dñ
‰ð ‰?Ü Ð!;Ó<Ð<ä,JØÐ!6Àó-
Ñ)ˆˆ1Ð&¨ð #;×"RÑ"RÐð ˆÜ%.¨t¯y©yÖ%9Ñ!ˆG�\Ø˜sÔ"Ø '�Ùñ &:ð
 Ñ Ø#‰Oä)HØ Mó*Ð&ð
 !Ð$;Ó;ô —’ä—[‘[ð &ð +Ð.GÑG÷=à,´·±Ñ;ð ð  '×1Ñ1Ðæ&:Ñ Ô"Àð 	#ö Ø Ðð "ŸiœiˆNØ× Ñ  MÕ1Ø -¨n×.CÑ.CÑ D�ä˜Ó'¬4Ð0JÓ+KÔKØ%×+Ñ+Ð/HÕHà1>Ð.Ø(6Ð%Ùñ (ð &Ñ-Ü Ð!NÓOÐOØ%?ˆ˜D�kÑ"ØÑ$Ü,ØØ*ØØØØóˆLð #ˆGð €Nð (ˆGà€NrP   c                 ó(  • / nU R                    H*  n[        U UUUUUUUUUU	U
5      nUR                  U5        M,     0 nU R                  R	                  5        H   u  nn[        U UUUUUUUUUU	U
5      nUXï'   M"     [        U5      U l         Xàl        g)a+  
If needed, inserts observers to the input args and kwargs of `node`.
Note: modifies `node` inplace.

For example, if cur_node needs an observer after prev_node, we change from

  prev_node -> cur_node

To

  prev_node -> obs -> cur_node

Note: backend_config only needed for standalone_module node
N)r™   r  r  r¢   Úitemsrq   )rQ   ra   rÉ   rR   rÊ   rÙ   r­   r”   rœ   rc   rË   Únew_argsr`   r  Ú
new_kwargsÚkÚkwargÚ	new_kwargs                     rN   Ú&_maybe_insert_input_observers_for_noder#  z  s¾   € ð: €HØ�yŒyˆÜ?ØØØØØØØØ!ØØØØó
ˆð 	�‰˜Ö ñ ð" €JØ—K‘K×%Ñ%Ö'‰ˆˆ5ÜAØØØØØØØØ!ØØØØó
ˆ	ð "ˆ
‹ñ (ô$ �h“€D„IØ…KrP   Úequalization_qconfigÚ	is_branchc                 óÆ  • Ub  [        X5      (       d  gU(       a  [        R                  " SU  S3SS9  g/ nU R                   HŠ  n[	        U[
        5      (       a  [        X5      (       a  UR                  U5        M;  [        X5      nU(       a  UR                  OUR                  n	U	" 5       n
[        XzX#U5      nUR                  U5        MŒ     [        U5      U l        g)zÒ
If `node` needs to be equalized, find the input/weight observers it needs in
`equalization_qconfig`, creates them, and inserts it into `graph`.

If `node` does not need an equalization observer, returns None.
NzCannot equalize z  because it is part of a branch.é   ©Ú
stacklevel)r   ÚwarningsÚwarnr™   rU   r   r5   r  r6   râ   Úinput_activationr×   rq   )rQ   r$  rÉ   rR   rÊ   r%  r  r`   r{   Úact_eq_process_ctrÚnew_eq_obs_modÚnew_eq_obs_nodes               rN   Ú3_maybe_insert_input_equalization_observers_for_noder0  À  sÛ   € ð Ñ#Ô+EØ÷,ñ ,ð 	æÜ�ŠØ˜t˜fÐ$DÐEÐRSò	
ð 	à€HØ�yŒyˆÜ˜#œt×$Ñ$Ô(8¸×(CÑ(CØ�O‰O˜CÔ Ùä& tÓ1ˆ	ö ð !×'Ò'à%×6Ñ6ð 	ñ ,Ó-ˆÜ+Ø °uó
ˆð 	�‰˜Ö(ñ% ô* �h“€D…IrP   c                 óü  • U R                   S:X  a  [        S5      eSnSU R                  ;   a  [        S5      eSU R                  ;  a  [        S5      eU R                  S   R	                  SS5      nU R                  S   R	                  S	5      nU(       a  U" 5       OS
n[        U5      u  pšSn[        [        R                  SXšU5      nU
(       a  SnU=(       a    U(       + nU(       a  X„U '   [        XXU5      $ g
)a  
If `node` needs an output observer, creates it, inserts it into `graph`
and returns it.

If `node` does not need an output observer, returns None.

Note: inserting dynamic quantization ops for output is not supported in fx graph mode
quantization code path right now
Úoutputz3observer insertion for outputs is handled elsewhereFrö   r÷   rl   r  rç   r@   N)
rW   rJ   rs   rø   rt   r_   rO   rL   rM   r×   )rQ   rÉ   rR   rÊ   r”   rœ   rê   r@   r�   Útarget_dtypeÚtarget_is_dynamicrE   r  s                rN   Ú&_maybe_insert_output_observer_for_noder5  ò  s  € ð" ‡w�w�(ÓÜÐRÓSÐSà ÐØ  D§I¡IÓ-Ü!Ø[ó
ð 	
ð  $§)¡)Ó+ÜÐHÓIÐIØŸ9™9Ð%8Ñ9×=Ñ=Ø óÐð  $Ÿy™yÐ)<Ñ=×AÑAØ"ó Ðö '?Ñ Ô"ÀDð ô '@Ð@TÓ&UÑ#€Lð "Ðô 'Ü�‰�U˜LÐ=Ró€Oö Øˆð &×DÐ/CÔ+C€OæØ2�dÑÜ Ø¨¸eó
ð 	
ð rP   Úgraph_output_nodec           
      ó4  ^^^• S[         S[        R                  R                  S[        [
        [        R                  R                  4   S[        S[         4
UUU4S jjmU R                   Vs/ s H  nT" XaX#5      PM     nn[        U5      U l        gs  snf )zŽ
If the output needs to be quantized and there are any nodes
in the output which are not already observed, inserts observers
for those nodes.
rÈ   rÉ   rR   rÊ   rG   c           	      óÒ  >• [        U [        5      (       a¨  [        XTT5      nSn[        R                  nSU R
                  ;   a5  U R
                  S   R                  SS5      nUb  U" 5       nUR                  nXF:g  =(       a    U[        R                  :g  nU(       a  Uc  [        S5      e[        XXU5      n	U	$ U $ [        U [        [        45      (       a=  U  V
s/ s H  n
T" U
UUU5      PM     nn
[        U [        5      (       a  U$ [        U5      $ [        U [        5      (       a(  0 nU R                  5        H  u  pÞT" XáX#5      XÍ'   M     U$ U c  g[        SU 5      es  sn
f )a  
Navigate an arbitrary data structure of lists, tuples, dicts.
For each container type, recurse on all inputs. Once any Node
is found, insert an observer if needed and do not recurse further.

For example, given a structure of

  {'foo1': [[bar1]], 'foo2': {'foo3': [[[bar3]]]}}

we recurse down to bar1 and bar3, observe them if necessary,
and if we inserted an observer then replace the original node
with its observer.

Returns the data structure with all nodes needing observation being
replaced by their observers.
Nrl   r?   z3observer_mod must not be None when need_obs is Truez!Unhandled type for returned node:)rU   r   r—   rL   rM   rs   rt   r=   rJ   r×   rp   rq   Údictr  Ú	Exception)rÈ   rÉ   rR   rÊ   rþ   Úobserver_modr  Úobserver_clsÚneed_obsÚobserver_nodeÚ
inner_nodeÚresultsÚresults_dictr   Úinner_vÚ&_recursive_maybe_replace_node_with_obsrœ   r”   s                  €€€rN   rC  Ú[_maybe_insert_observers_before_graph_output.<locals>._recursive_maybe_replace_node_with_obsS  s›  ø€ ô, �j¤$×'Ñ'ä)HØ¨=¸&ó*Ð&ð  ˆLÜ(-¯©Ð%Ø" j§o¡oÓ5Ø)Ÿ™Ð/BÑC×GÑGØ-¨tó �ð  Ñ+Ù#/£>�LØ0<×0BÑ0BÐ-ð +ÑG÷ =Ø-´·±Ñ<ð ö ØÑ'Ü(ØMóð ô !2Ø¨eÀEó!�ð %Ð$à!Ð!Ü˜
¤T¬5 M×2Ñ2ñ #-ó	ò #-�Jñ 7àØØ!Øöñ #-ð ð 	ô ˜*¤d×+Ñ+Ø�ä˜W“~Ð%Ü˜
¤D×)Ñ)ØˆLØ(×.Ñ.Ö0‘
�Ù"HØ Mó#�“ñ 1ð  ÐØÑØäØ3°Zóð ùò1	s   ÃE$N)	r   rL   ÚnnÚModuler9  rX   r   r™   rq   )	r6  rÉ   rR   rÊ   r”   rœ   Úold_argr  rC  s	       ``  @rN   Ú+_maybe_insert_observers_before_graph_outputrH  E  s    ú€ ðPÜðPä�x‰x�‰ðPô œC¤§¡§¡Ð0Ñ1ðPô ð	Pô
 
÷Pñ Pðh )×-Ò-óâ-ˆGñ 	/¨w¸}ÖTÙ-ð ð ô
 # 8›_ÐÕùòs   Á/Br3  Ú&node_name_to_match_result_with_qconfigc                 ó&  • SU R                   S   S'   SU R                   S   S'   UR                  U R                  S5      u  nnnnnUbH  UR                  5       (       a2  U R                  S   n[        U[        5      (       a  [        X�U5        gggg)zË
Assigns `target_dtype` to `node`, setting `is_dynamic` to False. If `node`
is a general tensor shape op, also call this function recursively on
the first argument, to propagate the dtype to the caller.
Nrl   r?   r@   ©NNNNNr   )rs   rt   rÆ   ré   r™   rU   r   Ú_maybe_propagate_dtype_for_node)	rQ   r3  rI  Ú
_root_noder‚   Ú_patternrÙ   Ú_qconfigÚ	prev_nodes	            rN   rL  rL  ­  sª   € ð AE€D‡I�IÐ!Ñ"Ð#<Ñ=ØAE€D‡I�IÐ!Ñ"Ð#=Ñ>ð 	/×2Ñ2Ø�	‰	Ð1ó	ñØØ	ØØØð
 Ñ × CÑ C× EÑ EØ—I‘I˜a‘Lˆ	Ü�i¤×&Ñ&Ü+ØÐ)Oõð 'ð !FÐrP   c           	      ó~  • U R                    H­  n[        U5      nU H™  nX4   " U5      nU H†  nUR                  U   n[        U[        [
        45      (       a  [        U5      nOU/nU HD  n	[        U	[        R                  R                  R                  5      (       d  M8  [        X”U5        MF     Mˆ     M›     M¯     g)aá  
Currently we assume that inputs to the graph are either `torch.float` or
`torch.quint8`, which is not always correct. For ops such as
`x.masked_fill(mask, value)`, we know that the dtype of  `mask` is a
`BoolTensor`. Propagate this information throughout the graph.

Note: not all dtypes in the graph will be correct after this pass, but a
higher percentage of them will be correct. Hopefully in the future we can
replace this with a better way to reason about dtypes of tensors.
N)Únodesr4   r™   rU   rq   rp   rL   rV   rQ   r   rL  )
rÊ   rI  rQ   Únon_observable_arg_dictÚarg_typeÚnon_observable_indicesÚindexr`   Úarg_listÚcur_args
             rN   r;   r;   Ì  s£   € ð —”ˆÜ"JÈ4Ó"PÐã/ˆHØ%<Ò%FÀtÓ%LÐ"ã/�Ø—i‘i Ñ&�ô ˜c¤E¬4 =×1Ñ1Ü# C›y‘Hà #˜u�Hã'�Gä! '¬5¯8©8¯=©=×+=Ñ+=×>Ó>Ü7Ø#Ð/Uöó  (ó 0ó 0ò rP   c                 óx  • Sn[        [        U R                  5      5       HA  n[        U R                  U   [        [
        [        45      (       d  M2  U R                  U   n  O   Uc  g[        U[
        [        45      (       a  US   nO[        U[        5      (       a  UnOgSn[        XR5      (       d¢  [        U[        5      (       d  gUR                  S:X  a  gSn[        [        UR                  5      5       H)  nUR                  U   n[        U[        5      (       d  M)    O   Uc  gUnUS-  nUS:”  a  [        S5      e[        XR5      (       d  M¢  [        U[        5      (       d  [        S5      eUR                  n[        U[        5      (       d  [        S	5      eX(   n	[        U[
        [        45      (       a¥  [        U5       H–  u  p«U
S:X  a  M  Sn[        X²5      (       dR  [        UR                  5      S:  a    gUR                  S   nUS-  nUS:”  a  [        S5      e[        X²5      (       d  MR  [        UR                  5      u  pÍ[        X,   XÙ5        M˜     U R                   HC  n[        Xâ5      (       d  [        S
5      e[        UR                  5      u  pÍ[        X,   XÙ5        ME     g)a~  
Ensures that we share an observer
for all input arguments as well as the output argument. In detail, given
a graph of

  x0 -> obs0 -> op -> x2
              /
  x1 -> obs1 /

where node obs0 points to observer instance observer0,
obs1 points to observer1 and obs2 points to observer2, we make nodes obs1
and ob2 point to observer0.
Returns: whether the operation succeeded or not
NFr   r–   r   i'  z(Unable to find observer of previous nodezfirst_arg_arg must be a Nodeztarget_to_use must be a stringú7output_obs_node must be an activation post process nodeT)Úranger˜   r™   rU   r   rp   rq   rZ   rW   rJ   rY   rX   r  r   rÐ   r  )rQ   rÉ   rR   Ú	first_argÚiÚfirst_arg_argÚiteration_guardÚtrace_back_nodeÚtarget_to_useÚobs_mod_to_useÚ	input_idxÚ	input_argÚparent_namerÆ   Úoutput_obs_nodes                  rN   Ú(_maybe_make_input_output_share_observersrg  ò  sz  € ð& €Iä”3�t—y‘y“>Ö"ˆÜ�d—i‘i ‘l¤T¬4´Ð$7×8Ó8ØŸ	™	 !™ˆIÙñ #ð ÑØä�)œd¤E˜]×+Ñ+Ø! !™‰Ü	�Iœt×	$Ñ	$Ø!‰àð
 €Oä.¨}×LÑLÜ˜-¬×.Ñ.Øà×Ñ˜}Ó,ØàˆÜ”s˜=×-Ñ-Ó.Ö/ˆAØ+×0Ñ0°Ñ3ˆOÜ˜/¬4×0Ó0Ùñ 0ð Ñ"ØØ'ˆà˜1ÑˆØ˜UÓ"Ü Ð!KÓLÐLô% /¨}×LÓLô( �m¤T×*Ñ*ÜÐ;Ó<Ð<Ø!×(Ñ(€MÜ�m¤S×)Ñ)ÜÐ=Ó>Ð>Ø"Ñ1€Nä�)œd¤E˜]×+Ñ+ä$-¨iÖ$8Ñ ˆIØ˜A‹~ÙØˆOä6°y×PÑPô �y—~‘~Ó&¨Ó*Ù à%ŸN™N¨1Ñ-�	Ø 1Ñ$�Ø" UÓ*Ü(Ð)SÓTÐTô 7°y×PÓPô !-¨Y×-=Ñ-=Ó >ÑˆKÜ�MÑ.°ÖEñ% %9ð*  Ÿ:œ:ˆÜ/°×OÑOÜ ØIóð ô )¨×)?Ñ)?Ó@ÑˆÜ�Ñ*¨DÖAñ &ð rP   c                 óî   • [        U R                  R                  5       5      nU HL  u  pE[        XB5      (       d  [	        S5      eUR                  U 5        UR                  R                  U5        MN     g )NrZ  )rp   r  r  rZ   rJ   Úreplace_all_uses_withrÊ   Ú
erase_node)rQ   rÉ   rR   r  rf  r‚   s         rN   Ú_remove_output_observerrk  Z  se   € ô �—‘×!Ñ!Ó#Ó$€EÛ#ÑˆÜ/°×OÑOÜ ØIóð ð 	×-Ñ-¨dÔ3Ø�‰×Ñ˜Ö/ò $rP   c                 ó¼   • X R                      nUR                  n[        XEU5      nUR                  U5      n[	        U R                   5      u  p‰[        X(   X—5        g rf   )rY   Úfloat_to_observed_mappingr   Ú
from_floatr   rÐ   )
rQ   ra   rR   r­   Úcustom_moduleÚcustom_module_class_mappingÚobserved_custom_module_classÚobserved_custom_modulere  rÆ   s
             rN   Ú_swap_custom_module_to_observedrs  g  s]   € ð "§+¡+Ñ.€MØ"7×"QÑ"QÐÜ#BØ°Gó$Ð ð :×DÑDÀ]ÓSÐÜ$ T§[¡[Ó1Ñ€KÜˆMÑ&¨ÕErP   Únode_name_to_qconfigÚequalization_config_mapÚobserved_node_namesc                 óx  • 0 n[        U R                  SS95      n	UR                  n
UR                  n[	        5       nU R
                  R                   H*  n[        R                  " [        5      UR                  S'   M,     SnSn0 n0 nU R
                  R                   H9  nUR                  S:X  a
  UUU'   US-  nUR                  S:X  d  M/  UUU'   US-  nM;     UR                  5        H+  nUu  nnnnnUc  [        S	5      e[        UUUUUU	UU5        M-     U R
                  R                   HÂ  nUR                  S:X  a2  UU   U
;   a)  [        R                  " [        5      UR                  S'   ME  UR                  S
;   a)  [        XÙU5      nU(       a  SSS.UR                  S'   M|  M~  UR                  S:X  d  M�  UU   U;   d  M›  [        R                  " [        5      UR                  S'   MÄ     [!        U R
                  U5        [	        5       nUR                  5        HÀ  nUu  nnnnn[#        UUUU5      nUc  [        S	5      eWR                  S   S   nU(       a  U" 5       OSn[%        U5      u  nnU(       a  M`  US[&        [(        [*        R,                  4;  d  M‚  [        UU[*        R.                  R0                  R2                  R4                  SUU	UU5        MÂ     [7        U R
                  R                  5      n[	        5       nSnSnSn 0 n![9        U 5      n"U GHŒ  nUR                  S:X  a  GODUR                  S;   Ga3  UR;                  UR<                  S5      u  nnnnnUR;                  UR<                  5      n#UR                  S   n$SUR                  ;   a)  U$SL=(       a    [?        UR                  S   [@        5      n%OU$SLn%USL =(       d    U%(       + =(       a    UR                  S:g  n&[#        UUUU5      nU&(       Gdl  U(       Gad  [        U R                  SS95      n	UR                  S:w  Ga#  Uc  [        S5      e[C        UU5        Sn'[E        URF                  5      S:”  aÛ  [?        URF                  S   [H        5      (       a¹  [E        URF                  S   RJ                  5      S:”  a“  URF                  S   RJ                   Hv  n(UR;                  U(R<                  5      SL=(       d<    U(R                  S:H  =(       a&    [?        U	[M        U(RN                  5         [P        5      n)U(U:w  d  Mk  U)(       d  Mt  Sn'Mx     [S        U5      n*U*R;                  U[T        5      n+U+" U5      n,UU,L n-U-(       a9  [W        UUU U	U R
                  UUU!UUU"5        [Y        UU#U U	U R
                  U'5        UUL n.UR                  S   R;                  SS5      n/UR                  S   R;                  SS5      n0U.(       Ga[  [[        UU	UU5      (       aS  []        UU U	U R
                  5        URN                  U;  a)  UR_                  URN                  5        [a        UUU	U5        GO[c        UU U	U R
                  U!U5      n1U1bØ  [7        URJ                  Re                  5       5      n2U2 H  n3U3U1L a  M
  U3Rg                  UU15        M     [i        UU	U!U5      n4U/(       a  U4(       d  U0(       a  [k        UU U	5      (       d  [m        UU U	5        UbN  URo                  5       (       a9  URN                  U;  a)  UR_                  URN                  5        [a        UUU	U5        O[q        XÐX�R
                  U!U5        UR                  S:X  a  US-  nGMr  UR                  S:X  d  GM…  US-  nUn GM�     U $ )aÐ  
Inserts observers, using the following high level algorithm:

For each node in the graph:
  1. determine the target dtype of this node in the quantized graph, and save
       it for future steps
  2. determine the target dtype or all args and kwargs of this node
  3. if any arg or kwarg's target dtype does not match the current node's
       dtype, insert an observer
  4. if the current node needs an output observer, insert it

For example:

- starting graph:
    x0 -> linear -> x1

- observed graph after processing x0:
    x0(fp32)

- observed graph after processing linear:
    x0(fp32) -> x0_obs0(int8) -> linear(int8) -> linear_obs0(int8)

- observed graph after processing x1:
    x0(fp32) -> x0_obs0(int8) -> linear(int8) -> linear_obs0(int8) -> x1

After a node is processed, the naive observer placement is guaranteed to be
complete for that node and all of its predecessors. There can be future
passes which optimize the graph by deduplicating observers, etc.
F©Úremove_duplicaterl   r   r–   r   r2  Nzqhandler must not be None)rT   Úcall_methodrá   r>   r@   )rT   rz  rá   r2  rK  Úvalz%matched_node_pattern must not be NonerT   Træ   rE   )9r9  rR   r  Úoutput_quantized_indexesÚsetrÊ   rR  rï   rð   rs   rW   r£   rJ   rÝ   Ú-_DEFAULT_QUINT8_QCONFIG_FOR_TARGET_DTYPE_INFOr0   r;   r¬   r_   ÚintrM   rL   rv   ÚaoÚquantizationra   Ú!_default_fp32_placeholder_qconfigrp   r1   rt   rÆ   rU   r   rÇ   r˜   r™   r   r  rX   rY   r   r   r)   r#  r0  r-   r,   rÅ   rs  r5  ÚkeysÚreplace_input_withrž   rg  rk  Úis_custom_modulerH  )5rÉ   rI  rt  r­   ru  rc   rv  rœ   rÚ   rR   Úinput_quantized_idxsÚoutput_quantized_idxsrÛ   rQ   Úinputs_seen_counterÚoutputs_seen_counterÚplaceholder_node_to_input_indexÚoutput_node_to_output_indexÚmatch_res_with_qconfigrØ   r    rŸ   rÙ   ra   rñ   Úis_supported_by_backendÚoutput_act_or_fq_ctrÚoutput_act_or_fqÚoutput_act_dtyper‚   Únodes_before_observationÚ#custom_module_names_already_swappedÚresults_noder”   rË   r$  Úthis_node_dtype_infoÚoutput_is_a_tensorÚskip_inserting_observersÚis_quantized_branchÚuserÚis_user_quantizedr¦   r§   r¨   Úis_input_node_of_the_patternÚis_last_node_of_patternræ   rE   Úmaybe_output_obs_nodeÚ
orig_usersÚ	user_nodeÚ_is_observer_in_same_graph_s5                                                        rN   r9   r9   w  s=  € ðx 35Ðô ˜×,Ñ,¸eÐ,ÐDÓE€Mà&;×&SÑ&SÐØ'<×'UÑ'UÐÜ!$£€Oà—‘×!Ô!ˆÜ)-¯ªÜ7ó*
ˆ�	‰	Ð%Ó&ñ "ð
 ÐØÐØ79Ð#ð 46ÐØ—‘×!Ô!ˆØ�7‰7�mÓ#Ø4GÐ+¨DÑ1Ø 1Ñ$ÐØ�7‰7�hÕØ0DÐ'¨Ñ-Ø  AÑ%Ò ñ "ð #I×"OÑ"OÖ"QÐð #ñ	
ØØ ØØØàÑÜ Ð!<Ó=Ð=Ü7Ø ØØØØØØ%Øö		
ñ #Rð4 —‘×!Ô!ˆà�G‰G�}Ó$Ø/°Ñ5Ð9MÓMô .2¯YªYÜ=ó.ˆD�I‰IÐ)Ó*ð �W‰WÐGÓGÜ#@ØÐ%>ó$Ð ö $à/3Ø04ñ2�—	‘	Ð-Ó.ñ $ð �G‰G�xÕØ+¨DÑ1Ð5JÕJô .2¯YªYÜ=ó.ˆD�I‰IÐ)Ó*ñ? "ôN %Ø�‰Ð;ôô "%£€OØ"H×"OÑ"OÖ"QÐð #ñ	
ØØ ØØØô FØÐ-¨w¸óð 	 ð
 ÑÜ Ð!<Ó=Ð=ð
  $Ÿy™yÐ)<Ñ=Ø&ñ 
Ðö 6JÑ/Ô1ÈtÐÜ7Ð8HÓIÑÐ˜!ß&Ð&Ð+;ØÜÜÜ�J‰Jð	D
õ ,
ô <Ø$ØÜ—‘×%Ñ%×-Ñ-×OÑOØØØØ)Øö	ñ? #Rôb  $ E§K¡K×$5Ñ$5Ó6Ðô 58³EÐ'ð ÐØÐØ€LØ>@€MÜ/°Ó6€Lô )ˆØ�7‰7�mÓ#ñ à�W‰WÐQÔQð 7×:Ñ:Ø—	‘	Ð9óñØØ$ØØØð $;×#>Ñ#>¸t¿y¹yÓ#IÐ à#'§9¡9Ð-@Ñ#AÐ Ø˜Ÿ	™	Ó!Ø%9ÀÐ%E÷ &Ì*Ø—I‘I˜eÑ$¤jóKÑ"ð &:ÀÐ%EÐ"ð ˜D�×;Ð);Ô%;÷((à—7‘7˜hÑ&ð %ô JØÐ1°7¸Nóð $÷ ,×0GÜ $ U×%8Ñ%8È%Ð%8Ð%PÓ Q�Ø—7‘7˜hÔ&Ø+Ñ3Ü,Ð-TÓUÐUä1Ø,Ð.Aôð +0Ð'ä˜DŸI™I›¨Ó*Ü& t§y¡y°¡|´T×:Ñ:Ü §	¡	¨!¡× 2Ñ 2Ó3°aÓ7à$(§I¡I¨a¡L×$6Ô$6˜Dà0D×0HÑ0HØ $§	¡	ó1à%)ð1*÷ 1ð !%§¡¨=Ñ 8÷ !"Ü$.Ø$1´#°d·k±kÓ2BÑ$CÄ\ó%"ð	 .ð  $ t�|×0AÐ0AØ6:Ò 3ñ %7ô ?¸~ÓNð 0ð (C×'FÑ'FØÔ!:ó(Ð$ñ !1Ð1EÓ F�IØ37¸9Ð3DÐ0Þ3ä>Ø Ø#Ø!Ø)Ø!ŸK™KØ$Ø1Ø)Ø"Ø*Ø(ôô LØ Ø0Ø!Ø)Ø!ŸK™KØ/ôð /3°iÐ.?Ð+Ø37·9±9Ð=PÑ3Q×3UÑ3UØ6¸ó4Ð0ð -1¯I©IÐ6IÑ,J×,NÑ,NØ/°ó-Ð)÷ /Ü1à Ø)Ø#Ø$÷ñ ô$ Pà $Ø %Ø -Ø %§¡ôð  $Ÿ{™{Ð2UÓUà C× GÑ GÈÏÉÔ TÜ ?à$(Ø$+Ø$1Ø$9ô!"ùô !Gà$(Ø$)Ø$1Ø$)§K¡KØ$1Ø$*ó!"ð 2ð  5Ñ@ô" .2°$·*±*·/±/Ó2CÓ-D 
Û1; IØ'0Ð4IÒ'IÙ(0Ø$-×$@Ñ$@Ø(,Ð.Cö%&ñ 2<ô %?à(,Ø(5Ø(5Ø(.ó%&ð !<ö %AÞ(CÞ%:Ü+Sà(,Ø(-Ø(5÷	,&ñ ,&ô )@à,0Ø,1Ø,9ô	)*ð $,Ñ#7¸H×<UÑ<U×<WÑ<Wð )-¯©Ø/Ró)Sð )L×(OÑ(Oà,0¯K©Kô)*ô )Hà,0Ø,3Ø,9Ø,Aô)*øô @Ø ]·K±KÀÐPVôð �7‰7�mÓ#Ø 1Ñ$ÓØ�W‰W˜Ö Ø  AÑ%Ð Ø‹LñO )ðR ÐrP   c           
      ó”  • UR                  5        H´  u  nnnn	n
U	c  M  U	R                  5       (       d  M%  [        XbXJU5      u  nnnnX&R                     n[        R
                  R                  R                  R                  nU" UUUUUUS9n[        UR                  5      u  nn[        UU   UU5        UX&R                  '   M¶     g)z˜
Runs prepare_fx on each standalone module. Note: this does
not modify the graph, it just replaces the unobserved modules with
their observed versions.
N)r·   r­   rc   )r£   rê   r»   rY   rL   r€  r�  Úquantize_fxÚ_prepare_standalone_module_fxr   rÐ   )rÉ   rœ   rR   rI  r­   rc   r¨   r‚   rN  rÙ   ra   Úsm_qconfig_mappingÚsm_example_inputsr  Úsm_backend_configÚstandalone_moduler:   Úobserved_standalone_modulere  rÆ   s                       rN   Ú%_run_prepare_fx_on_standalone_modulesr¨  j  sç   € ð& 
0×	6Ñ	6Ö	8ñ	ØØ	ØØØàÑÙØ×.Ñ.×0Ñ0Ùô +ØÐ&;Ànó
ñ	
ØØØ$Øð
 *×*:Ñ*:Ñ;ÐÜ—(‘(×'Ñ'×3Ñ3×QÑQˆÙ%,ØØØØ,Ø":Ø,ñ&
Ð"ô )¨×)9Ñ)9Ó:Ñˆ�TÜ�˜kÑ*¨DÐ2LÔMØ*Dˆ×&Ñ&Ó'ò7 
9rP   ÚobservedÚnode_name_to_scopeÚ!equalization_node_name_to_qconfigrµ   c           
      ó<   • [        UUUUUUUS9U R                  S'   g )N)rt  rª  r­   r«  rµ   rœ   rv  Ú_observed_graph_module_attrs)r8   rs   )r©  rt  rª  r­   r«  rµ   rœ   rv  s           rN   Ú_save_stater®  ›  s.   € ô 5MØ1Ø-Ø3Ø*KØ'ØØ/ñ5€H‡M�MÐ0Ò1rP   r·   Ú_equalization_configrê   c	           
      óØ  • Uc
  [        5       nUc
  [        5       n[        U[        5      (       a0  [        R
                  " S[        SS9  [        R                  " U5      n[        U[        5      (       a0  [        R
                  " S[        SS9  [        R                  " U5      n[        U[        5      (       a0  [        R
                  " S[        SS9  [         R                  " U5      n[        U[        5      (       a0  [        R
                  " S[        SS9  [        R                  " U5      n[        U[        5      (       d  [        S5      e[        U[        5      (       d  [        S5      e[        R                  " U5      n[        R                  " U5      n0 n	Uc
  [        5       n[        U5      n	[        U	5      n	[        U5      n
[!        X5        [!        X5        [#        U5      n[%        XUR'                  5       5        U(       a!  [)        U5      n[+        X5        [-        X5        [        U R/                  S	S
95      n[1        U UU R2                  UU5      n[1        U UU R2                  UU5      n[5        UR6                  R9                  5       5      n[5        UR:                  R9                  5       5      n[=        UR>                  5      n[A        U R2                  UU	U
UUU5      n0 nURC                  5        H  u  nn/ UQUU   P7nUUU'   M     [E        U UUUUU5        [G        5       n[I        U UUUUUUU5      n[K        X R2                  5      n [M        U UUUUUUU5        U(       aw  Uc  [        S5      e[        URN                  S   [P        5      (       d  [        S5      eURR                  nURT                  nU RV                  S   nSUl,        UUl-        UUl.        U $ )aæ  standalone_module means it a submodule that is not inlined in
parent module, and will be quantized separately as one unit.

How the standalone module is observed is specified by `input_quantized_idxs` and
`output_quantized_idxs` in the prepare_custom_config for the standalone module
Args:
    node_name_to_scope: mapping from node name to the scope of the module which contains the node.
    The scope is a tuple of fully qualified path of the module and the type of the module
Returns:
    model(GraphModule): prepared standalone module
    attributes related to standalone module
    in model.meta["_observed_graph_module_attrs"]:
        is_observed_standalone_module (bool): boolean value that shows whether the
        current model is a observed standalone module or not
        standalone_module_input_quantized_idxs(List[Int]): a list of
            indexes for the graph input that is expected to be quantized,
            same as input_quantized_idxs configuration provided
            for the standalone module
        standalone_module_output_quantized_idxs(List[Int]): a list of
            indices for the graph output that is quantized
            same as input_quantized_idxs configuration provided
            for the standalone module
z�Passing a QConfig dictionary to prepare is deprecated and will not be supported in a future version. Please pass in a QConfigMapping instead.r'  r(  zžPassing a QConfig dictionary to prepare for equalization is deprecated and will not be supported in a future version. Please pass in a QConfigMapping instead.zšPassing a prepare_custom_config_dict to prepare is deprecated and will not be supported in a future version. Please pass in a PrepareCustomConfig instead.z�Passing a backend_config_dict to prepare is deprecated and will not be supported in a future version. Please pass in a BackendConfig instead.z(qconfig_mapping must be a QConfigMappingz-_equalization_config must be a QConfigMappingFrx  z3result_node must not be None for standalone modulesr   zWstandalone module only supports returning simple value currently (not tuple, dict etc.)r­  T)/r    r   rU   r9  r*  r+  ÚFutureWarningÚ	from_dictr   rJ   rï   Údeepcopyr
   r*   r$   r   r'   r&   r   Úto_dictr   rÂ   r(   rR   r%   rÊ   rp   r´   rƒ  r³   r2   rm  r"   r  r¨  r}  r9   r   r®  r™   r   r  r|  rs   Úis_observed_standalone_moduleÚ&standalone_module_input_quantized_idxsÚ'standalone_module_output_quantized_idxs)rÉ   rµ   rœ   rª  r·   r­   r¯  rc   rê   Úpattern_to_quantize_handlerÚroot_node_getter_mappingÚflattened_qconfig_dictr½   rR   r«  rt  r´   r³   Úcustom_module_classesÚmatches_without_qconfigrI  Ú	node_nameÚmatch_without_qconfigÚmatch_with_qconfigrv  Úresult_noder†  r‡  Úobserved_graph_module_attrss                                rN   r:   r:   °  s  € ðD Ñ$Ü 3Ó 5ÐØÑ#Ü-Ó/Ðä�/¤4×(Ñ(Ü�ŠðLäØò		
ô )×2Ò2°?ÓCˆäÐ&¬×-Ñ-Ü�ŠðYäØò		
ô  .×7Ò7Ð8LÓMÐäÐ'¬×.Ñ.Ü�ŠðQäØò		
ô !4× =Ò =Ð>SÓ TÐä�.¤$×'Ñ'Ü�ŠðKäØò		
ô '×0Ò0°Ó@ˆä�o¤~×6Ñ6ÜÐGÓHÐHÜÐ*¬N×;Ñ;ÜÐLÓMÐMÜ—m’m OÓ4€OÜŸ=š=Ð)=Ó>Ðð CEÐØÑÜ2Ó4ˆÜ"CÀNÓ"SÐÜ"7Ð8SÓ"TÐäEÀnÓUÐô ˜uÔ6ä˜uÔ;ä8¸ÓIÐä�uÐ6K×6SÑ6SÓ6UÔVæÜ7¸ÓGÐÜ˜%Ô6ä Ô@ô ˜×,Ñ,¸eÐ,ÐDÓE€Mô )GØØØ�‰àØó)Ð%ô :ØØØ�‰àØóÐô #Ð#8×#PÑ#P×#UÑ#UÓ#WÓXÐÜ $Ø×7Ñ7×<Ñ<Ó>ó!Ðô 9Ø×7Ñ7óÐô ,Ø�‰ØØ#Ø ØØ!ØóÐð .0Ð*Ø,C×,IÑ,IÖ,KÑ(ˆ	Ð(ØVÐ4ÐVÐ6JÈ9Ñ6UÑVÐØ<NÐ.¨yÓ9ñ -Lô *ØØØØ.ØØôô %(£EÐä,ØØ.ØØØ)ØØØó	€Kô ˜Ÿ{™{Ó+€EäØØØØØ)àØØô
ö ØÑÜ Ð!VÓWÐWÜ˜+×*Ñ*¨1Ñ-¬t×4Ñ4Ü Øióð ð +@×*WÑ*WÐà!×:Ñ:ð 	ð ',§j¡jÐ1OÑ&PÐ#àDHÐ#ÔAà ð 	$ÔJð "ð 	$ÔKð €LrP   )Frf   )NN)NNNF)�rï   r*  Útypingr   rL   Útorch._subclassesr   Útorch.ao.quantizationr   r   r   Ú$torch.ao.quantization.backend_configr   r	   r
   Ú*torch.ao.quantization.backend_config.utilsr   r   r   Útorch.ao.quantization.observerr   Útorch.ao.quantization.qconfigr   r   Ú%torch.ao.quantization.qconfig_mappingr   Útorch.ao.quantization.quantizer   r   Útorch.ao.quantization.utilsr   r   r   r   r   Útorch.fxr   Útorch.fx.graphr   r   Útorch.fx.noder   Ú	_equalizer   r   Úcustom_configr    r!   Úmatch_utilsr"   r#   Úpattern_utilsr$   Úqconfig_mapping_utilsr%   r&   r'   r(   Úquantize_handlerr)   r*   r+   Úutilsr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   Ú__all__r  rM   rv   rK   rš   Úqint8Úqint32rè   r›   Úint8Úint16Úint32Úfloat8_e5m2Úfloat8_e4m3fnrI   rî   r‹   r€  r�  ra   r‚  rí   rð   Ú#_default_quint8_placeholder_qconfigr~  rO   r9  rX   rE  rF  rZ   rq   r=   r_   rg   r’   r“   Ú
EdgeOrNoderž   rp   r¬   r»   r²   rÂ   r}  rÇ   Údevicer×   rÝ   rÞ   rû   r—   r  r  r#  r0  r5  rH  rL  r;   rg  rk  rs  r9   r¨  r®  r:   r±   rP   rN   Ú<module>rá     s  ðã Û Ý ã Ý (÷ñ ÷
ñ ÷
ñ õ
 Gß MÝ @ß F÷õ õ !ß &Ý "ç Kß Kß ?Ý 0÷ó ÷ñ ÷
÷ ÷ õ ò"€ð ˜u e§j¡j°$Ð7Ð à	‡L�LØ	‡K�KØ	‡L�LØ	‡M�MØ	‡K�KØ	‡J�JØ	‡K�KØ	‡K�KØ	×ÑØ	×Ñð€ð 2×;Ò;À%Ç+Á+ÑNÐ ð
  %Ÿx™x×4Ñ4×<Ñ<×^Ñ^×iÑiØ %§¡× 5Ñ 5× =Ñ =× _Ñ _× jÑ jñ/Ð +ð  %Ÿx™x×4Ñ4×<Ñ<×`Ñ`×kÑkØ %§¡× 5Ñ 5× =Ñ =× aÑ a× lÑ lñ1Ð -ð  ñ*Øð*à ð*ð ð*ð  ð	*ð
  ð*ð ð*ð 
õ*ðZØ
ðØ# C¨¯©¯©Ð$8Ñ9ðà	ôð
HØ%¨Ñ,ð
Hà
ˆ5�;‰;˜Ñ˜tÐ#Ñ$ô
HðI
Ø	ðI
à
ðI
ð ðI
ð ð	I
ð
 "ðI
ð 
ôI
ðX"Ø
ð"àð"ð ð"ð 
ô	"õJ å ð �u˜T 4˜ZÑ(¨4Ñ/°Ð5Ñ6€
ðØ
ðà˜˜UŸX™XŸ_™_Ð,Ñ-ðð ˜
Ð$:Ð:Ñ;ôð.%Ø�t‰^ð%à˜t™* tÑ+ð%ð ð%ð "ð	%ð
 
ô%ðPTØ
ðTà˜˜UŸX™XŸ_™_Ð,Ñ-ðTð /ðTð ð	Tð
 )¨4Ñ/ðTð ˆ>˜5  c ™?Ð,?ÀÐQUÑAUÐUÑVôTð@TØ
�(‰(�/‰/ðTØ15°g¸tÀEÇHÁHÇOÁOÑ?TÐ6TÑ1UðTà	ôTð9¸ð 9ÈÈCÉô 9ð )-ñØ
ðà%ðð �8‰8�?‰?ðð ˜˜UŸX™XŸ_™_Ð,Ñ-ð	ð
 ðð —,‘, Ñ%ðð 
õð@5;Ø%ð5;àð5;ð ð5;ð  Ñ$ð	5;ð
 "ð5;ð ˜˜UŸX™XŸ_™_Ð,Ñ-ð5;ð  $ D¨$ JÑ/ð5;ð ˜‘Yð5;ð 
ô5;ðpbBØ
ðbBàðbBð  Ñ$ðbBð ˜˜UŸX™XŸ_™_Ð,Ñ-ð	bBð
 "ðbBð  $ D¨$ JÑ/ðbBð 
ˆ#ˆsˆ(�^ôbBðJB Ø	ðB à˜˜UŸX™XŸ_™_Ð,Ñ-ðB ð ˜
Ð$:Ð:Ñ;ðB ð ð	B ð
 ˜dÑ"ôB ðJ&Ø	ð&à˜˜UŸX™XŸ_™_Ð,Ñ-ð&ð ˜
Ð$:Ð:Ñ;ð&ð ð	&ð
 ‡[�[�4Ñô&ð%6Ø	ð%6à
ð%6ð ˜˜UŸX™XŸ_™_Ð,Ñ-ð%6ð ˜
Ð$:Ð:Ñ;ð	%6ð
 ð%6ð ˜dÑ"ô%6ðf ,0Ø(,ñiØ
�‰*ðià	ðið ðið �8‰8�?‰?ð	ið
 ˜˜UŸX™XŸ_™_Ð,Ñ-ðið ðið  Ñ$ðið /ðið ˜
Ð$:Ð:Ñ;ðið ðið " DÑ(ðið —,‘, Ñ%ðið õiðl ,0Ø(,ñCØ
ðCàðCð �8‰8�?‰?ðCð ˜˜UŸX™XŸ_™_Ð,Ñ-ð	Cð
 ðCð  Ñ$ðCð /ðCð ˜
Ð$:Ð:Ñ;ðCð ðCð " DÑ(ðCð —,‘, Ñ%ðCð 
õCðL/ Ø
ð/ àð/ ð �8‰8�?‰?ð/ ð ˜˜UŸX™XŸ_™_Ð,Ñ-ð	/ ð
 ð/ ð ð/ ð 
ô/ ðdPØ
ðPà�8‰8�?‰?ðPð ˜˜UŸX™XŸ_™_Ð,Ñ-ðPð ð	Pð
 ˜
Ð$:Ð:Ñ;ðPð ðPð 
ˆD�[ôPðfe-Øðe-à�8‰8�?‰?ðe-ð ˜˜UŸX™XŸ_™_Ð,Ñ-ðe-ð ð	e-ð
 ˜
Ð$:Ð:Ñ;ðe-ð ðe-ð 
ôe-ðPØ
ðà—+‘+ Ñ$ðð -1°Ð6MÐ1MÑ,Nðð 
ô	ð>#Øð#à,0°Ð6MÐ1MÑ,Nð#ð 
ô#ðLeØ
ðeà�8‰8�?‰?ðeð ˜˜UŸX™XŸ_™_Ð,Ñ-ðeð 
ô	eðP
0Ø
ð
0Ø—x‘x—‘ð
0Ø7;¸CÀÇÁÇÁÐ<PÑ7Qô
0ðFØ
ðFàðFð ˜˜UŸX™XŸ_™_Ð,Ñ-ðFð /ô	Fð pØðpà,0°Ð6MÐ1MÑ,Nðpð ˜s J˜Ñ/ðpð /ð	pð
 " # s (™^ðpð "ðpð ˜S™ðpð ðpð 
ˆD�[ôpðf.EØ�8‰8�?‰?ð.Eàð.Eð ˜˜UŸX™XŸ_™_Ð,Ñ-ð.Eð -0ð	.Eð
 /ð.Eð "ð.Eð 
ô.EðbØðà˜s J˜Ñ/ðð ˜S %¨¨T¨	Ñ"2Ð2Ñ3ðð /ð	ð
 (,¨C°¨H¡~ðð $ðð ðð ˜S™ðð 
ôð6 JNØCGØ<@Ø!&ñeØðeà# d¨3°¨8¡nÑ4ðeð ðeð ˜S %¨¨T¨	Ñ"2Ð2Ñ3ð	eð
 ˜#˜s˜(‘Oðeð /°°c¸3°h±Ñ?À$ÑFðeð )¨4°°S°©>Ñ9¸DÑ@ðeð " D¨¨c¨¡NÑ2°TÑ9ðeð ðeð öerP   