Ë
    éÓ^j&Á  ã                   ó  — d Z ddlZddlZddlmZmZmZmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddl m!Z! ddl"m#Z# dd	l$m%Z% dd
l&m'Z'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z. dgZ/ ej`                  e1«      Z2ee3e
e3e3f   f   Z4dejj                  de
e3e3f   dejj                  fd„Z6e%dejj                  de
e3e3f   de3de3dejj                  f
d„«       Z7dbde3de3dejj                  fd„Z8 G d„ dejr                  «      Z: G d„ dejr                  «      Z; G d„ dejr                  «      Z< G d„ d ejr                  «      Z= G d!„ dejr                  «      Z>d"e?d#ejr                  dee@ejj                  f   fd$„ZAdcd%e@d&eBde>fd'„ZCddd(e@dee@ef   fd)„ZD e*i d* eDd+d,¬-«      “d. eDd+d/¬-«      “d0 eDd+d1d2d3d4¬5«      “d6 eDd+d7¬-«      “d8 eDd+d9d2d3d4¬5«      “d: eDd+d;¬-«      “d< eDd+d=¬-«      “d> eDd+d?¬-«      “d@ eDd+dAd2d3d4¬5«      “dB eDd+dC¬-«      “dD eDd+dEdF¬G«      “dH eDd+dIdF¬G«      “dJ eDd+dKdF¬G«      “dL eDd+dMd2d3d4dF¬N«      “dO eDd+dPdF¬G«      “dQ eDd+dRd2d3d4dF¬N«      “dS eDd+dT¬-«      “ eDd+dU¬-«       eDd+dV¬-«      dWœ¥«      ZEe+dcde>fdX„«       ZFe+dcde>fdY„«       ZGe+dcde>fdZ„«       ZHe+dcde>fd[„«       ZIe+dcde>fd\„«       ZJe+dcde>fd]„«       ZKe+dcde>fd^„«       ZLe+dcde>fd_„«       ZMe+dcde>fd`„«       ZN e,e1dJdLdOdQdaœ«       y)eaß   Swin Transformer
A PyTorch impl of : `Swin Transformer: Hierarchical Vision Transformer using Shifted Windows`
    - https://arxiv.org/pdf/2103.14030

Code/weights from https://github.com/microsoft/Swin-Transformer, original copyright/license info below

S3 (AutoFormerV2, https://arxiv.org/abs/2111.14725) Swin weights from
    - https://github.com/microsoft/Cream/tree/main/AutoFormerV2

Modifications and additions for timm hacked together by / Copyright 2021, Ross Wightman
é    N)	ÚAnyÚDictÚCallableÚListÚOptionalÚSetÚTupleÚUnionÚType©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚDropPathÚcalculate_drop_path_ratesÚClassifierHeadÚ	to_2tupleÚ	to_ntupleÚtrunc_normal_Úuse_fused_attnÚresize_rel_pos_bias_tableÚresample_patch_embedÚndgridé   )Úbuild_model_with_cfg)Úfeature_take_indices)Úregister_notrace_function)Úcheckpoint_seqÚnamed_apply)Úgenerate_default_cfgsÚregister_modelÚregister_model_deprecations)Úget_init_weights_vitÚSwinTransformerÚxÚwindow_sizeÚreturnc                 óð   — | j                   \  }}}}| j                  |||d   z  |d   ||d   z  |d   |«      } | j                  dddddd«      j                  «       j                  d|d   |d   |«      }|S )zóPartition into non-overlapping windows.

    Args:
        x: Input tokens with shape [B, H, W, C].
        window_size: Window size.

    Returns:
        Windows after partition with shape [B * num_windows, window_size, window_size, C].
    r   r   é   é   é   é   éÿÿÿÿ©ÚshapeÚviewÚpermuteÚ
contiguous)r&   r'   ÚBÚHÚWÚCÚwindowss          úg/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/swin_transformer.pyÚwindow_partitionr:   *   sŒ   € ð —‘�J€A€qˆ!ˆQØ	�‰ˆq�!�{ 1‘~Ñ% {°1¡~°q¸KÈ¹NÑ7JÈKÐXYÉNÐ\]Ó^€AØ�i‰i˜˜1˜a  A qÓ)×4Ñ4Ó6×;Ñ;¸BÀÈAÁÐP[Ð\]ÑP^Ð`aÓb€GØ€Nó    r8   r5   r6   c                 óà   — | j                   d   }| j                  d||d   z  ||d   z  |d   |d   |«      }|j                  dddddd«      j                  «       j                  d|||«      }|S )a
  Reverse window partition.

    Args:
        windows: Windows with shape (num_windows*B, window_size, window_size, C).
        window_size: Window size.
        H: Height of image.
        W: Width of image.

    Returns:
        Tensor with shape (B, H, W, C).
    r.   r   r   r*   r+   r,   r-   r/   )r8   r'   r5   r6   r7   r&   s         r9   Úwindow_reverser=   =   s   € ð 	�‰�bÑ€AØ�‰�R˜˜k¨!™nÑ,¨a°;¸q±>Ñ.AÀ;ÈqÁ>ÐS^Ð_`ÑSaÐcdÓe€AØ	�	‰	�!�Q˜˜1˜a Ó#×.Ñ.Ó0×5Ñ5°b¸!¸QÀÓB€AØ€Hr;   Úwin_hÚwin_wc           
      ó"  — t        j                  t        t        j                  | |t         j                  ¬«      t        j                  ||t         j                  ¬«      «      «      }t        j
                  |d«      }|dd…dd…df   |dd…ddd…f   z
  }|j                  ddd«      j                  «       }|dd…dd…dfxx   | dz
  z  cc<   |dd…dd…dfxx   |dz
  z  cc<   |dd…dd…dfxx   d|z  dz
  z  cc<   |j                  d«      S )zÈGet pair-wise relative position index for each token inside the window.

    Args:
        win_h: Window height.
        win_w: Window width.

    Returns:
        Relative position index tensor.
    ©ÚdeviceÚdtyper   Nr+   r   r.   )	ÚtorchÚstackr   ÚarangeÚlongÚflattenr2   r3   Úsum)r>   r?   rB   ÚcoordsÚcoords_flattenÚrelative_coordss         r9   Úget_relative_position_indexrM   P   só   € ô �[‰[œÜ�‰�U 6´·±Ô<Ü�‰�U 6´·±Ô<óó €Fô —]‘] 6¨1Ó-€NØ$¢Qª¨4 ZÑ0°>Â!ÀTÊ1À*Ñ3MÑM€OØ%×-Ñ-¨a°°AÓ6×AÑAÓC€OØ’A’q˜!�GÓ ¨¡	Ñ)ÓØ’A’q˜!�GÓ ¨¡	Ñ)ÓØ’A’q˜!�GÓ  E¡	¨A¡Ñ-ÓØ×Ñ˜rÓ"Ð"r;   c                   ó:  ‡ — e Zd ZU dZej
                  j                  e   ed<   	 	 	 	 	 	 	 dde	de	de
e	   deded	ed
efˆ fd„Zdd„Zdd„Zdee	e	f   ddfd„Zdej$                  fd„Zddej$                  de
ej$                     dej$                  fd„Zdd„Zˆ xZS )ÚWindowAttentionz‹Window based multi-head self attention (W-MSA) module with relative position bias.

    Supports both shifted and non-shifted windows.
    Ú
fused_attnNÚdimÚ	num_headsÚhead_dimr'   Úqkv_biasÚ	attn_dropÚ	proj_dropc
           	      ó  •— ||	dœ}
t         ‰| �  «        || _        t        |«      | _        | j                  \  }}||z  | _        || _        |xs ||z  }||z  }|dz  | _        t        d¬«      | _	        t        j                  t        j                  d|z  dz
  d|z  dz
  z  |fi |
¤Ž«      | _        | j                  dt        j                  ||z  ||z  |t        j                   ¬«      d¬	«       t        j"                  ||d
z  fd|i|
¤Ž| _        t        j&                  |«      | _        t        j"                  ||fi |
¤Ž| _        t        j&                  |«      | _        t        j.                  d¬«      | _        | j3                  «        y)a¶  
        Args:
            dim: Number of input channels.
            num_heads: Number of attention heads.
            head_dim: Number of channels per head (dim // num_heads if not set)
            window_size: The height and width of the window.
            qkv_bias:  If True, add a learnable bias to query, key, value.
            attn_drop: Dropout ratio of attention weight.
            proj_drop: Dropout ratio of output.
        rA   g      à¿T)Úexperimentalr+   r   Úrelative_position_indexF©Ú
persistentr*   Úbiasr.   )rQ   N)ÚsuperÚ__init__rQ   r   r'   Úwindow_arearR   Úscaler   rP   ÚnnÚ	ParameterrD   ÚemptyÚrelative_position_bias_tableÚregister_bufferrG   ÚLinearÚqkvÚDropoutrU   ÚprojrV   ÚSoftmaxÚsoftmaxÚreset_parameters)ÚselfrQ   rR   rS   r'   rT   rU   rV   rB   rC   Úddr>   r?   Úattn_dimÚ	__class__s                 €r9   r^   zWindowAttention.__init__o   sm  ø€ ð, ¨Ñ/ˆÜ‰ÑÔØˆŒÜ$ [Ó1ˆÔØ×'Ñ'‰ˆˆuØ  5™=ˆÔØ"ˆŒØÒ/˜s iÑ/ˆØ˜iÑ'ˆØ Ñ%ˆŒ
Ü(°dÔ;ˆŒô -/¯L©LÜ�K‰K˜˜U™ Q™¨1¨u©9°q©=Ñ9¸9ÑKÈÑKó-MˆÔ)ð 	×ÑØ%Ü�K‰K˜ ™ u¨u¡}¸VÌ5Ï:É:ÔVØð 	ô 	
ô —9‘9˜S (¨Q¡,ÑD°XÐDÀÑDˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜h¨Ñ2¨rÑ2ˆŒ	ÜŸ™ IÓ.ˆŒÜ—z‘z bÔ)ˆŒð 	×ÑÕr;   r(   c                 óR   — t        | j                  d¬«       | j                  «        y)ú"Initialize parameters and buffers.g{®Gáz”?)ÚstdN)r   rd   Ú_init_buffers©rm   s    r9   rl   z WindowAttention.reset_parameters¥   s   € ä�d×7Ñ7¸SÕAØ×ÑÕr;   c                 ó˜   — | j                   \  }}| j                  j                  t        ||| j                  j                  ¬«      «       y)ú.Compute and fill non-persistent buffer values.©rB   N)r'   rY   Úcopy_rM   rB   )rm   r>   r?   s      r9   rt   zWindowAttention._init_buffersª   s=   € à×'Ñ'‰ˆˆuØ×$Ñ$×*Ñ*Ü'¨¨u¸T×=YÑ=Y×=`Ñ=`Ôaõ	
r;   c           	      óâ  — t        |«      }|| j                  k(  ry|| _        | j                  \  }}||z  | _        t        j                  «       5  d|z  dz
  d|z  dz
  z  | j
                  f}t        j                  t        | j                  | j                  |¬«      «      | _	        | j                  dt        ||| j                  j                  ¬«      d¬«       ddd«       y# 1 sw Y   yxY w)	zzUpdate window size & interpolate position embeddings
        Args:
            window_size (int): New window size
        Nr+   r   ©Únew_window_sizeÚnew_bias_shaperY   rx   FrZ   )r   r'   r_   rD   Úno_gradrR   ra   rb   r   rd   re   rM   rB   )rm   r'   r>   r?   r}   s        r9   Úset_window_sizezWindowAttention.set_window_size±   sä   € ô
   Ó,ˆØ˜$×*Ñ*Ò*ØØ&ˆÔØ×'Ñ'‰ˆˆuØ  5™=ˆÔÜ�]‰]‹_ñ 	Ø %™i¨!™m°°E±	¸A±Ñ>ÀÇÁÐNˆNÜ02·±Ü)Ø×5Ñ5Ø$(×$4Ñ$4Ø#1ôó1ˆDÔ-ð × Ñ Ø)Ü+¨E°5À×AbÑAb×AiÑAiÔjØ ð !ô ÷	÷ 	ñ 	ús   ÁBC%Ã%C.c                 ó   — | j                   | j                  j                  d«         j                  | j                  | j                  d«      }|j	                  ddd«      j                  «       }|j                  d«      S )Nr.   r+   r   r   )rd   rY   r1   r_   r2   r3   Ú	unsqueeze)rm   Úrelative_position_biass     r9   Ú_get_rel_pos_biasz!WindowAttention._get_rel_pos_biasÊ   ss   € Ø!%×!BÑ!BØ×(Ñ(×-Ñ-¨bÓ1ñ"3ß37±4¸×8HÑ8HÈ$×JZÑJZÐ\^Ó3_ð 	à!7×!?Ñ!?ÀÀ1ÀaÓ!H×!SÑ!SÓ!UÐØ%×/Ñ/°Ó2Ð2r;   r&   Úmaskc                 óž  — |j                   \  }}}| j                  |«      j                  ||d| j                  d«      j	                  ddddd«      }|j                  d«      \  }}}	| j                  rÈ| j                  «       }
|�e|j                   d   }|j                  d|d||«      j                  ||z  d| j                  dd«      }|
|j                  d| j                  ||«      z   }
t        j                  j                  j                  |||	|
| j                  r| j                  j                   nd¬«      }nÍ|| j"                  z  }||j%                  d	d«      z  }|| j                  «       z   }|�m|j                   d   }|j                  d|| j                  ||«      |j'                  d«      j'                  d«      z   }|j                  d| j                  ||«      }| j)                  |«      }| j                  |«      }||	z  }|j%                  dd«      j                  ||d«      }| j+                  |«      }| j-                  |«      }|S )
a  Forward pass.

        Args:
            x: Input features with shape of (num_windows*B, N, C).
            mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None.

        Returns:
            Output features with shape of (num_windows*B, N, C).
        r*   r.   r+   r   r   r,   ç        )Ú	attn_maskÚ	dropout_péþÿÿÿ)r0   rg   ÚreshaperR   r2   ÚunbindrP   rƒ   r1   ÚexpandrD   ra   Ú
functionalÚscaled_dot_product_attentionÚtrainingrU   Úpr`   Ú	transposer�   rk   ri   rV   )rm   r&   r„   ÚB_ÚNr7   rg   ÚqÚkÚvr‡   Únum_winÚattns                r9   ÚforwardzWindowAttention.forwardÐ   s  € ð —7‘7‰ˆˆAˆqØ�h‰h�q‹k×!Ñ! " a¨¨D¯N©N¸BÓ?×GÑGÈÈ1ÈaÐQRÐTUÓVˆØ—*‘*˜Q“-‰ˆˆ1ˆaà�?Š?Ø×.Ñ.Ó0ˆIØÐØŸ*™* Q™-�Ø—y‘y  G¨Q°°1Ó5×<Ñ<¸RÀ7¹]ÈBÐPT×P^ÑP^Ð`bÐdfÓg�Ø%¨¯©°R¸¿¹ÈÈAÓ(NÑN�	Ü—‘×#Ñ#×@Ñ@Ø�1�aØ#Ø.2¯mªm˜$Ÿ.™.×*Ò*Àð Aó ‰Að �D—J‘J‘ˆAØ�q—{‘{ 2 rÓ*Ñ*ˆDØ˜$×0Ñ0Ó2Ñ2ˆDØÐØŸ*™* Q™-�Ø—y‘y  W¨d¯n©n¸aÀÓCÀdÇnÁnÐUVÓFW×FaÑFaÐbcÓFdÑd�Ø—y‘y  T§^¡^°Q¸Ó:�Ø—<‘< Ó%ˆDØ—>‘> $Ó'ˆDØ�q‘ˆAà�K‰K˜˜1Ó×%Ñ% b¨!¨RÓ0ˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØˆr;   c                 ó$   — | j                  «        y©z"Initialize non-persistent buffers.N©rt   ru   s    r9   Úinit_non_persistent_buffersz+WindowAttention.init_non_persistent_buffersú   ó   € à×ÑÕr;   )Né   Tr†   r†   NN©r(   N©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   ÚjitÚFinalÚboolÚ__annotations__Úintr   Ú_int_or_tuple_2_tÚfloatr^   rl   rt   r	   r   ÚTensorrƒ   r™   r�   Ú__classcell__©rp   s   @r9   rO   rO   h   sè   ø… ñð —	‘	—‘ Ñ%Ó%ð '+Ø-.Ø!Ø!Ø!ØØñ4 àð4 ð ð4 ð ˜s‘mð	4 ð
 +ð4 ð ð4 ð ð4 ð õ4 óló

ð¨5°°c°©?ð ¸tó ð23 5§<¡<ó 3ñ(˜Ÿ™ð (¨X°e·l±lÑ-Cð (ÈuÏ|É|ó (÷Tr;   rO   c                    óV  ‡ — e Zd ZdZddddddddd	d	d	ej
                  ej                  ddfd
ededede	e   dedede
de
dede
dedededeej                     deej                     fˆ fd„Zd)d„Zd)d„Z	 	 	 d*de	ej$                     de	ej&                     de	ej(                     de	ej$                     fd „Z	 d+d!eeeeef   f   d"e	eeeeef   f      deeeef   eeef   f   fd#„Z	 d+d$eeef   deeef   de	e
   fd%„Zd&„ Zdej$                  dej$                  fd'„Zd)d(„Zˆ xZS ),ÚSwinTransformerBlockzkSwin Transformer Block.

    A transformer block with window-based self-attention and shifted windows.
    r,   NrŸ   r   Fç      @Tr†   rQ   Úinput_resolutionrR   rS   r'   Ú
shift_sizeÚalways_partitionÚdynamic_maskÚ	mlp_ratiorT   rV   rU   Ú	drop_pathÚ	act_layerÚ
norm_layerc           
      óÂ  •— ||dœ}t         ‰| �  «        || _        || _        t	        |«      | _        || _        || _        | j                  ||«      \  | _	        | _
        | j                  d   | j                  d   z  | _        |	| _         ||fi |¤Ž| _        t        |f||| j                  |
||dœ|¤Ž| _        |dkD  rt!        |«      nt#        j$                  «       | _         ||fi |¤Ž| _        t+        d|t-        ||	z  «      ||dœ|¤Ž| _        |dkD  rt!        |«      nt#        j$                  «       | _        | j3                  ddd	¬
«       | j5                  «        y)aå  
        Args:
            dim: Number of input channels.
            input_resolution: Input resolution.
            window_size: Window size.
            num_heads: Number of attention heads.
            head_dim: Enforce the number of channels per head
            shift_size: Shift size for SW-MSA.
            always_partition: Always partition into full windows and shift
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            proj_drop: Dropout rate.
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth rate.
            act_layer: Activation layer.
            norm_layer: Normalization layer.
        rA   r   r   )rR   rS   r'   rT   rU   rV   r†   )Úin_featuresÚhidden_featuresr¹   Údropr‡   NFrZ   © )r]   r^   rQ   r³   r   Útarget_shift_sizerµ   r¶   Ú_calc_window_shiftr'   r´   r_   r·   Únorm1rO   r˜   r   ra   ÚIdentityÚ
drop_path1Únorm2r   rª   ÚmlpÚ
drop_path2re   rl   )rm   rQ   r³   rR   rS   r'   r´   rµ   r¶   r·   rT   rV   rU   r¸   r¹   rº   rB   rC   rn   rp   s                      €r9   r^   zSwinTransformerBlock.__init__  ss  ø€ ðJ ¨Ñ/ˆÜ‰ÑÔØˆŒØ 0ˆÔÜ!*¨:Ó!6ˆÔØ 0ˆÔØ(ˆÔØ,0×,CÑ,CÀKÐQ[Ó,\Ñ)ˆÔ˜$œ/Ø×+Ñ+¨AÑ.°×1AÑ1AÀ!Ñ1DÑDˆÔØ"ˆŒá Ñ* rÑ*ˆŒ
Ü#Øð	
àØØ×(Ñ(ØØØñ	
ð ñ	
ˆŒ	ð 2;¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
Üð 
ØÜ  i¡Ó0ØØñ	
ð
 ñ
ˆŒð 2;¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒð 	×Ñ˜[¨$¸5ÐÔAð 	×ÑÕr;   r(   c                 ó$   — | j                  «        y)rr   Nrœ   ru   s    r9   rl   z%SwinTransformerBlock.reset_parametersR  rž   r;   c                 óì   — | j                   sh| j                  j                  j                  }| j                  j                  j                  }| j                  ||¬«      }| j                  d|d¬«       yy)rw   rA   r‡   FrZ   N)r¶   rÂ   ÚweightrB   rC   Úget_attn_maskre   )rm   rB   rC   r‡   s       r9   rt   z"SwinTransformerBlock._init_buffersV  sd   € à× Ò Ø—Z‘Z×&Ñ&×-Ñ-ˆFØ—J‘J×%Ñ%×+Ñ+ˆEØ×*Ñ*°&ÀÐ*ÓFˆIØ× Ñ  ¨iÀEÐ ÕJð	 !r;   r&   rB   rC   c           	      ód  — t        | j                  «      �r|�7|j                  d   |j                  d   }}|j                  }|j                  }n| j
                  \  }}|}|}t        j                  || j                  d   z  «      | j                  d   z  }t        j                  || j                  d   z  «      | j                  d   z  }t        j                  d||df||¬«      }d}d| j                  d    f| j                  d    | j                  d    f| j                  d    d ffD ]l  }d| j                  d    f| j                  d    | j                  d    f| j                  d    d ffD ]$  }	||d d …|d   |d   …|	d   |	d   …d d …f<   |dz  }Œ& Œn t        || j                  «      }
|
j                  d| j                  «      }
|
j                  d«      |
j                  d«      z
  }|j                  |dk7  t!        d«      «      j                  |dk(  t!        d«      «      }|S d }|S )Nr   r+   r   )rC   rB   r.   g      YÀr†   )Úanyr´   r0   rB   rC   r³   ÚmathÚceilr'   rD   Úzerosr:   r1   r_   r�   Úmasked_fillr¬   )rm   r&   rB   rC   r5   r6   Úimg_maskÚcntÚhÚwÚmask_windowsr‡   s               r9   rË   z"SwinTransformerBlock.get_attn_mask^  s\  € ô ˆt�‰Õàˆ}Ø—w‘w˜q‘z 1§7¡7¨1¡:�1�ØŸ™�ØŸ™‘à×,Ñ,‘��1Ø�Ø�Ü—	‘	˜!˜d×.Ñ.¨qÑ1Ñ1Ó2°T×5EÑ5EÀaÑ5HÑHˆAÜ—	‘	˜!˜d×.Ñ.¨qÑ1Ñ1Ó2°T×5EÑ5EÀaÑ5HÑHˆAÜ—{‘{ A q¨!¨Q <°uÀVÔLˆHØˆCà˜×)Ñ)¨!Ñ,Ð,Ð-Ø×&Ñ& qÑ)Ð)¨D¯O©O¸AÑ,>Ð+>Ð?Ø—o‘o aÑ(Ð(¨$Ð/ðò �ð ˜T×-Ñ-¨aÑ0Ð0Ð1Ø×*Ñ*¨1Ñ-Ð-°·±ÀÑ0BÐ/BÐCØŸ/™/¨!Ñ,Ð,¨dÐ3ðò �Að
 <?�HšQ  !¡ Q q¡T 	¨1¨Q©4°°!±¨9²aÐ7Ñ8Ø˜1‘H‘Cñðô ,¨H°d×6FÑ6FÓGˆLØ'×,Ñ,¨R°×1AÑ1AÓBˆLØ$×.Ñ.¨qÓ1°L×4JÑ4JÈ1Ó4MÑMˆIØ!×-Ñ-¨i¸1©n¼eÀF»mÓL×XÑXÐYbÐfgÑYgÔinÐorÓisÓtˆIð Ðð ˆIØÐr;   Útarget_window_sizerÀ   c                 ó¬  — t        |«      }|€(| j                  }t        |«      r|d   dz  |d   dz  f}nt        |«      }| j                  r||fS t	        | j
                  |«      D ��cg c]  \  }}||k  r|n|‘Œ }}}t	        | j
                  ||«      D ���cg c]  \  }}}||k  rdn|‘Œ }}}}t        |«      t        |«      fS c c}}w c c}}}w )Nr   r+   r   )r   rÀ   rÍ   rµ   Úzipr³   Útuple)rm   r×   rÀ   ÚrrÕ   r'   Úsr´   s           r9   rÁ   z'SwinTransformerBlock._calc_window_shift†  sô   € ô
 'Ð'9Ó:ÐØÐ$à $× 6Ñ 6ÐÜÐ$Ô%Ø%7¸Ñ%:¸aÑ%?ÐASÐTUÑAVÐZ[ÑA[Ð$\Ñ!ä )Ð*;Ó <Ðà× Ò Ø%Ð'8Ð8Ð8ä69¸$×:OÑ:OÐQcÓ6d×e©d¨a°˜A šF‘q¨Ñ)ÐeˆÑeÜ8;¸D×<QÑ<QÐS^Ð`qÓ8r×sÐs©W¨Q°°1˜1 š6‘a qÑ(Ðsˆ
ÒsÜ�[Ó!¤5¨Ó#4Ð4Ð4ùó fùÜss   Á*C	ÂCÚ	feat_sizec                 óè  — || _         |�|| _        | j                  |«      \  | _        | _        | j                  d   | j                  d   z  | _        | j                  j                  | j                  «       | j                  �| j                  j                  nd}| j                  �| j                  j                  nd}| j                  d| j                  rdn| j                  ||¬«      d¬«       y)z¸
        Args:
            feat_size: New input resolution
            window_size: New window size
            always_partition: Change always_partition attribute if not None
        Nr   r   r‡   rA   FrZ   )r³   rµ   rÁ   r'   r´   r_   r˜   r   r‡   rB   rC   re   r¶   rË   )rm   rÝ   r'   rµ   rB   rC   s         r9   Úset_input_sizez#SwinTransformerBlock.set_input_size›  sÚ   € ð !*ˆÔØÐ'Ø$4ˆDÔ!Ø,0×,CÑ,CÀKÓ,PÑ)ˆÔ˜$œ/Ø×+Ñ+¨AÑ.°×1AÑ1AÀ!Ñ1DÑDˆÔØ�	‰	×!Ñ! $×"2Ñ"2Ô3Ø*.¯.©.Ð*D�—‘×&Ò&È$ˆØ(,¯©Ð(B�—‘×$Ò$ÈˆØ×ÑØØ×%Ò%‰D¨4×+=Ñ+=ÀVÐSXÐ+=Ó+YØð 	õ 	
r;   c           	      ó  — |j                   \  }}}}t        | j                  «      }|r7t        j                  || j                  d    | j                  d    fd¬«      }n|}| j
                  d   || j
                  d   z  z
  | j
                  d   z  }| j
                  d   || j
                  d   z  z
  | j
                  d   z  }	t        j                  j                  j                  |ddd|	d|f«      }|j                   \  }
}}}
t        || j
                  «      }|j                  d| j                  |«      }t        | dd«      r| j                  |«      }n| j                  }| j                  ||¬«      }|j                  d| j
                  d   | j
                  d   |«      }t!        || j
                  ||«      }|d d …d |…d |…d d …f   j#                  «       }|r$t        j                  || j                  d¬«      }|S |}|S )	Nr   r   )r   r+   )ÚshiftsÚdimsr.   r¶   F)r„   )r0   rÍ   r´   rD   Úrollr'   ra   r�   Úpadr:   r1   r_   ÚgetattrrË   r‡   r˜   r=   r3   )rm   r&   r4   r5   r6   r7   Ú	has_shiftÚ	shifted_xÚpad_hÚpad_wÚ_ÚHpÚWpÚ	x_windowsr‡   Úattn_windowss                   r9   Ú_attnzSwinTransformerBlock._attnµ  s   € Ø—W‘W‰
ˆˆ1ˆa�ô ˜Ÿ™Ó(ˆ	ÙÜŸ
™
 1¨t¯©¸qÑ/AÐ.AÀDÇOÁOÐTUÑDVÐCVÐ-WÐ^dÔe‰IàˆIð ×!Ñ! !Ñ$ q¨4×+;Ñ+;¸AÑ+>Ñ'>Ñ>À$×BRÑBRÐSTÑBUÑUˆØ×!Ñ! !Ñ$ q¨4×+;Ñ+;¸AÑ+>Ñ'>Ñ>À$×BRÑBRÐSTÑBUÑUˆÜ—H‘H×'Ñ'×+Ñ+¨I¸¸1¸aÀÈÈ5Ð7QÓRˆ	Ø —‘‰ˆˆ2ˆr�1ô % Y°×0@Ñ0@ÓAˆ	Ø—N‘N 2 t×'7Ñ'7¸Ó;ˆ	ô �4˜¨Ô/Ø×*Ñ*¨9Ó5‰IàŸ™ˆIØ—y‘y °�yÓ;ˆð $×(Ñ(¨¨T×-=Ñ-=¸aÑ-@À$×BRÑBRÐSTÑBUÐWXÓYˆÜ" <°×1AÑ1AÀ2ÀrÓJˆ	Øša  !  R a Rª˜lÑ+×6Ñ6Ó8ˆ	ñ Ü—
‘
˜9¨T¯_©_À6ÔJˆAð ˆð ˆAØˆr;   c                 ó>  — |j                   \  }}}}|| j                  | j                  | j                  |«      «      «      z   }|j	                  |d|«      }|| j                  | j                  | j                  |«      «      «      z   }|j	                  ||||«      }|S )z£Forward pass.

        Args:
            x: Input features with shape (B, H, W, C).

        Returns:
            Output features with shape (B, H, W, C).
        r.   )r0   rÄ   rï   rÂ   rŠ   rÇ   rÆ   rÅ   )rm   r&   r4   r5   r6   r7   s         r9   r™   zSwinTransformerBlock.forwardÜ  sˆ   € ð —W‘W‰
ˆˆ1ˆa�Ø�—‘ §
¡
¨4¯:©:°a«=Ó 9Ó:Ñ:ˆØ�I‰I�a˜˜QÓˆØ�—‘ §¡¨¯©°A«Ó 7Ó8Ñ8ˆØ�I‰I�a˜˜A˜qÓ!ˆØˆr;   c                 ó$   — | j                  «        yr›   rœ   ru   s    r9   r�   z0SwinTransformerBlock.init_non_persistent_buffersì  rž   r;   r    )NNNr¡   )r¢   r£   r¤   r¥   ra   ÚGELUÚ	LayerNormrª   r«   r   r¨   r¬   r   ÚModuler^   rl   rt   rD   r­   rB   rC   rË   r
   r	   rÁ   rß   rï   r™   r�   r®   r¯   s   @r9   r±   r±   ÿ   s.  ø„ ñð Ø&*Ø-.ØØ%*Ø!&Ø!Ø!Ø!Ø!Ø!Ø)+¯©Ø*,¯,©,ØØñ%K àðK ð 0ðK ð ð	K ð
 ˜s‘mðK ð +ðK ð ðK ð #ðK ð ðK ð ðK ð ðK ð ðK ð ðK ð ðK ð ˜BŸI™I‘ðK ð  ˜RŸY™Y™õ!K óZóKð )-Ø-1Ø+/ñ	&à˜Ÿ™Ñ%ð&ð ˜UŸ\™\Ñ*ð&ð ˜EŸK™KÑ(ð	&ð
 
�%—,‘,Ñ	ó&ðV HLñ5à % c¨5°°c°©?Ð&:Ñ ;ð5ð  (¨¨c°5¸¸c¸±?Ð.BÑ(CÑDð5ð 
ˆu�S˜#�X‰  c¨3 h¡Ð/Ñ	0ó	5ð2 04ñ	
à˜S #˜X‘ð
ð ˜s C˜x™ð
ð ' t™nó	
ò4%ðN˜Ÿ™ð ¨%¯,©,ó ÷ r;   r±   c                   ó¦   ‡ — e Zd ZdZdej
                  ddfdedee   deej                     fˆ fd„Z
dej                  dej                  fd	„Zˆ xZS )
ÚPatchMergingzVPatch Merging Layer.

    Downsample features by merging 2x2 neighboring patches.
    NrQ   Úout_dimrº   c                 óÎ   •— ||dœ}t         ‰| �  «        || _        |xs d|z  | _         |d|z  fi |¤Ž| _        t        j                  d|z  | j                  fddi|¤Ž| _        y)z³
        Args:
            dim: Number of input channels.
            out_dim: Number of output channels (or 2 * dim if None)
            norm_layer: Normalization layer.
        rA   r+   r,   r\   FN)r]   r^   rQ   r÷   Únormra   rf   Ú	reduction)rm   rQ   r÷   rº   rB   rC   rn   rp   s          €r9   r^   zPatchMerging.__init__÷  sj   ø€ ð ¨Ñ/ˆÜ‰ÑÔØˆŒØÒ) ! c¡'ˆŒÙ˜q 3™wÑ-¨"Ñ-ˆŒ	ÜŸ™ 1 s¡7¨D¯L©LÑK¸uÐKÈÑKˆ�r;   r&   r(   c                 óh  — |j                   \  }}}}ddd|dz  d|dz  f}t        j                  j                  ||«      }|j                   \  }}}}|j	                  ||dz  d|dz  d|«      j                  dddddd«      j                  d«      }| j                  |«      }| j                  |«      }|S )z¯Forward pass.

        Args:
            x: Input features with shape (B, H, W, C).

        Returns:
            Output features with shape (B, H//2, W//2, out_dim).
        r   r+   r   r*   r,   r-   )	r0   ra   r�   rä   rŠ   r2   rH   rù   rú   )rm   r&   r4   r5   r6   r7   Ú
pad_valuesrê   s           r9   r™   zPatchMerging.forward  s·   € ð —W‘W‰
ˆˆ1ˆa�à˜˜A˜q 1™u a¨¨Q©Ð/ˆ
Ü�M‰M×Ñ˜a Ó,ˆØ—W‘W‰
ˆˆ1ˆa�à�I‰I�a˜˜a™  A¨¡F¨A¨qÓ1×9Ñ9¸!¸QÀÀ1ÀaÈÓK×SÑSÐTUÓVˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØˆr;   )r¢   r£   r¤   r¥   ra   ró   rª   r   r   rô   r^   rD   r­   r™   r®   r¯   s   @r9   rö   rö   ñ  sf   ø„ ñð &*Ø*,¯,©,ØØñLàðLð ˜c‘]ðLð ˜RŸY™Y™õ	Lð*˜Ÿ™ð ¨%¯,©,÷ r;   rö   c            "       ó0  ‡ — e Zd ZdZdddddddddddej
                  ddfd	ed
edeeef   dededede	e   de
dededededededeee   ef   deej                     f ˆ fd„Z	 ddeeef   dede	e   fd„Zdej&                  dej&                  fd„Zˆ xZS ) ÚSwinTransformerStagez|A basic Swin Transformer layer for one stage.

    Contains multiple Swin Transformer blocks and optional downsampling.
    Tr,   NrŸ   Fr²   r†   rQ   r÷   r³   ÚdepthÚ
downsamplerR   rS   r'   rµ   r¶   r·   rT   rV   rU   r¸   rº   c                 óH  •— ||dœ}t         ‰| �  «        || _        || _        |rt	        d„ |D «       «      n|| _        || _        d| _        t        |«      }t	        |D �cg c]  }|dz  ‘Œ	 c}«      }|rt        d	|||dœ|¤Ž| _
        n ||k(  sJ ‚t        j                  «       | _
        t        j                  t        |«      D �cg c]E  }t        d	|| j
                  ||||dz  dk(  rdn||	|
||||t!        |t"        «      r||   n||dœ|¤Ž‘ŒG c}Ž | _        yc c}w c c}w )
aò  
        Args:
            dim: Number of input channels.
            out_dim: Number of output channels.
            input_resolution: Input resolution.
            depth: Number of blocks.
            downsample: Downsample layer at the end of the layer.
            num_heads: Number of attention heads.
            head_dim: Channels per head (dim // num_heads if not set)
            window_size: Local window size.
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            proj_drop: Projection dropout rate.
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth rate.
            norm_layer: Normalization layer.
        rA   c              3   ó&   K  — | ]	  }|d z  –— Œ y­w©r+   Nr¿   ©Ú.0Úis     r9   ú	<genexpr>z0SwinTransformerStage.__init__.<locals>.<genexpr>Q  s   è ø€ Ò&H°! q¨A¥vÑ&Hùó   ‚Fr+   )rQ   r÷   rº   r   )rQ   r³   rR   rS   r'   r´   rµ   r¶   r·   rT   rV   rU   r¸   rº   Nr¿   )r]   r^   rQ   r³   rÚ   Úoutput_resolutionrÿ   Úgrad_checkpointingr   rö   r   ra   rÃ   Ú
SequentialÚranger±   Ú
isinstanceÚlistÚblocks)rm   rQ   r÷   r³   rÿ   r   rR   rS   r'   rµ   r¶   r·   rT   rV   rU   r¸   rº   rB   rC   rn   rÕ   r´   r  rp   s                          €r9   r^   zSwinTransformerStage.__init__'  sR  ø€ ðL ¨Ñ/ˆÜ‰ÑÔØˆŒØ 0ˆÔÙLV¤Ñ&HÐ7GÔ&HÔ!HÐ\lˆÔØˆŒ
Ø"'ˆÔÜ Ó,ˆÜ¨KÖ8 q˜A ›FÒ8Ó9ˆ
ñ Ü*ð ØØØ%ñð ñ	ˆD�Oð ˜'’>Ð!�>Ü Ÿk™k›mˆDŒOô —m‘mô$ ˜5“\ö%&#ð$ ô# !ð ØØ!%×!7Ñ!7Ø#Ø!Ø'Ø!" Q¡¨!¢™1°*Ø!1Ø)Ø#Ø!Ø#Ø#Ü*4°YÄÔ*E˜) Aš,È9Ø%ñð óò&#ð $ˆ�ùò 9ùò&#s   Á DÃA
DrÝ   c                 óö   — || _         t        | j                  t        j                  «      r|| _        nt        d„ |D «       «      | _        | j                  D ]   }|j                  | j
                  ||¬«       Œ" y)a   Updates the resolution, window size and so the pair-wise relative positions.

        Args:
            feat_size: New input (feature) resolution
            window_size: New window size
            always_partition: Always partition / shift the window
        c              3   ó&   K  — | ]	  }|d z  –— Œ y­wr  r¿   r  s     r9   r  z6SwinTransformerStage.set_input_size.<locals>.<genexpr>‰  s   è ø€ Ò*E°a¨1°­6Ñ*Eùr  ©rÝ   r'   rµ   N)	r³   r  r   ra   rÃ   r	  rÚ   r  rß   )rm   rÝ   r'   rµ   Úblocks        r9   rß   z#SwinTransformerStage.set_input_sizex  sn   € ð !*ˆÔÜ�d—o‘o¤r§{¡{Ô3Ø%.ˆDÕ"ä%*Ñ*E¸9Ô*EÓ%EˆDÔ"Ø—[‘[ò 	ˆEØ× Ñ Ø×0Ñ0Ø'Ø!1ð !õ ñ	r;   r&   r(   c                 óÎ   — | j                  |«      }| j                  r6t        j                  j	                  «       st        | j                  |«      }|S | j                  |«      }|S )zsForward pass.

        Args:
            x: Input features.

        Returns:
            Output features.
        )r   r
  rD   r¦   Úis_scriptingr   r  ©rm   r&   s     r9   r™   zSwinTransformerStage.forward‘  sU   € ð �O‰O˜AÓˆà×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆr;   r¡   )r¢   r£   r¤   r¥   ra   ró   rª   r	   r¨   r   r«   r¬   r
   r   r   rô   r^   rß   rD   r­   r™   r®   r¯   s   @r9   rþ   rþ   !  s\  ø„ ñð  $ØØ&*Ø-.Ø%*Ø!&Ø!Ø!Ø!Ø!Ø35Ø*,¯,©,ØØñ'O$àðO$ð ðO$ð $ C¨ H™oð	O$ð
 ðO$ð ðO$ð ðO$ð ˜s‘mðO$ð +ðO$ð #ðO$ð ðO$ð ðO$ð ðO$ð ðO$ð ðO$ð  ˜T %™[¨%Ð/Ñ0ð!O$ð" ˜RŸY™Y™õ#O$ðj 04ñ	à˜S #˜X‘ðð ðð ' t™nó	ð2˜Ÿ™ð ¨%¯,©,÷ r;   rþ   c            ,       óœ  ‡ — e Zd ZdZdddddddd	d
dddddddddeej                  dd
d
fdedededede	dede
edf   de
edf   dee   dedededed ed!ed"ed#ed$ed%eej                     d&ee	eej                     f   d'e	f*ˆ fd(„Zej&                  j(                  dDd)e	d*ed+d
fd,„«       Zej&                  j(                  d+ee	   fd-„«       Z	 	 	 	 	 dEdee
eef      dee
eef      dee
eef      d.edee   d+d
fd/„Zej&                  j(                  dFd0ed+ee	ef   fd1„«       Zej&                  j(                  dGd2ed+d
fd3„«       Zej&                  j(                  d+ej                  fd4„«       ZdHdedee	   d+d
fd5„Z	 	 	 	 	 dId6ej>                  d7eeee e   f      d8ed9ed:e	d;ed+ee ej>                     e
ej>                  e ej>                     f   f   fd<„Z!	 	 	 dJd7eee e   f   d=ed>ed+e e   fd?„Z"d6ej>                  d+ej>                  fd@„Z#dFd6ej>                  dAed+ej>                  fdB„Z$d6ej>                  d+ej>                  fdC„Z%ˆ xZ&S )Kr%   z§Swin Transformer.

    A PyTorch impl of : `Swin Transformer: Hierarchical Vision Transformer using Shifted Windows`  -
          https://arxiv.org/pdf/2103.14030
    éà   r,   r*   éè  Úavgé`   ©r+   r+   é   r+   ©r*   r  é   é   NrŸ   FTr²   r†   gš™™™™™¹?Ú Úimg_sizeÚ
patch_sizeÚin_chansÚnum_classesÚglobal_poolÚ	embed_dimÚdepths.rR   rS   r'   rµ   Ústrict_img_sizer·   rT   Ú	drop_rateÚproj_drop_rateÚattn_drop_rateÚdrop_path_rateÚembed_layerrº   Úweight_initc                 óÌ  •— t         ‰!| �  «        ||dœ}|dv sJ ‚|| _        || _        || _        d| _        t        |«      | _        || _        t        |d| j                  dz
  z  z  «      x| _
        | _        g | _        t        |t        t        f«      s1t!        | j                  «      D �cg c]  }t        |d|z  z  «      ‘Œ }} |d"||||d   ||ddœ|¤Ž| _        | j"                  j$                  } t'        | j                  «      |	«      }	t        |
t        t        f«      s t'        | j                  «      |
«      }
nt        |
«      dk(  r|
f| j                  z  }
t        |
«      | j                  k(  sJ ‚ t'        | j                  «      |«      }t)        ||d¬	«      }g }|d   }d}t!        | j                  «      D ]ž  }||   } |t+        d"i d
|“d| “d|d   |z  |d   |z  f“d||   “d|dkD  “d||   “d|	|   “d|
|   “d|“d| “d||   “d|“d|“d|“d||   “d|“|¤Žgz  }| }|dkD  r|dz  }| xj                  t-        | ||z  d|› �¬«      gz  c_        Œ  t/        j0                  |Ž | _         || j                  fi |¤Ž| _        t7        | j                  |f||| j
                  dœ|¤Ž| _        |dk(  rdn|| _        |dk7  r| j=                  d¬ «       y!y!c c}w )#a~  
        Args:
            img_size: Input image size.
            patch_size: Patch size.
            in_chans: Number of input image channels.
            num_classes: Number of classes for classification head.
            embed_dim: Patch embedding dimension.
            depths: Depth of each Swin Transformer layer.
            num_heads: Number of attention heads in different layers.
            head_dim: Dimension of self-attention heads.
            window_size: Window size.
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            drop_rate: Dropout rate.
            attn_drop_rate (float): Attention dropout rate.
            drop_path_rate (float): Stochastic depth rate.
            embed_layer: Patch embedding layer.
            norm_layer (nn.Module): Normalization layer.
        rA   )r!  r  ÚNHWCr+   r   r   )r"  r#  r$  r'  rº   r)  Ú
output_fmtT)Ú	stagewiserQ   r÷   r³   rÿ   r   rR   rS   r'   rµ   r¶   r·   rT   rV   rU   r¸   rº   úlayers.)Únum_chsrú   Úmodule)Ú	pool_typer*  Ú	input_fmtÚskipÚresetF)Úneeds_resetNr¿   )r]   r^   r%  r$  r&  r2  ÚlenÚ
num_layersr'  rª   Únum_featuresÚhead_hidden_sizeÚfeature_infor  rÚ   r  r  Úpatch_embedÚ	grid_sizer   r   rþ   Údictra   r  Úlayersrù   r   ÚheadÚweight_init_modeÚinit_weights)"rm   r"  r#  r$  r%  r&  r'  r(  rR   rS   r'   rµ   r)  r·   rT   r*  r+  r,  r-  r.  rº   r/  rB   rC   Úkwargsrn   r  Ú
patch_gridÚdprrD  Úin_dimr`   r÷   rp   s"                                    €r9   r^   zSwinTransformer.__init__ª  sœ  ø€ ô\ 	‰ÑÔØ¨Ñ/ˆØ˜kÑ)Ð)Ð)Ø&ˆÔØ ˆŒØ&ˆÔØ ˆŒä˜f›+ˆŒØ"ˆŒÜ47¸	ÀAÈ$Ï/É/Ð\]ÑJ]ÑD^Ñ8^Ó4_Ð_ˆÔ˜DÔ1ØˆÔä˜)¤e¬T ]Ô3Ü:?ÀÇÁÓ:PÖQ°Qœ˜Y¨¨a©Ñ/Õ0ÐQˆIÐQñ 'ð 	
ØØ!ØØ ‘lØ!Ø+Øñ	
ð ñ	
ˆÔð ×%Ñ%×/Ñ/ˆ
ð .”9˜TŸ_™_Ó-¨hÓ7ˆÜ˜+¬¬e }Ô5Ø4œ) D§O¡OÓ4°[ÓA‰KÜ�Ó Ò"Ø&˜.¨4¯?©?Ñ:ˆKÜ�;Ó 4§?¡?Ò2Ð2Ð2Ø.”I˜dŸo™oÓ.¨yÓ9ˆ	Ü'¨¸È$ÔOˆØˆØ˜1‘ˆØˆÜ�t—‘Ó'ò 	mˆAØ ‘lˆGØÔ+ò Ùðáðð ˜q‘M UÑ*Ø˜q‘M UÑ*ñ"ðð ˜Q’iðð ˜qš5ðð $ Aš,ðð " !šðð (¨šNðñ "2ðð "1Ñ0ðð $ Aš,ðñ "ðñ  )ð!ñ" )ð#ð$ ˜aš&ð%ñ& &Øñ)ð ñ ˆFð, ˆFØ�1ŠuØ˜‘
�Ø×Ò¤$¨wÀ*ÈuÑBTÐ_fÐghÐfiÐ]jÔ"kÐ!lÑlÖð7	mô8 —m‘m VÐ,ˆŒá˜t×0Ñ0Ñ7°BÑ7ˆŒ	Ü"Ø×ÑØð
ð "ØØ—o‘oñ
ð ñ
ˆŒ	ð ,7¸&Ò+@¡ÀkˆÔà˜&Ò Ø×Ñ¨%ÐÕ0ð !ùòK Rs   Â,K!Úmoder;  r(   c                 ó¬   — |xs | j                   }|dv sJ ‚d|v r t        j                  | j                  «       nd}t	        t        |||¬«      | «       y)a*  Initialize model weights.

        Args:
            mode: Weight initialization mode ('jax', 'jax_nlhb', 'moco', or '').
            needs_reset: If True, call reset_parameters() on modules that have it.
                Set to False when modules have already self-initialized in __init__.
        )ÚjaxÚjax_nlhbÚmocor:  r!  Únlhbr†   )Ú	head_biasr;  N)rF  rÎ   Úlogr%  r    r$   )rm   rL  r;  rR  s       r9   rG  zSwinTransformer.init_weights.  sX   € ð Ò,�t×,Ñ,ˆØÐ?Ñ?Ð?Ð?Ø39¸T±>”T—X‘X˜d×.Ñ.Ó/Ñ/Àrˆ	ÜÔ(¨¸ÐP[Ô\Ð^bÕcr;   c                 óv   — t        «       }| j                  «       D ]  \  }}d|v sŒ|j                  |«       Œ |S )z,Parameters that should not use weight decay.rd   )ÚsetÚnamed_parametersÚadd)rm   ÚnwdÚnrê   s       r9   Úno_weight_decayzSwinTransformer.no_weight_decay<  sA   € ô ‹eˆØ×)Ñ)Ó+ò 	‰DˆAˆqØ-°Ò2Ø—‘˜•
ð	ð ˆ
r;   Úwindow_ratioc                 óZ  — |€|�3| j                   j                  ||¬«       | j                   j                  }|€t        D �cg c]  }||z  ‘Œ	 c}«      }t	        | j
                  «      D ]9  \  }}	dt        |dz
  d«      z  }
|	j                  d   |
z  |d   |
z  f||¬«       Œ; yc c}w )aê  Update the image resolution and window size.

        Args:
            img_size: New input resolution, if None current resolution is used.
            patch_size: New patch size, if None use current patch size.
            window_size: New window size, if None based on new_img_size // window_div.
            window_ratio: Divisor for calculating window size from grid size.
            always_partition: Always partition into windows and shift (even if window size < feat size).
        N)r"  r#  r+   r   r   r  )rA  rß   rB  rÚ   Ú	enumeraterD  Úmax)rm   r"  r#  r'   r[  rµ   rI  ÚpgÚindexÚstageÚstage_scales              r9   rß   zSwinTransformer.set_input_sizeE  sÃ   € ð" Ð :Ð#9Ø×Ñ×+Ñ+°XÈ*Ð+ÔUØ×)Ñ)×3Ñ3ˆJàÐÜ¸jÖ I¸  |Ó!3Ò IÓJˆKä% d§k¡kÓ2ò 	‰LˆE�5Øœs 5¨1¡9¨aÓ0Ñ0ˆKØ× Ñ Ø% a™=¨KÑ7¸ÀA¹È+Ñ9UÐVØ'Ø!1ð !õ ñ	ùò !Js   ÁB(Úcoarsec                 ó2   — t        d|rd¬«      S g d¢¬«      S )z"Group parameters for optimization.z^patch_embedz^layers\.(\d+)))z^layers\.(\d+).downsample)r   )z^layers\.(\d+)\.\w+\.(\d+)N)z^norm)iŸ† )Ústemr  )rC  )rm   rc  s     r9   Úgroup_matcherzSwinTransformer.group_matchere  s)   € ô Ø Ù(.Ð$ô
ð 	
ò5ô
ð 	
r;   Úenablec                 ó4   — | j                   D ]	  }||_        Œ y)z)Enable or disable gradient checkpointing.N)rD  r
  )rm   rg  Úls      r9   Úset_grad_checkpointingz&SwinTransformer.set_grad_checkpointingq  s   € ð —‘ò 	*ˆAØ#)ˆAÕ ñ	*r;   c                 ó.   — | j                   j                  S )zGet the classifier head.)rE  Úfcru   s    r9   Úget_classifierzSwinTransformer.get_classifierw  s   € ð �y‰y�|‰|Ðr;   c                 óL   — || _         | j                  j                  ||¬«       y)zŸReset the classifier head.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        )r7  N)r%  rE  r:  )rm   r%  r&  s      r9   Úreset_classifierz SwinTransformer.reset_classifier|  s    € ð 'ˆÔØ�	‰	�‰˜¨{ˆÕ;r;   r&   Úindicesrù   Ú
stop_earlyr2  Úintermediates_onlyc                 ó>  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	| j                  |«      }t        | j                  «      }
t        j
                  j                  «       s|s| j                  }n| j                  d|	dz    }t        |«      D ]c  \  }} ||«      }||v sŒ|r||
dz
  k(  r| j                  |«      }n|}|j                  dddd«      j                  «       }|j                  |«       Œe |r|S | j                  |«      }||fS )aK  Forward features that returns intermediates.

        Args:
            x: Input image tensor.
            indices: Take last n blocks if int, all if None, select matching indices if sequence.
            norm: Apply norm layer to compatible intermediates.
            stop_early: Stop iterating over blocks when last desired intermediate hit.
            output_fmt: Shape of intermediate feature outputs.
            intermediates_only: Only return intermediate features.

        Returns:
            List of intermediate features or tuple of (final features, intermediates).
        )ÚNCHWzOutput shape must be NCHW.Nr   r   r*   r+   )r   r<  rD  rA  rD   r¦   r  r]  rù   r2   r3   Úappend)rm   r&   rp  rù   rq  r2  rr  ÚintermediatesÚtake_indicesÚ	max_indexÚ
num_stagesÚstagesr  ra  Úx_inters                  r9   Úforward_intermediatesz%SwinTransformer.forward_intermediates†  s  € ð, ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið ×Ñ˜QÓˆä˜Ÿ™Ó%ˆ
Ü�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFÜ! &Ó)ò 	.‰HˆAˆuÙ�a“ˆAØ�LÒ Ù˜A ¨a¡Ò/Ø"Ÿi™i¨›l‘Gà�GØ!Ÿ/™/¨!¨Q°°1Ó5×@Ñ@ÓB�Ø×$Ñ$ WÕ-ð	.ñ Ø Ð à�I‰I�a‹Lˆà�-ÐÐr;   Ú
prune_normÚ
prune_headc                 óÖ   — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |rt        j                  «       | _        |r| j                  dd«       |S )aE  Prune layers not required for specified intermediates.

        Args:
            indices: Indices of intermediate layers to keep.
            prune_norm: Whether to prune normalization layer.
            prune_head: Whether to prune the classifier head.

        Returns:
            List of indices that were kept.
        Nr   r   r!  )r   r<  rD  ra   rÃ   rù   ro  )rm   rp  r}  r~  rw  rx  s         r9   Úprune_intermediate_layersz)SwinTransformer.prune_intermediate_layers¹  s]   € ô  #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙÜŸ™›ˆDŒIÙØ×!Ñ! ! RÔ(ØÐr;   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S )z/Forward pass through feature extraction layers.)rA  rD  rù   r  s     r9   Úforward_featuresz SwinTransformer.forward_featuresÑ  s1   € à×Ñ˜QÓˆØ�K‰K˜‹NˆØ�I‰I�a‹LˆØˆr;   Ú
pre_logitsc                 óN   — |r| j                  |d¬«      S | j                  |«      S )zÊForward pass through classifier head.

        Args:
            x: Feature tensor.
            pre_logits: Return features before final classifier.

        Returns:
            Output tensor.
        T)rƒ  )rE  )rm   r&   rƒ  s      r9   Úforward_headzSwinTransformer.forward_headØ  s&   € ñ 1;ˆt�y‰y˜ tˆyÓ,ÐLÀÇ	Á	È!ÃÐLr;   c                 óJ   — | j                  |«      }| j                  |«      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )r‚  r…  r  s     r9   r™   zSwinTransformer.forwardä  s)   € ð ×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr;   )r!  T)NNNé   N©F)Tr¡   )NFFrt  F)r   FT)'r¢   r£   r¤   r¥   r   ra   ró   r«   rª   Ústrr	   r   r¨   r¬   r   rô   r
   r^   rD   r¦   ÚignorerG  r   rZ  rß   r   r   rf  rj  rm  ro  r­   r   r|  r€  r‚  r…  r™   r®   r¯   s   @r9   r%   r%   £  s0  ø„ ñð +.ØØØ#Ø$ØØ&2Ø)7Ø&*Ø-.Ø%*Ø$(Ø!Ø!Ø!Ø$&Ø$&Ø$'Ø+5Ø68·l±lØ!ØØñ1B1à'ðB1ð ðB1ð ð	B1ð
 ðB1ð ðB1ð ðB1ð ˜#˜s˜(‘OðB1ð ˜S #˜X‘ðB1ð ˜s‘mðB1ð +ðB1ð #ðB1ð "ðB1ð ðB1ð ðB1ð  ð!B1ð" "ð#B1ð$ "ð%B1ð& "ð'B1ð( ˜bŸi™i™ð)B1ð* ˜c 4¨¯	©	¡?Ð2Ñ3ð+B1ð, õ-B1ðH ‡Y�Y×Ññd ð d¸ð dÈò dó ðdð ‡Y�Y×Ñð  S¡ò ó ðð 37Ø48Ø59Ø !Ø/3ñà˜u S¨# X™Ñ/ðð !  s¨C x¡Ñ1ðð " %¨¨S¨¡/Ñ2ð	ð
 ðð ' t™nðð 
óð@ ‡Y�Y×Ññ	
 Dð 	
°T¸#¸s¸(±^ò 	
ó ð	
ð ‡Y�Y×Ññ*¨Tð *¸Tò *ó ð*ð
 ‡Y�Y×Ñð §	¡	ò ó ðñ<¨Cð <¸hÀs¹mð <ÐW[ó <ð 8<ØØ$Ø$Ø',ñ1 à�|‰|ð1 ð ˜e C¨¨c© NÑ3Ñ4ð1 ð ð	1 ð
 ð1 ð ð1 ð !%ð1 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó1 ðj ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ð	ð
 
ˆc‰óð0 %§,¡,ð °5·<±<ó ñ
M˜eŸl™lð 
M¸ð 
MÈÏÉó 
Mð˜Ÿ™ð ¨%¯,©,÷ r;   Ú
state_dictÚmodelc                 ó2  — d}d| v rd}ddl }i }| j                  d| «      } | j                  d| «      } | j                  «       D �]K  \  }}t        dD �cg c]  }||v ‘Œ c}«      rŒ#d	|v re|j                  j
                  j                  j                  \  }}}	}
|j                  d
   |	k7  s|j                  d   |
k7  rt        ||	|
fddd¬«      }|j                  d«      r‚|j                  |dd «      }|j                  |j                  j                  k7  s|j                  d   |j                  d   k7  r,t        ||j                  |j                  j                  ¬«      }|r&|j                  dd„ |«      }|j                  dd«      }|||<   �ŒN |S c c}w )zàConvert patch embedding weight from manual patchify + linear proj to conv.

    Args:
        state_dict: State dictionary from checkpoint.
        model: Model instance.

    Returns:
        Filtered state dictionary.
    Tzhead.fc.weightFr   NrŒ  r‹  )rY   r‡   zpatch_embed.proj.weightr‰   r.   Úbicubic)ÚinterpolationÚ	antialiasÚverboserd   iãÿÿÿr   r{   zlayers.(\d+).downsamplec                 óD   — dt        | j                  d«      «      dz   › d�S )Nr4  r   z.downsample)rª   Úgroup)r&   s    r9   ú<lambda>z&checkpoint_filter_fn.<locals>.<lambda>  s$   € ¸wÄsÈ1Ï7É7ÐSTË:ÃÐYZÑGZÐF[Ð[fÐ=g€ r;   zhead.zhead.fc.)ÚreÚgetÚitemsrÍ   rA  ri   rÊ   r0   r   ÚendswithÚget_submodulerd   r'   r   ÚsubÚreplace)r‹  rŒ  Úold_weightsr•  Úout_dictr•   r–   rY  rê   r5   r6   Úms               r9   Úcheckpoint_filter_fnrŸ  ò  sœ  € ð €KØ˜:Ñ%ØˆÛØ€HØ—‘ ¨Ó4€JØ—‘ ¨jÓ9€JØ× Ñ Ó"ó ‰ˆˆ1ÜÐ HÖI˜1��Q’ÒIÔJØà$¨Ñ)Ø×*Ñ*×/Ñ/×6Ñ6×<Ñ<‰JˆAˆq�!�QØ�w‰w�r‰{˜aÒ 1§7¡7¨2¡;°!Ò#3Ü(ØØ˜�FØ"+Ø"Ø ô�ð �:‰:Ð4Ô5Ø×#Ñ# A d s GÓ,ˆAØ�w‰w˜!×8Ñ8×>Ñ>Ò>À!Ç-Á-ÐPQÑBRÐVW×VcÑVcÐdeÑVfÒBfÜ-ØØ$%§M¡MØ#$×#AÑ#A×#GÑ#Gô�ñ Ø—‘Ð1Ñ3gÐijÓkˆAØ—	‘	˜' :Ó.ˆAàˆ�‹ð9ð: €Oùò9 Js   ÁF
ÚvariantÚ
pretrainedc           	      óÈ   — t        d„ t        |j                  dd«      «      D «       «      }|j                  d|«      }t	        t
        | |ft        t        d|¬«      dœ|¤Ž}|S )zæCreate a Swin Transformer model.

    Args:
        variant: Model variant name.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        SwinTransformer model instance.
    c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wr¡   r¿   )r  r  rê   s      r9   r  z+_create_swin_transformer.<locals>.<genexpr>.  s   è ø€ Ò\¡d a¨¤Ñ\ùr  r(  )r   r   r*   r   Úout_indicesT)Úflatten_sequentialr¤  )Úpretrained_filter_fnÚfeature_cfg)rÚ   r]  r–  Úpopr   r%   rŸ  rC  )r   r¡  rH  Údefault_out_indicesr¤  rŒ  s         r9   Ú_create_swin_transformerrª  #  sj   € ô  Ñ\¬i¸¿
¹
À8È\Ó8ZÓ.[Ô\Ó\ÐØ—*‘*˜]Ð,?Ó@€Kä Ü˜ *ðä1Ü¨D¸kÔJñð ñ	€Eð €Lr;   Úurlc                 ó4   — | ddddddt         t        ddd	d
œ|¥S )z9Create default configuration for Swin Transformer models.r  )r*   r  r  )rŸ   rŸ   gÍÌÌÌÌÌì?rŽ  Tzpatch_embed.projzhead.fcÚmit)r«  r%  Ú
input_sizeÚ	pool_sizeÚcrop_pctr�  Úfixed_input_sizeÚmeanrs   Ú
first_convÚ
classifierÚlicenser   )r«  rH  s     r9   Ú_cfgr¶  :  s7   € ð Ø¨=ÀvØ¨ÈÜ%Ô.BØ(¸	Øñð #ðð r;   z.swin_small_patch4_window7_224.ms_in22k_ft_in1kztimm/zvhttps://github.com/SwinTransformer/storage/releases/download/v1.0.8/swin_small_patch4_window7_224_22kto1k_finetune.pth)Ú	hf_hub_idr«  z-swin_base_patch4_window7_224.ms_in22k_ft_in1kzlhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224_22kto1k.pthz.swin_base_patch4_window12_384.ms_in22k_ft_in1kzmhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384_22kto1k.pth)r*   é€  r¸  )r  r  g      ð?)r·  r«  r®  r¯  r°  z.swin_large_patch4_window7_224.ms_in22k_ft_in1kzmhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window7_224_22kto1k.pthz/swin_large_patch4_window12_384.ms_in22k_ft_in1kznhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22kto1k.pthz$swin_tiny_patch4_window7_224.ms_in1kzdhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pthz%swin_small_patch4_window7_224.ms_in1kzehttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pthz$swin_base_patch4_window7_224.ms_in1kzdhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224.pthz%swin_base_patch4_window12_384.ms_in1kzehttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384.pthz-swin_tiny_patch4_window7_224.ms_in22k_ft_in1kzuhttps://github.com/SwinTransformer/storage/releases/download/v1.0.8/swin_tiny_patch4_window7_224_22kto1k_finetune.pthz%swin_tiny_patch4_window7_224.ms_in22kzhhttps://github.com/SwinTransformer/storage/releases/download/v1.0.8/swin_tiny_patch4_window7_224_22k.pthiQU  )r·  r«  r%  z&swin_small_patch4_window7_224.ms_in22kzihttps://github.com/SwinTransformer/storage/releases/download/v1.0.8/swin_small_patch4_window7_224_22k.pthz%swin_base_patch4_window7_224.ms_in22kzhhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224_22k.pthz&swin_base_patch4_window12_384.ms_in22kzihttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384_22k.pth)r·  r«  r®  r¯  r°  r%  z&swin_large_patch4_window7_224.ms_in22kzihttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window7_224_22k.pthz'swin_large_patch4_window12_384.ms_in22kzjhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22k.pthzswin_s3_tiny_224.ms_in1kzbhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/s3_t-1d53f6a8.pthzbhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/s3_s-3bb4c69d.pthzbhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/s3_b-a1e95db4.pth)zswin_s3_small_224.ms_in1kzswin_s3_base_224.ms_in1kc           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	z+ Swin-T @ 224x224, trained ImageNet-1k
    r,   rŸ   r  r  r  ©r#  r'   r'  r(  rR   r¡  )Úswin_tiny_patch4_window7_224©rC  rª  ©r¡  rH  Ú
model_argss      r9   r»  r»  ‘  sF   € ô  °¸RÈÐ`nÔo€JÜ#Ø&ñ]Ø3=ð]ÜAEÀjÑA[ÐTZÑA[ñ]ð ]r;   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	z Swin-S @ 224x224
    r,   rŸ   r  ©r+   r+   é   r+   r  rº  r¡  )Úswin_small_patch4_window7_224r¼  r½  s      r9   rÂ  rÂ  š  sF   € ô  °¸RÈÐaoÔp€JÜ#Ø'ñ^Ø4>ð^ÜBFÀzÑB\ÐU[ÑB\ñ^ð ^r;   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	z Swin-B @ 224x224
    r,   rŸ   é€   rÀ  ©r,   r‡  é   é    rº  r¡  )Úswin_base_patch4_window7_224r¼  r½  s      r9   rÈ  rÈ  £  sF   € ô  °¸SÈÐbpÔq€JÜ#Ø&ñ]Ø3=ð]ÜAEÀjÑA[ÐTZÑA[ñ]ð ]r;   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	z Swin-B @ 384x384
    r,   r  rÄ  rÀ  rÅ  rº  r¡  )Úswin_base_patch4_window12_384r¼  r½  s      r9   rÊ  rÊ  ¬  sF   € ô  °¸cÈ-ÐcqÔr€JÜ#Ø'ñ^Ø4>ð^ÜBFÀzÑB\ÐU[ÑB\ñ^ð ^r;   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	z Swin-L @ 224x224
    r,   rŸ   éÀ   rÀ  ©r  r  r   é0   rº  r¡  )Úswin_large_patch4_window7_224r¼  r½  s      r9   rÏ  rÏ  µ  sF   € ô  °¸SÈÐbqÔr€JÜ#Ø'ñ^Ø4>ð^ÜBFÀzÑB\ÐU[ÑB\ñ^ð ^r;   c           	      óR   — t        ddddd¬«      }t        	 dd| it        |fi |¤Ž¤ŽS )	z Swin-L @ 384x384
    r,   r  rÌ  rÀ  rÍ  rº  r¡  )Úswin_large_patch4_window12_384r¼  r½  s      r9   rÑ  rÑ  ¾  sF   € ô  °¸cÈ-ÐcrÔs€JÜ#Ø(ñ_Ø5?ð_ÜCGÈ
ÑC]ÐV\ÑC]ñ_ð _r;   c           	      óP   — t        ddddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )	z; Swin-S3-T @ 224x224, https://arxiv.org/abs/2111.14725
    r,   ©rŸ   rŸ   é   rŸ   r  r  r  rº  r¡  )Úswin_s3_tiny_224r¼  r½  s      r9   rÕ  rÕ  Ç  s;   € ô Ø -¸2ÀlÐ^lôn€Jä#ÑlÀ:ÐlÔQUÐV`ÑQkÐdjÑQkÑlÐlr;   c           	      óP   — t        ddddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )	z; Swin-S3-S @ 224x224, https://arxiv.org/abs/2111.14725
    r,   )rÔ  rÔ  rÔ  rŸ   r  rÀ  r  rº  r¡  )Úswin_s3_small_224r¼  r½  s      r9   r×  r×  Ð  s;   € ô Ø /¸RÈÐaoôq€Jä#ÑmÀJÐmÔRVÐWaÑRlÐekÑRlÑmÐmr;   c           	      óP   — t        ddddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )	z; Swin-S3-B @ 224x224, https://arxiv.org/abs/2111.14725
    r,   rÓ  r  )r+   r+   é   r+   r  rº  r¡  )Úswin_s3_base_224r¼  r½  s      r9   rÚ  rÚ  Ù  s;   € ô Ø -¸2ÀmÐ_môo€Jä#ÑlÀ:ÐlÔQUÐV`ÑQkÐdjÑQkÑlÐlr;   )Ú"swin_base_patch4_window7_224_in22kÚ#swin_base_patch4_window12_384_in22kÚ#swin_large_patch4_window7_224_in22kÚ$swin_large_patch4_window12_384_in22kr¡   rˆ  )r!  )Or¥   ÚloggingrÎ   Útypingr   r   r   r   r   r   r	   r
   r   rD   Útorch.nnra   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   r   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_features_fxr   Ú_manipulater   r    Ú	_registryr!   r"   r#   Úvision_transformerr$   Ú__all__Ú	getLoggerr¢   Ú_loggerrª   r«   r­   r:   r=   rM   rô   rO   r±   rö   rþ   r%   rC  r‰  rŸ  r¨   rª  r¶  Údefault_cfgsr»  rÂ  rÈ  rÊ  rÏ  rÑ  rÕ  r×  rÚ  r¿   r;   r9   ú<module>rî     s2  ðñ
ó" Û ß O× OÕ Oã Ý ç A÷L÷ L÷ Ló Lå *Ý +Ý 3ß 4ß YÑ YÝ 4àÐ
€à
ˆ'×
Ñ
˜HÓ
%€à˜#˜u S¨# X™Ð.Ñ/Ð ðØ�<‰<ðà˜3 ˜8‘_ðð ‡\�\óð& ð˜EŸL™Lð °u¸SÀ#¸X±ð È3ð ÐSVð Ð[`×[gÑ[gò ó ðñ$# sð #°3ð #ÈÏÉó #ô0T�b—i‘iô Tôno˜2Ÿ9™9ô oôd-�2—9‘9ô -ô`˜2Ÿ9™9ô ôDL�b—i‘iô Lð^
. Tð .°"·)±)ð .ÀÀSÈ%Ï,É,ÐEVÑ@Wó .ñb cð °tð ÐRaó ñ.	ˆcð 	 T¨#¨s¨(¡^ó 	ñ %ð H&Ø4±dØð Eô7HðH&ð 4±TØØzô6}ð	H&ð 5±dØØ{Ø ¨H¸sô7DðH&ð 5±dØØ{ô7~ðH&ð 6±tØØ|Ø ¨H¸sô8DðH&ð& +©DØØrô-uð'H&ð, ,©TØØsô.vð-H&ð2 +©DØØrô-uð3H&ð8 ,©TØØsØ ¨H¸sô.Dð9H&ðD 4±TØð Dô6FðEH&ðL ,©TØØvØô.ðMH&ðT -©dØØwØô/ðUH&ð\ ,©TØØvØô.ð]H&ðd -©dØØwØ ¨H¸sÐPUô/WðeH&ðl -©dØØwØô/ðmH&ðt .©tØØxØ ¨H¸sÐPUô0WðuH&ð~ ¡ØØpô!rðH&ñD "&ØØpô"rñ !%ØØpô!ròKH&ó H€ðV ñ]Àò ]ó ð]ð ñ^Àò ^ó ð^ð ñ]Àò ]ó ð]ð ñ^Àò ^ó ð^ð ñ^Àò ^ó ð^ð ñ_À/ò _ó ð_ð ñm°Oò mó ðmð ñn°_ò nó ðnð ñm°Oò mó ðmñ ˜HØ*QØ+SØ+SØ,Uñ	'õ r;   