o
    Ù­jÓ  ã                   @   sr  U d Z ddl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	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mZmZmZmZmZ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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL erÁddlMZNdd	lOmPZQ dd
lOmRZS eejTee* ee+ f ZUeeVd< dZWddhZXde)dee, ddfdd„ZYde)ddfdd„ZZde)de[fdd„Z\de)de[de)fdd„Z]eGj^dœde)de,de_dee* dee+ deGdeUfd d!„Z`de)de[fd"d#„ZaeGj^dœde)de,de_dee* dee+ deGdeUfd$d%„Zbde)de[fd&d'„Zcde)deejd fd(d)„Zede)d*ee- dejdfd+d,„ZfeGj^dœdejdde,de_dee* dee+ deGdeUfd-d.„Zgd/d/d/d/d/d/d/d/d0d0d0d1d2œZhd/d/d/d/d/d/d/d/d0d0d1d3œZid/d/d/d/d/d/d/d/d0d0d0d0d1d4œZjeh kei¡ eh kej¡ d5Zlde)ddfd6d7„Zmdd8d9een dee* dee+ d:e[deee* ee+ f fd;d<„Zod*e.de[fd=d>„Zpd*ede[fd?d@„Zqd*ede[fdAdB„Zrejsde	e.ge[f fdCdD„ƒZtd*e.de[fdEdF„Zuejsde	e.ge[f fdGdH„ƒZvd*e.de[fdIdJ„ZwdKedejdfdLdM„Zxejsde[fdNdO„ƒZyejsdezfdPdQ„ƒZ{dd8deeejdef  fdRdS„Z|G dTdU„ dUeƒZ}			dÀdd8d:e[dee* deee+ef  d9een dee}ee* ee+ f fdVdW„Z~de)dXend*ee- dYejTddf
dZd[„ZeGj^dœdd8d:e[de,de_dee* deee+ef  deGdeUfd\d]„Z€de)dXend*ee- dYejTddf
d^d_„Z�de)de,de_d:e[dee* dee+ deUfd`da„Z‚G dbdc„ dceƒZƒdddd:e[dee* deee+ef  deeƒee* ee+ f f
dedf„Z„eGj^fde)d:e[de,dge_dee* deee+ef  deGdeUfdhdi„Z…ejsde
e)enf fdjdk„ƒZ†de)deeen ef fdldm„Z‡de)dXend*ee- dYejTddf
dndo„ZˆdÁdpdq„Z‰de)d:e[dee* deee+ef  deeƒee* ee+ f f
drds„ZŠeGj^fde)d:e[de,dge_dee* deee+ef  deGdeUfdtdu„Z‹ejsde	ege[f fdvdw„ƒZŒejsde	ege[f fdxdy„ƒZ�G dzd{„ d{eƒZŽde)dee* deee+ef  d:e[deeŽee* ee+ f f
d|d}„Z�de)de,de_dee* deee+ef  d:e[deUfd~d„Z�de)de(fd€d�„Z‘de)de,de_dee* dee+ deUfd‚dƒ„Z’de)de[fd„d…„Z“de)de[fd†d‡„Z”de)de[fdˆd‰„Z•de)de[fdŠd‹„Z–de)de,de_dee* dee+ deUfdŒd�„Z—de)dee/ fdŽd�„Z˜eGj^fde/dee, dee* dee+ deGdeUfd�d‘„Z™de)deeš fd’d“„Z›eGj^dœdede,dge_dee* dee+ deGdeUfd”d•„Zœde)deez fd–d—„Z�eGj^dœdede,dge_dee* dee+ deGdeUfd˜d™„Zžde)deeF fdšd›„ZŸde)de[fdœd�„Z de)de)fdždŸ„Z¡d eGj^d¡œde)de,d¢e_dee* deee+ef  d:e[deGdeUfd£d¤„Z¢de)dXenddfd¥d¦„Z£dejdd§end*ee- dYejTddf
d¨d©„Z¤ded§end*ee- dYejTddf
dªd«„Z¥ded§end*ee- dYejTddf
d¬d­„Z¦de)d§endYejTddfd®d¯„Z§de)d§endYejTddfd°d±„Z¨de)d§endYejTddfd²d³„Z©	dÂd´eHde)dXend*ee- ddf
dµd¶„ZªG d·d¸„ d¸eFƒZ«de)dee* dee+ d:e[de0f
d¹dº„Z¬dede[fd»d¼„Z­d½eJde)ddfd¾d¿„Z®dS )ÃzData dispatching for DMatrix.é    N)ÚTYPE_CHECKINGÚAnyÚCallableÚDictÚListÚOptionalÚSequenceÚTupleÚ	TypeAliasÚ	TypeGuardÚUnioné   )ÚAifTypeÚ
CategoriesÚDfCatAccessorÚTransformedDfÚ_arrow_array_infÚ_ensure_np_dtypeÚ
_is_df_catÚarray_hasobjectÚarray_interfaceÚarray_interface_dictÚarrow_cat_infÚcheck_cudf_metaÚcuda_array_interfaceÚcuda_array_interface_dictÚcudf_cat_infÚget_ref_categoriesÚis_arrow_dictÚ
pd_cat_inf)
ÚCupyTÚDataTypeÚFeatureNamesÚFeatureTypesÚFloatCompatibleÚ
NumpyDTypeÚPandasDTypeÚPathLikeÚTransformedDataÚc_bst_ulong)Ú	_is_arrowÚ_is_cudf_dfÚ_is_cudf_pandasÚ_is_cudf_serÚ_is_cupy_alikeÚ_is_modin_dfÚ_is_modin_seriesÚ_is_pandas_dfÚ_is_pandas_seriesÚ
_is_polarsÚ_is_polars_lazyframeÚ_is_polars_seriesÚimport_pandasÚimport_polarsÚimport_pyarrowÚis_pyarrow_availableÚlazy_isinstance)Ú_LIBÚDataIterÚDataSplitModeÚDMatrixÚ_check_callÚ_ProxyDMatrixÚc_strÚmake_jcargs)Ú	DataFrame)ÚSeriesÚDispatchedDataBackendReturnTypeÚcÚbase_marginÚlabelÚdataÚmissingÚreturnc                 C   s6   |d urt  |¡st dtt| ƒƒ t¡ d S d S d S )Nz2`missing` is not used for current input data type:)ÚnpÚisnanÚwarningsÚwarnÚstrÚtypeÚUserWarning)rI   rJ   © rS   úI/var/www/html/CropPilot/venv/lib/python3.10/site-packages/xgboost/data.pyÚ_warn_unused_missingh   s   þÿrU   c                 C   s(   t | dƒrt| jƒdkrtdƒ‚d S d S )NÚshapeé   z8Please reshape the input data into 2-dimensional matrix.)ÚhasattrÚlenrV   Ú
ValueError©rI   rS   rS   rT   Ú_check_data_shapep   s   ÿr\   c                 C   ól   d}d}zddl m} t| |ƒ}W n	 ty   Y nw zddl m} t| |ƒ}W n	 ty1   Y nw |p5|S )zPredicate for scipy CSR input.Fr   )Ú	csr_array)Ú
csr_matrix)Úscipy.sparser^   Ú
isinstanceÚImportErrorr_   )rI   Úis_arrayÚ	is_matrixr^   r_   rS   rS   rT   Úis_scipy_csru   ó   ÿÿre   Úis_csrc                 C   sÒ   ddl m}m} t| jƒt| jƒkr"tdt| jƒ› dt| jƒ› �ƒ‚t| j| jj	ƒ\}}t| j| jj	ƒ\}}t| j| jj	ƒ\}}|| jusO|| jusO|| jurg|r]||||f| j
d�} | S ||||f| j
d�} | S )zxEnsure correct data alignment and data type for scipy sparse inputs. Input should
    be either csr or csc matrix.

    r   )Ú
csc_matrixr_   zlength mismatch: z vs )rV   )r`   rh   r_   rY   ÚindicesrI   rZ   r   ÚindptrÚdtyperV   )rI   rg   rh   r_   rj   Ú_ri   ÚvaluesrS   rS   rT   Útransform_scipy_sparseˆ   s    


ÿrn   )Údata_split_modeÚnthreadÚfeature_namesÚfeature_typesro   c                 C   sl   t  ¡ }t| dƒ} tt t| jƒt| jƒt| j	ƒt
| jd ƒtt|ƒt|ƒt|ƒd�t  |¡¡ƒ |||fS )z"Initialize data from a CSR matrix.Tr   ©rJ   rp   ro   )ÚctypesÚc_void_prn   r?   r;   ÚXGDMatrixCreateFromCSRr   rj   ri   rI   r)   rV   rB   ÚfloatÚintÚbyref©rI   rJ   rp   rq   rr   ro   ÚhandlerS   rS   rT   Ú_from_scipy_csr¡   s"   
ýöÿ
r|   c                 C   r]   )zPredicate for scipy CSC input.Fr   )Ú	csc_array)rh   )r`   r}   ra   rb   rh   )rI   rc   rd   r}   rh   rS   rS   rT   Úis_scipy_csc¿   rf   r~   c                 C   sl   t  ¡ }t| dƒ tt t| jƒt| jƒt| j	ƒt
| jd ƒtt|ƒt|ƒt|ƒd�t  |¡¡ƒ |||fS )z"Initialize data from a CSC matrix.Fr   rs   )rt   ru   rn   r?   r;   ÚXGDMatrixCreateFromCSCr   rj   ri   rI   r)   rV   rB   rw   rx   ry   rz   rS   rS   rT   Ú_from_scipy_cscÒ   s"   

ýöÿ
r€   c                 C   r]   )zPredicate for scipy COO input.Fr   )Ú	coo_array)Ú
coo_matrix)r`   r�   ra   rb   r‚   )rI   rc   rd   r�   r‚   rS   rS   rT   Úis_scipy_cooï   rf   rƒ   c                 C   ó
   t | dƒS )NÚ__array_interface__©rX   r[   rS   rS   rT   Ú_is_np_array_like  ó   
r‡   rk   c                 C   s`   z| j jstj| d|d�} ntj| |d�} W n ty&   tj| |d�} Y nw t| |ƒ\} }| S )zGHandle numpy slice.  This can be removed if we use __array_interface__.T)Úcopyrk   ©rk   )ÚflagsÚc_contiguousrL   ÚarrayÚasarrayÚAttributeErrorr   )rI   rk   rS   rS   rT   Ú_maybe_np_slice  s   €ÿr�   c              	   C   s\   t | ƒ t| | jƒ\} }t ¡ }tt t| ƒt	t
|ƒt|ƒt|ƒd�t |¡¡ƒ |||fS )z(Initialize data from a 2-D numpy matrix.rs   )r\   r   rk   rt   ru   r?   r;   ÚXGDMatrixCreateFromDenser   rB   rw   rx   ry   )rI   rJ   rp   rq   rr   ro   rl   r{   rS   rS   rT   Ú_from_numpy_array  s   
ýùÿ
r’   rx   rw   Úi)Úint8Úint16Úint32Úint64Úuint8Úuint16Úuint32Úuint64Úfloat16Úfloat32Úfloat64Úbool)ÚInt8ÚInt16ÚInt32ÚInt64ÚUInt8ÚUInt16ÚUInt32ÚUInt64ÚFloat32ÚFloat64Úboolean)zint8[pyarrow]zint16[pyarrow]zint32[pyarrow]zint64[pyarrow]zuint8[pyarrow]zuint16[pyarrow]zuint32[pyarrow]zuint64[pyarrow]zfloat[pyarrow]zfloat32[pyarrow]zdouble[pyarrow]zfloat64[pyarrow]zbool[pyarrow]zpWhen categorical type is supplied, the experimental DMatrix parameter`enable_categorical` must be set to `True`.c                    sb   t ˆ dƒrt ˆ jdƒr‡ fdd„tˆ jƒD ƒ}dd |¡ }nd}d}|› d	t› d	|› �}t|ƒ‚)
NÚdtypesÚ__iter__c                    s.   g | ]\}}|j tvrˆ j| › d |› �‘qS )z: )ÚnameÚ_pandas_dtype_mapperÚcolumns)Ú.0r“   rk   r[   rS   rT   Ú
<listcomp>j  s
    
þz,_invalid_dataframe_dtype.<locals>.<listcomp>z Invalid columns:z, Ú z?DataFrame.dtypes for data must be int, float, bool or category.ú )rX   r«   Ú	enumerateÚjoinÚ_ENABLE_CAT_ERRrZ   )rI   Ú
bad_fieldsÚerrÚtype_errÚmsgrS   r[   rT   Ú_invalid_dataframe_dtypef  s   
þr»   ÚPdDataFrameÚmetaÚenable_categoricalc           	   	   C   sò   t ƒ }|du r#|du r#t| j|jƒrdd„ | jD ƒ}nt| j t¡ƒ}g }d}| jD ]@}t|ƒrC| 	t
|jj ¡ |rBt d¡ d}q*t|ƒsKt|ƒrS|rS| 	t¡ q*z
| 	t
|j ¡ W q* tyj   t| ƒ Y q*w |du ru|du ru|}||fS )z)Handle feature info for pandas dataframe.Nc                 S   ó    g | ]}d   dd„ |D ƒ¡‘qS )r³   c                 S   ó   g | ]}t |ƒ‘qS rS   ©rP   ©r°   ÚxrS   rS   rT   r±   …  ó    z2pandas_feature_info.<locals>.<listcomp>.<listcomp>©rµ   ©r°   r“   rS   rS   rT   r±   …  ó     z'pandas_feature_info.<locals>.<listcomp>Tz3Sparse arrays from pandas are converted into dense.F)r6   ra   r¯   Ú
MultiIndexÚlistÚmaprP   r«   Úis_pd_sparse_dtypeÚappendr®   Úsubtyper­   rN   rO   Úis_pd_cat_dtypeÚis_pa_ext_categorical_dtypeÚCAT_TÚKeyErrorr»   )	rI   r½   rq   rr   r¾   ÚpdÚnew_feature_typesÚneed_sparse_extension_warnrk   rS   rS   rT   Úpandas_feature_infox  s:   

€ÿÿþÿrÕ   c                 C   sx   ddl m} t| |ƒsdS ddlm}m}m} || ƒo| jtv }|| ƒo(| jdk}|| ƒo1| jtv }|p;|p;|p;t	| ƒS )z(Whether dtype is a pandas nullable type.r   )ÚExtensionDtypeF)Úis_bool_dtypeÚis_float_dtypeÚis_integer_dtyperª   )
Úpandas.api.extensionsrÖ   ra   Úpandas.api.typesr×   rØ   rÙ   r­   Úpandas_nullable_mapperrÎ   )rk   rÖ   r×   rØ   rÙ   Úis_intÚis_boolÚis_floatrS   rS   rT   Úis_nullable_dtype¢  s   
rà   c                 C   r„   )z;Return whether dtype is a pyarrow extension type for pandasÚpyarrow_dtyper†   rŠ   rS   rS   rT   Úis_pa_ext_dtype³  s   
râ   c                 C   s   t t| ddƒddƒS )z)Check whether dtype is a dictionary type.rá   Nzpyarrow.libÚDictionaryType)r:   ÚgetattrrŠ   rS   rS   rT   rÏ   ¸  s   ÿrÏ   c                     ór   t ƒ } t| jdƒr1t| jjdƒr1| jjj}|| jƒ|dƒkr1ddlm‰  dtdt	f‡ fdd	„}|S dd
l
m} |S )NÚversionÚVersionú2.1.0r   ©ÚCategoricalDtyperk   rK   c                    ó
   t | ˆ ƒS ©N©ra   rŠ   ré   rS   rT   Úpd_is_cat_210È  rˆ   z+_lazy_load_pd_is_cat.<locals>.pd_is_cat_210©Úis_categorical_dtype)r6   rX   Úutilræ   rç   Ú__version__Úpandasrê   r&   rŸ   rÛ   rð   )rÒ   rç   rî   rð   rS   ré   rT   Ú_lazy_load_pd_is_cat¿  s   
rô   c                 C   ó   t ƒ }|| ƒS )z)Wrapper for testing pandas category type.)rô   )rk   Úis_catrS   rS   rT   rÎ   Ñ  s   rÎ   c                     rå   )Nræ   rç   rè   r   ©ÚSparseDtyperk   rK   c                    rë   rì   rí   rŠ   r÷   rS   rT   Úpd_is_sparse_210à  rˆ   z1_lazy_load_pd_is_sparse.<locals>.pd_is_sparse_210)Ú	is_sparse)r6   rX   rñ   ræ   rç   rò   ró   rø   r&   rŸ   rÛ   rú   )rÒ   rç   rù   rú   rS   r÷   rT   Ú_lazy_load_pd_is_sparse×  s   
rû   c                 C   rõ   )z'Wrapper for testing pandas sparse type.)rû   )rk   rú   rS   rS   rT   rË   ê  s   rË   Úserc           	      C   sl   t ƒ }tr
ddl}ntƒ }| j}| ¡ }| ¡ }|jdko$|j 	|j
¡ }|j|dd�}t||jƒ\}}|S )z Handle pandas pyarrow extention.r   NF)Úzero_copy_onlyÚwritable)r6   r   Úpyarrowr8   r�   Ú__arrow_array__Úcombine_chunksÚ
null_countÚtypesÚ
is_booleanrQ   Úto_numpyr   rk   )	rü   rÒ   ÚpaÚd_arrayÚaaÚchunkÚ	zero_copyÚarrrl   rS   rS   rT   Úpandas_pa_typeñ  s   
r  c                   C   s   t j t j¡t j d¡kS )Nz1.25.0)rL   ÚlibÚNumpyVersionrò   rS   rS   rS   rT   Ú_lazy_has_npdtypes  s   r  c                  C   s   ddl m} m} | |fS )Nr   ©ÚFloat32DtypeÚFloat64Dtype)ró   r  r  r  rS   rS   rT   Ú_lazy_load_pd_floats  s   r  c                    s,  t ƒ \‰ ‰g }tƒ ‰dddtfdd„}dddtjf‡ ‡‡fdd„}dddtjf‡‡fdd	„}t| j| jƒD ]^\}‰tˆƒrAt	d
ƒ‚t
ˆƒrO| || | ƒ¡ q5tˆƒr]| t| | ƒ¡ q5tˆƒrk| || | ƒ¡ q5tˆƒrŠ| | j}| ¡ }t|ƒr„t||jƒ\}}| |¡ q5| || | ƒ¡ q5|S )z9Handle categorical dtype and extension types from pandas.rü   ÚPdSeriesrK   c                 S   s   | j S rì   )Úcat)rü   rS   rS   rT   Ú	cat_codes%  s   z(pandas_transform_data.<locals>.cat_codesc                    sD   t ˆˆ ƒr	tj}nt ˆˆƒrtj}ntj}t| j|tjd�|ƒd S ©N)rk   Úna_valuer   )ra   rL   r�   rž   r   r  Únan)rü   Ú	res_dtype)r  r  rk   rS   rT   Únu_type(  s   

ÿþz&pandas_transform_data.<locals>.nu_typec                    s\   ˆot | jtjjtjjfƒ}|sˆ tjtjhv r|  ¡ }n	| jtjtj	d�}t
||jƒd S r  )ra   rk   rL   r«   ÚFloat32DTypeÚFloat64DTyper�   rž   r  r  r   )rü   Únpdtypesr�   )rk   Ú	np_dtypesrS   rT   Úoth_type4  s   üþ

z'pandas_transform_data.<locals>.oth_typezFpyarrow dictionary type is not supported. Use pandas category instead.)r  r  r   rL   ÚndarrayÚzipr¯   r«   rÏ   rZ   rÎ   rÌ   râ   r  rà   rË   rm   Úto_denser‡   r   rk   )rI   Úresultr  r  r   Úcolr  rl   rS   )r  r  rk   r  rT   Úpandas_transform_data  s2   
ÿ
r&  c                       sZ   e Zd ZdZdeeejef  de	e
 ddf‡ fdd„Zedeeef fdd	„ƒZ‡  ZS )
ÚPandasTransformedz1A storage class for transformed pandas DataFrame.r¯   Úref_categoriesrK   Nc           
         sˆ   || _ g }g }| j D ].}t|ƒr't|j|jƒ\}}}| |¡ | ||f¡ q
t|tjƒs/J ‚t	|ƒ}	| |	¡ q
t
ƒ j|||d� d S )N©r(  ÚaitfsÚtemporary_buffers)r¯   r   r   Ú
categoriesÚcodesrÌ   ra   rL   r!  r   ÚsuperÚ__init__)
Úselfr¯   r(  r*  r+  r%  ÚjnamesÚjcodesÚbufÚinf©Ú	__class__rS   rT   r/  e  s    


ýzPandasTransformed.__init__c                 C   s`   t | jd ƒrt| jd jƒ}nt| jd ƒr!| jd jjd }n| jd jd }|t| jƒfS ©z*Return shape of the transformed DataFrame.r   )r   r¯   rY   ri   r   r-  rV   ©r0  Ú	n_samplesrS   rS   rT   rV   ‚  s   zPandasTransformed.shape)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   rL   r!  r   r   r   r/  Úpropertyr	   rx   rV   Ú__classcell__rS   rS   r5  rT   r'  b  s    þýü r'  c                 C   sd   |rt | jƒdkr|tvrtd|› d�ƒ‚t|ƒ\}}t| ||||ƒ\}}t| ƒ}t||d�||fS )Nr   zDataFrame for z cannot have multiple columns©r(  )rY   r¯   Ú_matrix_metarZ   r   rÕ   r&  r'  )rI   r¾   rq   rr   r½   r(  ÚarraysrS   rS   rT   Ú_transform_pandas_df‘  s   
ÿ
ýrC  r­   r{   c                 C   s\   t | d|d�\} }}t| jƒdkr| jd }nt | j¡j}t||ƒ\}}t||||ƒ d S )NF)r½   r   r   )rC  rY   r¯   rL   ÚstackÚTr   Ú_meta_from_numpy)rI   r­   rk   r{   rl   r�   rS   rS   rT   Ú_meta_from_pandas_df¨  s   rG  c           	   	   C   óL   t | |||ƒ\}}}t ¡ }tt | ¡ t|||d�t |¡¡ƒ |||fS ©N)rp   rJ   ro   )	rC  rt   ru   r?   r;   ÚXGDMatrixCreateFromColumnarr   rB   ry   )	rI   r¾   rJ   rp   rq   rr   ro   Údfr{   rS   rS   rT   Ú_from_pandas_df¸  s   

ÿÿûÿ
	rL  c                 C   sœ   t | jƒr| j ¡  tj¡} nt| jƒrt| ƒ} n	| j	tjtj
d�} t t| d| ƒƒr.|  ¡ } t| jƒdksE| jd dksE| jd dksEJ ‚t| |||ƒ dS )z6Help transform pandas series for meta data like labels)r  rk   r   r   N)rË   rk   rm   r#  ÚastyperL   r�   râ   r  r  r  rä   rY   rV   rF  )rI   r­   rk   r{   rS   rS   rT   Ú_meta_from_pandas_seriesÓ  s   


.rN  c                 C   s`   | j jtvrt| j ƒr|st| ƒ |rt| j ƒr| jj} t| j 	| j
d d¡ d¡||||d�S )Nr   r   rw   ©rI   rJ   rp   rq   rr   )rk   r­   r®   rÎ   r»   r  r-  r’   rm   ÚreshaperV   rM  )rI   rJ   rp   r¾   rq   rr   rS   rS   rT   Ú_from_pandas_seriesä  s   	ÿÿûrQ  c                       sX   e Zd ZdZ	ddeed  dee ddf‡ fdd„Ze	de
eef fd	d
„ƒZ‡  ZS )ÚArrowTransformedz,A storage class for transformed arrow table.Nr¯   ©zpa.NumericArrayzpa.DictionaryArrayr(  rK   c                    sj   || _ tr
dd l‰ntƒ ‰g ‰ g ‰dtd dd f‡ ‡‡fdd„}| j D ]}||ƒ q#tƒ j|ˆ ˆd� d S )Nr   r%  rS  rK   c                    st   t | ˆjƒr/| j}| j}t |ˆjˆjfƒstdƒ‚t||ƒ\}}}ˆ |¡ ˆ  ||f¡ d S t	| ƒ}ˆ  |¡ d S )Nz;Only string-based categorical index is supported for arrow.)
ra   ÚDictionaryArrayÚ
dictionaryri   ÚStringArrayÚLargeStringArrayÚ	TypeErrorr   rÌ   r   )r%  Úcatsr-  r1  r2  r3  Újdata©r*  r  r+  rS   rT   Úpush_series  s   ÿ
z.ArrowTransformed.__init__.<locals>.push_seriesr)  )r¯   r   rÿ   r8   r   r.  r/  ©r0  r¯   r(  r\  r%  r5  r[  rT   r/  ÿ  s   



ýzArrowTransformed.__init__c                 C   s   t | jd ƒt | jƒfS r7  )rY   r¯   ©r0  rS   rS   rT   rV   &  s   zArrowTransformed.shaperì   )r:  r;  r<  r=  r   r   r   r   r/  r>  r	   rx   rV   r?  rS   rS   r5  rT   rR  ü  s    ý
þýü' rR  zpa.Tablec                 C   s²   t rdd l}ntƒ }t| ƒ\}}t|ƒ\}}|d u r|}|d u r"|}g }|D ]'}	|  |	¡}
|
 ¡ }t||jƒr>| 	| 
¡ ¡}t|ƒrH|sHtd ƒ | |¡ q&t||d�}|||fS )Nr   r@  )r   rÿ   r8   Ú_arrow_feature_infor   Úcolumnr  ra   ÚBooleanArrayÚcastr”   r   r»   rÌ   rR  )rI   r¾   rq   rr   r  Út_namesÚt_typesr(  r¯   ÚcnameÚcol0r%  Údf_trS   rS   rT   Ú_transform_arrow_table,  s(   


rh  Ú	n_threadsc           	   	   C   rH  rI  )	rh  rt   ru   r?   r;   rJ  r   rB   ry   ©	rI   r¾   rJ   ri  rq   rr   ro   rg  r{   rS   rS   rT   Ú_from_arrow_tableO  ó   	
ÿÿûÿ
	rk  c                  C   sp   dd l } |  ¡ d|  ¡ d|  ¡ d|  ¡ d|  ¡ d|  ¡ d|  ¡ d|  ¡ d|  	¡ d|  
¡ d|  ¡ d|  ¡ di}|S )Nr   rx   rw   r“   )rÿ   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   Úbool_)r  ÚmappingrS   rS   rT   Ú_arrow_dtypeh  s   ôro  c                    sL   t rdd l‰ ntƒ ‰ | ‰ˆj}dtdtf‡ ‡fdd„}tt||ƒƒ}||fS )Nr   r­   rK   c                    s(   ˆ  | ¡}t|jˆ jƒrtS tƒ |j S rì   )r`  ra   rQ   rã   rÐ   ro  )r­   r%  ©r  ÚtablerS   rT   Úmap_type‡  s   
z%_arrow_feature_info.<locals>.map_type)r   rÿ   r8   Úcolumn_namesrP   rÉ   rÊ   )rI   Únamesrr  r  rS   rp  rT   r_  ~  s   
r_  c                 C   s   | }t | ¡ |||d� d S )N)r­   rk   r{   )rG  Ú	to_pandas)rI   r­   rk   r{   rq  rS   rS   rT   Ú_meta_from_arrow_table’  s   rv  c                   C   s   t ƒ stdƒ‚d S )Nz!`pyarrow` is required for polars.)r9   rb   rS   rS   rS   rT   Ú_check_pyarrow_for_polarsœ  s   ÿrw  c                 C   s>   t | ƒr|  ¡ }t dt¡ n| }tƒ  | ¡ }t||||ƒS )Nz}Using the default parameters for the polars `LazyFrame.collect`. Consider passing a realized `DataFrame` or `Series` instead.)r4   ÚcollectrN   rO   rR   rw  Úto_arrowrh  )rI   r¾   rq   rr   rK  rq  rS   rS   rT   Ú_transform_polars_df¡  s   ýÿrz  c           	   	   C   rH  rI  )	rz  rt   ru   r?   r;   rJ  r   rB   ry   rj  rS   rS   rT   Ú_from_polars_df¸  rl  r{  c                     sp   zddl m‰  dtdtf‡ fdd„} W | S  ty7   z
ddlm}  W Y | S  ty6   ddlm}  Y Y | S w w )Nr   ré   rk   rK   c                    rë   rì   rí   rŠ   ré   rS   rT   rð   Ö  rˆ   z4_lazy_load_cudf_is_cat.<locals>.is_categorical_dtyperï   )Úcudfrê   r   rŸ   rb   Úcudf.api.typesrð   Úcudf.utils.dtypesrï   rS   ré   rT   Ú_lazy_load_cudf_is_catÑ  s   	úýýýr  c                  C   s   ddl m}  | S )Nr   ©r×   )r}  r×   r€  rS   rS   rT   Ú_lazy_load_cudf_is_boolâ  s   r�  c                       sX   e Zd ZdZdeedef  dee ddf‡ fdd„Z	e
deeef fd	d
„ƒZ‡  ZS )ÚCudfTransformedz/A storage class for transformed cuDF dataframe.r¯   r  r(  rK   Nc                    sP   || _ g ‰ g ‰dtdd f‡ ‡fdd„}| j D ]}||ƒ qtƒ j|ˆ ˆd� d S )Nrü   rK   c                    sX   t | ƒr!| j| j}}t||ƒ\}}}ˆ |¡ ˆ  ||f¡ d S t| ƒ}ˆ  |¡ d S rì   )r   r,  r-  r   rÌ   r   )rü   rY  r-  Ú	cats_ainfÚ
codes_ainfr3  Úainf©r*  r+  rS   rT   r\  ø  s   
z-CudfTransformed.__init__.<locals>.push_seriesr)  )r¯   r   r.  r/  r]  r5  r†  rT   r/  ì  s   


ýzCudfTransformed.__init__c                 C   s@   t | jd ƒr| jd jjd }n| jd jd }|t| jƒfS r7  )r   r¯   r-  rV   rY   r8  rS   rS   rT   rV     s   zCudfTransformed.shape)r:  r;  r<  r=  r   r   r   r   r   r/  r>  r	   rx   rV   r?  rS   rS   r5  rT   r‚  é  s    þýü  r‚  c                    s°  t ƒ }tƒ ‰t| ƒr|| jƒr|  tj¡} | jg}n|  dd„ | jdd�D ƒ¡} | j}t	‡ ‡fdd„|D ƒƒs;t
| ƒ |d u r`t| ƒrH| jg}nt| jddƒrXd	d
„ | jD ƒ}nt| j t¡ƒ}t|ƒ\}}|d u r…g }|D ]}ˆ|ƒr|ˆ r|| t¡ qn| t|j ¡ qng }t| ƒr¥ˆ| jƒr™ˆ r™| | j¡ n6ˆ rŸttƒ‚| | ¡ n*t| j| jƒD ]"\}	}| |	 }
ˆ|ƒrÁˆ rÁ| |
j¡ q¬ˆ|ƒrÉttƒ‚| |
¡ q¬t||d�||fS )Nc                 S   s   i | ]}|t j“qS rS   )rL   r˜   )r°   r%  rS   rS   rT   Ú
<dictcomp>*  rÄ   z&_transform_cudf_df.<locals>.<dictcomp>rŸ   )Úincludec                 3   s&   � | ]}|j tv pˆ|ƒoˆ V  qd S rì   )r­   r®   )r°   rk   ©r¾   rð   rS   rT   Ú	<genexpr>.  s   € 
þ

þz%_transform_cudf_df.<locals>.<genexpr>zcudf.core.multiindexrÈ   c                 S   r¿   )r³   c                 S   rÀ   rS   rÁ   rÂ   rS   rS   rT   r±   :  rÄ   z1_transform_cudf_df.<locals>.<listcomp>.<listcomp>rÅ   rÆ   rS   rS   rT   r±   :  rÇ   z&_transform_cudf_df.<locals>.<listcomp>r@  )r�  r  r-   rk   rM  rL   r˜   Úselect_dtypesr«   Úallr»   r­   r:   r¯   rÉ   rÊ   rP   r   rÌ   rÐ   r®   r  rZ   r¶   r"  r‚  )rI   rq   rr   r¾   r×   r«   r(  rk   r$  r%  ÚseriesrS   r‰  rT   Ú_transform_cudf_df  sZ   


ÿý

ýrŽ  c                 C   sJ   t | |||ƒ\}}}t ¡ }tt | ¡ t||d�t |¡¡ƒ |||fS )N)rp   rJ   )	rŽ  rt   ru   r?   r;   ÚXGDMatrixCreateFromCudaColumnarr   rB   ry   )rI   rJ   rp   rq   rr   r¾   rK  r{   rS   rS   rT   Ú_from_cudf_dfc  s   	
ÿ
ýÿ
r�  c                 C   sT   dd l }t| dƒst| dƒr|j| dd�} t| ƒs | j|jfv r(| j|jdd�} | S )Nr   Ú__cuda_array_interface__Ú	__array__F)r‰   )ÚcupyrX   r�   r   rk   rm  rM  r�   )rI   r“  rS   rS   rT   Ú_transform_cupy_arrayz  s   r”  c                 C   sP   t | ƒ} t| ƒ}t ¡ }tt ||dœ¡dƒ}tt 	||t 
|¡¡ƒ |||fS )z%Initialize DMatrix from cupy ndarray.)rJ   rp   zutf-8)r”  r   rt   ru   ÚbytesÚjsonÚdumpsr?   r;   Ú%XGDMatrixCreateFromCudaArrayInterfacery   )rI   rJ   rp   rq   rr   Úinterface_strr{   ÚconfigrS   rS   rT   Ú_from_cupy_array„  s   ÿÿ
r›  c                 C   ó2   zdd l }W n
 ty   Y dS w t| |jjjƒS ©Nr   F)Úcupyxrb   ra   ÚscipyÚsparser_   ©rI   rž  rS   rS   rT   Ú_is_cupy_csr˜  ó   ÿr¢  c                 C   rœ  r�  )rž  rb   ra   rŸ  r   rh   r¡  rS   rS   rT   Ú_is_cupy_csc   r£  r¤  c                 C   s   dt t| ƒƒv odt | ƒv S )NÚ	PyCapsuleÚdltensor)rP   rQ   r[   rS   rS   rT   Ú
_is_dlpack¨  s   r§  c                 C   s(   ddl m} dt| ƒvsJ ‚|| ƒ} | S )Nr   )Úfrom_dlpackÚused_dltensor)r“  r¨  rP   )rI   r¨  rS   rS   rT   Ú_transform_dlpack¬  s   rª  c                 C   s   t | ƒ} t| ||||ƒS rì   )rª  r›  rO  rS   rS   rT   Ú_from_dlpack´  s   r«  c                 C   s   t | ttjfƒS rì   )ra   rP   Úosr'   r[   rS   rS   rT   Ú_is_uri¿  s   r­  c                 C   sX   t | |ƒ t ¡ }t tj | ¡¡} tt| ƒt	|ƒd�}t
t |t |¡¡ƒ |||fS )N)Úuriro   )rU   rt   ru   r¬  ÚfspathÚpathÚ
expanduserrB   rP   rx   r?   r;   ÚXGDMatrixCreateFromURIry   )rI   rJ   rq   rr   ro   r{   rš  rS   rS   rT   Ú	_from_uriÃ  s   

r³  c                 C   ó
   t | tƒS rì   )ra   rÉ   r[   rS   rS   rT   Ú_is_listÒ  rˆ   rµ  c                 C   s&   t  | ¡}t| ƒ t||||||d�S )N©rI   rJ   rp   rq   rr   ro   )rL   r�   r\   r’   )rI   rJ   ri  rq   rr   ro   r�   rS   rS   rT   Ú
_from_listÖ  s   
	úr·  c                 C   r´  rì   )ra   Útupler[   rS   rS   rT   Ú	_is_tupleë  rˆ   r¹  c                 C   s   t | |||||d�S )N©rI   rJ   ri  rq   rr   ro   )r·  rº  rS   rS   rT   Ú_from_tupleï  s   	úr»  c                 C   r´  rì   )ra   r<   r[   rS   rS   rT   Ú_is_iter  rˆ   r¼  c                 C   r„   )Nr’  r†   r[   rS   rS   rT   Ú_has_array_protocol  rˆ   r½  c                 C   sb   t  dt| ƒ› d�t¡ zdd l}W n
 ty   Y d S w z	|j | ¡} W | S  ty0   Y d S w )NzUnknown data type: z$, trying to convert it to csr_matrixr   )	rN   rO   rQ   rR   r`   rb   r   r_   Ú	Exception)rI   rŸ  rS   rS   rT   Ú_convert_unknown_data
  s   þÿýÿr¿  F)r¾   ro   Úthreadsc              	   C   sJ  dt tttf  dtt t  fdd„}t| ƒs#t| ƒs#t| ƒs#t| ƒ t	| ƒr7||ƒs-J ‚t
| |||||d�S t| ƒrK||ƒsAJ ‚t| |||||d�S t| ƒra||ƒsUJ ‚t
|  ¡ |||||d�S t| ƒru||ƒskJ ‚t| |||||d�S t| ƒr‡||ƒsJ ‚t| ||||ƒS t| ƒr›||ƒs‘J ‚t| |||||d�S t| ƒr¯||ƒs¥J ‚t| |||||d�S t| ƒr¾tƒ }| | j| i¡} t| ƒrÍt| ||||||d�S t| ƒrÜt| ||||||d�S t| ƒrã| j} t| ƒrït ƒ }	|	 | ¡} t!| ƒrþt"| ||||||d�S t#| ƒ�st| ƒ�rt$| |||||d	�S t%| ƒ�r&||ƒ�sJ ‚t&| ||||ƒS t'| ƒ�r/t(d
ƒ‚t)| ƒ�r8t(dƒ‚t*| ƒ�rL||ƒ�sDJ ‚t+| ||||ƒS t,| ƒ�rYt ƒ }	|	 | ¡} t-| ƒ�rht"| |||||d�S t.| ƒ�r‚||ƒ�stJ ‚t/ 0| ¡}
t|
||||d�S t1| ƒ}|du�r›||ƒ�s’J ‚t
|||||d�S t(dt2t3| ƒƒ ƒ‚)zDispatch data for DMatrix.rr   rK   c                 S   s   t | tƒr	tdƒ‚dS )Nz9Reference category is only supported by DataFrame inputs.T)ra   r   rZ   )rr   rS   rS   rT   Ú
check_cats(  s
   
ÿz)dispatch_data_backend.<locals>.check_catsr¶  rº  )rJ   ri  rq   rr   ro   )rI   r¾   rJ   rp   rq   rr   ro   )rI   rJ   rp   rq   rr   r¾   zcupyx CSR is not supported yet.zcupyx CSC is not supported yet.)rI   r¾   rJ   rp   rq   rr   rO  NzNot supported type for data.)4r   r   r#   r   r   r-   r2   r5   r\   re   r|   r~   r€   rƒ   Útocsrr‡   r’   r­  r³  rµ  r·  r¹  r»  r7   rC   r­   r3   r{  r*   rk  r,   Ú_fsproxy_fastr6   r1   rL  r+   r�  r.   r›  r¢  rX  r¤  r§  r«  r0   r/   r½  rL   rŽ   r¿  rP   rQ   )rI   rJ   rÀ  rq   rr   r¾   ro   rÁ  ÚplrÒ   r�   Ú	convertedrS   rS   rT   Údispatch_data_backend  sJ  ÿ

þ
ÿþýúúúúúúù	ù	
ù	ú






ú
	
û
ûrÆ  c                 C   sœ   t | dƒrFd| j› d|› �}|tv rt| jƒdkrt|ƒ‚d S t| jƒdks;t| jƒdkrH| jd dkrJ| jd dkrLtd| j› d|› �ƒ‚d S d S d S d S )NrV   zInvalid shape: z for rW   r   r   )rX   rV   rA  rY   rZ   )rI   r­   rº   rS   rS   rT   Ú_validate_meta_shapeØ  s   
*örÇ  Úfieldc                 C   sN   t | |ƒ\} }| j}| dd ¡d urtdƒ‚t| ƒ}tt |t|ƒ|¡ƒ d S )NÚmaskzMasked array is not supported.)	r   r…   ÚgetrZ   r   r?   r;   ÚXGDMatrixSetInfoFromInterfacerA   )rI   rÈ  rk   r{   Ú	interfacer™  rS   rS   rT   rF  æ  s   rF  c                 C   s   t  | ¡}t||||ƒ d S rì   )rL   r�   rF  )rI   rÈ  rk   r{   Údata_nprS   rS   rT   Ú_meta_from_listô  s   
rÎ  c                 C   s   t | |||ƒS rì   )rÎ  )rI   rÈ  rk   r{   rS   rS   rT   Ú_meta_from_tupleû  s   rÏ  c                 C   sN   |t vrt| jd d …df ||ƒ d S | j} t| ƒ}tt |t|ƒ|¡ƒ d S ©Nr   )	rA  Ú_meta_from_cudf_seriesÚilocrm   r   r?   r;   rË  rA   )rI   rÈ  r{   rÌ  rS   rS   rT   Ú_meta_from_cudf_df  s
   rÓ  c                 C   s,   t | |ƒ t| ƒ}tt |t|ƒ|¡ƒ d S rì   )r   r   r?   r;   rË  rA   ©rI   rÈ  r{   r4  rS   rS   rT   rÑ  
  s   
rÑ  c                 C   s*   t | ƒ} t| ƒ}tt |t|ƒ|¡ƒ d S rì   )r”  r   r?   r;   rË  rA   rÔ  rS   rS   rT   Ú_meta_from_cupy_array  s   rÕ  Úmatrixc                 C   s  | j }|dus	J ‚t||ƒ |du rdS t|ƒr!t||||ƒ dS t|ƒr.t||||ƒ dS t|ƒr;t||||ƒ dS t|ƒrHt	||||ƒ dS t
|ƒrO|j}t|ƒrit|ƒr[| ¡ }tƒ  t	| ¡ |||ƒ dS t|ƒrwt||||d� dS t|ƒr„t||||ƒ dS t|ƒr”t|ƒ}t|||ƒ dS t|ƒr t|||ƒ dS t|ƒr¬t|||ƒ dS t|ƒr¸t|||ƒ dS t|ƒrÆt||||d� dS t|ƒrð|j  d¡}t!|j"ƒdksç|j"d dksç|j"d dksçJ ‚t||||ƒ dS t#|ƒ�rt$ %|¡}t||||ƒ dS t&d| t't(|ƒƒƒ‚)zDispatch for meta info.N)rk   r{   rw   r   r   zUnsupported type for ))r{   rÇ  rµ  rÎ  r¹  rÏ  r‡   rF  r*   rv  r,   rÃ  r3   r4   rx  rw  ry  r1   rG  r2   rN  r§  rª  rÕ  r-   rÑ  r+   rÓ  r.   r/   r0   rm   rM  rY   rV   r½  rL   rŽ   rX  rP   rQ   )rÖ  rI   r­   rk   r{   r�   rS   rS   rT   Údispatch_meta_backend  sr   
.

r×  c                       sF   e Zd ZdZdeddf‡ fdd„Zdedefdd	„Zdd
d„Z	‡  Z
S )ÚSingleBatchInternalIterzüAn iterator for single batch data to help creating device DMatrix.
    Transforming input directly to histogram with normal single batch data API
    can not access weight for sketching.  So this iterator acts as a staging
    area for meta info.

    ÚkwargsrK   Nc                    s   || _ d| _tƒ jdd� d S )Nr   F)Úrelease_data)rÙ  Úitr.  r/  )r0  rÙ  r5  rS   rT   r/  ^  s   z SingleBatchInternalIter.__init__Ú
input_datac                 C   s0   | j dkrdS |  j d7  _ |di | j¤Ž dS )Nr   FTrS   )rÛ  rÙ  )r0  rÜ  rS   rS   rT   Únextf  s
   
zSingleBatchInternalIter.nextc                 C   s
   d| _ d S rÐ  )rÛ  r^  rS   rS   rT   Úresetm  rˆ   zSingleBatchInternalIter.reset©rK   N)r:  r;  r<  r=  r   r/  r   rŸ   rÝ  rÞ  r?  rS   rS   r5  rT   rØ  V  s
    rØ  c           	      C   s’  t | ƒr| j} t| ƒst| ƒrt| |||ƒS t| ƒr#t| ƒ} | ||fS t| ƒr.t| ƒ||fS t	| ƒs6t
| ƒr;t | ¡} t| ƒrLt| | jƒ\} }| ||fS t| ƒrZt| dƒ} | ||fS t| ƒrjt|  ¡ dƒ} | ||fS t| ƒrzt|  ¡ dƒ} | ||fS t| ƒr�t| |||ƒ\}}}|||fS t| ƒr™tƒ }| | ¡} t| ƒr¬t| |||ƒ\}}}|||fS t| ƒr¿t| |||ƒ\}}}|||fS tdtt | ƒƒ ƒ‚)NTú.Value type is not supported for data iterator:)!r,   rÃ  r+   r-   rŽ  r.   r”  r§  rª  rµ  r¹  rL   r�   r‡   r   rk   re   rn   r~   rÂ  rƒ   r3   rz  r2   r6   rC   r*   rh  r1   rC  rX  rP   rQ   )	rI   rq   rr   r¾   rl   Údf_plrÒ   Údf_parK  rS   rS   rT   Ú_proxy_transformq  sX   ÿ







ÿ


ÿ

ÿ
rã  c                    s    t ‡ fdd„tttttfD ƒƒS )z0Whether the data is a CUDA-based data structure.c                 3   s   � | ]}|ˆ ƒV  qd S rì   rS   )r°   Úpr[   rS   rT   rŠ  ¨  s
   € ÿ
ÿzis_on_cuda.<locals>.<genexpr>)Úanyr+   r-   r,   r.   r§  r[   rS   r[   rT   Ú
is_on_cuda¦  s   ûþræ  Úproxyc                 C   sÔ   t |ƒst|ƒst|ƒst|ƒ t|tƒr|  |¡ dS t|ƒr'|  |¡ dS t	|ƒr6t
|ƒ}|  |¡ dS t|ttfƒrD|  |¡ dS t|ƒrSt|ƒ |  |¡ dS t|ƒr^|  |¡ dS tdtt|ƒƒ ƒ}|‚)zDispatch for QuantileDMatrix.Nrà  )r-   r2   r5   r\   ra   r‚  Ú_ref_data_from_cuda_columnarr.   Ú_ref_data_from_cuda_interfacer§  rª  rR  r'  Ú_ref_data_from_columnarr‡   Ú_ref_data_from_arrayre   Ú_ref_data_from_csrrX  rP   rQ   )rç  rI   r¸   rS   rS   rT   Údispatch_proxy_set_data´  s:   ÿþý






rí  )NNNrß  rì   )¯r=  rt   Ú	functoolsr–  r¬  rN   Útypingr   r   r   r   r   r   r   r	   r
   r   r   ÚnumpyrL   Ú_data_utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú_typingr    r!   r"   r#   r$   r%   r&   r'   r(   r)   Úcompatr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   Úcorer;   r<   r=   r>   r?   r@   rA   rB   rÿ   r  ró   rC   r¼   rD   r  ru   rE   Ú__annotations__rÐ   rA  rU   r\   rŸ   re   rn   ÚROWrx   r|   r~   r€   rƒ   r!  r‡   r�   r’   r®   rÜ   Úpandas_pyarrow_mapperÚupdater¶   r»   rP   rÕ   rà   râ   rÏ   Úcacherô   rÎ   rû   rË   r  r  r¸  r  r&  r'  rC  rG  rL  rN  rQ  rR  rh  rk  ro  r_  rv  rw  rz  r{  r  r�  r‚  rŽ  r�  r”  r›  r¢  r¤  r§  rª  r«  r­  r³  rÉ   rµ  r·  r¹  r»  r¼  r½  r¿  rÆ  rÇ  rF  rÎ  rÏ  rÓ  rÑ  rÕ  r×  rØ  rã  ræ  rí  rS   rS   rS   rT   Ú<module>   sö  4P0L(ÿ ùþýüûúù
øùþýüûúù
øùþýüûúù
øôõó

ÿÿþýüû
ú*ÿ
þF2ûÿþýüû
úÿþýü
ûøþýüûúùø	
÷ÿÿÿÿ
þþýüûúù
ø0ÿþýü
û*ùÿþýüûúù
øÿþýü
û

ÿþýü
ûùÿþýüûúù
ø-ÿþýüþÿ
ûMþýüûúù
ø
ÿþýüû
úÿþýüû
ú	ûÿþýüû
úùþýüûúù
øùþýüûúù
øøþýüûúùø	
÷ =ÿþýü
ûÿÿÿÿ
þÿÿÿÿ
þ	ÿÿÿÿÿ
þ@ÿþýü
û5ÿþý