U
    9%e;Z                    @   sX  d dl Z d dlZd dlZd dlmZ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 d dlmZmZmZmZmZmZ d dlmZmZ d dlmZm Z  d dl!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- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO d dlPmQZQ dZRejSjTZUeejVG dd de
jZWeejVdd eejVdd eejVdd eejVdd eejVdd eejXG dd deZYdd ZZd d! Z[eej\ej]d"d# Z^eej]d$d% Z_eejVd&d' Z`eejVd(d) Zad*d+ Zbed,d- Zced.d/ Zded0d1 Zeed2d3 Zfed>d4d5Zged6d7d8d9 Zhd:d; Zied<d= Zjed>d? Zked@dA Zled6d7dBdC ZmedDdE ZnedFdG ZoedHdI Zped6d7dJdK ZqedLdM ZredNdO ZseetdPdQ ZueejvdRdS ZweejxdTdU ZyeejzdVdW Z{eej|dXdY Z}eej~dZd[ Zeejd\d] Zeejd^d_ Zd`da Zdbdc Zeddde Zedfdg Zedhdi Zedjdk Zdldm ZeeeZeeeZeejVdnd?dodpZeejVdqd@drdsZeejVdtdAdudvZeejVdwdBdxdyZeejVdzd{d| ZeejVd}dCd~dZeejVddd Zedd ZeejVddDddZeejVddEddZeejVddFddZeejVddGddZdd Zeee8Zeee9ZeejVddHddZeejVddIddZdd ZeejVded6 eejVded dd ZeeeAZeee@ZeejVddJddZedd ZeejVddd ZeejVddd Zedd Zedd Zdd Zdd ZeejVddKddZeejVddLddZeejVddMddZedNddZedd ZeddĄ ZeddƄ Zed6d7ddȄ Zeddʄ Zeejdd̄ Zeejeejdd΄ ZeddЄ Zeejdd҄ ZeejddԄ ZeejVdՃdOddׄZddل ZeejVdڃeeMeK edd܄ ZeejVd݃ee2e dd߄ Zedd܄ ZeeeEeFeZeee?e>eDZeejVddd ZeejVddd ZeejVddd ZeejVddd ZeejVddd ZȐdPddZeejVdee8 eejVdeeL eejVdeeN eejVdeeO eejVdee7d6 dd Zedd Zedd Zdd Zeed6ZeedZdd  Zeee/Zeee0ZeejVddd ZeejVddd Zedd Zed	d
 ZeejVddd Zedd Zedd ZeejVddd Zedd Zedd ZeejVddd Zedd Zedd ZeejVd d!d" Zeed#d$ Zed%d& Zd'eR Zed(d) Zeed*d+ ZeejVd,d-d. ZeejVd/d0d1 Zeejd,d2d3 Zeejd/d4d5 Zeejd/eejd,d6d7 Zed8ejVd9d: Zed;ejXeejd<d= ZdS (Q      N)IntTypeConstant)is_nonelike)
modelsregister_modelmake_attribute_wrapperunboxboxNativeValueoverloadoverload_method	intrinsicregister_jitable)lower_constant
lower_castlower_builtiniternext_implimpl_ret_new_refRefType)register_defaultStructModel)typescgutils)PY_UNICODE_1BYTE_KINDPY_UNICODE_2BYTE_KINDPY_UNICODE_4BYTE_KINDPY_UNICODE_WCHAR_KIND)	c_helpers)
_Py_hash_t)memcpy_region)TypingError)!_Py_TOUPPER_Py_TOLOWER_Py_UCS4_Py_ISALNUM_PyUnicode_ToUpperFull_PyUnicode_ToLowerFull_PyUnicode_ToFoldedFull_PyUnicode_ToTitleFull_PyUnicode_IsPrintable_PyUnicode_IsSpace_Py_ISSPACE_PyUnicode_IsXidStart_PyUnicode_IsXidContinue_PyUnicode_IsCased_PyUnicode_IsCaseIgnorable_PyUnicode_IsUppercase_PyUnicode_IsLowercase_PyUnicode_IsLineBreak_Py_ISLINEBREAK_Py_ISLINEFEED_Py_ISCARRIAGERETURN_PyUnicode_IsTitlecase_Py_ISLOWER_Py_ISUPPER_Py_TAB_Py_LINEFEED_Py_CARRIAGE_RETURN	_Py_SPACE_PyUnicode_IsAlpha_PyUnicode_IsNumeric_Py_ISALPHA_PyUnicode_IsDigit_PyUnicode_IsDecimalDigit)slicing c                   @   s   e Zd Zdd ZdS )UnicodeModelc              	   C   sV   dt jfdt jfdt jfdt jfdtfdt t jfdt jfg}tj	
| ||| d S )Ndatalengthkindis_asciihashmeminfoparent)r   voidptrintpint32uint32r   ZMemInfoPointerZpyobjectr   r   __init__selfZdmmZfe_typemembers rT   T/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/cpython/unicode.pyrP   O   s    
zUnicodeModel.__init__N)__name__
__module____qualname__rP   rT   rT   rT   rU   rD   M   s   rD   rE   _datarF   _lengthrG   _kindrH   	_is_asciirI   _hashc                       s   e Zd Z fddZ  ZS )UnicodeIteratorModelc                    s2   dt t jfd|jfg}tt| ||| d S )NindexrE   )r   ZEphemeralPointeruintprE   superr^   rP   rQ   	__class__rT   rU   rP   f   s    zUnicodeIteratorModel.__init__)rV   rW   rX   rP   __classcell__rT   rT   rb   rU   r^   d   s   r^   c                 C   s   ddl m}m}m}m}m}m}m}m}m	}	 t
d }
|||||||||||}||
}| }| }| }| }|| |	||	||	||	|}|dkrtd|j}|j}|j}|d t| }|| |}t|||||jfS )ztGet string data from a python string for use at compile-time to embed
    the string data into the LLVM module.
    r   )		CFUNCTYPEc_void_pc_intc_uint	c_ssize_tc_ubyte	py_objectPOINTERbyrefZextract_unicodeNz1cannot extract unicode data from the given string   )ctypesre   rf   rg   rh   ri   rj   rk   rl   rm   r   
ValueErrorvalue_kind_to_byte_widthZfrom_addressbytes)objre   rf   rg   rh   ri   rj   rk   rl   rm   Zextract_unicode_fnprotofnrF   rG   rH   hashvrE   nbytesoutrT   rT   rU   compile_time_get_string_datan   s(    ,  rz   c                 C   sz   t |\}}}}}|j}	| |	|}
t|| |}|
|_|j||_|j||_|j	||_	|j
d|_
| S )zf
    Get string data by `compile_time_get_string_data()` and return a
    unicode_type LLVM value
    )rz   moduleZinsert_const_bytesr   create_struct_proxyrE   rF   typerG   rH   rI   	_getvalue)contextbuildertypZliteral_stringZ	databytesrF   rG   rH   rw   modgvuni_strrT   rT   rU   make_string_from_constant   s    r   c                 C   s   t | |||jS N)r   Zliteral_value)r   r   ZfromtyZtotyvalrT   rT   rU   cast_from_literal   s       r   c                 C   s   t | |||S r   )r   )r   r   r   ZpyvalrT   rT   rU   constant_unicode   s    r   c                 C   s   |j |\}}}}}}t| |j|j}	||	_||	_||	_||	_	||	_
|j |||	_||	_t|j|j  }
t|	 |
dS )zE
    Convert a unicode str object to a native unicode structure.
    )is_error)pyapiZstring_as_string_size_and_kindr   r}   r   r   rE   rF   rG   rH   rI   Znrt_meminfo_new_from_pyobjectrJ   rK   Zis_not_nullZerr_occurredr
   r   )r   rt   cokrE   rF   rG   rH   rw   r   r   rT   rT   rU   unbox_unicode_str   s    
r   c                 C   sR   t | |j|j|d}|j|j|j|j}|j	| |jj
|j| | |S )z@
    Convert a native unicode structure to a unicode string
    rq   )r   r}   r   r   r   Zstring_from_kind_and_datarG   rE   rF   Zobject_hashnrtZdecref)r   r   r   r   resrT   rT   rU   box_unicode_str   s      r   c                    s    fdd}|S )Nc                    s@   |\}}| |t  }||||g}||tdS N    )bitcastr   
as_pointerloadgepZzext)r   r   	signatureargsrE   idxptrchbitsizerT   rU   codegen   s    z#make_deref_codegen.<locals>.codegenrT   r   r   rT   r   rU   make_deref_codegen   s    r   c                 C   s   t t jt j}|tdfS N   r   rO   rL   rM   r   	typingctxrE   offsetsigrT   rT   rU   deref_uint8   s    r   c                 C   s   t t jt j}|tdfS N   r   r   rT   rT   rU   deref_uint16   s    r   c                 C   s   t t jt j}|tdfS r   r   r   rT   rT   rU   deref_uint32   s    r   c                 C   s(   dd }t t jt jt jt j}||fS )zmake empty string with data buffer of size alloc_bytes.

    Must set length and kind values for string after it is returned
    c              	   S   s   |\}}}}t tj}|| |}	||||t|jd}
| j	||
|	_
||	_||	_||	_| td|	_| j||	j
|	_t |	jj|	_|	 S )Nrn   r{   )r   r}   r   unicode_typemuladdr   r~   r   Zmeminfo_allocrJ   rG   rH   rF   get_constantr   rI   Zmeminfo_datarE   get_null_valuerK   r   )r   r   r   r   Zkind_valZchar_bytes_valZ
length_valZis_ascii_valZuni_str_ctorr   Z
nbytes_valrT   rT   rU   details   s     

z_malloc_string.<locals>.details)r   r   rN   rM   rO   )r   rG   Z
char_bytesrF   rH   r   r   rT   rT   rU   _malloc_string   s    r   c                 C   s,   t | }t| |||}t||td |S Nr   )rr   r   _set_code_pointnprO   )rG   rF   rH   
char_widthsrT   rT   rU   _empty_string  s    r   F)Z_nrtc                 C   sJ   | j tkrt| j|S | j tkr,t| j|S | j tkrBt| j|S dS d S r   )r[   r   r   rY   r   r   r   r   )airT   rT   rU   _get_code_point  s    


r   c                    s    fdd}|S )Nc                    sT   |\}}} dk r"| |t }||t  }|||||g |  S r   )truncr   r   r   storer   Zget_dummy_value)r   r   r   r   rE   r   r   r   r   rT   rU   r   .  s    
z!make_set_codegen.<locals>.codegenrT   r   rT   r   rU   make_set_codegen-  s    r   c                 C   s    t t jt jt j}|tdfS r   r   voidrL   Zint64rO   r   r   rE   r   r   r   rT   rT   rU   	set_uint89  s    r   c                 C   s    t t jt jt j}|tdfS r   r   r   rT   rT   rU   
set_uint16?  s    r   c                 C   s    t t jt jt j}|tdfS r   r   r   rT   rT   rU   
set_uint32E  s    r   c                 C   sZ   | j tkrt| j|| n<| j tkr4t| j|| n"| j tkrNt| j|| ntdd S )Nz4Unexpected unicode representation in _set_code_point)	r[   r   r   rY   r   r   r   r   AssertionError)r   r   r   rT   rT   rU   r   K  s    


r   c                 C   sV   | t ks|t krtd| tkr$|S | tkr>|tkr8|S | S n| tkrJ| S tdd S )N!PY_UNICODE_WCHAR_KIND unsupportedz/Unexpected unicode representation in _pick_kind)r   r   r   r   r   )Zkind1Zkind2rT   rT   rU   
_pick_kind^  s    r   c                 C   s$   | dkr|dkrt dS t dS Nrn   r   )r   rO   )Z	is_ascii1Z	is_ascii2rT   rT   rU   _pick_asciip  s    
r   c                 C   sB   | t krdS | tkrdS | tkr$dS | tkr6tdntdd S )Nrn         r   z'Unexpected unicode encoding encountered)r   r   r   r   r   )rG   rT   rT   rU   rr   w  s    
rr   c                 C   sz   |dkrdS || | j krdS || |j kr0dS t|D ]<}t| || }t||| }||k rf dS ||kr8 dS q8dS )Nr   r{   rn   )rZ   ranger   )r   Za_offsetbZb_offsetnr   Za_chrZb_chrrT   rT   rU   _cmp_region  s    r   c                 C   s8   | dk rt S | dk rtS d}| |kr0d}t|tS dS )zK
    Compute the minimum unicode kind needed to hold a given codepoint
       i   rC   z;Invalid codepoint. Found value greater than Unicode maximumN)r   r   rp   r   )cpZMAX_UNICODEmsgrT   rT   rU   _codepoint_to_kind  s    r   c                 C   s   | dk S )z;
    Returns true if a codepoint is in the ASCII range
       rT   )r   rT   rT   rU   _codepoint_is_ascii  s    r   c                 C   s   t | tjrdd }|S d S )Nc                 S   s   | j S r   )rZ   r   rT   rT   rU   len_impl  s    zunicode_len.<locals>.len_impl
isinstancer   UnicodeType)r   r   rT   rT   rU   unicode_len  s    r   c                 C   s   | j r|j sd S t| tjr$| j}n| }t|tjr<|j}n|}tjtjtjf}t||}t||}|rx|rxdd }|S ||A rdd }|S d S )Nc                 S   sd   | d k}|d k}|s|r(|r$|r$dS dS t | } t |}t| t|krLdS t| d|dt| dkS )NTFr   )strlenr   )r   r   Za_noneZb_nonerT   rT   rU   eq_impl  s    zunicode_eq.<locals>.eq_implc                 S   s   dS NFrT   r   r   rT   rT   rU   r     s    )is_internalr   r   Optionalr~   r   StringLiteralUnicodeCharSeq)r   r   Zcheck_aZcheck_baccept	a_unicode	b_unicoder   rT   rT   rU   
unicode_eq  s"    

r   c                 C   s`   | j r|j sd S tjtjtjf}t| |}t||}|rH|rHdd }|S ||A r\dd }|S d S )Nc                 S   s
   | |k S r   rT   r   rT   rT   rU   ne_impl  s    zunicode_ne.<locals>.ne_implc                 S   s   dS )NTrT   r   rT   rT   rU   r     s    zunicode_ne.<locals>.eq_impl)r   r   r   r   r   r   )r   r   r   r   r   r   r   rT   rT   rU   
unicode_ne  s    

r   c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   sJ   t t| t|}t| d|d|}|dkr.dS |dkrFt| t|k S dS )Nr   r{   TFminr   r   r   r   ZminlenZeqcoderT   rT   rU   lt_impl  s    zunicode_lt.<locals>.lt_implr   r   r   r   )r   r   r   r   r   rT   rT   rU   
unicode_lt  s
    r   c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   sJ   t t| t|}t| d|d|}|dkr.dS |dkrFt| t|kS dS )Nr   rn   TFr   r   rT   rT   rU   gt_impl  s    zunicode_gt.<locals>.gt_implr   )r   r   r   r   r   rT   rT   rU   
unicode_gt  s
    r   c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   s
   | |k S r   rT   r   rT   rT   rU   le_impl  s    zunicode_le.<locals>.le_implr   )r   r   r   r   r   rT   rT   rU   
unicode_le  s
    r   c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   s
   | |k  S r   rT   r   rT   rT   rU   ge_impl&  s    zunicode_ge.<locals>.ge_implr   )r   r   r   r   r   rT   rT   rU   
unicode_ge!  s
    r   c                 C   s(   t | tjr$t |tjr$dd }|S d S )Nc                 S   s   t | |dkS )Nr{   )_findr   rT   rT   rU   contains_impl.  s    z'unicode_contains.<locals>.contains_implr   )r   r   r   rT   rT   rU   unicode_contains+  s    r   c                 C   s^   | }t | tjr| j}nt | tjr*| j}tjtjf}|dk	rZt ||sZtd	||| dS )zCheck object belongs to one of specific types
    ty: type
        Type of the object
    name: str
        Name of the object
    N"{}" must be {}, not {})
r   r   Omittedrq   r   r~   IntegerNoneTyper    format)tynamethetyacceptedrT   rT   rU   unicode_idx_check_type4  s    r  c                 C   s(   t | tjs$d|tj| }t|dS )z$Check object belongs to unicode typer   N)r   r   r   r  r    )r  r  r   rT   rT   rU   unicode_sub_check_typeH  s    r  c                 C   s   | d|t d @ > O } | S Nrn   _BLOOM_WIDTHmaskr   rT   rT   rU   
_bloom_addQ  s    r  c                 C   s   | d|t d @ > @ S r	  r
  r  rT   rT   rU   _bloom_checkW  s    r  c                 C   sP  t |}|dkr|S |d  }}t||}td}t||}	t|D ],}
t||
}t|	|}	||krF||
 d }qF|}
|
|| krLt| ||
 }||krd}||k rt| |
| }t||}||krq|d7 }q||kr|
S t| ||
 d }t|	|dkr|
|7 }
n|
|7 }
n*t| ||
 d }t|	|dkrB|
|7 }
|
d7 }
qxdS )zLeft finder.r   rn   r{   )r   r   r   rM   r  r   r  )rE   substrstartendmgapmlastlastzeror  r   r   jhaystack_ch	needle_chrT   rT   rU   _default_find]  sD    










r  c                 C   sR  t |}|dkr|S |d  }}t|d}td|}|}	|	dkrnt||	}
t||
}|
|krd|	d }|	d8 }	q8|| }	|	|krNt| |	}
|
|kr|}|dkrt| |	| }t||}||krq|d8 }q|dkr|	S t| |	d }
|	|kr
t||
dkr
|	|8 }	n|	|8 }	n0t| |	d }
|	|krDt||
dkrD|	|8 }	|	d8 }	qvdS )zRight finder.r   rn   r{   )r   r   r  r  )rE   r  r  r  r  skipr  Zmfirstr  r   r   r  r  r  rT   rT   rU   _default_rfind  sF    












r  c                    s   d fdd	}|S )z%Generate finder either left or right.Nc                    sV   t | }t |}|d krd}|d kr(|}t|||\}}|| |k rHdS  | |||S )Nr   r{   )r   _adjust_indices)rE   r  r  r  rF   
sub_length	find_funcrT   rU   impl  s    zgenerate_finder.<locals>.impl)NNrT   )r!  r"  rT   r   rU   generate_finder  s    r#  findc                 C   s<   t |tjrddd}|S t|d t|d t|d tS )zImplements str.find()Nc                 S   s   |  t|S r   )r$  r   rE   r  r  r  rT   rT   rU   	find_impl  s    zunicode_find.<locals>.find_implr  r  r  )NN)r   r   r   r  r  r   )rE   r  r  r  r&  rT   rT   rU   unicode_find  s    



r'  rfindc                 C   s<   t |tjrddd}|S t|d t|d t|d tS )zImplements str.rfind()Nc                 S   s   |  t|S r   )r(  r   r%  rT   rT   rU   
rfind_impl  s    z!unicode_rfind.<locals>.rfind_implr  r  r  )NN)r   r   r   r  r  _rfind)rE   r  r  r  r)  rT   rT   rU   unicode_rfind  s    



r+  rindexc                 C   s,   t |d t |d t|d ddd}|S )zImplements str.rindex()r  r  subNc                 S   s"   |  |||}|dk rtd|S Nr   zsubstring not found)r(  rp   r   r-  r  r  resultrT   rT   rU   rindex_impl  s    z#unicode_rindex.<locals>.rindex_impl)NNr  r  )r   r-  r  r  r1  rT   rT   rU   unicode_rindex  s
    



r3  r_   c                 C   s,   t |d t |d t|d ddd}|S )zImplements str.index()r  r  r-  Nc                 S   s"   |  |||}|dk rtd|S r.  )r$  rp   r/  rT   rT   rU   
index_impl  s    z!unicode_index.<locals>.index_impl)NNr2  )r   r-  r  r  r4  rT   rT   rU   unicode_index  s
    



r5  	partitionc                 C   sj   |}t |tjr|j}nt |tjr*|j}tjtjf}|dk	r^t ||s^dd||}t	|dd }|S )zImplements str.partition()Nr   sepc                 S   s   t |}t| jd| j}t|}| j|jk s8t| |k rB| ||fS |dkrRtd| |}|dk rn| ||fS | d| || || t|  fS Nr   empty separator)r   r   r[   r\   r   rp   r$  rE   r7  Z	empty_str
sep_lengthposrT   rT   rU   r"  '  s    


zunicode_partition.<locals>.impl
r   r   r   rq   r   r~   r   r   r  r    rE   r7  r  r  r   r"  rT   rT   rU   unicode_partition  s    r?  countc                 C   sD   t | t | t|tjr*ddd}|S d}t|t|d S )Nc                 S   s   d}t | }t |}t||d}t|||}|| dk s@||krDdS | || } t | }d| }}|dkrr|d S || |kr| |||  |kr|d7 }||7 }qr|d7 }qr|S Nr   rn   )r   _normalize_slice_idx_count)srcr-  r  r  r@  Zsrc_lenZsub_lenrT   rT   rU   
count_implB  s$    


z!unicode_count.<locals>.count_implz+The substring must be a UnicodeType, not {})NN)_count_args_types_checkr   r   r   r    r  r~   )rC  r-  r  r  rD  	error_msgrT   rT   rU   unicode_count;  s    
rG  
rpartitionc                 C   sj   |}t |tjr|j}nt |tjr*|j}tjtjf}|dk	r^t ||s^dd||}t	|dd }|S )zImplements str.rpartition()Nr   r7  c                 S   s   t |}t| jd| j}t|}| j|jk s8t| |k rB||| fS |dkrRtd| |}|dk rn||| fS | d| || || t|  fS r8  )r   r   r[   r\   r   rp   r(  r:  rT   rT   rU   r"  p  s    


z unicode_rpartition.<locals>.implr=  r>  rT   rT   rU   unicode_rpartition`  s    rI  c                 C   sL   || kr| }|dk r(|| 7 }|dk r(d}|dk rD|| 7 }|dk rDd}||fS r   rT   )rF   r  r  rT   rT   rU   r    s    r  
startswithc                 C   s   t |st|tjstdt |s8t|tjs8tdt|tjr`t|jtjr`d
dd}|S t|tjrzddd}|S t|tjrddd}|S td	d S )Nz:When specified, the arg 'start' must be an Integer or Nonez8When specified, the arg 'end' must be an Integer or Nonec                 S   s"   |D ]}|  |||r dS qdS NTF)rJ  )r   prefixr  r  itemrT   rT   rU   startswith_tuple_impl  s    z1unicode_startswith.<locals>.startswith_tuple_implc                 S   s   |  t|||S r   )rJ  r   )r   rL  r  r  rT   rT   rU   startswith_char_seq_impl  s    z4unicode_startswith.<locals>.startswith_char_seq_implc                 S   sv   t | t | }}|d krd}|d kr*|}t|||\}}|| |k rJdS |dkrVdS | || }t|d|d|dkS Nr   FTr   r  r   )r   rL  r  r  rF   Zprefix_lengthZs_slicerT   rT   rU   startswith_unicode_impl  s    z3unicode_startswith.<locals>.startswith_unicode_implz9The arg 'prefix' should be a string or a tuple of strings)NN)NN)NN)	r   r   r   r   r    UniTupledtyper   r   )r   rL  r  r  rN  rO  rR  rT   rT   rU   unicode_startswith  s,    


rU  endswithc                 C   s   |d ks&t |tjtjtjfs&td|d ksLt |tjtjtjfsLtdt |tjtjfrlddd}|S t |tjrddd}|S t |tj	rddd}|S d S )	Nz!The arg must be a Integer or Nonec                 S   s&   |D ]}|  |||dkr dS qdS rK  )rV  )r   r  r  r  rM  rT   rT   rU   endswith_impl  s    z'unicode_endswith.<locals>.endswith_implc                 S   s   t | }t |}|d krd}|d kr(|}t|||\}}|| |k rHdS |dkrTdS | || } t | | }t| ||d|dkS rP  rQ  )r   r  r  r  rF   r  r   rT   rT   rU   rW    s    c                 S   s   |  t|||S r   )rV  r   )r   r  r  r  rT   rT   rU   rW    s    )NN)NN)NN)
r   r   r   r   r  r    TuplerS  r   r   )r   r  r  r  rW  rT   rT   rU   unicode_endswith  s&    


rY  
expandtabsr   c                 C   sd   |}t |tjr|j}nt |tjr*|j}tjtf}|dk	rVt ||sVtd	||ddd}|S )zImplements str.expandtabs()Nz"tabsize" must be {}, not {}r   c                 S   sf  t | }d }}d}t|D ]}t| |}|tkrrd}|dkr|||  }|tj| kr`td||7 }||7 }q|tjd krtd|d7 }|d7 }|ttfkrd}q|s| S t	| j
|| j}	d }}t|D ]}t| |}|tkr4|dkr`|||  }||7 }t||| D ]}
t|	|
t q||7 }q|d7 }t|	|| |d7 }|ttfkrd}q|	S )Nr   FTznew string is too longrn   )r   r   r   r9   sysmaxsizeOverflowErrorr:   r;   r   r[   r\   r   r<   )rE   tabsizerF   r  Zline_posfoundr   
code_pointincrr   r   rT   rT   rU   expandtabs_impl  sL    





z+unicode_expandtabs.<locals>.expandtabs_impl)r   )
r   r   r   rq   r   r~   r   intr    r  )rE   r^  r  r  rb  rT   rT   rU   unicode_expandtabs  s    


.rd  splitr{   c                 C   s   |dks"t |tjtjtjfs"d S t |tjr<d	dd}|S t |tjrVd
dd}|S |d kszt |tjszt|ddd krddd}|S d S )Nr{   c                 S   s   | j t||dS )N)maxsplit)re  r   )r   r7  rf  rT   rT   rU   
split_implE  s    z!unicode_split.<locals>.split_implc           
      S   s   t | }t |}|dkr tdg }d}d}|dkr~|dkr~t|d}t|D ],}t| ||krN|| ||  |d }qNnbd}	||k r|dks|	|k rt| ||d|dkr|| ||  ||7 }|}|	d7 }	q|d7 }q||kr|| |d   |S )Nr   r9  rn   r{   )r   rp   r   r   appendr   )
r   r7  rf  a_lensep_lenpartsr  r   Zsep_code_pointsplit_countrT   rT   rU   rg  J  s4    


rq   Fc                 S   s   t | }g }d}d}d}d}t|D ]b}t| |}	t|	}
|rN|
rDq|}d}q$|
sTq$|| ||  d}|d7 }|dkr$||kr$ qq$||kr|s|| |d   |S )Nr   TFrn   r{   )r   r   r   r*   rh  )r   r7  rf  ri  rk  r  r   rl  Zin_whitespace_blockr`  Zis_whitespacerT   rT   rU   split_whitespace_implo  s0    
z,unicode_split.<locals>.split_whitespace_impl)Nr{   )Nr{   )Nr{   )	r   r   r   r   ZIntegerLiteralr   r   r  getattr)r   r7  rf  rg  rm  rT   rT   rU   unicode_split=  s"    

"
 ro  c                    s   d fdd	}|S )z@Generate whitespace rsplit func based on either ascii or unicodeNr{   c                    s  |dk rt j}g }t| d }|dkr|dkrLt| |} |sBqL|d8 }q&|dk rVq|}|d8 }|dkrt| |} |r~q|d8 }qb|| |d |d   |d8 }q|dkr|dkrt| |} |sq|d8 }q|dkr|| d|d   |d d d S Nr   rn   r{   )r[  r\  r   r   rh  )rE   r7  rf  r0  r   r`  r  isspace_funcrT   rU   rsplit_whitespace_impl  s<    






z?generate_rsplit_whitespace_impl.<locals>.rsplit_whitespace_impl)Nr{   rT   )rr  rs  rT   rq  rU   generate_rsplit_whitespace_impl  s    &rt  rsplitc                 C   sh   dd }||dt jt jt jf ||dt jtf |dksLt|t jt jfrZddd}|S dd	d
}|S )zImplements str.unicode_rsplit()c                 S   sR   | }t | tjr| j}nt | tjr*| j}|dk	rNt ||sNtd||| dS )z.Check object belongs to one of specified typesNr   )r   r   r   rq   r   r~   r    r  )r  r  r  r  rT   rT   rU   _unicode_rsplit_check_type  s    z2unicode_rsplit.<locals>._unicode_rsplit_check_typer7  rf  Nr{   c                 S   s   | j rt| ||S t| ||S r   )r\   ascii_rsplit_whitespace_implunicode_rsplit_whitespace_impl)rE   r7  rf  rT   rT   rU   rs    s    z.unicode_rsplit.<locals>.rsplit_whitespace_implc                 S   s   t |}| j|jk s$t| t|k r*| gS dd }|dk r@tj}t|}|dkrXtd|dkrl|| ||S g }t| }|dkr| j|d|d}|dk rq|| || |  |}|d8 }qx|| d|  |d d d S )Nc                 S   s   g }t |d}t| d  }}|dkrx|dkrxt | |}||krn|| |d |d   |d  }}|d8 }|d8 }q|dkr|| d|d   |d d d S rp  )r   r   rh  )rE   r   rf  r0  Zch_code_pointr   r  Zdata_code_pointrT   rT   rU   _rsplit_char  s    


z9unicode_rsplit.<locals>.rsplit_impl.<locals>._rsplit_charr   r9  rn   )r  r  r{   )r   r[   r   r[  r\  rp   r(  rh  )rE   r7  rf  ry  r;  r0  r  r<  rT   rT   rU   rsplit_impl  s,    
z#unicode_rsplit.<locals>.rsplit_impl)Nr{   )Nr{   )r   r   r   r  r   rc  r   r   )rE   r7  rf  rv  rs  rz  rT   rT   rU   unicode_rsplit  s    


/r{  center c                 C   s^   t |tjstdt |tjr.ddd}|S |dksPt |tjtjfsPtdddd}|S )	NThe width must be an Integerr}  c                 S   s   |  |t|S r   )r|  r   stringwidthfillcharrT   rT   rU   center_impl  s    z#unicode_center.<locals>.center_impl"The fillchar must be a UnicodeTypec           	      S   s   t | }t |}|dkr td||kr,| S || }|d ||@ d@  }|| }|| }||krl||  | S ||  ||  S d S )Nrn   5The fill character must be exactly one character longr   r   rp   )	r  r  r  str_lenfillchar_lenZ	allmarginZlmarginZrmarginZl_stringrT   rT   rU   r  %  s    )r}  )r}  r   r   r   r    r   r   r   )r  r  r  r  rT   rT   rU   unicode_center  s    

r  c                    s   d fdd	}|S )Nr}  c                    st   t |tjstdt |tjr@ r2d
dd}|S ddd}|S |dksbt |tjtjfsbtdd fdd		}|S )Nr~  r}  c                 S   s   |  |t|S r   )ljustr   r  rT   rT   rU   
ljust_implD  s    z<gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.ljust_implc                 S   s   |  |t|S r   )rjustr   r  rT   rT   rU   
rjust_implH  s    z<gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.rjust_implr  c                    sP   t | }t |}|dkr td||kr,| S |||  } rD| | S ||  S d S )Nrn   r  r  )r  r  r  r  r  newstrSTRING_FIRSTrT   rU   r"  P  s    z6gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.impl)r}  )r}  )r}  r  )r  r  r  r  r  r"  r  rT   rU   unicode_Xjust>  s    

z(gen_unicode_Xjust.<locals>.unicode_Xjust)r}  rT   )r  r  rT   r  rU   gen_unicode_Xjust=  s    %r  r  r  Tc                    s    fdd}|S )zDGenerate splitlines performer based on ascii or unicode line breaks.c           
         s   t | }g }d }}||k r||k rBt| |} |r8qB|d7 }q|}||k r|d |k rt| |}t| |d }	t|rt|	r|d7 }|d7 }|r|}|| ||  |}q|S rA  )r   r   r5   r4   rh  )
rE   keependsrF   r0  r   r  r`  eolZcur_cpZnext_cpis_line_break_funcrT   rU   r"  l  s,    


z&generate_splitlines_func.<locals>.implrT   )r  r"  rT   r  rU   generate_splitlines_funcj  s    r  
splitlinesc                 C   sl   |}t |tjr|j}nt |tjr*|j}tjttjt	f}|dk	r^t ||s^t
dd||ddd}|S )zImplements str.splitlines()Nr   r  Fc                 S   s   | j rt| |S t| |S r   )r\   _ascii_splitlines_unicode_splitlines)rE   r  rT   rT   rU   splitlines_impl  s    
z+unicode_splitlines.<locals>.splitlines_impl)F)r   r   r   rq   r   r~   r   rc  Booleanboolr    r  )rE   r  r  r  r  rT   rT   rU   unicode_splitlines  s    
r  c                 C   s   t |}|dkrdS t | }|d | }| j}| j}|D ](}|t |7 }t||j}t||j}q8t|||}|d }	t|d|	dt |	 t |	}
td|D ]D}t||
| d| |
|7 }
|| }	t||
|	dt |	 |
t |	7 }
q|S )Nr    rn   )r   r[   r\   r   r   r   _strncpyr   )r7  rk  Z	parts_lenrj  rF   rG   rH   pr0  part
dst_offsetr   rT   rT   rU   	join_list  s,    r  joinc                 C   sv   t |tjrBt |jtjr&dd }|S t |jtjrrdd }|S n0t |tjrZdd }|S t |tjrrdd }|S d S )Nc                 S   s
   t | |S r   r  )r7  rk  rT   rT   rU   join_list_impl  s    z$unicode_join.<locals>.join_list_implc                 S   s   dd |D }t | |S )Nc                 S   s   g | ]}t |qS rT   r   .0r  rT   rT   rU   
<listcomp>  s     z8unicode_join.<locals>.join_list_impl.<locals>.<listcomp>r  )r7  rk  _partsrT   rT   rU   r    s    c                 S   s   dd |D }|  |S )Nc                 S   s   g | ]}|qS rT   rT   r  rT   rT   rU   r    s     z8unicode_join.<locals>.join_iter_impl.<locals>.<listcomp>)r  r7  rk  Z
parts_listrT   rT   rU   join_iter_impl  s    z$unicode_join.<locals>.join_iter_implc                    s$    fddt t D }t| |S )Nc                    s   g | ]} | qS rT   rT   )r  r   rk  rT   rU   r    s     z7unicode_join.<locals>.join_str_impl.<locals>.<listcomp>)r   r   r  r  rT   r  rU   join_str_impl  s    z#unicode_join.<locals>.join_str_impl)r   r   ListrT  r   r   ZIterableType)r7  rk  r  r  r  rT   rT   rU   unicode_join  s    r  zfillc                 C   s    t |tjstddd }|S )Nz<width> must be an Integerc                 S   sZ   t | }||kr| S |r | d nd}d||  }|dkrN|| | dd   }n||  }|S )Nr   r  0)+-rn   r   )r  r  r  
first_charpaddingr  rT   rT   rU   
zfill_impl  s    z!unicode_zfill.<locals>.zfill_impl)r   r   r   r    )r  r  r  rT   rT   rU   unicode_zfill  s    r  c                 C   s^   t | }d}|d k	r8t|D ]}| | |kr|  S qn"t|D ]}t| | s@|  S q@|S r   r   r   r*   r  charsr  r   rT   rT   rU   unicode_strip_left_bound  s    
r  c                 C   sv   t | }d}|d k	rDt|d ddD ]}| | |kr$|d7 } qrq$n.t|d ddD ]}t| | sT|d7 } qrqT|S rp  r  r  rT   rT   rU   unicode_strip_right_bound  s    r  c                 C   s<   t | tjr| j} | d ks8t | tjtjtjfs8tdd S )Nz%The arg must be a UnicodeType or None)r   r   r   r~   r   r   r  r    )r  rT   rT   rU   unicode_strip_types_check'  s    r  c                 C   s<   t | tjr| j} | d ks8t | tjtjtjfs8tdd S )Nz,The slice indices must be an Integer or None)r   r   r   r~   r   r   r  r    )argrT   rT   rU   rE  0  s    rE  lstripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   r  r  rT   rT   rU   lstrip_impl=  s    z#unicode_lstrip.<locals>.lstrip_implc                 S   s   | t | |d  S r   )r  r  rT   rT   rU   r  C  s    )N)Nr   r   r   r  )r  r  r  rT   rT   rU   unicode_lstrip9  s    

r  rstripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   r  rT   rT   rU   rstrip_implL  s    z#unicode_rstrip.<locals>.rstrip_implc                 S   s   | d t | | S r   )r  r  rT   rT   rU   r  R  s    )N)Nr  )r  r  r  rT   rT   rU   unicode_rstripH  s    

r  stripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   r  rT   rT   rU   
strip_impl[  s    z!unicode_strip.<locals>.strip_implc                 S   s    t | |}t| |}| || S r   )r  r  )r  r  ZlbrbrT   rT   rU   r  a  s    

)N)Nr  )r  r  r  rT   rT   rU   unicode_stripW  s    

r  c                 C   sB   | dkr|rdS |S n| dk r&| |7 } | dk s6| |kr>t d| S )a%  
    Parameters
    ----------
    idx : int or None
        the index
    length : int
        the string length
    is_start : bool; optional with defaults to True
        Is it the *start* or the *stop* of the slice?

    Returns
    -------
    norm_idx : int
        normalized index
    Nr   zstring index out of range)
IndexError)r   rF   Zis_startrT   rT   rU   normalize_str_idxl  s    r  c                 C   s>   | dkr|S | |   kr"|k r.n n| | S | dk r:dS | S )a%  
    Used for unicode_count

    If arg < -slice_len, returns 0 (prevents circle)

    If arg is within slice, e.g -slice_len <= arg < slice_len
    returns its real index via arg % slice_len

    If arg > slice_len, returns arg (in this case count must
    return 0 if it is start index)
    Nr   rT   )r  Z	slice_lendefaultrT   rT   rU   rB    s
    rB  c                 C   s   |||}dd }||fS )zFix slice object.
    c           	      S   sF   |j \}}|\}}| |||}t| ||| t||| | S r   )r   make_helperrB   Zguard_invalid_sliceZ	fix_slicer   )	r   r   r   r   	slicetypeZ
lengthtypesliceobjrF   slicerT   rT   rU   r     s    
z!_normalize_slice.<locals>.codegenrT   )r   r  rF   r   r   rT   rT   rU   _normalize_slice  s    
r  c                 C   s   t |}dd }||fS )z2Compute the span from the given slice object.
    c                 S   s,   |j \}|\}| |||}t||}|S r   )r   r  rB   Zget_slice_length)r   r   r   r   r  r  r  Zresult_sizerT   rT   rU   r     s
    z_slice_span.<locals>.codegen)r   rM   )r   r  r   r   rT   rT   rU   _slice_span  s    
r  c           
      C   st   |j | j krHt|j }|| }|| }|| }t| j||j||dd n(t|D ]}	t| ||	 t|||	  qPd S )Nrn   )align)r[   rr   r   rY   r   r   r   )
dstr  rC  Z
src_offsetr   
byte_widthZsrc_byte_offsetZdst_byte_offsetrx   r   rT   rT   rU   r    s    
  
r  c                 C   s2   |t jkstdd }t t jt jt j}||fS )z_Create a slice of a unicode string using a view of its data to avoid
    extra allocation.
    c                 S   s   |\}}}t tj| ||d}t tj| |}|j|_|j|_|j|_||_| t	d|_
| jt}	|	| jtjfi }
| |	|
}|||jf}|||}||j|g|_t |jj|_| jr| j||jd | | S )Nr   r{   r   )r   r}   r   r   rJ   rG   rH   rF   r   r   rI   typing_contextresolve_value_typerr   get_call_typerN   get_functionr   r   rE   r   rK   r~   
enable_nrtr   increfr   r   )r   r   r   r   rC  r  rF   Zin_strZview_strZbw_typZbw_sigZbw_implr  r   rT   rT   rU   r     sB    
     z$_get_str_slice_view.<locals>.codegen)r   r   r   rM   )r   Zsrc_tZstart_tZlength_tr   r   rT   rT   rU   _get_str_slice_view  s    r  c                 C   s@   t | tjr<t |tjr$dd }|S t |tjr<dd }|S d S )Nc                 S   s^   t |t| }t| |}t|}|| jkr6t| |dS t|}t|d|}t|d| |S d S r   )	r  r   r   r   r[   r  r   r   r   )r   r   r   rG   rH   retrT   rT   rU   getitem_char  s    

z%unicode_getitem.<locals>.getitem_charc                 S   s   t |t| }t|}t| |j}t|}t|}t|j|j |j	|jD ]4}t| |}|t|M }t|}||krJt
||}qJ|jdkr|| jkrt| |j|S t|||}	|j}
t|D ] }t|	|t| |
 |
|j7 }
q|	S d S r	  )r  r   r  r   r  r   r   r   stepstopr   r[   r  r   r   )r   r   Z	slice_idxspanr   rG   rH   r   new_kindr  currT   rT   rU   getitem_slice  s,     
z&unicode_getitem.<locals>.getitem_slice)r   r   r   r   Z	SliceType)r   r   r  r  rT   rT   rU   unicode_getitem  s    $r  c                 C   sL   t | tjr$t |tjr$dd }|S t | tjrHt |tjrHdd }|S d S )Nc                 S   s   | j |j  }t| j|j}t| j|j}t|||}tt| D ]}t||t	| | q@tt|D ]}t|t| | t	|| qd|S r   )
rZ   r   r[   r   r\   r   r   r   r   r   )r   r   
new_lengthr  Z	new_asciir0  r   r  rT   rT   rU   concat_impl7  s    z#unicode_concat.<locals>.concat_implc                 S   s   | t | S r   r  r   rT   rT   rU   r  D  s    )r   r   r   r   )r   r   r  rT   rT   rU   unicode_concat3  s    
r  c                 C   s   | dks|dk rdS |dkr | S | j | }| j}t||| j}t| }t|d| d| |}d| |krt|||d| |d9 }qZd| |ks|| }t||||| | |S d S )Nr  rn   r   r   )rZ   r[   r   r\   r   r  )Zstr_argZmult_argr  r  r0  Zlen_aZ	copy_sizerestrT   rT   rU   _repeat_implI  s"    

r  c                 C   sL   t | tjr$t |tjr$dd }|S t | tjrHt |tjrHdd }|S d S )Nc                 S   s
   t | |S r   r  r   rT   rT   rU   wrapg  s    zunicode_repeat.<locals>.wrapc                 S   s
   t || S r   r  r   rT   rT   rU   r  k  s    )r   r   r   r   )r   r   r  rT   rT   rU   unicode_repeatd  s    r  c                 C   s   t | tjrdd }|S d S )Nc                 S   s   t | dkS r   r  r   rT   rT   rU   r"  s  s    zunicode_not.<locals>.implr   r   r"  rT   rT   rU   unicode_notp  s    r  replacec                 C   s   |}t |tjr|j}nt |tjr*|j}t |ttjfsHtd	|t |tj
tjfshtd	|t |tj
std	|ddd}|S )NzGUnsupported parameters. The parameters must be Integer. Given count: {}z+The object must be a UnicodeType. Given: {}r{   c           	      S   s   |dkr| S |dkrt | }|dkr6||| | S |g}tt||}t|D ]F}|||  |d |kr||| qR|d||d d   qR|t|kr|| d|S | ||}||}|S )Nr   r  r{   rn   )listr  r   r   r   rh  re  )	r   old_strnew_strr@  ZscharsZsplit_resultZ	min_countr   r0  rT   rT   rU   r"    s&    


zunicode_replace.<locals>.impl)r{   )r   r   r   rq   r   r~   rc  r   r    r  r   r  )r   r  r  r@  r  r"  rT   rT   rU   unicode_replacex  s&    
r  c                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    s   t | }|dkrdS |dkr<t| d}| jr4 |S |S | jrht|D ]}t| |} |sJ dS qJt|D ]}t| |}|sp dS qpdS )Nr   Frn   T)r   r   r\   r   )rE   rF   r`  r   
ascii_funcunicode_funcrT   rU   r"    s$    


z.gen_isAlX.<locals>.unicode_isAlX.<locals>.implrT   rE   r"  r  rT   rU   unicode_isAlX  s    z gen_isAlX.<locals>.unicode_isAlXrT   )r  r  r   rT   r  rU   	gen_isAlX  s    r  isalphac                 C   s   t | pt| S r   )r>   r=   xrT   rT   rU   <lambda>  s    r  isalnumc                    s    fdd}|S )Nc                    sp   t | }|dkrt| dS |dkr*dS d}t|D ]4}t| |} |sT|rZ dS |s6|r6d}q6|S Nrn   r   FTr   r   r   )r   lcasedr   r`  is_loweris_titleis_upperrT   rU   r"    s    
z_is_upper.<locals>.implrT   )r  r  r  r"  rT   r  rU   	_is_upper  s    r  c                 C   s   dS r   rT   r  rT   rT   rU   r        isupperc                 C   s   dd }|S )z
    Implements .isupper()
    c                 S   s   | j rt| S t| S d S r   )r\   _ascii_is_upper_unicode_is_upperr  rT   rT   rU   r"    s    zunicode_isupper.<locals>.implrT   r  rT   rT   rU   unicode_isupper  s    r  isasciic                 C   s   dd }|S )z Implements UnicodeType.isascii()c                 S   s   | j S r   )r\   rE   rT   rT   rU   r"    s    zunicode_isascii.<locals>.implrT   r  rT   rT   rU   unicode_isascii  s    r  istitlec                 C   s   dd }|S )z
    Implements UnicodeType.istitle()
    The algorithm is an approximate translation from CPython:
    https://github.com/python/cpython/blob/1d4b6ba19466aba0eb91c4ba01ba509acf18c723/Objects/unicodeobject.c#L11829-L11885 # noqa: E501
    c                 S   s   t | }|dkr*t| d}t|p(t|S |dkr6dS d}d}t|D ]R}t| |}t|sdt|rx|rn dS d}d}qFt|r|s dS d}d}qFd}qF|S r  )r   r   r0   r6   r   r1   )rE   rF   charr
  previous_is_casedr   rT   rT   rU   r"    s,    

zunicode_istitle.<locals>.implrT   r  rT   rT   rU   unicode_istitle  s    r  islowerc                 C   s   dd }|S )aP  
    impl is an approximate translation of:
    https://github.com/python/cpython/blob/201c8f79450628241574fba940e08107178dc3a5/Objects/unicodeobject.c#L11900-L11933    # noqa: E501
    mixed with:
    https://github.com/python/cpython/blob/201c8f79450628241574fba940e08107178dc3a5/Objects/bytes_methods.c#L131-L156    # noqa: E501
    c                 S   sp   t | }|dkrtt| dS |dkr*dS d}t|D ]4}t| |}t|sTt|rZ dS |s6t|r6d}q6|S r  )r   r1   r   r   r0   r6   )rE   rF   r
  r   r   rT   rT   rU   r"  :  s    
zunicode_islower.<locals>.implrT   r  rT   rT   rU   unicode_islower1  s    	r  isidentifierc                 C   s   dd }|S )z%Implements UnicodeType.isidentifier()c                 S   s^   t | }|dkrdS t| d}t|s2|dkr2dS td|D ]}t| |}t|s< dS q<dS )Nr   F_   rn   T)r   r   r,   r   r-   )rE   rF   Zfirst_cpr   r`  rT   rT   rU   r"  Q  s    

z"unicode_isidentifier.<locals>.implrT   r  rT   rT   rU   unicode_isidentifierM  s    r   c                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    sX   t | }|dkr t| dS r.|dkr.dS t|D ]}t| |} |s6 dS q6dS r  r  )rE   rF   r   r`  _PyUnicode_IS_funcempty_is_falserT   rU   r"  g  s    
z*gen_isX.<locals>.unicode_isX.<locals>.implrT   r  r!  rT   rU   unicode_isXf  s    zgen_isX.<locals>.unicode_isXrT   )r"  r#  r$  rT   r!  rU   gen_isXe  s    r%  isspace	isnumericisdigit	isdecimalisprintablec                    s    fdd}|S )z)Generate common case operation performer.c           	         s   t | }|dkr t| j|| jS | jrBt| j|d} | | |S ttd| | j}dg}| |||}|d }t|}t||t|}t|D ]}t||t	|| q|S )Nr   rn      )
r   r   r[   r\   r   r   r   r   r   r   )	rE   rF   r   tmpmaxcharsZ	newlengthmaxcharZnewkindr   r  rT   rU   r"    s     
zcase_operation.<locals>.implrT   )r  r  r"  rT   r  rU   case_operation  s    r/  c                 C   s   d}|d }|dkr2t | |}t|s(q2|d8 }q|dko@t|}|r|d }||k rtt | |}t|sjqt|d7 }qN||kpt| }|rdS dS )zEThis is a translation of the function that handles the capital sigma.r   rn   i  i  )r   r/   r.   )rE   rF   r   r   r  Zfinal_sigmarT   rT   rU   _handle_capital_sigma  s"    



r0  c                 C   s&   | dkrt ||||d< dS t| |S )z>This is a translation of the function that lowers a character.i  r   rn   )r0  r&   )r`  rE   rF   r   mappedrT   rT   rU   _lower_ucs4  s    r2  c                    s    fdd}|S )Nc           
         s   d}t |D ]t}tjdtd}t| |} r>t|| |||}n
t||}|d | D ]*}	t|d |	|d< t|||	 |d7 }qTq|S Nr   r+  rT  rn   )	r   r   zerosr#   r   r2  r%   maxr   )
rE   rF   r   r-  kr   r1  r`  n_resr  lowerrT   rU   _do_upper_or_lower  s    

z7_gen_unicode_upper_or_lower.<locals>._do_upper_or_lowerrT   )r:  r;  rT   r9  rU   _gen_unicode_upper_or_lower  s    r<  c                    s    fdd}|S )Nc                    s0   t t| D ]}t| |}t|| | qd S r   )r   r   r   r   rE   r   r   r`  funcrT   rU   _ascii_upper_or_lower  s    
z8_gen_ascii_upper_or_lower.<locals>._ascii_upper_or_lowerrT   )r?  r@  rT   r>  rU   _gen_ascii_upper_or_lower  s    rA  r:  c                 C   s
   t ttS )zImplements .lower())r/  _ascii_lower_unicode_lowerr  rT   rT   rU   unicode_lower  s    rD  upperc                 C   s
   t ttS )zImplements .upper())r/  _ascii_upper_unicode_upperr  rT   rT   rU   unicode_upper  s    rH  c                 C   s~   d}t jdtd}t|D ]^}|d t| |}t||}|d | D ].}	|d }
t|
|	|d< t|||	 |d7 }qHq|S r3  )	r   r5  r#   r   fillr   r'   r6  r   )rE   rF   r   r-  r7  r1  r   r`  r8  r  r.  rT   rT   rU   _unicode_casefold 	  s    


rJ  c                 C   s0   t t| D ]}t| |}t||t| qd S r   )r   r   r   r   r"   r=  rT   rT   rU   _ascii_casefold	  s    
rK  casefoldc                 C   s
   t ttS )zImplements str.casefold())r/  rK  rJ  r  rT   rT   rU   unicode_casefold	  s    rM  c                 C   s   d}d}t jdtd}t| d}t||}|d | D ]"}	t||	}t|||	 |d7 }q6td|D ]X}
|d t| |
}t	|| ||
|}|d | D ]"}	t||	}t|||	 |d7 }qqd||d< |S r3  )
r   r5  r#   r   r(   r6  r   r   rI  r2  )rE   rF   r   r-  r7  r.  r1  r`  r8  r  r   rT   rT   rU   _unicode_capitalize	  s&    






rN  c                 C   sL   t | d}t|dt| tdt| D ]}t | |}t||t| q(d S rA  )r   r   r!   r   r   r"   )rE   r   r`  r   rT   rT   rU   _ascii_capitalize9	  s
    

rO  
capitalizec                 C   s
   t ttS r   )r/  rO  rN  r  rT   rT   rU   unicode_capitalizeC	  s    rQ  c                 C   s   d}d}t jdtd}t|D ]}|d t| |}|rLt|| |||}	ntt||}	|d|	 D ],}
|\}t||
|d< t	|||
 |d7 }qft
t|}q|S )zCThis is a translation of the function that titles a unicode string.r   Fr+  r4  Nrn   )r   emptyr#   r   rI  r   r2  r(   r6  r   r.   )rE   rF   r   r-  r7  Zprevious_casedr1  r   r`  r8  r  r.  rT   rT   rU   _unicode_titleI	  s     


rS  c                 C   sh   d}t t| D ]R}t| |}t|r8|s2t|}d}nt|rR|rLt|}d}nd}t||| qdS )z" Does .title() on an ASCII string FTN)r   r   r   r7   r!   r8   r"   r   )rE   r   r  r   r`  rT   rT   rU   _ascii_title`	  s    
rT  titlec                 C   s
   t ttS )zImplements str.title())r/  rT  rS  r  rT   rT   rU   unicode_titlet	  s    rV  c                 C   sN   t t| D ]<}t| |}t|r,t|}nt|r<t|}t||| qd S r   )r   r   r   r8   r"   r7   r!   r   r=  rT   rT   rU   _ascii_swapcase|	  s    

rW  c                 C   s   d}d}t jdtd}t|D ]}|d t| |}t|rPt|| |||}	n t|rdt	||}	nd}	||d< |d |	 D ]"}
t
||
}t|||
 |d7 }q|q||d< |S r3  )r   rR  r#   r   rI  r   r0   r2  r1   r%   r6  r   )rE   rF   r   r-  r7  r.  r1  r   r`  r8  r  rT   rT   rU   _unicode_swapcase	  s$    


rX  swapcasec                 C   s
   t ttS r   )r/  rW  rX  r  rT   rT   rU   unicode_swapcase	  s    rZ  c                 C   s   t | tjrdd }|S d S )Nc                 S   s"   t | }|dkrtdt| dS )Nrn   zord() expected a characterr   )r   	TypeErrorr   )r   lcrT   rT   rU   r"  	  s    zol_ord.<locals>.implr   )r   r"  rT   rT   rU   ol_ord	  s    r]  c                 C   s4   | t kstt| }t|d|tk}t|d|  |S r   )_MAX_UNICODEr   r   r   r   r   )r   rG   r  rT   rT   rU   _unicode_char	  s
    r_  zchr() arg not in range(0x%hx)c                 C   s$   | dk s| t krtttt| S r   )r^  rp   _out_of_range_msgr_  r#   )ZordinalrT   rT   rU   _PyUnicode_FromOrdinal	  s    ra  c                 C   s   t | tjrdd }|S d S )Nc                 S   s   t | S r   )ra  )r   rT   rT   rU   r"  	  s    zol_chr.<locals>.impl)r   r   r   )r   r"  rT   rT   rU   ol_chr	  s    rb  __str__c                 C   s   dd S )Nc                 S   s   | S r   rT   r   rT   rT   rU   r  	  r  zunicode_str.<locals>.<lambda>rT   r   rT   rT   rU   unicode_str	  s    rd  __repr__c                 C   s   dd S )Nc                 S   s   d|  d S )N'rT   r   rT   rT   rU   r  	  r  zunicode_repr.<locals>.<lambda>rT   r   rT   rT   rU   unicode_repr	  s    rg  c                    s   | d  fdd}|S )N
   c           	         s   d}| dk r|  } d}| dkr"dS |d t tt|  }t}t|}t|||d}|rlt|dtd |d }| dkrt	|  \} }td| }t||| |d8 }qt|S )NFr   Tr  rn   r  )
rc  r   floorlog10r   rr   r   r   orddivmod)	r   flagrF   rG   r   r   r   digitr   tenrT   rU   r"  	  s&    
zinteger_str.<locals>.implrT   )r   r"  rT   ro  rU   integer_str	  s    rq  c                 C   s   dd S )Nc                 S   s   |   S r   )rc  r   rT   rT   rU   r  	  r  zinteger_repr.<locals>.<lambda>rT   rr  rT   rT   rU   integer_repr	  s    rs  c                 C   s   dd S )Nc                 S   s   | rdS dS )NTrueFalserT   r   rT   rT   rU   r  
  r  zboolean_str.<locals>.<lambda>rT   rv  rT   rT   rU   boolean_str
  s    rw  Zgetiterc           
      C   sp   |j \}|\}| ||j}| tjd}t||}||_||_	| j
rX| j||| | }	t| ||j|	S r   )r   r  return_typer   r   r`   r   Zalloca_once_valuer_   rE   r  r   r  r   r   )
r   r   r   r   r  rE   iterobjr  Zindexptrr   rT   rT   rU   getiter_unicode
  s    rz  Ziternextc              	   C   s   |j \}|\}| j}|tj}||tjtjfi }	| 	||	}
|t
}||tjfi }| 	||}| j|||d}|||jf}||j}|d||}|| ||: |
||j|f}|| t||}|||j W 5 Q R X d S )Nr   <)r   r  r  operatorgetitemr  r   r   r`   r  r   r  rE   r   r_   Zicmp_unsignedZ	set_validZif_thenZyield_r   Zincrement_indexr   )r   r   r   r   r0  ZitertyiterZtyctxZfntyZgetitem_sigZgetitem_implZlen_sigr   ry  Zstrlenr_   Zis_validZgotitemZnindexrT   rT   rU   iternext_unicode%
  s*    


r  )r   )NN)NN)NN)NN)NN)NN)NN)r   )Nr{   )Nr{   )r}  )F)N)N)N)T)r{   )T)r[  r|  numpyr   Zllvmlite.irr   r   Znumba.core.cgutilsr   Znumba.core.extendingr   r   r   r   r	   r
   r   r   r   r   Znumba.core.imputilsr   r   r   r   r   r   Znumba.core.datamodelr   r   Z
numba.corer   r   Znumba.core.pythonapir   r   r   r   Znumba._helperlibr   Znumba.cpython.hashingr   Znumba.core.unsafe.bytesr   Znumba.core.errorsr    Znumba.cpython.unicode_supportr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   Znumba.cpythonrB   r^  rM   Zbitwidthr  r   rD   ZUnicodeIteratorTyper^   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rr   r   r   r   r   r   eqr   ner   ltr   gtr   ler   ger   containsr   r  r  r  r  r  r  r#  r   r*  r'  r+  r3  r5  r?  rG  rI  r  rU  rY  rd  ro  rt  rx  rw  r{  r  r  r  r  r  r  r  r  r  r  r  r  rE  r  r  r  r  rB  r  r  r  r  r}  r  r   iaddr  r  r   r  not_r  r  r  Z_unicode_is_alnumr  Z_always_falser  r  r  r  r  r  r   r%  r/  r0  r2  r<  rG  rC  rA  rF  rB  rD  rH  rJ  rK  rM  rN  rO  rQ  rS  rT  rV  rW  rX  rZ  rk  r]  r_  r`  ra  chrrb  rd  rg  r   rq  rs  r  rw  rz  ZNEWr  rT   rT   rT   rU   <module>   s@  0 	






















&



	
	
	


.
0





#
$

$

4
1
@
T,
Q
%)#







		







%
<



1!





%





	

	
	
	