o
    Õ­jú/  ã                   @  s
  U d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dl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mZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ eed�dudd„ƒZ%eed�dvdd„ƒZ&eed�dwdd„ƒZ'e(dd„ e )¡ D ƒƒZ*de+d< dd„ e*D ƒZ,de+d< eed�dxd!d"„ƒZ-eed�dvd#d$„ƒZ.eed�dvd%d&„ƒZ/eed�dvd'd(„ƒZ0eed�dvd)d*„ƒZ1eed�dvd+d,„ƒZ2eed�dvd-d.„ƒZ3eed�dvd/d0„ƒZ4eed�dvd1d2„ƒZ5eed�dvd3d4„ƒZ6eed�dvd5d6„ƒZ7eed�dvd7d8„ƒZ8eed�dvd9d:„ƒZ9eed�dvd;d<„ƒZ:eed�dvd=d>„ƒZ;ee<eƒd�dyd@dA„ƒZ=eed�dvdBdC„ƒZ>	Ddzd{dHdI„Z?edJd�d|dLdM„ƒZ@d}dOdP„ZAd~dRdS„ZBdd€dWdX„ZCd�d\d]„ZDd‚d^d_„ZEd`ejFdafdƒdedf„ZG	d„d…dsdt„ZHdS )†é    )ÚannotationsN)Úbisect_right)ÚIncrementalDecoder)Úaliases)Ú	lru_cache)Úfindall)Ú	Generator)ÚMultibyteIncrementalDecoderé   )ÚENCODING_MARKSÚIANA_SUPPORTED_SIMILARÚRE_POSSIBLE_ENCODING_INDICATIONÚUNICODE_RANGES_COMBINEDÚUNICODE_SECONDARY_RANGE_KEYWORDÚUTF8_MAXIMAL_ALLOCATIONÚCOMMON_CJK_CHARACTERSÚ_LATINÚ_CJKÚ_HANGULÚ	_KATAKANAÚ	_HIRAGANAÚ_THAIÚ_ARABICÚ_ARABIC_ISOLATED_FORMÚ_ACCENT_KEYWORDSÚ_ACCENTUATED)ÚmaxsizeÚ	characterÚstrÚreturnÚintc                 C  sÌ   zt  | ¡}W n
 ty   Y dS w d}d|v r|tO }d|v r$|tO }d|v r,|tO }d|v r4|tO }d|v r<|tO }d|v rD|tO }d|v rT|t	O }d	|v rT|t
O }tD ]}||v rc|tO } |S qV|S )
zRCompute all name-based classification flags with a single unicodedata.name() call.r   ÚLATINÚCJKÚHANGULÚKATAKANAÚHIRAGANAÚTHAIÚARABICzISOLATED FORM)ÚunicodedataÚnameÚ
ValueErrorr   r   r   r   r   r   r   r   r   r   )r   ÚdescÚflagsÚkw© r.   úU/var/www/html/CropPilot/venv/lib/python3.10/site-packages/charset_normalizer/utils.pyÚ_character_flags&   s:   ÿür0   Úboolc                 C  ó   t t| ƒt@ ƒS ©N)r1   r0   r   ©r   r.   r.   r/   Úis_accentuatedI   ó   r5   c                 C  s.   t  | ¡}|s	| S | d¡}tt|d dƒƒS )Nú r   é   )r(   ÚdecompositionÚsplitÚchrr    )r   Ú
decomposedÚcodesr.   r.   r/   Úremove_accentN   s
   

r>   c                 c  s"   � | ]\}}|j |j|fV  qd S r3   )ÚstartÚstop)Ú.0r)   Ú	ord_ranger.   r.   r/   Ú	<genexpr>[   s
   € ÿ
ÿrC   zlist[tuple[int, int, str]]Ú_UNICODE_RANGES_SORTEDc                 C  s   g | ]}|d  ‘qS )r   r.   )rA   Úer.   r.   r/   Ú
<listcomp>_   s    rF   z	list[int]Ú_UNICODE_RANGE_STARTSú
str | Nonec                 C  s<   t | ƒ}tt|ƒd }|dkrt| \}}}||k r|S dS )zK
    Retrieve the Unicode range official name from a single character.
    r
   r   N)Úordr   rG   rD   )r   Úcharacter_ordÚidxr?   r@   r)   r.   r.   r/   Úunicode_rangeb   s   rL   c                 C  r2   r3   )r1   r0   r   r4   r.   r.   r/   Úis_latins   r6   rM   c                 C  s2   t  | ¡}d|v rdS t| ƒ}|d u rdS d|v S )NÚPTFÚPunctuation©r(   ÚcategoryrL   ©r   Úcharacter_categoryÚcharacter_ranger.   r.   r/   Úis_punctuationx   s   
rU   c                 C  sB   t  | ¡}d|v sd|v rdS t| ƒ}|d u rdS d|v o |dkS )NÚSÚNTFÚFormsÚLorP   rR   r.   r.   r/   Ú	is_symbol‡   s   
rZ   c                 C  s$   t | ƒ}|d u r
dS d|v pd|v S )NFÚ	EmoticonsÚPictographs)rL   )r   rT   r.   r.   r/   Úis_emoticon–   s   r]   c                 C  s.   |   ¡ s| dv r
dS t | ¡}d|v p|dv S )N>   õ   ï½œú+ú<ú>TÚZ>   ÚPcÚPdÚPo)Úisspacer(   rQ   )r   rS   r.   r.   r/   Úis_separator    s   
rg   c                 C  s   |   ¡ |  ¡ kS r3   )ÚislowerÚisupperr4   r.   r.   r/   Úis_case_variableª   r6   rj   c                 C  r2   r3   )r1   r0   r   r4   r.   r.   r/   Úis_cjk¯   r6   rk   c                 C  r2   r3   )r1   r0   r   r4   r.   r.   r/   Úis_hiragana´   r6   rl   c                 C  r2   r3   )r1   r0   r   r4   r.   r.   r/   Úis_katakana¹   r6   rm   c                 C  r2   r3   )r1   r0   r   r4   r.   r.   r/   Ú	is_hangul¾   r6   rn   c                 C  r2   r3   )r1   r0   r   r4   r.   r.   r/   Úis_thaiÃ   r6   ro   c                 C  r2   r3   )r1   r0   r   r4   r.   r.   r/   Ú	is_arabicÈ   r6   rp   c                 C  r2   r3   )r1   r0   r   r4   r.   r.   r/   Úis_arabic_isolated_formÍ   r6   rq   c                 C  s   | t vS r3   )r   r4   r.   r.   r/   Úis_cjk_uncommonÒ   s   rr   Ú
range_namec                   s   t ‡ fdd„tD ƒƒS )Nc                 3  s   � | ]}|ˆ v V  qd S r3   r.   )rA   Úkeyword©rs   r.   r/   rC   Ù   s   € z-is_unicode_range_secondary.<locals>.<genexpr>)Úanyr   ru   r.   ru   r/   Úis_unicode_range_secondary×   s   rw   c                 C  s(   |   ¡ du o|  ¡ du o| dko| dkS )NFúu   ï»¿)rf   Úisprintabler4   r.   r.   r/   Úis_unprintableÜ   s   
ÿþürz   é    Úsequenceúbytes | bytearrayÚsearch_zonec                 C  s¤   t | ttfƒs	t‚t| ƒ}tt| dt||ƒ… jddd�ƒ}t|ƒdkr&dS |D ]'}| 	¡  
dd¡}t ¡ D ]\}}||krD|    S ||krN|    S q6q(dS )zW
    Extract using ASCII-only decoder any specified encoding in the first n-bytes.
    NÚasciiÚignore©Úerrorsr   ú-Ú_)Ú
isinstanceÚbytesÚ	bytearrayÚ	TypeErrorÚlenr   r   ÚminÚdecodeÚlowerÚreplacer   Úitems)r|   r~   Úseq_lenÚresultsÚspecified_encodingÚencoding_aliasÚencoding_ianar.   r.   r/   Úany_specified_encodingç   s&   þÿýr”   é€   r)   c                 C  s    | dv pt t d| › �¡jtƒS )zQ
    Verify is a specific encoding is a multi byte one based on it IANA name
    >	   Úutf_7Úutf_8Úutf_16Úutf_32Ú	utf_16_beÚ	utf_16_leÚ	utf_32_beÚ	utf_32_leÚ	utf_8_sigú
encodings.)Ú
issubclassÚ	importlibÚimport_moduler   r	   )r)   r.   r.   r/   Úis_multi_byte_encoding	  s   
þör£   útuple[str | None, bytes]c                 C  sJ   t D ] }t | }t|tƒr|g}|D ]}|  |¡r!||f    S qqdS )z9
    Identify and extract SIG/BOM in given sequence.
    )Nó    )r   r…   r†   Ú
startswith)r|   Úiana_encodingÚmarksÚmarkr.   r.   r/   Úidentify_sig_or_bom  s   

ÿÿrª   r§   c                 C  s   | dvS )N>   r˜   r™   r.   )r§   r.   r.   r/   Úshould_strip_sig_or_bom0  s   r«   TÚcp_nameÚstrictc                 C  sN   |   ¡  dd¡} t ¡ D ]\}}| ||fv r|  S q|r%td| › d�ƒ‚| S )zIReturns the Python normalized encoding name (Not the IANA official name).rƒ   r„   zUnable to retrieve IANA for 'ú')rŒ   r�   r   rŽ   r*   )r¬   r­   r’   r“   r.   r.   r/   Ú	iana_name4  s   ÿr¯   Úiana_name_aÚiana_name_bÚfloatc           	      C  sŒ   t | ƒst |ƒr
dS t d| › �¡j}t d|› �¡j}|dd�}|dd�}d}tdƒD ]}t|gƒ}| |¡| |¡krA|d7 }q,|d S )Ng        rŸ   r€   r�   r   é   r
   )r£   r¡   r¢   r   Úranger†   r‹   )	r°   r±   Ú	decoder_aÚ	decoder_bÚid_aÚid_bÚcharacter_match_countÚiÚto_be_decodedr.   r.   r/   Úcp_similarityE  s   


€r¼   c                 C  s   | t v o	|t |  v S )zŽ
    Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using
    the function cp_similarity.
    )r   )r°   r±   r.   r.   r/   Úis_cp_similarY  s   
þr½   Úcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)sÚlevelÚformat_stringÚNonec                 C  s:   t  | ¡}| |¡ t  ¡ }| t  |¡¡ | |¡ d S r3   )ÚloggingÚ	getLoggerÚsetLevelÚStreamHandlerÚsetFormatterÚ	FormatterÚ
addHandler)r)   r¿   rÀ   ÚloggerÚhandlerr.   r.   r/   Úset_logging_handlerd  s
   

rË   Ú	sequencesr“   Úoffsetsr´   Ú
chunk_sizeÚbom_or_sig_availableÚstrip_sig_or_bomÚsig_payloadr†   Úis_multi_byte_decoderÚdecoded_payloadúGenerator[str, None, None]c	                 c  s&  � |r|du r|D ]}	||	|	| … }
|
s d S |
V  q	d S |D ]p}	|	| }|t | ƒd kr/q | |	|	| … }|rA|du rA|| }|j||rHdndd�}
|r�|	dkr�t|dƒ}|r�|
d |… |vr�t|	|	d d	ƒD ]#}| ||… }|r{|du r{|| }|j|dd�}
|
d |… |v rŒ nqi|
V  q d S )
NFé   r€   r­   r�   r   r8   é   éÿÿÿÿ)r‰   r‹   rŠ   r´   )rÌ   r“   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rº   ÚchunkÚ	chunk_endÚcut_sequenceÚchunk_partial_size_chkÚjr.   r.   r/   Úcut_sequence_chunksq  sD   €ü
þ
ÿÿÝrÝ   )r   r   r   r    )r   r   r   r1   )r   r   r   r   )r   r   r   rH   )rs   r   r   r1   )r{   )r|   r}   r~   r    r   rH   )r)   r   r   r1   )r|   r}   r   r¤   )r§   r   r   r1   )T)r¬   r   r­   r1   r   r   )r°   r   r±   r   r   r²   )r°   r   r±   r   r   r1   )r)   r   r¿   r    rÀ   r   r   rÁ   r3   )rÌ   r}   r“   r   rÍ   r´   rÎ   r    rÏ   r1   rÐ   r1   rÑ   r†   rÒ   r1   rÓ   rH   r   rÔ   )IÚ
__future__r   r¡   rÂ   r(   Úbisectr   Úcodecsr   Úencodings.aliasesr   Ú	functoolsr   Úrer   Útypingr   Ú_multibytecodecr	   Úconstantr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r5   r>   ÚsortedrŽ   rD   Ú__annotations__rG   rL   rM   rU   rZ   r]   rg   rj   rk   rl   rm   rn   ro   rp   rq   rr   r‰   rw   rz   r”   r£   rª   r«   r¯   r¼   r½   ÚINFOrË   rÝ   r.   r.   r.   r/   Ú<module>   sŽ    L"þ		ÿ"



ý÷