ó
    >:jŠM  ã                  óÂ   • S SK Jr  S SKrS SKJr  S SKrS SKJr  S SKJr  SSK	J
r
  SrS	r " S
 S\R                  5      rSS jrSS jrSS jr S         SS jjrg)é    )ÚannotationsN)ÚAny)Únn)ÚPreTrainedModelé   )ÚArrowConfigÚtask_Úgks_c                  óÐ   ^ • \ rS rSrSrU 4S jr\R                  " 5       S 5       rSS jr	\R                  " 5       S 5       r
\R                  " 5       S 5       rSS jrS	 rS
rU =r$ )ÚArrowLoraLinearLayeré   zW
This class represent the main logic of the arrow routing algorithm for linear layers.
c                óZ  >• [         TU ]  5         Xl        SU l        UR                  U l        UR
                  U l        UR                  U l        UR                  R                  5       U l        UR                  U l
        UR                  U l        SU l        / U l        Xl        SU l        g )NFT)ÚsuperÚ__init__Úin_featuresÚ_protos_readyÚtop_kÚrouter_temperatureÚtemperatureÚrng_seedÚtask_adapter_namesÚcopyÚgks_adapter_namesÚuse_gksÚgks_doneÚgks_added_adapter_namesÚcast_input_dtype_enabled)Úselfr   Úarrow_configÚ	__class__s      €ÚS/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/lora/arrow.pyr   ÚArrowLoraLinearLayer.__init__#   s�   ø€ Ü‰ÑÔà&ÔØ"ˆÔØ!×'Ñ'ˆŒ
Ø'×:Ñ:ˆÔØ$×-Ñ-ˆŒà×+Ñ+×0Ñ0Ó2ð 	Ôð ×*Ñ*ð 	Ôð $×+Ñ+ˆŒØˆŒØ')ˆÔ$Ø&ÔØ(,ˆÕ%ó    c                óü  • UR                  5        Vs/ s HM  nX2;   d  M
  US:w  d  M  UR                  S5      (       a#  U[        S5      S R                  5       (       a  MK  UPMO     nn[	        U R
                  5      [	        U5      :X  a  g[        U R
                  5      [        U5      :  a)  U Vs/ s H  oUU R
                  ;  d  M  UPM     snU l        UR                  5       U l        SU l        gs  snf s  snf )zv
Called when adapters are added/removed/renamed so Arrow can refresh its internal state before the next forward
pass.
Úarrow_routerr
   NF)	ÚkeysÚ
startswithÚlenÚisdigitÚsortedr   r   r   r   )r   Úlora_AÚlora_BÚkÚall_ts_adapter_namesÚxs         r!   Úon_adapter_changeÚ&ArrowLoraLinearLayer.on_adapter_change7   sï   € ð —[‘[”]ó 
â"�Ø‰{ó à  NÑ2ó à<=¿L¹LÈ×<PÑ<PÐUVÔWZÐ[aÓWbÐWdÐUe×UmÑUm×Uo÷ Ù"ð 	ð  
ô �$×)Ñ)Ó*¬fÐ5IÓ.JÓJØô ˆt×&Ñ&Ó'¬#Ð.BÓ*CÓCÙ7KÓ+pÒ7K°!ÐX\×XoÑXoÑOo¯AÑ7KÑ+pˆDÔ(ð #7×";Ñ";Ó"=ˆÔà"ˆÕùò! 
ùò ,qs!   “	C4 C4¨5C4Á!C4Â2C9Ã	C9c                ój  • UR                  [        R                  5      nUR                  [        R                  5      nUR                  U-  nSnU R                  bL  [        R
                  " UR                  R                  S9nUR                  [        U R                  5      5        [        R                  " UR                  S5      UR                  UR                  US9n	X™R                  5       U-   -  n	[        U5       H,  n
UR                  XuU	-  -  -  nX»R                  5       U-   -  n	M.     U	$ )uß  
Computes the top *right* singular vector of Î”W = B @ A without forming Î”W.

Theory:
    For any matrix M, the right singular vectors are the eigenvectors of Máµ€ M. If Î”W = B @ A (with A âˆˆ
    â„�^{rÃ—in}, B âˆˆ â„�^{outÃ—r}), then
        Î”Wáµ€ Î”W = (B @ A)áµ€ (B @ A) = Aáµ€ (Báµ€ B) A âˆˆ â„�^{inÃ—in}.
    Therefore, the dominant right singular vector of Î”W is the dominant eigenvector of M := Aáµ€ (Báµ€ B) A. We
    find it by *power iteration* on the linear operator
        v â†¦ Aáµ€ (Báµ€ B) (A v),
    which avoids materializing Î”W (outÃ—in) or M (inÃ—in). The result lives in the input/token space (size =
    in_features), which is exactly what Arrow needs. (Right singular vectors â‰¡ eigenvectors of Máµ€M; power
    iteration converges to the dominant eigenvector under mild conditions.)
=============================== Practical notes:
    - We perform all iteration in float32 for numerical stability, then cast back
    to the LoRA dtype/device before storing/using the prototype.
    - Convergence is checked with a simple fixed-iter cap (`iters`) and/or
    `allclose` tolerance (`tol`).
    - The returned vector is unique up to sign (Â±), as with any singular vector.
    Downstream code should be sign-invariant.
N)Údevicer   )Údtyper3   Ú	generator)ÚtoÚtorchÚfloat32ÚTr   Ú	Generatorr3   ÚtypeÚmanual_seedÚintÚrandnÚsizer4   ÚnormÚrange)r   ÚAÚBÚitersÚepsÚA32ÚB32ÚCÚgenÚvÚ_Úws               r!   Útop_right_singular_vec_from_BAÚ3ArrowLoraLinearLayer.top_right_singular_vec_from_BAP   så   € ð0 �d‰d”5—=‘=Ó!ˆØ�d‰d”5—=‘=Ó!ˆØ�E‰E�C‰Kˆð ˆØ�=‰=Ñ$Ü—/’/¨¯©¯©Ñ9ˆCØ�O‰OœC §¡Ó.Ô/ô �KŠK˜Ÿ™ ›¨3¯9©9¸S¿Z¹ZÐSVÑWˆØ—‘“˜C‘Ñ ˆä�u–ˆAà—‘˜ A™g™Ñ'ˆAØ—V‘V“X ‘^Ñ$ŠAñ ð
 ˆr#   c                óp  • U R                   (       a  g/ nU R                   He  nX   R                  nX$   R                  nU R                  XV5      nUR	                  UR
                  UR                  S9nUR                  U5        Mg     [        R                  " USS9n	U R                  SU	SS9  SU l         g)	a»  
Computes a prototype vector for each LoRA module in every layer by applying Singular Value Decomposition (SVD)
to the `lora_A` matrix and extracting the top right singular vector.

These prototypes are later used to calculate the cosine similarity between each input token and each expert.
The resulting similarity scores serve as coefficients to compute a weighted average of the corresponding LoRA
modules, effectively routing each token through its most relevant experts.

** This prototype computation is done is done once for all experts and is re-done on newly added adapters.**

Args:
    lora_A : Matrices A in LoRA layer.
    lora_B (optional): Matrices B in LoRA layer. Defaults to None.
N)r4   r3   r   ©ÚdimÚ
prototypesF)Ú
persistentT)r   r   ÚweightrM   r6   r4   r3   Úappendr7   ÚstackÚregister_buffer)
r   r+   r,   ÚprotosÚnamerB   rC   Úproto32ÚprotoÚproto_stacks
             r!   Úbuild_prototypesÚ%ArrowLoraLinearLayer.build_prototypes}   s¨   € ð" ××ØØˆØ×+Ô+ˆDØ‘×#Ñ#ˆAØ‘×#Ñ#ˆAð ×9Ñ9¸!Ó?ˆGà—J‘J Q§W¡W°Q·X±X�JÐ>ˆEØ�M‰M˜%Ö ñ ,ô —k’k &¨aÑ0ˆð 	×Ñ˜\¨;À5ÐÑIØ!ˆÕr#   c                ón  • U R                   (       d  gU R                  (       a  U R                  (       d  g[        R                  " U R
                   Vs/ s H  o1U   R                  PM     snSS9R                  S5      n[        R                  " U R
                   Vs/ s H  o2U   R                  PM     snSS9R                  S5      nU R                  SL ab  U R                   HQ  nX   R                  R                  R                  U5        X&   R                  R                  R                  U5        MS     OaU R                   HQ  nX   R                  R                  R                  U5        X&   R                  R                  R                  U5        MS     SU l        / U l        gs  snf s  snf )a  
This function performs General Knowledge Subtraction. It takes an average of provided general_adapters, and
subtract it from each task_adapter. This subtraction tries to purify the task adapters, based on
"forgetting-via-negation" principle. Forgetting-via-negation is a task-arithmetic operation, explained in:
https://huggingface.co/papers/2212.04089 The task adapters will be more focused and isolated, enhancing the
performance on new tasks.

Args:
    lora_A : Matrices A in LoRA layer.
    lora_B : Matrices A in LoRA layer.
Nr   rP   FT)r   r   r   r7   rV   r   rT   Úmeanr   ÚdataÚsub_)r   r+   r,   ÚnÚavg_AÚavg_BrY   s          r!   Úgen_know_subÚ!ArrowLoraLinearLayer.gen_know_sub¡   s]  € ð �|�|ØØ�]�] 4×#?×#?Øô —K’K¸4×;QÒ;QÓ RÒ;Q°a¨¡×!1Ô!1Ñ;QÑ RÐXYÑZ×_Ñ_ØóˆEô —K’K¸4×;QÒ;QÓ RÒ;Q°a¨¡×!1Ô!1Ñ;QÑ RÐXYÑZ×_Ñ_ØóˆEð
 �}‰} Ò%Ø ×3Ô3�DØ‘L×'Ñ'×,Ñ,×1Ñ1°%Ô8Ø‘L×'Ñ'×,Ñ,×1Ñ1°%Ö8ò 4ð !×8Ô8�DØ‘L×'Ñ'×,Ñ,×1Ñ1°%Ô8Ø‘L×'Ñ'×,Ñ,×1Ñ1°%Ö8ñ 9ð
 !ˆDŒMà+-ˆDÕ(ùò) !Sùò !Ss   ÁF-ÂF2c                ót   • Uc  g[        U SS5      nU(       a  UR                  U:X  a  U$ UR                  US9$ )aT  
Whether to cast the dtype of the input of the forward method.

Usually, we want to enable this to align the input dtype with the dtype of the weight, but by setting
layer.cast_input_dtype=False, this can be disabled if necessary.

Enabling or disabling can be managed via the peft.helpers.disable_lora_input_dtype_casting context manager.
Nr   T)r4   )Úgetattrr4   r6   )r   r/   r4   r   s       r!   Ú_cast_input_dtypeÚ&ArrowLoraLinearLayer._cast_input_dtypeÊ   s@   € ð ‰9Øä#*¨4Ð1KÈTÓ#RÐ Þ(¨a¯g©g¸Ó.>ØˆHØ�t‰t˜%ˆtÐ Ð r#   c                óö  • U R                  XU R                  S      R                  R                  5      nUR                  GtpgnUR                  SU5      n	U	R                  S5      U R                  R                  S5      pº[        R                  " U R                   Vs/ s H  oÅU   PM	     snU	R                  U	R                  S9n[        R                  " X�R                  R                  -  5      n[        R                  " XàR                  SS9u  nnU	R                  X«4[!        S5      5      nUR#                  SUU5        [        R$                  " UU R&                  -  SS9n[        R(                  " U R                   Vs/ s H  oÂU   R                  PM     snSS9n[        R(                  " U R                   Vs/ s H  oÃU   R                  PM     snSS9n[        R*                  " SU	U5      n[        R*                  " SUU5      nUUR                  SSS5      -  n[        R*                  " S	UU5      nU" U5      nUR                  S5      nUR
                  " U/UQUP76 $ s  snf s  snf s  snf )
u¥  
Applies Arrow routing inside a LoRA layer.

Steps:
1. Compute cosine similarity between each token representation and all adapter prototypes.
2. Select the top-k experts per token and normalize their scores with a softmax.
3. Project tokens into each selected expertâ€™s low-rank space (A weights).
4. Map back to the output space (B weights).
5. Aggregate expert outputs via the weighted sum of their contributions.
6. Apply dropout, scaling, and return the reshaped delta.

- Conceptually, this is a Mixture-of-Experts (MoE) over LoRA adapters,
where coefficients are derived from prototype similarity.

Returns:
    delta: LoRA output adjustment computed by Arrow routing.
r   éÿÿÿÿ)r3   r4   r   rP   z-infztf, erf -> terzter, eor -> teozte, teo -> to)rj   r   rT   r4   ÚshapeÚviewr?   rR   r7   Útensorr3   Úabsr9   Útopkr   Únew_fullÚfloatÚscatter_Úsoftmaxr   rV   Úeinsum)r   r/   r+   r,   ÚdropoutÚscalingrC   ÚrestÚF_inÚtokÚtÚErc   Úscales_tensÚsimÚtop_vÚidxÚ
full_scoreÚcoeffÚA_stackÚB_stackÚzÚyÚ
delta_flatÚdeltaÚout_dims                             r!   ÚforwardÚArrowLoraLinearLayer.forwardÛ   s  € ð$ ×"Ñ" 1¨T×-DÑ-DÀQÑ-GÑ&H×&OÑ&O×&UÑ&UÓVˆØŸ™‰ˆ�$Ø�f‰f�R˜ÓˆØ�x‰x˜‹{˜DŸO™O×0Ñ0°Ó3ˆ1ô —l’lØ!%×!8Ò!8Ó9Ò!8˜A�QŒZÑ!8Ñ9Ø—:‘:Ø—)‘)ñ
ˆô �iŠi˜Ÿo™o×/Ñ/Ñ/Ó0ˆô —Z’Z §Z¡Z°QÑ7‰
ˆˆsØ—\‘\ 1 &¬%°«-Ó8ˆ
Ø×Ñ˜A˜s EÔ*Ü—’˜j¨4×+;Ñ+;Ñ;ÀÑCˆô —+’+¸×9PÒ9PÓQÒ9P°A a™y×/Ô/Ñ9PÑQÐWXÑYˆÜ—+’+¸×9PÒ9PÓQÒ9P°A a™y×/Ô/Ñ9PÑQÐWXÑYˆô �LŠLÐ)¨3°Ó8ˆô �LŠLÐ*¨A¨wÓ7ˆð �× Ñ   B¨Ó*Ñ*ˆô —\’\ /°5¸!Ó<ˆ
ñ ˜
Ó#ˆØ—/‘/ "Ó%ˆØ�zŠz˜!Ð,˜dÐ, GÒ,Ð,ùòM :ùò  RùÚQs   Â I,ÆI1ÇI6)r   r   r   r   r   r   r   r   r   r   r   )é   g:Œ0âŽyE>)r4   ztorch.dtype)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r7   Úno_gradr0   rM   r]   rf   rj   rŒ   Ú__static_attributes__Ú__classcell__)r    s   @r!   r   r      sr   ø† ñõ-ð( ‡]‚]ƒ_ñ#ó ð#ô0+ðZ ‡]‚]ƒ_ñ!"ó ð!"ðF ‡]‚]ƒ_ñ&.ó ð&.ôP!÷"?-ð ?-r#   r   c                óÜ  • SnU GHF  n[        5       nSnSnU R                  5        H§  u  px[        US5      (       d  M  X8R                  ;   d  M)  UR                  U   R                  n	UR
                  U   R                  n
UR                  S5      S   nUR                  U5        U	R                  S   nU	R                  U
R                  4nM©     Uc  XVUS.nM×  XRS   :w  a  [        SU S	U S
US    35      eXbS   :w  a  [        SU SU S
US    35      eXBS   :w  d  GM   [        SU S[        U5       S[        US   5       35      e   [        US   5      nU[        US   5      4$ )zÕ
After loading all adapters into `model`, check they share:
  - the same LoRA rank (r)
  - identical weight shapes
  - identical sets of target_modules
Returns (sorted list of target module names, agreed rank r).
Nr+   Ú.rm   r   )ÚrÚshapesÚmodulesr™   Ú[z] rank mismatch: z != rš   z] shape mismatch: r›   z-] target_modules mismatch:
  this adapter -> z
  reference   -> )ÚsetÚnamed_modulesÚhasattrr+   rT   r,   ÚsplitÚaddrn   Ú
ValueErrorr*   r=   )ÚmodelÚadapter_namesÚ	referencerY   Úcurr_modulesÚcurr_rÚcurr_shapesÚ	full_nameÚmodulerB   rC   Úmod_nameÚagreed_moduless                r!   Ú%check_loaded_lora_compatibility_arrowr­     s™  € ð €IäˆÜ“uˆØˆØˆà!&×!4Ñ!4Ö!6ÑˆIÜ�v˜x×(Ó(¨T·]±]Õ-BØ—M‘M $Ñ'×.Ñ.�Ø—M‘M $Ñ'×.Ñ.�Ø$Ÿ?™?¨3Ó/°Ñ3�Ø× Ñ  Ô*àŸ™ ™�Ø Ÿw™w¨¯©Ð0’ñ "7ð ÑØ$ÈÑUŠIà 3™Ó'Ü  1 T FÐ*;¸F¸8À4È	ÐRUÉÐGWÐ!XÓYÐYØ¨Ñ1Ó1Ü  1 T FÐ*<¸[¸MÈÈiÐX`ÑNaÐMbÐ!cÓdÐdØ¨Ñ3Ö3Ü Ø˜�vð )Ü)/°Ó)=Ð(>ð ?(Ü(.¨y¸Ñ/CÓ(DÐ'EðGóð ñ/ ô: ˜I iÑ0Ó1€NØœ3˜y¨™~Ó.Ð.Ð.r#   c           	     óØ  • SSK Jn  Sn SSKnUR                  R                  nSn SSKJn  UR                  UR                  4nUb  Xc4-   nUb  Xe4-   n/ nU R                  5        H”  u  p‰[        U	S5      (       d  M  U Hv  n
U
[        U	S0 5      ;   d  M  [        U	SS5      =(       d    [        U	SS5      nUb  UOU	n[        XÆ5      (       a  MP  UR                  X¨[        U5      R                  45        Mx     M–     U(       aC  S/nU H   u  p¨nUR                  SU
 S	U S
U 35        M"     [!        SR#                  U5      5      eg! [         a     GN3f = f! [         a     GN;f = f)zÏ
Validate that every module holding LoRA weights for any of `adapter_names` is Linear-like: nn.Linear,
bitsandbytes.nn.Linear4bit, nn.Conv1d, or transformers.models.gpt2.modeling_gpt2.Conv1D. If not, raise.
r   N)ÚConv1Dr+   Ú
base_layerÚoriginal_modulezzLoRA adapters must only target Linear-like layers (nn.Linear, nn.Conv1d, HF Conv1D, or bitsandbytes.nn.Linear4bit). Found:z  - adapter 'z' on module 'z
' of type Ú
)Útorch.nnr   ÚbitsandbytesÚ
Linear4bitÚImportErrorÚ&transformers.models.gpt2.modeling_gpt2r¯   ÚLinearÚConv1drž   rŸ   ri   Ú
isinstancerU   r;   r�   Ú	TypeErrorÚjoin)r£   r¤   r   rµ   ÚbnbÚHFConv1DÚallowed_typesÚ	offendersr©   rª   rY   ÚbaseÚlayer_to_checkÚlinesÚtnames                  r!   Ú)ensure_adapters_target_linear_layers_onlyrÅ   H  s€  € õ
 à€JðÛ"à—V‘V×&Ñ&ˆ
ð €HðÝMð —Y‘Y §	¡	Ð*€MØÑØ%¨Ñ5ˆØÑØ%¨Ñ3ˆà€Ià"×0Ñ0Ö2Ñˆ	Ü�6˜8×$Ó$Û%�Øœ7 6¨8°RÓ8Õ8Ü" 6¨<¸Ó>×jÄ'È&ÐRcÐeiÓBj�DØ-1Ñ-=¡TÀ6�Nä% n×DÓDØ!×(Ñ(¨$¼4ÀÓ;O×;XÑ;XÐ)YÖZó &ñ 3ö ðWð
ˆó '0Ñ"ˆD˜UØ�L‰L˜=¨¨¨m¸I¸;ÀjÐQVÐPWÐXÖYñ '0ä˜Ÿ	™	 %Ó(Ó)Ð)ð øô7 ó Úðûô ó Úðús"   ŠE
 §E Å

EÅEÅ
E)Å(E)c                óÖ  • [         R                  R                  U 5      (       aU  [         R                  R                  [         R                  R	                  U S5      5      (       d  [        SU  S35      eU S4$ U R                  S5      R                  S5      n[        U5      S:¼  a>  SR	                  USS 5      n[        U5      S:”  a  SR	                  USS 5      nX#4$ US4$ U S4$ )aU  
Resolve a user-provided adapter `path` into (model_id, subfolder).

Supports:
  - Local path to a folder that contains `adapter_config.json`
  - Hub path with subfolder, e.g. "user/repo/ts_expert_0[/more/...]", which becomes:
        model_id="user/repo", subfolder="ts_expert_0[/more/...]"
  - Plain Hub repo id "user/repo" (no subfolder)
zadapter_config.jsonzLocal adapter path 'z)' does not contain 'adapter_config.json'.NÚ/é   )	ÚosÚpathÚisdirÚisfiler¼   r¢   Ústripr    r(   )rÊ   ÚpartsÚmodel_idÚ	subfolders       r!   Ú_resolve_adapter_sourcerÑ   y  sÍ   € ô 
‡w�w‡}�}�T×ÑÜ�w‰w�~‰~œbŸg™gŸl™l¨4Ð1FÓG×HÑHÜÐ3°D°6Ð9bÐcÓdÐdØ�TˆzÐà�J‰J�s‹O×!Ñ! #Ó&€EÜ
ˆ5ƒz�QƒØ—8‘8˜E " 1˜IÓ&ˆÜˆu‹:˜‹>ØŸ™  q r Ó+ˆIØÐ&Ð&Ø˜ˆ~Ðà�ˆ:Ðr#   c                óˆ  • Ub  [        U5      S:X  a  [        S5      eSSKJnJn  [        US   5      u  px[         S3n	[        U5      n
Ub
  SU
;  a  XŠS'   UR                  " U 4UU	S.U
D6n[        S[        U5      5       HJ  n[         U 3n[        X   5      u  pï[        U5      nUb  SU;  a  UUS'   UR                  " SUUS.UD6  ML     [        [        U5      5       Vs/ s H  n[         U 3PM     snUl        UR                  (       a²  Ub  [        U5      S:X  a  [        S5      e[        [        U5      5       HJ  n[         U 3n[        X<   5      u  pï[        U5      nUb  SU;  a  UUS'   UR                  " SUUS.UD6  ML     [        [        U5      5       Vs/ s H  n[         U 3PM     snUl        O/ Ul        [        X²R                  UR                  -   S	9u  nn[!        X²R                  UR                  -   S	9  U" UUUS
9nUR#                  SUS9  UR%                  S5        U$ s  snf s  snf )Nr   zF`task_specific_adapter_paths` should contain at least one adapter path)Ú
LoraConfigÚ	PeftModelÚ0rÐ   )rÏ   Úadapter_namer   zDYou should provide general LoRA paths if you want to use GenKnowSub.)r¤   )r   Útarget_modulesr™   r%   )rÖ   Úpeft_config© )r(   r¢   ÚpeftrÓ   rÔ   rÑ   ÚTASK_ADAPTER_PREFIXÚdictÚfrom_pretrainedrA   Úload_adapterr   r   ÚGKS_ADAPTER_PREFIXr   r­   rÅ   Úadd_adapterÚset_adapter)Ú
base_modelÚtask_specific_adapter_pathsr   Úgeneral_adapter_pathsÚadapter_kwargsrÓ   rÔ   Ú	model_id0Úsub0Úinitial_ts_expert_nameÚfirst_kwargsr£   ÚiÚts_expert_nameÚmidÚsubÚmore_kwargsÚgen_expert_nameÚ
gks_kwargsr×   r™   Ú
router_cfgs                         r!   Úcreate_arrow_modelrò   “  s£  € ð #Ñ*¬cÐ2MÓ.NÐRSÓ.SÜÐaÓbÐbç*ä-Ð.IÈ!Ñ.LÓM�O€IÜ 3Ð4°AÐ6Ðä˜Ó'€LØÑ˜K¨|Ó;Ø$(�[Ñ!à×%Ò%ØðàØ+ñð ñ	€Eô �1”cÐ5Ó6Ö7ˆÜ/Ð0°°Ð4ˆÜ*Ð+FÑ+IÓJ‰ˆÜ˜>Ó*ˆØ‰?˜{°+Ó=Ø'*ˆK˜Ñ$Ø×Òð 	
ØØ'ñ	
ð ô	
ñ 8ô MRÔRUÐVqÓRrÔLsÓ&tÒLsÀqÔ*=Ð)>¸q¸cÓ'BÑLsÑ&t€LÔ#à××Ø Ñ(¬CÐ0EÓ,FÈ!Ó,KÜÐcÓdÐdÜ”sÐ0Ó1Ö2ˆAÜ!3Ð 4°Q°CÐ8ˆOÜ.Ð/DÑ/GÓH‰HˆCÜ˜nÓ-ˆJØ‰ ;°jÓ#@Ø*-�
˜;Ñ'Ø×Òð ØØ,ñð ôñ 3ô OTÔTWÐXmÓTnÔNoÓ)pÒNoÈÔ-?Ð,@ÀÀÓ*DÑNoÑ)pˆÕ&à)+ˆÔ&ä=Ø×<Ñ<¸|×?]Ñ?]Ñ]ñÑ€N�Aô .Ø×<Ñ<¸|×?]Ñ?]Ñ]òñ Ø!Ø%Ø
ñ€Jð
 
×Ñ >¸zÐÑJØ	×Ñ�nÔ%à€LùòI 'uùò  *qs   Ã&H:Æ(H?)r¤   ú	list[str])rÊ   ÚstrÚreturnztuple[str, str | None])N)
râ   r   rã   ró   r   r   rä   zlist[str] | Nonerå   r   )Ú
__future__r   rÉ   Útypingr   r7   r   Útransformersr   Úconfigr   rÛ   rß   ÚModuler   r­   rÅ   rÑ   rò   rÙ   r#   r!   Ú<module>rû      sŒ   ðõ #ã 	Ý ã Ý Ý (å ð Ð ØÐ ô|-˜2Ÿ9™9ô |-ô~(/ôV.*ôbð< /3ð	IØðIà!*ðIð ðIð ,ð	Ið
 öIr#   