Ë
    úmxió9  ã            	      óâ  — U d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmc mZ d dlmZ d dlmZ d	d
lmZ d	dl m!Z!m"Z"m#Z#m$Z$m%Z% d	dl&m'Z' ejP                  dk\  r	d dlm)Z)m*Z* nd dl+m)Z)m*Z* ejP                  dk\  r	d dlm,Z,m-Z- nd dl+m,Z,m-Z- er@ejP                  dk\  rd dlm.Z. nd dl+m.Z. ejP                  dk\  rd dlm/Z/ nd dl+m/Z/ d dl0Z1d dl2Z3e* G d„ de)«      «       Z4ee5eef   ee4e!f   Z6de7d<    ede6¬«      Z8 ede¬«      Z9e5e:ee:e5eef   e;e5eef      f   f   Z<de7d<   e5e:ee5eef   e;e5eef      f   f   Z=de7d<   eee5e:e	f   df   Z>d>d„Z? e-d«      Z@ ede<e«      ZAee,e6e@f   eAf   ZB G d„ d e'eBeAf   «      ZC G d!„ d"eD«      ZEed?d@d#„«       ZFedAdBd$„«       ZF	 dC	 	 	 	 	 dDd%„ZFe	 dE	 	 	 	 	 	 	 dFd&„«       ZGe	 d?	 	 	 	 	 	 	 dGd'„«       ZGe	 d?	 	 	 	 	 	 	 dHd(„«       ZG	 	 	 dI	 	 	 	 	 	 	 dJd)„ZGed*   ZH G d+„ d,e«      ZI G d-„ d.e«      ZJe	 	 	 	 	 dK	 	 	 	 	 	 	 	 	 	 	 dLd/„«       ZKe	 	 	 	 dM	 	 	 	 	 	 	 	 	 	 	 dNd0„«       ZK	 	 	 	 	 dO	 	 	 	 	 	 	 	 	 	 	 dPd1„ZKe	 	 	 	 	 dK	 	 	 	 	 	 	 	 	 	 	 dLd2„«       ZLe	 	 	 	 dM	 	 	 	 	 	 	 	 	 	 	 dQd3„«       ZL	 	 	 	 	 dR	 	 	 	 	 	 	 	 	 	 	 dSd4„ZL	 	 	 	 	 	 	 	 	 	 	 	 	 	 dTd5„ZMdUd6„ZNdVd7„ZOdWd8„ZPdXd9„ZQdYd:„ZRdZd;„ZSdZd<„ZTd[d=„ZUy)\é    )ÚannotationsN)ÚCallableÚMutableMappingÚSequence)Úpartial)ÚPath)ÚTYPE_CHECKINGÚAnyÚLiteralÚ	TypedDictÚTypeVarÚUnionÚoverload)Úis_pandas_dataframe)ÚIntoDataFrameé   )Úimport_pyarrow_interchange)ÚDataFrameLikeÚsanitize_geo_interfaceÚsanitize_narwhals_dataframeÚsanitize_pandas_dataframeÚto_eager_narwhals_dataframe)ÚPluginRegistry)é   é   )ÚProtocolÚruntime_checkable)r   é
   )ÚConcatenateÚ	ParamSpec)ÚTypeIs)Ú	TypeAliasc                  ó   — e Zd ZU ded<   y)ÚSupportsGeoInterfacer   Ú__geo_interface__N©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    úH/home/htdocs/ttos/venv/lib/python3.12/site-packages/altair/utils/data.pyr$   r$   1   s   … à%Ô%r,   r$   r"   ÚDataTypeÚ	TDataType)ÚboundÚTIntoDataFrameÚVegaLiteDataDictÚToValuesReturnTypec                ó’   — t        | t        t        f«      xs0 t        t        j                  | dd¬«      t        j
                  «      S )NT)Úeager_or_interchange_onlyÚpass_through)Ú
isinstanceÚdictr$   ÚnwÚfrom_nativeÚ	DataFrame)Úobjs    r-   Úis_data_typer=   D   s:   € Ü�cœDÔ"6Ð7Ó8ò ¼JÜ
�‰�s°dÈÔNÜ
�‰ó=ð r,   ÚPÚRc                  óL   — e Zd ZddiZedd„«       Zej                  dd„«       Zy)ÚDataTransformerRegistryÚconsolidate_datasetsTc                ó    — | j                   d   S ©NrB   ©Ú_global_settings)Úselfs    r-   rB   z,DataTransformerRegistry.consolidate_datasets`   s   € à×$Ñ$Ð%;Ñ<Ð<r,   c                ó"   — || j                   d<   y rD   rE   )rG   Úvalues     r-   rB   z,DataTransformerRegistry.consolidate_datasetsd   s   € à8=ˆ×ÑÐ4Ò5r,   N)ÚreturnÚbool)rI   rK   rJ   ÚNone)r'   r(   r)   rF   ÚpropertyrB   Úsetterr+   r,   r-   rA   rA   ]   s9   „ Ø.°Ð5Ðàò=ó ð=ð × Ñ ò>ó !ñ>r,   rA   c                  ó6   ‡ — e Zd ZdZdˆ fd„Zedd„«       Zˆ xZS )ÚMaxRowsErrorz+Raised when a data model has too many rows.c               óF   •— || _         t        ‰| �	  | j                   «       y ©N)ÚmessageÚsuperÚ__init__)rG   rS   Ú	__class__s     €r-   rU   zMaxRowsError.__init__m   s   ø€ ØˆŒÜ‰Ñ˜Ÿ™Õ&r,   c               ó$   — d|› d|› d�} | |«      S )Nz$The number of rows in your dataset (z') is greater than the maximum allowed (aG  ).

Try enabling the VegaFusion data transformer which raises this limit by pre-evaluating data
transformations in Python.
    >> import altair as alt
    >> alt.data_transformers.enable("vegafusion")

Or, see https://altair-viz.github.io/user_guide/large_datasets.html for additional information
on how to plot large datasets.r+   )ÚclsÚ	user_rowsÚmax_rowsÚmsgs       r-   Úfrom_limit_rowszMaxRowsError.from_limit_rowsq   s/   € ð 3°9°+ð >)Ø)1¨
ð 3-ð	-ð 	ñ �3‹xˆr,   )rS   ÚstrrJ   rL   )rY   ÚintrZ   r^   rJ   rP   )r'   r(   r)   Ú__doc__rU   Úclassmethodr\   Ú__classcell__)rV   s   @r-   rP   rP   j   s   ø„ Ù5õ'ð òó ôr,   rP   c                 ó   — y rR   r+   ©ÚdatarZ   s     r-   Ú
limit_rowsre   ‚   s   € ØILr,   c                 ó   — y rR   r+   rc   s     r-   re   re   „   s   € ØHKr,   c                ób  — | €t        t        |¬«      S t        | «       t        | t        «      r/| j
                  d   dk(  r| j
                  d   }n6| j
                  }n)t        | t        «      rd| v r| d   }n| S t        | «      } | }t        |«      }|�||kD  rt        j                  ||«      ‚| S )z
    Raise MaxRowsError if the data model has more than max_rows.

    If max_rows is None, then do not perform any check.
    )rZ   ÚtypeÚFeatureCollectionÚfeaturesÚvalues)r   re   Úcheck_data_typer7   r$   r%   r8   r   ÚlenrP   r\   )rd   rZ   rk   Úns       r-   re   re   †   s´   € ð €|Ü”z¨HÔ5Ð5Ü�DÔä�$Ô,Ô-Ø×!Ñ! &Ñ)Ð-@Ò@Ø×+Ñ+¨JÑ7‰Fà×+Ñ+‰FÜ	�Dœ$Ô	Ø�tÑØ˜(‘^‰FàˆKä*¨4Ó0ˆØˆäˆF‹€AØÐ  H¢Ü×*Ñ*¨1¨hÓ7Ð7à€Kr,   c                 ó   — y rR   r+   ©rd   rn   Úfracs      r-   Úsamplerr   §   s   € ð r,   c                 ó   — y rR   r+   rp   s      r-   rr   rr   «   s   € ð r,   c                 ó   — y rR   r+   rp   s      r-   rr   rr   ¯   s   € ð r,   c                ó(  — | €t        t        ||¬«      S t        | «       t        | «      r| j                  ||¬«      S t	        | t
        «      rLd| v rG| d   }|s&|€d}t        |«      ‚t        |t        |«      z  «      }t        j                  ||«      }d|iS yt        j                  | d¬«      } |s&|€d}t        |«      ‚t        |t        | «      z  «      }t        j                  t        t        | «      «      |«      }| |   j                  «       S )zBReduce the size of the data model by sampling without replacement.N)rn   rq   rk   z9frac cannot be None if n is None and data is a dictionaryT©Ú
eager_onlyz:frac cannot be None if n is None with this data input type)r   rr   rl   r   r7   r8   Ú
ValueErrorr^   rm   Úrandomr9   r:   ÚrangeÚ	to_native)rd   rn   rq   rk   r[   Úindicess         r-   rr   rr   ³   s  € ð €|Ü”v ¨Ô.Ð.Ü�DÔÜ˜4Ô Ø�{‰{˜Q Tˆ{Ó*Ð*Ü	�Dœ$Ô	Ø�tÑØ˜(‘^ˆFÙØ�<ØU�CÜ$ S›/Ð)Ü˜œs 6›{Ñ*Ó+�Ü—]‘] 6¨1Ó-ˆFØ˜fÐ%Ð%ð Ü�>‰>˜$¨4Ô0€DÙØˆ<ØNˆCÜ˜S“/Ð!Ü�”s˜4“yÑ Ó!ˆÜ�m‰mœE¤# d£)Ó,¨aÓ0€GØ�‰=×"Ñ"Ó$Ð$r,   )ÚcsvÚjsonc                  ó   — e Zd ZU ded<   y)Ú_FormatDictÚ_FormatTyperh   Nr&   r+   r,   r-   r€   r€   Ø   s   … Ø
Ôr,   r€   c                  ó"   — e Zd ZU ded<   ded<   y)Ú_ToFormatReturnUrlDictr]   Úurlr€   ÚformatNr&   r+   r,   r-   rƒ   rƒ   Ü   s   … Ø	ƒHØÔr,   rƒ   c                 ó   — y rR   r+   ©rd   ÚprefixÚ	extensionÚfilenameÚurlpaths        r-   Úto_jsonrŒ   á   ó   € ð r,   c                 ó   — y rR   r+   r‡   s        r-   rŒ   rŒ   ë   ó   € ð !r,   c                óŒ   — t        ||||«      }| €t        t        fi |¤ŽS t        | «      }t	        |fi |¤dt        d¬«      i¤ŽS )zGWrite the data model to a .json file and return a url based data model.r…   r~   ©rh   )Ú_to_text_kwdsr   rŒ   Ú_data_to_json_stringÚ_to_textr€   ©rd   rˆ   r‰   rŠ   r‹   ÚkwdsÚdata_strs          r-   rŒ   rŒ   õ   sM   € ô ˜ ¨H°gÓ>€DØ€|Ü”wÑ' $Ñ'Ð'ä'¨Ó-ˆÜ˜ÑJ DÑJ´À&Ô1IÒJÐJr,   c                 ó   — y rR   r+   r‡   s        r-   Úto_csvr™     r�   r,   c                 ó   — y rR   r+   r‡   s        r-   r™   r™     r�   r,   c                óŒ   — t        ||||«      }| €t        t        fi |¤ŽS t        | «      }t	        |fi |¤dt        d¬«      i¤ŽS )zFWrite the data model to a .csv file and return a url based data model.r…   r}   r‘   )r’   r   r™   Ú_data_to_csv_stringr”   r€   r•   s          r-   r™   r™     sM   € ô ˜ ¨H°gÓ>€DØ€|Ü”vÑ& Ñ&Ð&ä& tÓ,ˆÜ˜ÑI DÑI´À%Ô1HÒIÐIr,   c                ó¾   — t        | «      }|j                  |||¬«      }t        |«      j                  | d¬«       t	        t        ||«      «      }t        ||dœ«      S )N)rˆ   Úhashr‰   zutf-8)Úencoding)r„   r…   )Ú_compute_data_hashr…   r   Ú
write_textr]   rƒ   )rd   rˆ   r‰   rŠ   r‹   r…   Ú	data_hashr„   s           r-   r”   r”   )  sZ   € ô # 4Ó(€IØ�‰ f°9È	ˆÓR€HÜˆƒN×Ñ˜d¨WÐÔ5Ü
Œd�7˜HÓ%Ó
&€CÜ!¨#¸Ñ"@ÓAÐAr,   c               ó   — | |||dœS )N©rˆ   r‰   rŠ   r‹   r+   r¤   s       r-   r’   r’   8  s   € Ø¨9À(ÐW^Ñ_Ð_r,   c                ó¾  — t        | «       t        j                  | d¬«      }t        |t        «      rdt        |«      iS t        |«      rt        |«      }d|j                  d¬«      iS t        |t        «      rd|vrd}t        |«      ‚|S t        | t        j                  «      rt        | «      } d| j                  d¬«      iS dt        | «      › �}t        |«      ‚)	z0Replace a DataFrame by a data model with values.T)r6   rk   Úrecords)Úorientú.values expected in data dict, but not present.©ÚnamedzUnrecognized data type: )rl   r9   r{   r7   r$   Ú_from_geo_interfacer   r   Úto_dictr8   ÚKeyErrorr;   r   Úrowsrh   rx   )rd   Údata_nativer[   s      r-   Ú	to_valuesr°   <  sÒ   € ä�DÔä—,‘,˜t°$Ô7€KÜ�+Ô3Ô4ØÔ-¨kÓ:Ð;Ð;Ü	˜[Ô	)Ü/°Ó<ˆØ˜+×-Ñ-°YÐ-Ó?Ð@Ð@Ü	�K¤Ô	&Ø˜;Ñ&ØBˆCÜ˜3“-ÐØÐÜ	�Dœ"Ÿ,™,Ô	'Ü*¨4Ó0ˆØ˜$Ÿ)™)¨$˜)Ó/Ð0Ð0ð )¬¨d«¨Ð5ˆÜ˜‹oÐr,   c                óL   — t        | «      sdt        | «      › �}t        |«      ‚y )Nz@Expected dict, DataFrame or a __geo_interface__ attribute, got: )r=   rh   Ú	TypeError)rd   r[   s     r-   rl   rl   T  s-   € Ü˜ÔØPÔQUÐVZÓQ[ÐP\Ð]ˆÜ˜‹nÐð r,   c                ój   — t        j                  | j                  «       «      j                  «       d d S )Né    )ÚhashlibÚsha256ÚencodeÚ	hexdigest)r—   s    r-   r    r    ]  s(   € Ü�>‰>˜(Ÿ/™/Ó+Ó,×6Ñ6Ó8¸¸"Ð=Ð=r,   c                ó\   — t        | «      rt        | «      n| }t        |j                  «      S )zÖ
    Sanitize a ``__geo_interface__`` w/ pre-sanitize step for ``pandas`` if needed.

    Introduces an intersection type::

        geo: <subclass of SupportsGeoInterface and DataFrame> | SupportsGeoInterface
    )r   r   r   r%   )rd   Úgeos     r-   r«   r«   a  s*   € ô .AÀÔ-FÔ
# DÔ
)ÈD€CÜ! #×"7Ñ"7Ó8Ð8r,   c                ó
  — t        | «       t        | t        «      rt        j                  t        | «      «      S t        | «      rt        | «      } | j                  dd¬«      S t        | t        «      r+d| vrd}t        |«      ‚t        j                  | d   d¬«      S 	 t        j                  | d¬«      }t        |«      }t        j                  |j!                  d¬«      «      S # t        $ r}d	}t        |«      |‚d
}~ww xY w)z6Return a JSON string representation of the input data.r¦   é   )r§   Údouble_precisionrk   r¨   T)Ú	sort_keysrv   zBto_json only works with data expressed as a DataFrame or as a dictNr©   )rl   r7   r$   r~   Údumpsr«   r   r   rŒ   r8   r­   r9   r:   r²   ÚNotImplementedErrorr   r®   )rd   r[   Údata_nwÚexcs       r-   r“   r“   m  sä   € ä�DÔÜ�$Ô,Ô-Ü�z‰zÔ-¨dÓ3Ó4Ð4Ü	˜TÔ	"Ü(¨Ó.ˆØ�|‰| 9¸rˆ|ÓBÐBÜ	�Dœ$Ô	Ø˜4ÑØBˆCÜ˜3“-ÐÜ�z‰z˜$˜x™.°DÔ9Ð9ð0Ü—.‘. °$Ô7ˆô *¨'Ó2€GÜ�:‰:�g—l‘l¨�lÓ.Ó/Ð/øô	 ò 0ØRˆÜ! #Ó&¨CÐ/ûð0ús   ÂC& Ã&	DÃ/C=Ã=Dc                óL  — t        | «       t        | t        «      r(dt        t        «      j                  ›d�}t        |«      ‚t        | «      rt        | «      } | j                  d¬«      S t        | t        «      rDd| vrd}t        |«      ‚	 ddl}|j                  j                  | d   «      j                  d¬«      S 	 t        j                   | d
¬«      }|j%                  «       S # t        $ r}d	}t        |«      |‚d}~ww xY w# t"        $ r}d}t        |«      |‚d}~ww xY w)z5Return a CSV string representation of the input data.z3to_csv does not yet work with data that is of type z0.
See https://github.com/vega/altair/issues/3441F)Úindexrk   z-values expected in data dict, but not presentr   Nz4pandas is required to convert a dict to a CSV stringTrv   zAto_csv only works with data expressed as a DataFrame or as a dict)rl   r7   r$   rh   r'   rÀ   r   r   r™   r8   r­   ÚpandasÚImportErrorr;   Ú	from_dictr9   r:   r²   Ú	write_csv)rd   r[   ÚpdrÂ   rÁ   s        r-   rœ   rœ   ƒ  s+  € ä�DÔÜ�$Ô,Ô-ðÜÔ3Ó4×=Ñ=Ð@ð A=ð>ð 	ô
 " #Ó&Ð&Ü	˜TÔ	"Ü(¨Ó.ˆØ�{‰{ ˆ{Ó'Ð'Ü	�Dœ$Ô	Ø˜4ÑØAˆCÜ˜3“-Ðð	,Ûð �|‰|×%Ñ% d¨8¡nÓ5×<Ñ<À5Ð<ÓIÐIð0Ü—.‘. °$Ô7ˆð ×ÑÓÐøô ò 	,ØHˆCÜ˜cÓ"¨Ð+ûð	,ûô ò 0ØQˆÜ! #Ó&¨CÐ/ûð0ús0   ÂC( ÃD Ã(	DÃ1C?Ã?DÄ	D#ÄDÄD#c                óÂ   — ddl }dD ]<  }t        | |d«      }t        |«      sŒ |«       }t        ||j                  «      sŒ:|c S  t        «       }|j                  | «      S )zMConvert a DataFrame Interchange Protocol compatible object to an Arrow Table.r   N)ÚarrowÚto_arrowÚto_arrow_tableÚ
to_pyarrow)ÚpyarrowÚgetattrÚcallabler7   ÚTabler   Úfrom_dataframe)Údfi_dfÚpaÚconvert_method_nameÚconvert_methodÚresultÚpis         r-   Úarrow_table_from_dfi_dataframerÚ   ¢  se   € ãð  Uò ÐÜ  Ð)<¸dÓCˆÜ�NÕ#Ù#Ó%ˆFÜ˜& "§(¡(Õ+Ø’ðô 
$Ó	%€BØ×Ñ˜VÓ$Ð$r,   )r<   r
   rJ   zTypeIs[DataType])..)rd   rL   rZ   ú
int | NonerJ   r   ).)rd   r.   rZ   rÛ   rJ   r.   )Niˆ  )rd   úDataType | NonerZ   rÛ   rJ   zpartial | DataType)...)rd   rL   rn   rÛ   rq   úfloat | NonerJ   r   )rd   r1   rn   rÛ   rq   rÝ   rJ   r1   )rd   r.   rn   rÛ   rq   rÝ   rJ   ÚSampleReturnType)NNN)rd   rÜ   rn   rÛ   rq   rÝ   rJ   zpartial | SampleReturnType).....)rd   rL   rˆ   r]   r‰   r]   rŠ   r]   r‹   r]   rJ   r   )....)rd   r.   rˆ   r]   r‰   r]   rŠ   r]   r‹   r]   rJ   rƒ   )Núaltair-datar~   ú{prefix}-{hash}.{extension}Ú )rd   rÜ   rˆ   r]   r‰   r]   rŠ   r]   r‹   r]   rJ   ú partial | _ToFormatReturnUrlDict)rd   z#dict | pd.DataFrame | DataFrameLikerˆ   r]   r‰   r]   rŠ   r]   r‹   r]   rJ   rƒ   )Nrß   r}   rà   rá   )rd   z*dict | pd.DataFrame | DataFrameLike | Nonerˆ   r]   r‰   r]   rŠ   r]   r‹   r]   rJ   râ   )rd   r]   rˆ   r]   r‰   r]   rŠ   r]   r‹   r]   r…   r€   rJ   rƒ   )
rˆ   r]   r‰   r]   rŠ   r]   r‹   r]   rJ   zdict[str, str])rd   r.   rJ   r3   )rd   r.   rJ   rL   )r—   r]   rJ   r]   )rd   r$   rJ   zdict[str, Any])rd   r.   rJ   r]   )rÔ   r   rJ   zpa.Table)VÚ
__future__r   rµ   r~   ry   ÚsysÚcollections.abcr   r   r   Ú	functoolsr   Úpathlibr   Útypingr	   r
   r   r   r   r   r   Únarwhals.stable.v1ÚstableÚv1r9   Únarwhals.stable.v1.dependenciesr   Únarwhals.stable.v1.typingr   Ú
_importersr   Úcorer   r   r   r   r   Úplugin_registryr   Úversion_infor   r   Útyping_extensionsr   r    r!   r"   rÅ   rÉ   rÏ   rÕ   r$   r8   r.   r*   r/   r1   r]   Úlistr2   r3   rÞ   r=   r>   r?   ÚDataTransformerTyperA   Ú	ExceptionrP   re   rr   r�   r€   rƒ   rŒ   r™   r”   r’   r°   rl   r    r«   r“   rœ   rÚ   r+   r,   r-   ú<module>rö      s´  ðÞ "ã Û Û Û 
ß >Ñ >Ý Ý ß S× SÑ Sç Ð Ý ?Ý 3å 2÷õ õ ,à×Ñ�wÒß2Ð2ç=Ø×Ñ�wÒß-Ð-ç8áØ
×Ñ˜7Ò"Þ!å,à
×Ñ˜7Ò"Þ$å/ÛÛð ô&˜8ó &ó ð&ð Øˆˆcˆ�N�MÐ#7¸ÐFñ€ˆ)ó ñ �K xÔ0€	ÙÐ)°Ô?€à"Øˆˆs�D˜˜c˜‘N D¨¨c°3¨h©Ñ$8Ð8Ñ	9Ð9ñÐ �)ó ð !% S¨%°°S¸#°X±ÀÀTÈ#ÈsÈ(Á^Ñ@TÐ0TÑ*UÐ%UÑ VÐ �IÓ VØ˜¨¨S°(¨]Ñ(;¸TÐAÑBÐ óñ& ˆcƒN€áˆCÐ! 3Ó'€Ø˜{¨8°Q¨;Ñ7¸Ð:Ñ;Ð ô	>˜nÐ-@À!Ð-CÑDô 	>ô�9ô ð0 
Û Ló 
Ø LØ	Û Kó 
Ø Kà9=ðØ
ðØ,6ðàóðB 
à@CðØ
ðØ#ðØ1=ðàòó 
ðð 
àDGðØ
ðØ'ðØ5Aðàòó 
ðð 
à>AðØ
ðØ!ðØ/;ðàòó 
ðð !ØØð%Ø
ð%àð%ð ð%ð  ó	%ðD �mÑ$€ô�)ô ô˜Yô ð
 
àØØØØðØ
ðàðð ðð ð	ð
 ðð òó 
ðð 
ð ØØØð!Ø
ð!àð!ð ð!ð ð	!ð
 ð!ð ò!ó 
ð!ð !ØØØ1ØðKØ
ðKàðKð ðKð ð	Kð
 ðKð &óKð  
àØØØØðØ
ðàðð ðð ð	ð
 ðð òó 
ðð 
ð ØØØð!Ø
-ð!àð!ð ð!ð ð	!ð
 ð!ð ò!ó 
ð!ð 8<ØØØ1ØðJØ
4ðJàðJð ðJð ð	Jð
 ðJð &óJð BØ
ðBàðBð ðBð ð	Bð
 ðBð ðBð óBó`óó0ó>ó	9ó0ó,ô>%r,   