
    4iz                       S SK Jr  S SKJrJr  S SKrS SKJr  S SKrS SK	J
r
JrJrJrJrJrJr  S SKrS SKrS SKJr  S SKJr  S SKJrJrJr  S S	KJr  S S
KJr  S SK J!r!  S SK"J#r#J$r$J%r%J&r&J'r'J(r(J)r)  S SK*J+r+J,r,  S SK-J.r.  S SK/J0r0  S SK1J2r2J3r3  S SK4J5r5  S SK6J7r7  S SK8J9r9J:r:  S SK;J<r<J=r=J>r>J?r?J@r@  \(       a   S SKAJBrBJCrCJDrDJErE  S SKJFrFJGrGJHrHJIrI  S SKJJKrKJLrL  SrM " S S\<5      rN " S S\R                  5      rO " S S\N5      rPS S jrQg)!    )annotations)abcdefaultdictN)StringIO)IOTYPE_CHECKINGAnyDefaultDictLiteralcastfinal)lib)Scalar)EmptyDataErrorParserErrorParserWarning)cache_readonly)find_stack_level)astype_array)is_bool_dtypeis_extension_array_dtype
is_integeris_numeric_dtypeis_object_dtypeis_string_dtypepandas_dtype)CategoricalDtypeExtensionDtype)is_dict_like)
algorithms)CategoricalExtensionArray)BooleanDtype)Index)dedup_namesis_potential_multi_index)
ParserBaseevaluate_callable_usecolsget_na_valuesparser_defaultsvalidate_parse_dates_presence)HashableIteratorMappingSequence)	ArrayLikeDtypeObjReadCsvBufferT)
MultiIndexSeriesu   ﻿c                    ^  \ rS rSr% S\S'   S"U 4S jjr\S#S j5       rS$S jr S%   S&S jjr	    S'S jr
 S%   S(S	 jjr    S)S
 jr\  S*   S+S jj5       r\S,S j5       r\S-S j5       r  S.S jr\S 5       r        S/S jrS0S jrS1S jrS2S jrS0S jrS3S jrS4S jrS5S jrS6S jrS5S jr        S7S jrS5S jr  S8S jrS9S jr S%S:S jjr!S;S jr"S<S  jr#S!r$U =r%$ )=PythonParser`   set[int]_no_thousands_columnsc                4  >^  [         TT ]  U5        / T l        / T l        ST l        ST l        US   T l        [        T R                  5      (       a  T R                  T l        OU 4S jT l        [        US   5      T l
        US   T l        US   T l        [        T R                  [        5      (       a  [        T R                  5      T l        US   T l        US   T l        US	   T l        US
   T l        US   T l        US   T l        UR+                  SS5      T l        US   T l        US   T l        US   T l        [        U[4        5      (       a  UT l        O)[7        US5      (       d   eT R9                  U5      T l        ST l        T R=                  5       u  nT l        T l         T RC                  UT RD                  5      u  T l#        T l"        T l$        n[5        T RF                  5      T l%        T RM                  5       u  nT l%        T l#        T RD                  c  UT l"        T R:                  c,  [5        [O        [Q        T RF                  5      5      5      T l        T RS                  5       T l*        [Q        T R0                  5      S:w  a  [W        S5      eg)z>
Workhorse function for processing nested list into DataFrame
r   skiprowsc                "   > U TR                   ;   $ N)r<   )xselfs    a/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/pandas/io/parsers/python_parser.py<lambda>'PythonParser.__init__.<locals>.<lambda>s   s    a4==&8    
skipfooter	delimiter	quotechar
escapechardoublequoteskipinitialspacelineterminatorquotingskip_blank_lineshas_index_namesF	thousandsdecimalcommentreadlineN   z'Only length-1 decimal markers supported),super__init__databufposline_posr<   callableskipfunc_validate_skipfooter_argrE   rF   rG   
isinstancestrrH   rI   rJ   rK   rL   rM   getrN   rO   rP   rQ   listhasattr_make_reader_col_indices_infer_columnsnum_original_columnsunnamed_cols_extract_multi_indexer_columnsindex_namescolumns	col_names
orig_names_get_index_namerangelen_set_no_thousand_columnsr:   
ValueError)r@   fkwdsri   _rh   	__class__s   `     rA   rU   PythonParser.__init__c   s_    	>@	Z(DMM"" MMDM8DM243EFk*k*dnnc** 0DN|,. $%7 8"#34I $%7 8  $xx(95Ak*II aDI1j))))))!,DI /3 !		
% //
	
LN +/t||*<595I5I5K2T_dl#*D$ $U3t||+<%= >D%)%B%B%D"t||!FGG "rD   c                    [         R                  " U R                  5      nU R                  c  SU S3nO)[         R                  " U R                  5      nSU SU S3n[         R                  " U5      $ )Nz^[\-\+]?[0-9]*(z [0-9]*)?([0-9]?(E|e)\-?[0-9]+)?$z^[\-\+]?([0-9]+z	|[0-9])*()reescaperP   rO   compile)r@   rP   regexrO   s       rA   numPythonParser.num   sm    ))DLL)>>!&wi/OPE		$..1I"9+Ywi @, -  zz%  rD   c                  ^ ^^ T R                   mTb  [        T5      S:X  GaK  T R                  (       a  [        S5      e " U 4S jS[        R
                  5      nUnTb  TUl         T R                  bp  T R                  T R                  5      (       aP  TR                  5       nU(       d  GOT =R                  S-  sl        T R                  T R                  5      (       a  MP  GOpTR                  5       nT R                  U//5      S   nT R                  T R                  5      (       d  U(       df  T =R                  S-  sl        TR                  5       nT R                  U//5      S   nT R                  T R                  5      (       a  M]  U(       d  Mf  [        [        [           U5      nUS   nT =R                  S-  sl        T =R                  S-  sl        [        R                  " 5       R!                  U5      nUR                   Ul         [        R"                  " [%        U5      US9nT R&                  R)                  [        U5      5        [        R"                  " TUSS9n	U	$ UU4S	 jn
U
" 5       n	U	$ )
NrS   z<Custom line terminators not supported in python parser (yet)c                     > \ rS rSr Y R                  r Y R
                  r Y R                  r Y R                  r Y R                  r Y R                  r	Sr
Srg),PythonParser._make_reader.<locals>.MyDialect   
 N)__name__
__module____qualname____firstlineno__rF   rG   rH   rI   rJ   rL   rK   __static_attributes__r@   s   rA   	MyDialectr      sC     NN	 NN	!__
"..#'#8#8 ,,!%rD   r   r   )dialectT)r   strictc               3     >#    TR                  5       n [        R                  " T5      nUR                  U R	                  5       5      v   T H$  n UR                  U R	                  5       5      v   M&     g 7fr>   )rR   rw   ry   splitstrip)linepatrq   seps     rA   _read(PythonParser._make_reader.<locals>._read  sR     zz|jjoii

--D))DJJL11 s   A3A6)rF   rn   rK   rp   csvDialectr<   r[   rX   rR   _check_commentsr   r`   r^   rY   Sniffersniffreaderr   rW   extend)r@   rq   r   diar   lines	lines_strsniffedline_rdrr   r   r   s   ``         @rA   rb   PythonParser._make_reader   s   nn;#c(a-"" R &CKK & C # ==,--11 zz|#!A	 --11 zz|,,tfX6q9mmDHH--UHHMH::<D 004&:1=E mmDHH--UU !cE2	 !|A"++---d3 ' 1 1 ::htncBX/ ZZ3t<F 2 WFrD   c                    U R                  U5      nSU l        [	        U R
                  5      nU(       dr  [        U R
                  [        U R
                  U R                  5      5      nU R                  UU R                  5      u  pSnU R                  X0R                  5      nXWU4$ S nU R                  (       a,  [        S US    5       5      [        U5      :X  a
  US   nUSS  nU R!                  U5      n	U R#                  U	5      u  pU R%                  U
5      nU R'                  X;5      nU R)                  XU5      u  p\X\U4$ ! [         a(    U R                  (       a  / n GNRU R                  5         e f = f)NFc              3  T   #    U  H  n[        US :H  =(       d    USL 5      v   M      g7f) N)int).0vs     rA   	<genexpr>$PythonParser.read.<locals>.<genexpr>7  s(      (
/9!CR$19%%zs   &(r   rS   )
_get_linesStopIteration_first_chunkcloser`   rk   r%   r&   	index_col_get_empty_metadtype_maybe_make_multi_index_columnsrj   rN   sumrn   _rows_to_cols_exclude_implicit_index_convert_data_do_date_conversions_make_index)r@   rowscontentri   namesindexcol_dictconv_columnsindexnamerowalldatarV   	conv_dataresult_columnss                rA   readPythonParser.read  su   	ood+G " '+4??&;  (OONNE (,';';

($EH  ??XL00 C (
/6qz(
 %
\% #1:LabkG$$W-44W=&&t,	--gA	 $ 0 0< Pi//[  	  

	s   E E7%E7c                Z   [        U R                  [        U R                  U R                  5      5      nSnU R                  (       a  [        U R                  5      n[        U5      nU R                  X!5        [        U5       VVs0 s H  u  pVXT:  d  M  XaXS-      _M     snnU4$ s  snnf Nr   )r%   rk   r&   r   _implicit_indexrn   _check_data_length	enumerate)r@   r   r   offsetlen_alldatainames          rA   r   $PythonParser._exclude_implicit_indexG  s    
 OO$
 (F'l/ 6?u5E
5E'!%D!*%%5E
 	 
s   B'B'c                >    Uc  U R                   nU R                  US9$ )N)r   )	chunksizer   )r@   sizes     rA   	get_chunkPythonParser.get_chunk`  s#     <>>Dyydy##rD   c                   U R                  U R                  5      nU R                  U R                  5      n0 n0 n[        U R                  [
        5      (       ar  U R                   Ha  nUc  M  U R                  U   nU R                  U   n[        U[        5      (       a  X`R                  ;  a  U R                  U   nXtU'   XU'   Mc     OU R                  nU R                  nU R                  UUUUU5      $ r>   )
_clean_mapping
convertersr   r]   	na_valuesdict
na_fvaluesr   rk   _convert_to_ndarrays)	r@   rV   
clean_convclean_dtypesclean_na_valuesclean_na_fvaluescolna_value	na_fvalues	            rA   r   PythonParser._convert_datal  s    
 ((9
**4::6 dnnd++~~?#~~c2H $ 4I!#s++??0J"ooc2+3C(,5S) & #nnO#((
 	
rD   c                <   0 n[        U R                  U R                  5      nUR                  5        GH  u  pUc  S OUR	                  US 5      n
[        U[        5      (       a  UR	                  US 5      nOUnU R                  (       a  [        XX0R                  5      u  pO[        5       [        5       pX;   aN  [        R                  " U	[        U5      U-  5      n[        R                  " X[        R                  5        XU'   M  U
bd  Ub&  [         R"                  " SU S3[$        ['        5       S9   [(        R*                  " X5      n	U R7                  U	[        U5      U-  US L SS9u  nnO[9        U5      nU=(       d    [;        U5      nU=(       a    U(       + nU R7                  U	[        U5      U-  US L U5      u  nnUb  [=        U5      nU(       aT  UR>                  U:w  d  U(       a=  U(       d$  US:  a  [A        U5      (       a  [-        SU 35      eU RC                  XU5      nXU'   GM     U$ ! [,         aX    [        R                  " U	[/        U5      5      R1                  [        R2                  5      n[(        R4                  " XU5      n	 GNMf = f)Nz5Both a converter and dtype were specified for column z# - only the converter will be used.
stacklevelF)try_num_boolr   z$Bool column has NA values in column )"r+   parse_datesri   itemsr_   r]   r   	na_filterr)   keep_default_nasetr    isinnpputmasknanwarningswarnr   r   r   	map_inferrp   r`   viewuint8map_infer_mask_infer_typesr   r   r   r   r   _cast_types)r@   dctr   r   r   dtypesresultparse_date_colscvaluesconv_f	cast_typecol_na_valuescol_na_fvaluesmaskcvalsna_countis_eais_str_or_ea_dtyper   s                       rA   r   !PythonParser._convert_to_ndarrays  sk    78H8H$,,WIA'/TZ^^At5LF&$''"JJq$/	 #	~~0=*.B.B1-~ 14su~# "vs=/AN/RS

60"q	!(MM**+,OQ &#3#5F ]]6:F
 #'"3"3&7%!&	 #4 #x 1;%*%Hoi.H" %.$D2DE #'"3"3&7% 	#x ( ,Y 7I%++":e X\(33",/STUSV-W"XX ,,UqAE1IO %P G " F%??64	?CHHRD //EFFs   7H99AJJc                   [        U[        5      (       a  UR                  SLn[        UR                  5      (       d  U(       d  [
        R                  " USSS9n[        USS9R                  5       R                  5       n[        R                  " XUR                  U5      X R                  S9nU$ [        U[        5      (       a  UR                  5       n [        U[         5      (       aL  U Vs/ s H  n[#        U5      PM     nnUR%                  UUU R                  U R&                  U R(                  S9$ UR%                  XS9$ [        U[,        5      (       a  UR/                  USS9nU$ [1        UR2                  ["        5      (       a  [
        R                  " US
SS9nU$  [5        XS
S9nU$ s  snf ! [*         a  n	[+        SU S	35      U	eSn	A	ff = f! [6         a  n	[7        SU SU 35      U	eSn	A	ff = f)a  
Cast values to specified type

Parameters
----------
values : ndarray or ExtensionArray
cast_type : np.dtype or ExtensionDtype
   dtype to cast values to
column : string
    column name - used only for error reporting

Returns
-------
converted : ndarray or ExtensionArray
NF)skipnaconvert_na_value)copy)true_values)r   r
  false_valuesnone_valuesr   zExtension Array: zO must implement _from_sequence_of_strings in order to be used in parser methodsTzUnable to convert column z	 to type )r]   r   
categoriesr   r   r   ensure_string_arrayr$   uniquedropnar!   _from_inferred_categoriesget_indexerr
  r   construct_array_typer#   r^   _from_sequence_of_stringsr  r   NotImplementedErrorr"   astype
issubclasstyper   rp   )
r@   r   r   column
known_catscats
array_typeval
values_strerrs
             rA   r   PythonParser._cast_types  s   " i!122"--T9J"6<<00 0055 e,335<<>D ::&&v.	GWGWFV M 	>22"779Ji66 7=!=fs#c(fJ!=%??"'$($4$4%)%6%6$(NN @   &???XX //]]95]9F  	,, ,,teF %fdC
 A "> ' )'
| 4V V $   /xyLsH   F7 0F22F7 8F7 &
G 2F7 7
GGG
G:#G55G:c                    U R                   c  gU R                   n[        U[        [        [        R
                  45      (       a  [        U5      S:  $ g)NFrS   )headerr]   r`   tupler   ndarrayrn   )r@   r#  s     rA   _have_mi_columnsPythonParser._have_mi_columns.  sA    ;;ftUBJJ788v;?"rD   c           
     `   U R                   nSnSn[        5       nU R                  GbR  U R                  nU R                  n[	        U[
        [        [        R                  45      (       a  U(       a  / [        U5      QUS   S-   PnOU/n/ n[        U5       GH  u  p U R                  5       n
U R                  U	::  a"  U R                  5       n
U R                  U	::  a  M"  / n/ n[        U
5       HV  u  nnUS:X  a9  U(       a	  SU SU 3nOSU 3nUR+                  U5        UR+                  U5        ME  UR+                  U5        MX     U(       Gd+  [/        [0        5      n[3        [#        U5      5       Vs/ s H  nUU;  d  M  UPM     snU-   nU H  nUU   nUnUU   nUS:  a  US:  a(  US-   UU'   U SU 3nUU;   a  US-  nOUU   nUS:  a  M(  U R4                  b  [7        U R4                  5      (       an  U R4                  R9                  U5      bR  U R4                  R9                  U5      c6  U R4                  R;                  UU R4                  R9                  U5      05        UUU'   US-   UU'   M     OsU(       al  XS   :X  ad  [#        U5      nU R<                  nUb  [#        U5      OSn[#        U5      nUU:w  a	  UU-
  U:  d  US:X  a  SnS /U-  nU R&                  S   /U l        UR+                  U5        UR;                  U Vs1 s H  nUU   iM
     sn5        [#        U5      S:X  d  GM  [#        U5      nGM     U(       a  U R&                  R)                  5         Ub   U R                  5       nUc  SO
[#        U5      n[#        U5      [#        US   5      :  a  [#        U5      U:  a  [%        S5      e[#        U5      S:  a  [?        S5      eU R@                  b  U RC                  XqU5        O[#        U5      nU RD                  bM  [#        U5      [#        U RD                  5      :w  a+  [G        U RD                  5       Vs/ s H  nUU   PM
     sn/nOU/nOU RC                  XwS   U5      nO[#        U RH                  5      nUnU(       d+  [        [3        U5      5      /nU RC                  XwS   U5      nOU R@                  b  [#        U5      U:  a   U RC                  U/UU5      n[#        U5      nO_[K        U R@                  5      (       d-  [#        U5      [#        U R@                  5      :w  a  [%        S5      eU/nU RC                  XwS   U5        XrU4$ ! [         Ga  nSU R                  s=:  a  U	::  au  O  OrU(       a  XS   :w  ac  [        [        [        U(       a  US S OU5      5      nSSR!                  U5       S[#        U5       S3n[%        S	U S
U R                   S35      UeU(       aS  U	S:  aM  U(       a  U R&                  R)                  5         UR+                  S /[#        US   5      -  5        XrU4s S nAs  $ U R                   (       d  [-        S5      UeU R                   S S  n
 S nAGNS nAff = fs  snf s  snf ! [         a    S n GN*f = fs  snf )Nr   TrS   [,z
], len of z, zPassed header=z	but only z lines in fileNo columns to parse from filer   z	Unnamed: _level_.FzHNumber of passed names did not match number of header fields in the filez*Cannot pass names with multi-index columns)&r   r   r#  r&  r]   r`   r$  r   r%  r   _buffered_linerY   
_next_liner   mapr^   joinrn   rp   rW   clearappendr   r   r   rm   r   r   r_   updater   	TypeErrorusecols_handle_usecolsrc   sorted_header_linerZ   )r@   r   re   clear_bufferrf   r#  have_mi_columnsri   levelhrr   r   joimsgthis_columnsthis_unnamed_colsr   r   col_namecountscol_loop_orderr   old_col	cur_countlcsicicunnamed_count
first_linelen_first_data_rowncolss                                  rA   rd   PythonParser._infer_columns9  sQ    

 +.5;;"[[F"33O&4

";<<"<tF|<VBZ!^<F 13G&v.	)..0D--2-#0 --2-: 57$&!%dODAqBw*)21#WUG'DH)21#H)003$++H5$++A. , '*5c*:F
 "'s<'8!9&!9A$55 !9& *	&*N ,*1o"%$*3K	$q="+a-2;a-w)0	9+&>#&,#6$-NI06sI #,a- !%

 6$0$<$<$(JJNN7$;$G$(JJNN3$7$? $

 1 13

w8O2P Q*-Q&/!ms- ,. % BZ' ."nn),SXa(+,=(> -/BGm4KPRVWPW+0L,06B;L(,~DH|,##>O$P>O\!_>O$PQw<1$+.|+<(M /P    &!%!2J +5*<Q#j/"u:GAJ/CJAS4S$>  w<!##$PQQ<<+ ((9MN+.u:($$0SZ3%%D 6 399J9J2KL2KQa2KLMG$gG..QZ)= ))*E#( e-...w
EJ%Uu)<..wuE'*5z$dll++E
c$,,>O0O 0  !'$$Waj%@l::u % )4==.B.+rBZ/? #3s?F3BKPV#WX !#((3-
3s8*BG(,SE4==/X"# '26' HHNN,vGBK0@'@A&lJJ::,-LMSVV::a=D1)Z&^ %Q % &!%J&,  MsP   A U#7
ZZZ
-Z Z+#Z.CZZ,ZZZ('Z(c                    U R                   b  g  U R                  5       nU$ ! [         a7  nU R                  (       d  [	        S5      UeU R                  S S  n S nAU$ S nAff = f)Nr,  )r#  r/  r   r   r   )r@   r   r   s      rA   r:  PythonParser._header_line  sd     ;;"	!&&(D   	!::$%DE3N::a=D	!s   " 
A#,AA#c                X   U R                   Gb[  [        U R                   5      (       a  [        U R                   U5      nO[        S U R                    5       5      (       ay  [	        U5      S:  a  [        S5      e/ nU R                    HL  n[        U[        5      (       a#   UR                  UR                  U5      5        M;  UR                  U5        MN     OEU R                    Vs/ s H  oUU:  d  M
  UPM     nnU(       a  [        SU S35      eU R                   nU VVV	s/ s H*  n[        U5       VV	s/ s H  u  pX;   d  M  U	PM     sn	nPM,     nnnn	[        U5      U l        U$ ! [
         a!    U R                  U R                   U5         GM  f = fs  snf s  sn	nf s  sn	nnf )zJ
Sets self._col_indices

usecols_key is used if there are string usecols.
c              3  B   #    U  H  n[        U[        5      v   M     g 7fr>   )r]   r^   )r   us     rA   r   /PythonParser._handle_usecols.<locals>.<genexpr>  s     >AZ3''s   rS   z4If using multiple headers, usecols must be integers.z<Defining usecols with out-of-bounds indices is not allowed. z are out-of-bounds.)r7  rZ   r(   anyrn   rp   r]   r^   r4  r   _validate_usecols_namesr   r   r9  rc   )
r@   ri   usecols_keyre   col_indicesr   missing_usecolsr  r   ns
             rA   r8  PythonParser._handle_usecols  s    <<#%%7kR>>>>w<!#$N  !<<C!#s++T'..{/@/@/EF $**3/ ( $(<<##/C:N3NC<   # #%V*++>@  #ll &%F  )0E0tqA4D0E%   !'{ 3D)  * T 88{SST
# Fs<   " E,(	F5F%F%9FFF%,&FFF%c                r    [        U R                  5      S:  a  U R                  S   $ U R                  5       $ )z8
Return a line from buffer, filling buffer if required.
r   )rn   rW   r0  r   s    rA   r/  PythonParser._buffered_line/  s/     txx=188A;??$$rD   c                r   U(       d  U$ [        US   [        5      (       d  U$ US   (       d  U$ US   S   nU[        :w  a  U$ US   n[        U5      S:  aR  US   U R                  :X  a?  SnUS   nUSS R                  U5      S-   nX4U n[        U5      US-   :  a
  XsUS-   S -  nOUSS nU/nXSS -   $ )z
Checks whether the file begins with the BOM character.
If it does, remove it. In addition, if there is quoting
in the field subsequent to the BOM, remove it as well
because it technically takes place at the beginning of
the name, not the middle of it.
r   rS      N)r]   r^   _BOMrn   rG   r   )	r@   	first_row	first_eltfirst_row_bomstartquoteendnew_rownew_row_lists	            rA   _check_for_bomPythonParser._check_for_bom8  s     
 )A,,, | aLO	!! }!mA&6$..&HE!!$E#))%014C $#.G =!C!G+q33 $AB'G&-Ym++rD   c                B    U(       + =(       d    [        S U 5       5      $ )z
Check if a line is empty or not.

Parameters
----------
line : str, array-like
    The line of data to check.

Returns
-------
boolean : Whether or not the line is empty.
c              3  .   #    U  H  o(       + v   M     g 7fr>   r   )r   r?   s     rA   r   .PythonParser._is_line_empty.<locals>.<genexpr>z  s     3duuds   )all)r@   r   s     rA   _is_line_emptyPythonParser._is_line_emptym  s     x333d333rD   c                   [        U R                  [        5      (       Ga;  U R                  U R                  5      (       a[  U R                  [        U R                  5      :  a  O7U =R                  S-  sl        U R                  U R                  5      (       a  M[    U R                  U R                  U R                     /5      S   nU =R                  S-  sl        U R                  (       d9  U R                  U R                  U R                  S-
     5      (       d  U(       a  GO:U R                  (       a   U R                  U/5      nU(       a  US   nGO	M  U R                  U R                  5      (       aL  U =R                  S-  sl        [        U R                  5        U R                  U R                  5      (       a  ML   U R                  U R                  S-   S9nU =R                  S-  sl        Ubd  U R                  U/5      S   nU R                  (       a   U R                  U/5      nU(       a  US   nO!OU R                  U5      (       d  U(       a  OM  U R                  S:X  a  U R                  U5      nU =R                  S-  sl        U R                   R#                  U5        U$ ! [         a  n[        UeS nAff = f)NrS   r   row_num)r]   rV   r`   r[   rX   rn   r   rM   rp  _remove_empty_lines
IndexErrorr   next_next_iter_linerj  rY   rW   r4  )r@   r   retr   	orig_lines        rA   r0  PythonParser._next_line|  s,   dii&&--))88s499~-A --))
 1//4881D0EFqIDHHMH00++DIIdhhl,CDD,,"66v>#&q6D! " --))ATYY --))  00A0F	A(//<Q?D,,"66v>#&q6D!  ,,Y774 & 88q=&&t,D? " 1'S01s   B	J6 )/J6 6
K KKc                2   U R                   U R                  R                  :X  a  [        U5      eU R                   U R                  R                  :X  d  [        U R                   5      (       a*  [        R                  " SU SU S3[        [        5       S9  gg)a  
Alert a user about a malformed row, depending on value of
`self.on_bad_lines` enum.

If `self.on_bad_lines` is ERROR, the alert will be `ParserError`.
If `self.on_bad_lines` is WARN, the alert will be printed out.

Parameters
----------
msg: str
    The error message to display.
row_num: int
    The row number where the parsing error occurred.
    Because this row number is displayed, we 1-index,
    even though we 0-index internally.
zSkipping line z: r   r   N)
on_bad_linesBadLineHandleMethodERRORr   WARNrZ   r   r   r   r   )r@   r@  rt  s      rA   _alert_malformedPythonParser._alert_malformed  s    "  8 8 > >>c"" 8 8 = ==B
 B
 MM 	C53+-B
rD   c                    [        U R                  [        5      (       a   e[        U R                  5      nU$ ! [        R
                   a  nU R                  U R                  R                  U R                  R                  4;   aD  [        U5      nSU;   d  SU;   a  SnU R                  S:  a
  SnUSU-   -  nU R                  XA5         SnAgSnAff = f)a  
Wrapper around iterating through `self.data` (CSV source).

When a CSV error is raised, we check for specific
error messages that allow us to customize the
error message displayed to the user.

Parameters
----------
row_num: int
    The row number of the line being parsed.
z	NULL bytezline contains NULzNULL byte detected. This byte cannot be processed in Python's native csv library at the moment, so please pass in engine='c' insteadr   zError could possibly be due to parsing errors in the skipped footer rows (the skipfooter keyword is only applied after Python's csv library has parsed all rows).. N)r]   rV   r`   rw  r   Errorr}  r~  r  r  r^   rE   r  )r@   rt  r   er@  reasons         rA   rx  PythonParser._next_iter_line  s    	!$))T2222		?DKyy 	  ((..((--%  !f#%)<)C?  ??Q&%  4&=(C%%c35	s   7: CA>CCc                |   U R                   c  U$ / nU H  n/ nU H  n[        U[        5      (       a  U R                   U;  d  XPR                  ;   a  UR	                  U5        MJ  US UR                  U R                   5       n[        U5      S:  a  UR	                  U5          O   UR	                  U5        M     U$ r   )rQ   r]   r^   r   r4  findrn   )r@   r   ry  r   rlr?   s         rA   r   PythonParser._check_comments  s    <<LDB"1c**||1,NN*IIaL0AFF4<<01A1vz		!  JJrN  
rD   c                    U Vs/ s HW  n[        U5      S:  dC  [        U5      S:X  d  M#  [        US   [        5      (       a  US   R                  5       (       d  MU  UPMY     nnU$ s  snf )a?  
Iterate through the lines and remove any that are
either empty or contain only one whitespace value

Parameters
----------
lines : list of list of Scalars
    The array of lines that we are to filter.

Returns
-------
filtered_lines : list of list of Scalars
    The same array of lines with the "empty" ones removed.
rS   r   )rn   r]   r^   r   )r@   r   r   ry  s       rA   ru   PythonParser._remove_empty_lines  sj    $ 	
D	AIN 
 -7tAw,D,DQ  	 	
 
	
s   "A'.A'A'c                T    U R                   c  U$ U R                  XR                   SS9$ )Nr   r   searchreplace)rO   _search_replace_num_columnsr@   r   s     rA   _check_thousandsPythonParser._check_thousands-  s2    >>!L// 0 
 	
rD   c                ~   / nU H  n/ n[        U5       H  u  px[        U[        5      (       aB  X(;  d=  XpR                  ;   d.  U R                  R                  UR                  5       5      (       d  UR                  U5        Mo  UR                  UR                  X#5      5        M     UR                  U5        M     U$ r>   )	r   r]   r^   r:   r{   r  r   r4  r  )	r@   r   r  r  ry  r   r  r   r?   s	            rA   r  (PythonParser._search_replace_num_columns5  s     DB!$"1c**66688??177955IIaLIIaii89 ( JJrN  
rD   c                h    U R                   [        S   :X  a  U$ U R                  XR                   SS9$ )NrP   r.  r  )rP   r*   r  r  s     rA   _check_decimalPythonParser._check_decimalH  s9    <<?955L//c 0 
 	
rD   c                   U R                   n[        U5      n[        U5      nU R                  b  U R                  nO U R                  5       n U R                  5       nSnUb  U R
                  nUSLa  [        U5      U R                  -
  nUb  U R                  b  USLa  [        U5      [        U5      U R                  -   :X  ay  [        [        [        U5      5      5      U l        U R                  SS U l
        [        U5       H  nUR                  SU5        M     [        U5      n[        U5      U l        X2U4$ US:  a0  SU l        U R
                  c  [        [        U5      5      U l        SnO#U R                  XR
                  5      u  pU l        XU4$ ! [         a    Sn GN^f = f! [         a    Sn GN`f = f)a  
Try several cases to get lines:

0) There are headers on row 0 and row 1 and their
total summed lengths equals the length of the next line.
Treat row 0 as columns and row 1 as indices
1) Look for implicit index: there are more columns
on row 1 than row 0. If this is true, assume that row
1 lists index columns and row 0 lists normal columns.
2) Get index from the columns if it was listed.
Nr   FrS   T)rk   r`   r:  r0  r   r   rn   re   r#  rm   rW   reversedinsertr   _clean_index_names)
r@   ri   rk   r   	next_lineimplicit_first_colsr   r   
index_namers   s
             rA   rl   PythonParser._get_index_nameP  s    '+oo']
w- ($$D(
	)I
   I%&)$i$2K2K&K# %KK+U*y>SY1J1J%JJ%)%D	*:%;DN#xx|DH%d^q!, , "&gJ03GD-W44"#'D ~~%!%e,?&@!AJ /3.E.E/+ZDN w..g !   	I	s#   F F0 F-,F-0G ?G c                   U R                   nU R                  (       a  U[        U R                  5      -  n[	        S U 5       5      nX2:  Ga>  U R                  SLGa.  U R
                  Gc   U R                  (       a  U R                  OSn/ n[        U5      n[        U5      n/ nU GHT  u  p[        U	5      n
X:  Ga,  [        U R                  5      (       a  U R                  U	5      nUbo  [        [        [           U5      n[        U5      U:  a6  U R                  Xx-
  U-   -
  nUR                  U[        U5      S45        US U nUR                  U5        M  M  U R                  U R                  R                   U R                  R"                  4;   aP  U R                  Xx-
  U-   -
  nUR                  XS45        U R                  U R                  R                   :X  a    OGM@  GMC  UR                  U	5        GMW     U H  u  pnSU SUS-    S	U
 3nUS:X  a  US
-  nORU R$                  (       aA  [        U R$                  5      S:  a(  U R&                  [(        R*                  :w  a
  SnUSU-   -  nU R-                  XS-   5        M     [        [.        R0                  " XS9R2                  5      nU R
                  (       a  U R4                  c   eU R4                  nU R                  (       aY  [        U5       VVs/ s H?  u  nnU[        U R                  5      :  d  U[        U R                  5      -
  U;   d  M=  UPMA     nnnU$ [        U5       VVs/ s H  u  nnUU;   d  M  UPM     nnnU$ s  snnf s  snnf )Nc              3  8   #    U  H  n[        U5      v   M     g 7fr>   )rn   )r   rows     rA   r   -PythonParser._rows_to_cols.<locals>.<genexpr>  s     2'3c#hh's   Fr   rZ   normalz	Expected z fields in line rS   z, saw z from bad_lines callablezXError could possibly be due to quotes being ignored when a multi-char delimiter is used.r  )	min_width)re   r   rn   r   maxr7  rE   r   rZ   r}  r   r`   r   rX   r4  r~  r  r  rF   rL   r   
QUOTE_NONEr  r   to_object_arrayr3   rc   )r@   r   col_lenmax_lenfooters	bad_linesiter_contentcontent_lenr   _content
actual_lennew_lrt  sourcer@  r  zipped_contentrY  as                      rA   r   PythonParser._rows_to_cols  s>   ++s4>>**G2'22
 u!<AU)-dooaGI$W-Lg,KG+ ]
' 1 122 $ 1 1( ; ,$(fu$=E"5zG3*.((ko6O*P ) 0 0'3u:z1R S(-hw#NN51 - **00660055/  #'((ko.G"H!(('x)HI,,0H0H0N0NN! O NN8,-  ,0 09+Vy(81VJ<X  Z'55CNNDNN+a/6G  4&=(C%%cQ;7% 09* c11'MOOP<<$$000++K## !*. 9" 91C//s4>>22kA	  9  "  #,N";"";$!QqK?OA";  " ""s   ><M3>M3M9(M9c                   U R                   nS nUbU  [        U R                   5      U:  a$  U R                   S U U R                   US  so0l         OU[        U R                   5      -  nUGc  [        U R                  [        5      (       a  U R
                  [        U R                  5      :  a  [        eUc/  U R                  U R
                  S  n[        U R                  5      nO5U R                  U R
                  U R
                  U-    nU R
                  U-   nU R                  U5      nUR                  U5        X@l        O/ n Ub  SnSnU R
                  b  U R
                  OSnXa:  aO  [        U R                  5      nU R                  Xu-   5      (       d  US-  nUS-  nUR                  U5        Xa:  a  MO  [        U5      n	U R                  U5      nUR                  U5        O=Sn U R                  U R
                  U-   S-   S9n
US-  nU
b  UR                  U
5        M:  U =R
                  U	-  sl        / U l         OUnU R                  (       a  US U R                  *  nU R                  U5      nU R                  (       a  U R!                  U5      nU R#                  U5      nU R%                  U5      $ ! [         a@    [        U5      n	U R                  U5      nUR                  U5        [        U5      S:X  a  e  Nf = f)Nr   rS   rs  )rW   rn   r]   rV   r`   rX   r   _remove_skipped_rowsr   rw  r[   r4  rx  rE   r   rM   ru  r  r  )r@   r   r   new_rowsnew_pos	row_indexrow_ctr   rh  len_new_rowsnext_rows              rA   r   PythonParser._get_lines  s    488}$%)XXet_dhhtuo"( DHH%$))T**88c$))n,''<#yy4H!$))nG#yyDHHtODH"hhoG44X>X&" '$%	!"-1XX-Aq$m&*499oG#'==1C#D#D &!%NI$OOG4 %m (+8}#'#<#<X#FX. "'+';';DHHtOVWDW';'XH AID'3 ( 9 # L(DHE??,T__,-E$$U+  ,,U3E%%e,""5))' % #&x=L#88BHLL*5zQ '	s    A4J< <-J< *=J< <ALLc                    U R                   (       aD  [        U5       VVs/ s H+  u  p#U R                  X R                  -   5      (       a  M)  UPM-     snn$ U$ s  snnf r>   )r<   r   r[   rX   )r@   r  r   r  s       rA   r  !PythonParser._remove_skipped_rows@  sJ    =="+H"5"5T]]1xx<=X"5  s   (AAc                   [        5       nU R                  (       aF  U R                  (       a5  U R                  c   eU R	                  U R                  U R                  5      nU R                  (       Ga  U R
                  (       Ga   U R                  c   e[        U R                  U R                  SS9 H  u  p#[        U R
                  [        5      (       d+  [        U R
                  5      (       d  UR                  U5        [        U R
                  [        5      (       d  Mp  X0R
                  ;   d  M  [        U R
                  U   5      (       a  [        U R
                  U   5      (       d  M  UR                  U5        M     U$ )NTr   )r   ri   r   rc   _set_noconvert_dtype_columnsr   zipr]   r   r   addr   )r@   no_thousands_columnsr   r   s       rA   ro   %PythonParser._set_no_thousand_columnsG  s   ),<<D,,$$000#'#D#D!!4<<$  <<<DJJJ$$000d//dK!$**d33<LJJ= = ),,Q/tzz400zz),TZZ_==(C99 ),,Q/ L $#rD   )rc   r   r   r:   rW   rj   ri   rQ   rV   rP   rF   rI   rH   rN   r   rh   rY   rK   re   rk   rX   rG   rL   rM   rE   r[   rJ   r<   rO   rf   )rq   zReadCsvBuffer[str] | listreturnNone)r  z
re.Pattern)rq   IO[str] | ReadCsvBuffer[str]r  zIterator[list[str]]r>   )r   
int | Noner  [tuple[Index | None, Sequence[Hashable] | MultiIndex, Mapping[Hashable, ArrayLike | Series]])r   list[np.ndarray]r  z8tuple[Mapping[Hashable, np.ndarray], Sequence[Hashable]])r   r  r  r  )rV   zMapping[Hashable, np.ndarray]r  zMapping[Hashable, ArrayLike])NN)r   r.   r  zdict[Any, np.ndarray])r   r0   r   r1   r  r0   )r  bool)r  z9tuple[list[list[Scalar | None]], int, set[Scalar | None]])ri   list[list[Scalar | None]]rX  zlist[Scalar | None]re   r   r  r  )r  list[Scalar])rb  r  r  r  )r   zSequence[Scalar]r  r  )r@  r^   rt  r   r  r  )rt  r   r  zlist[Scalar] | None)r   list[list[Scalar]]r  r  r   list[list[T]]r  r  )r   r  r  r^   r  r^   r  r  )r  z@tuple[Sequence[Hashable] | None, list[Hashable], list[Hashable]])r   r  r  r  )r   r  r  r  )r  r  r  r  )r  r9   )&r   r   r   r   __annotations__rU   r   r{   rb   r   r   r   r   r   r   r   r&  rd   r:  r8  r/  rj  rp  r0  r  rx  r   ru  r  r  r  rl   r   r   r  ro   r   __classcell__)rt   s   @rA   r7   r7   `   s   ##UHn 
! 
!FR "&6060
60p! 
B4 "&
$
$

$!
+!
 
&!
F  RR 
R Rh G GR  u;	Bu;n  .*. ). "	.
 
#.`%3,j44l8,\*8
'14?B	&
K/	IK/ZSjL*\$ $rD   r7   c                  v    \ rS rSrSr  S	             S
S jjrSSS jjr S     SS jjrSS jrSr	g)FixedWidthReaderia  z 
A reader of fixed-width lines.
Nc           	     v   Xl         S U l        U(       a  SU-   OSU l        X@l        US:X  a  U R	                  XeS9U l        OX l        [        U R
                  [        [        45      (       d!  [        S[        U5      R                   35      eU R
                   H  n[        U[        [        45      (       au  [        U5      S:X  af  [        US   [        [        R                  [        S 5      45      (       a4  [        US   [        [        R                  [        S 5      45      (       a  M  [        S	5      e   g )
Nz
z
	 infer)infer_nrowsr<   z;column specifications must be a list or tuple, input was a r`  r   rS   zEEach column specification must be 2 element tuple or list of integers)rq   bufferrF   rQ   detect_colspecscolspecsr]   r$  r`   r6  r  r   rn   r   r   integer)r@   rq   r  rF   rQ   r<   r  colspecs           rA   rU   FixedWidthReader.__init__f  s	    '+/8)+iw 00' 1 DM %M$--%77#H~6679 
 }}G7UDM22LA%wqzCT$Z+HIIwqzCT$Z+HII:  %rD   c                    Uc
  [        5       n/ n/ n[        U R                  5       H=  u  pVXR;  a  UR                  U5        UR                  U5        [	        U5      U:  d  M=    O   [        U5      U l        U$ )a1  
Read rows from self.f, skipping as specified.

We distinguish buffer_rows (the first <= infer_nrows
lines) from the rows returned to detect_colspecs
because it's simpler to leave the other locations
with skiprows logic alone than to modify them to
deal with the fact we skipped some rows here as
well.

Parameters
----------
infer_nrows : int
    Number of rows to read from self.f, not counting
    rows that are skipped.
skiprows: set, optional
    Indices of rows to skip.

Returns
-------
detect_rows : list of str
    A list containing the rows to read.

)r   r   rq   r4  rn   iterr  )r@   r  r<   buffer_rowsdetect_rowsr   r  s          rA   get_rowsFixedWidthReader.get_rows  sv    2 uH'FA ""3's#;;. ( ;'rD   c           	        SR                  U R                   Vs/ s H  nSU 3PM
     sn5      n[        R                  " SU S35      nU R	                  X5      nU(       d  [        S5      e[        [        [        U5      5      n[        R                  " US-   [        S9nU R                  b-  U V	s/ s H   oR                  U R                  5      S   PM"     nn	U H;  n	UR                  U	5       H#  n
SXR                  5       U
R!                  5       & M%     M=     [        R"                  " US5      nSUS'   [        R$                  " X-  S:H  5      S   n['        [)        US S S	2   USS S	2   S
S95      nU$ s  snf s  sn	f )Nr   \z([^z]+)z(No rows from which to infer column widthrS   r  r   r`  Tr  )r2  rF   rw   ry   r  r   r  r1  rn   r   zerosr   rQ   	partitionfinditerre  rg  rollwherer`   r  )r@   r  r<   r?   
delimiterspatternr   r  r   r  mshiftededges
edge_pairss                 rA   r   FixedWidthReader.detect_colspecs  sR    WW?11#h?@
**s:,c23}}[3 !KLLc#tn%xx!3/<<#>BCdsMM$,,/2dDCC%%c*,-WWY) +  ''$"
$.Q./2#eCaCj%1+dCD
! @ Ds   E93'E>c                P   U R                   b   [        U R                   5      nO[        U R                  5      nU R                   VVs/ s H"  u  p#XU R                  U R                  5      PM$     snn$ ! [         a    S U l         [        U R                  5      n Ndf = fs  snnf r>   )r  rw  r   rq   r  r   rF   )r@   r   from_tos       rA   __next__FixedWidthReader.__next__  s    ;;"$DKK(
 <DHLV%2$$T^^4VV ! $"DFF|$ Ws   A6 	)B"6&BB)r  r  rQ   rF   rq   )Nd   )rq   r  r  z(list[tuple[int, int]] | Literal['infer']rF   
str | NonerQ   r  r<   set[int] | Noner  r   r  r  r>   )r  r   r<   r   r  	list[str])r  N)r  r   r<   r   r  zlist[tuple[int, int]])r  r  )
r   r   r   r   __doc__rU   r  r  r  r   r   rD   rA   r  r  a  s     %)$'$ ;$ 	$
 $ "$ $ 
$L$N CG0?	,
WrD   r  c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)FixedWidthFieldParseri  z`
Specialization that Converts fixed-width fields into DataFrames.
See PythonParser for details.
c                    UR                  S5      U l        UR                  S5      U l        [        R                  " X40 UD6  g )Nr  r  )popr  r  r7   rU   )r@   rq   rr   s      rA   rU   FixedWidthFieldParser.__init__  s6    ,88M2d..rD   c                    [        UU R                  U R                  U R                  U R                  U R
                  5      $ r>   )r  r  rF   rQ   r<   r  )r@   rq   s     rA   rb   "FixedWidthFieldParser._make_reader  s7    MMNNLLMM
 	
rD   c                d    U Vs/ s H  n[        S U 5       5      (       d  M  UPM      sn$ s  snf )z
Returns the list of lines without the empty ones. With fixed-width
fields, empty lines become arrays of empty strings.

See PythonParser._remove_empty_lines.
c              3  z   #    U  H1  n[        U[        5      (       + =(       d    UR                  5       v   M3     g 7fr>   )r]   r^   r   )r   r  s     rA   r   <FixedWidthFieldParser._remove_empty_lines.<locals>.<genexpr>  s(     E1z!S))6QWWY6s   9;)rV  )r@   r   r   s      rA   ru  )FixedWidthFieldParser._remove_empty_lines  s7     
EEE 
 	
 
s   --)r  r  N)rq   zReadCsvBuffer[str]r  r  )rq   r  r  r  r  )	r   r   r   r   r  rU   rb   ru  r   r   rD   rA   r  r    s    
/

rD   r  c                ^    [        U 5      (       d  [        S5      eU S:  a  [        S5      eU $ )a  
Validate the 'skipfooter' parameter.

Checks whether 'skipfooter' is a non-negative integer.
Raises a ValueError if that is not the case.

Parameters
----------
skipfooter : non-negative integer
    The number of rows to skip at the end of the file.

Returns
-------
validated_skipfooter : non-negative integer
    The original input if the validation succeeds.

Raises
------
ValueError : 'skipfooter' was not a non-negative integer.
zskipfooter must be an integerr   zskipfooter cannot be negative)r   rp   )rE   s    rA   r\   r\     s6    * j!!899A~899 rD   )rE   r   r  r   )R
__future__r   collectionsr   r   r   ior   rw   typingr   r   r	   r
   r   r   r   r   numpyr   pandas._libsr   pandas._typingr   pandas.errorsr   r   r   pandas.util._decoratorsr   pandas.util._exceptionsr   pandas.core.dtypes.astyper   pandas.core.dtypes.commonr   r   r   r   r   r   r   pandas.core.dtypes.dtypesr   r   pandas.core.dtypes.inferencer   pandas.corer    pandas.core.arraysr!   r"   pandas.core.arrays.booleanr#   pandas.core.indexes.apir$   pandas.io.commonr%   r&   pandas.io.parsers.base_parserr'   r(   r)   r*   r+   collections.abcr,   r-   r.   r/   r0   r1   r2   r3   pandasr4   r5   ra  r7   r  r  r\   r   rD   rA   <module>r%     s    "   	      ! 
 3 4 2   6 " 4 )     ~$: ~$B(qWs|| qWh!
L !
HrD   