+
    :1jb                      a  0 t $ R t^ RIHt ^ RIHtHtHtHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHt ^RIHtHt ^RIHtHt ^R	IHt ^R
IHt ^RIHt ^RIHtH t  ^RI!H"t" ^RI#H$t$ ^RI%H&t& ]'       d5   ^ RI'H(t( ^ RI)H*t* ^ RIH+t+H,t, ^RIH-t-H.t.H/t/H0t0 ^RI1H2t2 ^RI3H4t4 ],! R4      t5]! ]64      t7Rt8R]9R&   ] ! R R4      4       t:]! RR7       ! R R4      4       t;R # )!z)EXPERIMENTAL Conda environment data model)annotations)	dataclassfieldfieldsreplace)reduce)chain)	getLogger)TYPE_CHECKING)	PLATFORMSUNKNOWN_CHANNEL)contextvalidate_channels)NULL)groupby_to_dict)
PrefixData)CondaValueErrorPlatformMismatchError)History)!get_package_records_from_explicit)	MatchSpec)	Namespace)Iterable)FinalTypeVar)ChannelPriorityDepsModifierSatSolverChoiceUpdateModifier)PathType)PackageRecordTpipr   EXTERNAL_PACKAGES_PYPI_KEYc                     ] tR t^-t$ Rt]! ]R7      tR]R&   Rt	R]R&   ]! ]R7      t
R]R&   ]! ]R7      tR	]R
&   RtR]R&   ]! ]R7      tR]R&   ]! ]R7      tR]R&   ]! ]R7      tR]R&   RtR]R&   RtR]R&   ]! ]R7      tR]R&   RtR]R&   RtR]R&   R R ltR R ltR R lt]R R  l4       t]R! R" l4       t]R# R$ l4       tR%tR# )&EnvironmentConfigz
**Experimental** While experimental, expect both major and minor changes across minor releases.

Data model for a conda environment config.
default_factoryztuple[str, ...]aggressive_update_packagesNzChannelPriority | Nonechannel_prioritychannelstuple[dict[str, str], ...]channel_settingszDepsModifier | Nonedeps_modifierdisallowed_packagespinned_packagesrepodata_fnszSatSolverChoice | None
sat_solver
str | Nonesolvertrack_featureszUpdateModifier | Noneupdate_modifierzbool | Noneuse_only_tar_bz2c               $    V ^8  d   QhRRRRRR/# )   firstzIterable[T]secondreturnztuple[T, ...] )formats   "8lib/python3.14/site-packages/conda/models/environment.py__annotate__EnvironmentConfig.__annotate__O   s)     K K K*5K	K    c           	     	^    \        \        P                  R  \        W4       4       4      4      # )c              3  $   "   T F  qx  K  	  R # 5iNr<   ).0items   & r>   	<genexpr>?EnvironmentConfig._append_without_duplicates.<locals>.<genexpr>R   s     "I4HD44Hs   )tupledictfromkeysr   )selfr9   r:   s   &&&r>   _append_without_duplicates,EnvironmentConfig._append_without_duplicatesO   s#     T]]"IE%4H"IIJJrA   c               $    V ^8  d   QhRRRRRR/# )r8   r9   r+   r:   r;   r<   )r=   s   "r>   r?   r@   T   s$     
 
/
9S
	#
rA   c                    \        R \        W4      4      p\        ;QJ d"    . R VP                  4        4       F  NK  	  5# ! R VP                  4        4       4      # )zMerge channel settings.

An individual channel setting is a dict that may have the key "channels". Settings
with matching "channels" should be merged together.
c                $    V P                  R 4      # )channel)get)xs   &r>   <lambda>;EnvironmentConfig._merge_channel_settings.<locals>.<lambda>^   s    aeeI&rA   c           	   3     "   T F5  w  rV UUUu/ uF  q3P                  4        F  w  rEWEbK	  	  K  	  upppx  K7  	  R # u upppi 5irD   )items)rE   rR   configsconfigkvs   &     r>   rG   <EnvironmentConfig._merge_channel_settings.<locals>.<genexpr>a   sB      
$D  !(CfLLNDAQTNQCC$D Ds   A#?
A)groupbyr   rI   rX   )rL   r9   r:   grouped_channel_settingss   &&& r>   _merge_channel_settings)EnvironmentConfig._merge_channel_settingsT   s_     $+&e(<$
  u 
$<$B$B$D
u 	
u 
$<$B$B$D
 
 	
rA   c                    V ^8  d   QhRRRR/# )r8   otherr%   r;   r<   )r=   s   "r>   r?   r@   f   s      B B- B2C BrA   c                ,   Vf   V # \        WP                  4      '       g   \        R4      hV P                  V P                  VP                  4      V n        VP
                  e   VP
                  V n        V P                  VP                  V P                  4      V n        V P                  V P                  VP                  4      V n        VP                  e   VP                  V n	        V P                  V P                  VP                  4      V n
        V P                  V P                  VP                  4      V n        V P                  V P                  VP                  4      V n        VP                  e   VP                  V n        VP                  e   VP                  V n        V P                  V P                  VP                  4      V n        VP                   e   VP                   V n        VP"                  e   VP"                  V n        V # )a  
**Experimental** While experimental, expect both major and minor changes across minor releases.

Merges an EnvironmentConfig into this one. Merging rules are:
* Primitive types get clobbered if subsequent configs have a value, otherwise keep the last set value
* Lists get appended to and deduplicated
* Dicts get updated
* Special cases:
  * channel settings is a list of dicts, it merges inner dicts, keyed on "channel"
  * channels: last wins for priority (prepended so later config's channels take precedence)
z9Cannot merge EnvironmentConfig with non-EnvironmentConfig)
isinstance	__class__r   rM   r(   r)   r*   r`   r,   r-   r.   r/   r0   r1   r3   r4   r5   r6   )rL   rc   s   &&r>   _mergeEnvironmentConfig._mergef   s    =K %00!K  +/*I*I++U-M-M+
' !!-$)$:$:D!77V $ < <!!5#9#9!
 *!&!4!4D#'#B#B$$e&?&?$
   $>>  %"7"7 
 !;;u11
 '#..DO<<#,,DK"==!5!5
   ,#(#8#8D !!-$)$:$:D!rA   c                   V ^8  d   QhRR/# )r8   r;   r%   r<   )r=   s   "r>   r?   r@      s     + +. +rA   c                    \        V 4       Uu0 uF  qP                  kK  	  pp\        P                  P	                  4        UUu/ uF  w  r4W29   g   K  W4bK  	  pppV ! R/ VB # u upi u uppi )z
**Experimental** While experimental, expect both major and minor changes across minor releases.

Create an EnvironmentConfig from the current context
r<   )r   namer   environment_settingsrX   )clsr   field_nameskeyvaluerl   s   &     r>   from_contextEnvironmentConfig.from_context   sv     06c{;{ezz{; &::@@B 
B
! CJB 	  

 *)** < 
s   A%
A*A*c                    V ^8  d   QhRRRR/# )r8   argsr   r;   r%   r<   )r=   s   "r>   r?   r@      s     & &Y &3D &rA   c                    \        VRR4      p\        VR\        4      pV'       g   V'       g   V ! 4       # V'       d   RMRpV'       d   \        V4      MRpV'       d   \        WE,           4      MTpV ! VR7      # )z
Build a sparse EnvironmentConfig from CLI args for channels only.

Used to override channels from the CLI when files are provided.
rR   N	use_localr*   )localr<   )getattrr   rI   r   )rm   rt   rR   rv   rx   arg_channelsr*   s   &&     r>   from_cli_channels#EnvironmentConfig.from_cli_channels   s`     $	40D+t4	y5L'
R)0uW~b>J$U%9:PUH%%rA   c                    V ^8  d   QhRRRR/# )r8   rY   r%   r;   r<   )r=   s   "r>   r?   r@      s     
 
. 
3D 
rA   c                    V'       g   R# \        V4      ^8X  d
   V^ ,          # \        R VR,          V^ ,          4      # )aO  
**Experimental** While experimental, expect both major and minor changes across minor releases.

Merges a list of EnvironmentConfigs into a single one. Merging rules are:
* Primitive types get clobbered if subsequent configs have a value, otherwise keep the last set value
* Lists get appended to and deduplicated
* Dicts get updated
Nc                $    V P                  V4      # rD   )rg   )resultrZ   s   &&r>   rU   )EnvironmentConfig.merge.<locals>.<lambda>   s    6==#8rA   :   NN)lenr   )rm   rY   s   &*r>   mergeEnvironmentConfig.merge   s@      w<11: 8'"+wqz
 	
rA   )r(   r)   r,   r*   r-   r.   r/   r0   r1   r3   r4   r5   r6   )__name__
__module____qualname____firstlineno____doc__r   rI   r(   __annotations__r)   r*   r,   r-   r.   r/   r0   r1   r3   r4   r5   r6   rM   r`   rg   classmethodrq   r{   r   __static_attributes__r<   rA   r>   r%   r%   -   s    382NN/3,3 %e <Ho<383O0O)-M&-+0+GG',U'CO_C$)%$@L/@)-J&-FJ&+E&BNOB-1O*1$(k(K

$BH + + & && 
 
rA   r%   T)kw_onlyc            	         ] tR t^t$ RtR]R&    ]! ]R7      tR]R&    ]! ]	R7      t
R]R&    ]! ]R7      tR	]R
&    RtR]R&    RtR]R&    ]! ]R7      tR]R&    ]! ]	R7      tR]R&    ]! ]R7      tR	]R&   R t]R 4       t]RRRRRRRR/R R ll4       t]R&R R ll4       t]R&R R  ll4       t]R! R" l4       tR# R$ ltR%tR# )'Environmentz
**Experimental** While experimental, expect both major and minor changes across minor releases.

Data model for a conda environment.
strplatformr&   r%   rZ   zdict[str, list[str]]external_packageszlist[PackageRecord]explicit_packagesNr2   rk   prefixlist[MatchSpec]requested_packageszdict[str, str]	variablesvirtual_packagesc                	|   V P                   '       g   \        R 4      hV P                   \        9  d!   \        RV P                    R\         R24      h\        V P                  4      ^8  dI   \        \        R V P                   4       4      4      \        V P                  4      8w  d   \        R4      h\        V P                  4      ^ 8  dn   \        V P                  4      ^ 8  dR   \        R V P                   4       4      pV P                   F#  pVP                  V9  g   K  \        RV R24      h	  R	# R	# R	# )
z!'Environment' needs a 'platform'.zInvalid platform 'z'. Valid platforms are .c              3  8   "   T F  qP                   x  K  	  R # 5irD   rk   rE   pkgs   & r>   rG   ,Environment.__post_init__.<locals>.<genexpr>  s     ;$:S$:   z0Duplicate packages found in 'explicit_packages'.c              3  8   "   T F  qP                   x  K  	  R # 5irD   r   r   s   & r>   rG   r   %  s     (T=Sc=Sr   zRequested package 'z&' is not found in 'explicit_packages'.N)r   r   r   r   r   setr   rk   )rL   explicit_package_namesrequested_packages   &  r>   __post_init__Environment.__post_init__  s   }}}!"EFF ==	)!$T]]O3J9+UVW 
 t%%&*s;D$:$:;;0
''(0) ""TUU t&&'!+D4J4J0Ka0O%((TT=S=S(T%T"%)%<%<!$))1GG)-.?-@@fg  &= 1P+rA   c                   RpRpRpV Uu. uF"  qUP                   '       g   K  VP                   NK$  	  ppV Uu. uF"  qUP                  '       g   K  VP                  NK$  	  ppV'       d0   VR	,          p\        V4      ^8  d   \        P	                  RWb4       V'       d0   VR	,          p\        V4      ^8  d   \        P	                  RWs4       V Uu. uF"  qUP
                  '       g   K  VP
                  NK$  	  pp\        \        V4      4      ^8w  d   \        RV 24      hV^ ,          p\        \        P                  R V 4       4      4      p	\        \        P                  R V 4       4      4      p
\        \        P                  R V 4       4      4      pV UUUu/ uF1  qUP                  ;'       g    / P                  4        F  w  rWbK	  	  K3  	  pppp/ pV F  pVP                  ;'       g    / P                  4        Fi  w  r\        V\        4      '       g   K  W9   d:   V Uu. uF  pVW,          9  g   K  VNK  	  ppW,          P                  V4       K\  \        V4      W&   Kk  	  K  	  \         P"                  ! V Uu. uF  qUP$                  f   K  VP$                  NK   	  up!  pV ! VVV
VVVV	VVR7	      # u upi u upi u upi u upppi u upi u upi )
a-  
**Experimental** While experimental, expect both major and minor changes across minor releases.

Merges multiple environments into a single environment following the rules:
* name, prefix: last wins (later env overrides earlier).
* platform: must match across all envs.
* requested_packages, explicit_packages, virtual_packages: union, deduplicated.
* variables: merged dict, last value wins per key.
* external_packages: concatenation per key (union of lists, deduplicated).
* config: EnvironmentConfig.merge (last wins for primitives, append for lists).
Nz,Several names passed %s. Picking last one %sz/Several prefixes passed %s. Picking last one %sz_Conda can not merge environments of different platforms. Received environments with platforms: c              3  L   "   T F  pVP                    F  pVx  K	  	  K  	  R # 5irD   r   rE   envrequirements   &  r>   rG   $Environment.merge.<locals>.<genexpr>T  s*      'C#&#9#9K #9 '   "$c              3  L   "   T F  pVP                    F  pVx  K	  	  K  	  R # 5irD   r   r   s   &  r>   rG   r   \  s*      'C#&#8#8K #8 'r   c              3  L   "   T F  pVP                    F  pVx  K	  	  K  	  R # 5irD   )r   )rE   r   virtual_packages   &  r>   rG   r   d  s*      'C'*';';O  ';  'r   )	rZ   r   r   rk   r   r   r   r   r   )rk   r   r   logdebugr   r   r   listrJ   rK   r   rX   r   re   extendr%   r   rZ   )rm   environmentsrk   r   r   r   namesprefixes	platformsr   r   r   r[   r\   r   r   r   new_pkgsrZ   s   &*                 r>   r   Environment.merge,  s    %1>\cXX\>*6E,3**JCJJ,E9D5zA~		H%Vb\F8}q 		Ex .:J\c\\\S\\\	Js9~!#!99BE  Q<!MM ' 
 !MM ' 
  MM ' 
 )
(S8K8K7R7R7TVaAD7TAL 	 
 C..44";;=!!T**)/0TqC?P?S4SqHT%(//9+/7%( >   #(($0KLSJJjcjjLK
 //1-

 
	
E ?E K@
  U LsE   K	K	KKK-K$K; K1KKK$#K$from_historyF	no_buildsignore_channelsr*   c               8    V ^8  d   QhRRRRRRRRRRRRR	R
RR/# )r8   r   r   rk   r   r   boolr   r   r*   zlist[str] | Noner;   r   r<   )r=   s   "r>   r?   Environment.__annotate__  sd     l
 l
l
 l
 	l
 l
 l
 l
 #l
 
l
rA   c                 aa \        VRR7      pVP                  4       p	. p
/ pVP                  4       pV'       d   V P                  V4      p
. pMVP	                  4       pV F  pV'       d   VP
                  MVP                  pV'       gJ   VP                  '       d8   VP                  P                  '       d   VP                  P                   RV 2pV
P                  \        V4      4       K  	  V'       d4   V Uu. uF  pVP                   RVP                   2NK   	  ppVV\        &   V Uu. uF  pVP                  NK  	  upo\        V3R lVP                  4        4       4      p\        T;'       g    R	4      pV'       g   . V3R lV 4       OVO5p\        \         P#                  V4      4      p\$        P'                  4       p\)        VVR7      pV ! VVVVV	VV
VR7      # u upi u upi )
ak  
Create an Environment model from an existing conda prefix.

This method analyzes an installed conda environment and creates
an Environment model that can be used for exporting or other operations.

:param prefix: Path to the conda environment prefix
:param name: Name for the environment
:param platform: Target platform (e.g., 'linux-64', 'osx-64')
:param from_history: Use explicit specs from history instead of installed packages
:param no_builds: Exclude build strings from package specs
:param ignore_channels: Don't include channel information in package specs
:return: Environment model representing the prefix
T)interoperabilityz::z==c              3  N   <"   T F  pVP                   S9  g   K  Vx  K  	  R # 5irD   r   )rE   r   python_precs_namess   & r>   rG   *Environment.from_prefix.<locals>.<genexpr>  s'      !
1xx11 C1s   %
%c              3  n   <"   T F*  pVP                   P                  ;o\        8w  g   K&  Sx  K,  	  R # 5irD   )rR   canonical_namer   )rE   conda_packager   s   & r>   rG   r     s8       *5*7*?*?*N*NN&' #N)4s   #5
5rw   )r   r   rk   rZ   r   r   r   r   r<   )r   get_environment_env_varsget_python_packagesr   get_conda_packagesspec_no_buildspecrR   rk   appendr   versionr#   r   iter_recordsrI   rJ   rK   r%   rq   r   )rm   r   rk   r   r   r   r   r*   prefix_datar   r   r   python_precsconda_precs
conda_precspec_strpython_precpython_depsr   r   environment_channelsrZ   r   r   s   &&&&$$$$              @@r>   from_prefixEnvironment.from_prefix  s	   4 !$?88:	  "668 !$!1!1&!9K &88:K *
7@:33joo ("***"**///","4"4"9"9!:"XJGH")))H*=> *  (4'3 #''(;+>+>*?@'3   AL!"<= 3??,3chh,?  !
"//1!
 
  %X^^4 	$ *5	$ &	$   %T]]3G%HI #//1 *>?/1/	
 		
S @s    $G+3G0c               $    V ^8  d   QhRRRRRR/# )r8   rt   r   add_default_packagesr   r;   r   r<   )r=   s   "r>   r?   r     s(       # 
	rA   c                ,    V P                  W4      w  r4V# )aj  
Create an Environment model from command-line arguments.

This method will parse command-line arguments and create an
Environment object. This includes: reading files provided as
cli arguments, and pulling EnvironmentConfig from the context.

:param args: argparse Namespace containing command-line arguments
:return: An Environment object representing the cli
)from_cli_with_file_envs)rm   rt   r   r   _s   &&&  r>   from_cliEnvironment.from_cli  s      ,,TH
rA   c               $    V ^8  d   QhRRRRRR/# )r8   rt   r   r   r   r;   z*tuple[Environment, dict[str, Environment]]r<   )r=   s   "r>   r?   r     s-     i& i&i& #i& 
4	i&rA   c           
        VP                    Uu. uF  q3P                  R4      NK  	  pp. p. p. p/ p/ p	. p
VP                   F  p\        P                  P                  V\        P                  R7      pVP                  V4      pWV&   \        P                  VP                  9  g   Kh  V
P                  WP                  34       K  	  V
'       d   \        V
\        P                  4      hV	P                  4        F9  w  rVP                  \        P                  4      pVP                  V4       WV&   K;  	  V'       d   V Uu0 uF  p\        V4      P                  kK  	  ppTV UUu0 uF0  p. VP                   OVP"                  O F  pVP                  kK  	  K2  	  upp,          p\        P$                   F0  p\        V4      P                  V9  g   K  VP                  V4       K2  	  V FI  p\        V4      ;pP'                  R4      '       d   VP                  V4       K8  VP                  V4       KK  	  \(        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      ;'       g    \+        V4      p\(        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      ;'       g    \+        V4      pV'       d   V'       d   \-        R4      h. pV'       d   \/        V4      p\1        \        P                  \2        P5                  4       R	7      p\1        VP                  \        P6                  \        P                  VV\2        P9                  V4      R
7      pV'       d%   V P:                  ! V!  pV P;                  VVV4      pMV P;                  VV4      p\=        VRR4      '       d7   \?        V\?        VP@                  VP@                  PB                  R7      R7      pVV3# u upi u upi u uppi )a  
Create an Environment model from command-line arguments, with a map
of file path to Environment for each environment file specified.

:param args: argparse Namespace containing command-line arguments
:return: Tuple of (merged Environment, dict mapping file path to Environment)
z"')sourcerk   urlc              3  8   "   T F  qP                   x  K  	  R # 5irD   r   rE   r   s   & r>   rG   6Environment.from_cli_with_file_envs.<locals>.<genexpr>F  s     KNS00Nr   TFc              3  8   "   T F  qP                   x  K  	  R # 5irD   r   r   s   & r>   rG   r   I  s     I.3...r   zCannot combine package names with explicit package lists. Package names (python, numpy) are resolved by the solver; explicit files and URLs are installed directly. Use only package names, or only explicit files/URLs.)r   rZ   )rk   r   r   r   r   rZ   override_channelsrw   )rZ   )"packagesstripfiler   plugin_managerget_environment_specifierenvironment_specifierenvironment_specsubdiravailable_platformsr   r   rX   env_forr   rk   r   r   create_default_packagesrS   anyr   r   r   r   r%   rq   target_prefixr{   r   ry   r   rZ   r*   )rm   rt   r   packagespecsr   fetch_explicit_packagesenvs_from_filefpath_envs_map
file_specsincompatiblefpath	spec_hookr   r   r   r   default_package
match_spechas_explicit	has_specsr   base_envcli_envfile_envmergeds   &&&                       r>   r   #Environment.from_cli_with_file_envs  st    6:]]C]'u%]C"$
YYE..HH22 I I --e4D $u~~T%=%==##U,D,D$EF  'gnnEE%++-KE,,w~~.C!!#&$'5! .  6;<edYt_))eE<))CLS22LS5K5KLC L ) E
 $+#B#B_-22%?LL1 $C D'o-
22599'..t4"))*5	  sKNKsssKNKK 
 
t#P
 CI.ICCCI.II 
 
TN
	 I!G  " A'! ^^,=,J,J,L
 ((^^1/$66t<
 yy.1HYYx7;F YYx1F
 4,e44wv}}w~~?V?VWF ~%%{ D8 =s   O>P+6Pc                    V ^8  d   QhRRRR/# )r8   r   r   r;   r   r<   )r=   s   "r>   r?   r   y  s     ' 'X '/ 'rA   c                	j    \        V 4      pVP                  4       p\        VP                  4       4      # rD   )r   get_requested_specs_mapr   values)r   historyspec_maps   &  r>   r   Environment.from_historyx  s+    &/224HOO%&&rA   c                    V ^8  d   QhRRRR/# )r8   r   r   r;   r   r<   )r=   s   "r>   r?   r     s     !
 !
C !
K !
rA   c                   WP                   8X  d   V # ^RIHp \        P                  P                  4       pV P                  V P                  4      p\        P                  ! RV4      ;_uu_ 4        V! V P                  P                  / 4       FJ  pV;_uu_ 4       pV! RV P                  P                  VR3VVRR7      pVP                  4       pRRR4       KL  	  RRR4       \        V P                  V P                  VV P                  VXV P                  R7      #   + '       g   i     K  ; i  + '       g   i     L^; i)	z\
Given the current environment, solve for a comparable environment on a
different platform.
)	Repodatas_subdirz/env/does/not/existnoarchcreate)r   r*   subdirsspecs_to_addrepodata_fncommandN)r   rk   r   rZ   r   r   r   )r   cli.installr  r   r   get_cached_solver_backendr   r   	_overriderZ   r0   r*   solve_final_stater   rk   r   )	rL   r   r  solver_backendr   repodata_managerr  r3   r   s	   &&       r>   extrapolateEnvironment.extrapolate  s   
 }}$K+ //IIK!..t{{;y(33$-dkk.F.F$K %%+4!%!5!5!)8 4%7$/ (F )/(@(@(B% &% %L 4 ;;;;1/"44
 	
 &%% 43s$   1+D35DD3D0*	D33E	r<   )F)r   r   r   r   r   r   r   r%   rZ   rJ   r   r   r   rk   r   r   r   r   r   r   r   r   r   r   staticmethodr   r%  r   r<   rA   r>   r   r      sO    MG %6G HFH /4D.I+IW-24-H*H
 D*FJ3*/*EE4 %d ;I~;A -2$,G)G4 [
 [
z l
 #l
  l
 !&l
 &*l
 l
\  $ i& i&V ' '!
 !
rA   r   N)<__conditional_annotations__r   
__future__r   dataclassesr   r   r   r   	functoolsr   	itertoolsr   loggingr	   typingr
   base.constantsr   r   base.contextr   r   common.constantsr   common.iteratorsr   r^   core.prefix_datar   
exceptionsr   r   r  r   miscr   r  r   argparser   collections.abcr   r   r   r   r   r   r   common.pathr   recordsr    r!   r   r   r#   r   r%   r   )r(  s   @r>   <module>r:     s    0 " 9 9      7 5 # 9 ) ?  4 !"(%  '&A %* E ) v
 v
 v
r 4x
 x
 x
rA   