o
    ag8                  
   @   sj  d Z ddlm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 ddlmZmZ ddlmZ dd	 Ze \ZZZdd
deeedZedde ZedZedZedZedZedZdZ ede  ej!ej"B ej#B Z$edededededededededd	Z%d Z&G d!d" d"e'Z(G d#d$ d$e'Z)G d%d& d&e'Z*dS )'zImplementation of JSONDecoder
    )absolute_importN   )fromhexu	text_typebinary_typePY2unichrascii)AttributedDictAttributedList)Errorc                  C   sZ   t d} tjdkr| d d d d d | dd  d d d  } td| \}}||| fS )N 7FF80000000000007FF0000000000000big   dd)r   sys	byteorderstructunpack)_BYTESnaninf r   j/var/www/eduai.edurigo.com/doc_train/edurigo_ai/Puru/venv/lib/python3.10/site-packages/dirtyjson/loader.py_floatconstants   s
   
,r   TF)nulltruefalsez	-InfinityInfinityNaNz(%s)|z0(-?(?:0x[\da-fA-F]+|\d+))(\.\d+)?([eE][-+]?\d+)?z[0-9.+\-]*[()[0-9+\-*/eEx&|]+z(.*?)(["\\\x00-\x1f])z(.*?)(['\\\x00-\x1f])z([\w_$]+[\w\d_$]*)z 	
z[%s]*"'\/
	)	r#   r$   r%   r&   bfnrtzutf-8c                   @   s   e Zd Zdd Zdd ZdS )Positionc                 C      || _ || _d S Nlinecolumn)selfr5   r6   r   r   r   __init__1      
zPosition.__init__c                 C   s(   | j |j krdS | j |j k p| j|jk S )NFr4   )r7   otherr   r   r   __lt__5   s   zPosition.__lt__N)__name__
__module____qualname__r8   r;   r   r   r   r   r1   0   s    r1   c                   @   s   e Zd Zdd ZdS )KeyValuePositionc                 C   r2   r3   )keyvalue)r7   key_positionvalue_positionr   r   r   r8   <   r9   zKeyValuePosition.__init__N)r<   r=   r>   r8   r   r   r   r   r?   ;   s    r?   c                   @   s   e Zd ZdZ		dddZdd Zdd Zd	d
 Zdd ZdddZ	dd Z
eedjeejfddZdd Zdd ZdddZdS )DirtyJSONLoadera"  JSON decoder that can handle muck in the file

    Performs the following translations in decoding by default:

    +---------------+-------------------+
    | JSON          | Python            |
    +===============+===================+
    | object        | AttributedDict    |
    +---------------+-------------------+
    | array         | list              |
    +---------------+-------------------+
    | string        | unicode           |
    +---------------+-------------------+
    | number (int)  | int, long         |
    +---------------+-------------------+
    | number (real) | float             |
    +---------------+-------------------+
    | true          | True              |
    +---------------+-------------------+
    | false         | False             |
    +---------------+-------------------+
    | null          | None              |
    +---------------+-------------------+

    It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as
    their corresponding ``float`` values, which is outside the JSON spec.

    Nc           	      C   s   |pt | _|pt| _|pt| _|ptj| _i | _	t
s%t|tr%| | _n|| _| jt krZ| j| jd }| j|krZt| jD ]\}}||| krYtd| jt|| j|qAt| j| _d| _d| _d| _d| _d S )NignorezNon-{} character {}r   r   Expecting value)DEFAULT_ENCODINGencodingfloatparse_floatint	parse_int
_CONSTANTS__getitem__parse_constantmemor   
isinstancer   decodecontentencode	enumerater   formatr
   lenendlinenocurrent_line_pospos	expecting)	r7   rS   rH   rJ   rL   rO   fixedindex	characterr   r   r   r8   _   s(   





zDirtyJSONLoader.__init__c                 C   sB   z| j | j }|  jd7  _|W S  ty    t| j| j | jw Nr   )rS   r[   
IndexErrorr   r\   r7   nextcharr   r   r   _next_characterv   s   zDirtyJSONLoader._next_characterc                 C   sR   z| j | j }|tv r|   | j | j }|  jd7  _|W S  ty(   Y dS w )Nr    )rS   r[   WHITESPACE_STR_skip_whitespacera   rb   r   r   r    _next_character_after_whitespace~   s   z0DirtyJSONLoader._next_character_after_whitespacec                 C   s   	 |  t| j| j  | j| jd krd S | j| j| jd  }|dks+|dkrQ|dkr1dnd}| j|| j}|dkrI|  |t|  n
|  | j d S d S q)NT   z//z/*r)   z*/r   )_skip_forward_to
WHITESPACEmatchrS   r[   rX   r^   rW   )r7   	two_chars
terminatorlfr   r   r   rg      s   z DirtyJSONLoader._skip_whitespacec                 C   sX   || j kr*| jd| j |}|r%|  j|7  _| jd| j |}|d | _|| _ d S d S )Nr)   r   )r[   rS   countrY   rfindrZ   )r7   rX   	linefeedsrposr   r   r   rj      s   


z DirtyJSONLoader._skip_forward_tor   c                 C   s   t | j| j| j d | S r`   )r1   rY   r[   rZ   )r7   offsetr   r   r   _current_position   s   z!DirtyJSONLoader._current_positionc              	   C   s  d| _ |  }|dks|dkr| |S |dkr|  S |dkr$|  S |  jd8  _t| j| j}|rC|	 | _| 
| d S t| j| j}|r|	 t| jks_| j|	  dvr| \}}}|sj|rx| ||ppd	 |ptd	 }n,z
| t|d}W n! ty   |d d
krd|dd   }| t|d}n Y nw |	 | _|S t| j| j}|rzt|j|j|	  }W n ttfy   td| j| jw |	 | _|S t| j | j| j)NrF   r#   r$   {[r   r   z+-/*()re   00ozCannot evaluate expression)r\   rd   parse_stringparse_objectparse_arrayr[   CONSTANT_RErl   rS   rX   rO   groups	NUMBER_RErW   rJ   rL   rK   
ValueErrorEQUATION_REevalstringSyntaxError	NameErrorr   )r7   rc   mintegerfracexpresr   r   r   scan   sN   

(

zDirtyJSONLoader.scanre   c                 C   s  |dkrt jntj}g }|j}| jd }		 || j| j}
|
du r'td| j|	|
 | _|
 \}}|rE|rAt	|t
sAt
|| j}|| ||krN	 ||S |dkrW|| qz| j| j }W n tym   td| j|	w |dkrz|| }W n ty   d}t|| j| jw |  jd7  _nd}| j| jd | jd	  }|dd
 }t|dks|dks|dkrt|| j| jd zt|d}W n ty   t|| j| jd w |  jd	7  _|dkrO|d@ dkrO| j| j| jd
  dkrO| j| jd
 | jd  }|dd
 }t|dkrO|dksO|dksOzt|d}W n ty4   t|| j| jw |d@ dkrOd|d d> |d B  }|  jd7  _t|}|| q)ax  Scan the string for a JSON string. End is the index of the
        character in string after the quote that started the JSON string.
        Unescapes all valid JSON string escape sequences and raises ValueError
        on attempt to decode an invalid string.

        Returns a tuple of the decoded string and the index of the character in
        string after the end quote.r#   r   NzUnterminated string starting atr%   r   zInvalid \X escape sequence %rzInvalid \uXXXX escape sequence   ri      xX   i  i   i   z\u   i   i   
   )STRINGCHUNK_DOUBLEQUOTErl   STRINGCHUNK_SINGLEQUOTEappendr[   rS   r   rX   r~   rQ   r   rH   ra   KeyErrorrW   rK   r   r	   )r7   terminating_character_b_join_py2_maxunicode_mchunks_appendbeginchunkrS   rn   esccharmsgesc_xuniesc2uni2r   r   r   rz      s   


/4"zDirtyJSONLoader.parse_stringc           	      C   s&  | j j}t }|  }	 |dkr	 |S | t| }|dks#|dkr)| |}n!t| j	| j
d }|d u r?td| j	| j
| | _
| d }|||}|  dkr]td	| j	| j
|   t||  }|  }|||| |  }|dkr~	 |S |d
krtd| j	| j
t| |  }q)NT}r#   r$   r   zExpecting property namer   :zExpecting ':' delimiter,zExpecting ',' delimiter or '}')rP   
setdefaultr   rh   ru   rW   rz   UNQUOTED_KEYNAMErl   rS   r[   r   rX   r~   rg   r?   r   add_with_attributes)	r7   memo_getobjrc   key_posr@   r   key_value_posrA   r   r   r   r{     sB    

zDirtyJSONLoader.parse_objectc                 C   s   t  }|  }|dkr|S |dkrtd| j| j	 |dkr!	 |S |  jt|8  _|  }|  }||| |  }|dkrC	 |S |dkrStd| j| jt| |  }q)N]re   zExpecting value or ']'Tr   zExpecting ',' delimiter or ']')	r   rh   r   rS   r[   rW   ru   r   r   )r7   valuesrc   	value_posrA   r   r   r   r|   K  s,   zDirtyJSONLoader.parse_arrayFc                 C   s~   |r|  | |r5| jd| j}| jd| j}||  kr$| jks)n |dk r+|}|| jkr5|  | |   |  }|S )zyReturn the Python representation of ``s`` (a ``str`` or ``unicode``
        instance containing a JSON document)
        rw   rv   r   )rj   rS   findr[   rg   r   )r7   search_for_first_objectstart_indexior   r   r   r   rR   d  s   
 

zDirtyJSONLoader.decode)NNNN)r   )Fr   )r<   r=   r>   __doc__r8   rd   rh   rg   rj   ru   r   	BACKSLASHr   joinr   r   
maxunicoderz   r{   r|   rR   r   r   r   r   rD   A   s"    

	
,
N,rD   )+r   
__future__r   rer   r   compatr   r   r   r   r   r	   r
   dirtyjson.attributed_containersr   r   errorr   r   r!   PosInfNegInfrM   compiler   r}   r   r   r   r   r   rf   VERBOSE	MULTILINEDOTALLrk   r   rG   objectr1   r?   rD   r   r   r   r   <module>   s@    $		




