
    ZiB              	       |   S r SrSSKrSSKrSSKJr  SSKr\R                  R                  \R                  R                  \R                  R                  \R                  R                  \5      5      5      5      r\\R                  ;  a  \R                  R                  S\5        CSSKJr  \R"                  S   S:  a  \rS rS rS	 r " S
 S\R.                  5      r " S S\R2                  5      r " S S\5      r " S S\R2                  5      r\" / SQ5      r\" / SQ5      r " S S\R@                  5      r! " S S\!5      r" " S S\!5      r# " S S\!5      r$ " S S\R@                  5      r% " S S\%5      r&S  r'\(S!:X  a2  \RR                  " \RT                  " \RV                  S"S \\5      5        gg)#zPParse xls up to some point

Read storages, (sub-)streams, records from xls file
z0.54    N)unpack)record_base   c                 F   Sn [        U 5      nUR                  5        H.  n[        U[        5      (       d  M    Ub  UR	                  5         gg   Ub  UR	                  5         g! [
         a    [        R                  " SSS9   N5f = f! Ub  UR	                  5         f f = f)z
determine whether a given file is an excel ole file

returns True if given file is an ole file and contains a Workbook stream

todo: could further check that workbook stream starts with a globals
substream.
See also: oleid.OleID.check_excel
NTz/Ignoring exception in is_xls, assume is not xls)exc_infoF)XlsFileiter_streams
isinstanceWorkbookStreamclose	Exceptionloggingdebug)filenamexls_filestreams      m/var/www/eduai.edurigo.com/question_generate/ques_gen_env/lib/python3.13/site-packages/oletools/xls_parser.pyis_xlsr   Q   s     H
8$++-F&.11
 NN   . NN  %G#	%% NN  s.   1A% A% A% %BB
 BB
 
B c                     [        XUS-    5      S:H  nU(       a   US-   U-   nXS-   U R                  S5      U4$ [        XS-   U5      $ )z<read a unicode string from a XLUnicodeStringNoCch structure    r   ascii)orddecoderead_unicode_2byte)data	start_idxn_charslow_bytes_onlyend_idxs        r   read_unicoder    j   s]     $156!;Na-')aK(//8'AA!$!W==    c                    ^  XS-  -   nUS:  a  S [        SSU-  -   T X 5       5       nOU 4S j[        XS5       5       nSR                  U5      U4$ )z9read a unicode string with characters encoded by 2 bytes       c              3   8   #    U  H  n[        U5      v   M     g 7f)N)unichr).0vals     r   	<genexpr>%read_unicode_2byte.<locals>.<genexpr>z   s      HF %(F3KKFs   <Hc           
   3   ^   >#    U  H"  n[        [        S TXS-    5      S   5      v   M$     g7f)<Hr#   r   N)r&   r   )r'   data_idxr   s     r   r)   r*   }   s6      B$@ 6$Xqj(AB1EFF$@s   *- )r   rangejoin)r   r   r   r   unicharss   `    r   r   r   v   sh    A+%G}H3W,d9.EFHB$))a$@B88Hw&&r!   c                   (    \ rS rSrSr\S 5       rSrg)r      z0An xls file has most streams made up of records c                 &    US:X  a  [         $ [        $ )zhelper for iter_streams Workbook)r   	XlsStream)clsstream_names     r   stream_class_for_nameXlsFile.stream_class_for_name   s     *$!!r!    N)__name__
__module____qualname____firstlineno____doc__classmethodr;   __static_attributes__r=   r!   r   r   r      s    ; r!   r   c                   .    \ rS rSrSrS r\S 5       rSrg)r8      z,most streams in xls file consist of records c                 X    [        SU R                  R                  S5      5      u  pXS4$ )kread first few bytes of record to determine size and type

returns (type, size, other) where other is None
<HH   N)r   r   read)selfrec_typerec_sizes      r   read_record_headXlsStream.read_record_head   s-    
 $E4;;+;+;A+>?4''r!   c                     [         S4$ )Cdetermine a class for given record type

returns (clz, force_read)
F)	XlsRecordr9   rM   s     r   record_class_for_typeXlsStream.record_class_for_type   s     %r!   r=   N)	r>   r?   r@   rA   rB   rO   rC   rU   rD   r=   r!   r   r8   r8      s    7(    r!   r8   c                   (    \ rS rSrSr\S 5       rSrg)r      z*Stream in excel file that holds most info c                     U[         R                  :X  a  [         S4$ U[        R                  :X  a  [        S4$ U[        R                  :X  a  [        S4$ [        S4$ rR   TF)XlsRecordBofTYPEXlsRecordEofXlsRecordSupBookrS   rT   s     r   rU   $WorkbookStream.record_class_for_type   s[     |(((%%***&&)...#T))e##r!   r=   N)r>   r?   r@   rA   rB   rC   rU   rD   r=   r!   r   r   r      s    5$ $r!   r   c                   6    \ rS rSrSrSrSrS r\S 5       r	Sr
g)	
XlsbStream   z?binary stream of an xlsb file, usually have a record structure       c                    [        U R                  R                  S5      5      nXR                  -  (       aE  [        U R                  R                  S5      5      nXR                  -  X R                  -  S-  -   nOUnSnSn[        S5       HT  n[        U R                  R                  S5      5      nXAU R                  -  U-  -  nUS-  nXR                  -  S:X  d  MT    O   X4S4$ )rH   r      r   rJ   N)r   r   rK   HIGH_BIT_MASKLOW7_BIT_MASKr1   )rL   r(   val2rM   rN   shift_s          r   rO   XlsbStream.read_record_head   s    
 $++""1%&###t{{''*+D000 2 22q8:H HqAdkk&&q)*Ct111e;;HQJE(((Q.  4''r!   c                 J    U[         R                  :X  a  [         S4$ [        S4$ rZ   )XlsbBeginSupBookr\   
XlsbRecordrT   s     r   rU    XlsbStream.record_class_for_type   s)     ',,,#T))u$$r!   r=   N)r>   r?   r@   rA   rB   rg   rh   rO   rC   rU   rD   r=   r!   r   ra   ra      s(    JMM(0 % %r!   ra   )()   BuiltInFnGroupCount)ic  BookExt)i  CodeName)B   CodePage)ic  Dat)ij  
DataLabExt)ik  DataLabExtContents)   DBCell)   DbOrParmQry)i  
DBQueryExt)iv  DConn)#   
ExternName)   ExternSheet)   ExtSST)i  	ExtString)ig  FeatHdr)[   FileSharing)i  Format)1   Font)i  GUIDTypeLib)i  HLink)   InterfaceHdr)   InterfaceEnd)i  Index)   Lbl)   Mms)]   Obj)i'  
ObjectLink)i
  	OleDbConn)   OleObjectSize)i  RichTextStream)ib  SheetExt)i  ShrFmla)i  	SxViewExt)iX  
SxViewLink)i  WebPub)   zXF (formatting))i}  zXFExt (formatting))i  Style)i  StyleExt))iL  BrtEndSupBook)i  BrtSupAddin)ic  BrtSupBookSrc)iJ  BrtSupNameBits)iH  BrtSupNameBool)iK  BrtSupNameEnd)iE  BrtSupNameErr)iI  BrtSupNameFmla)iG  BrtSupNameNil)iD  BrtSupNameNum)iF  BrtSupNameSt)iA  BrtSupNameStart)iC  BrtSupNameValueEnd)iB  BrtSupNameValueStart)if  
BrtSupSame)ie  
BrtSupSelf)ig  
BrtSupTabsc                   "    \ rS rSrSrSrS rSrg)rS   i(  z0basic building block of data in workbook stream i    c                      [         U R                     $ ! [         a    SR                  U R                  5      s $ f = f):simplification for subclasses to create their own __str__ zXlsRecord type {0})FREQUENT_RECORDStypeKeyErrorformatrL   s    r   	_type_strXlsRecord._type_str.  s:    	:#DII.. 	:'..tyy99	:    %==r=   Nr>   r?   r@   rA   rB   MAX_SIZEr   rD   r=   r!   r   rS   rS   (  s    ; H:r!   rS   c                   @    \ rS rSrSrSrSr\" / SQ5      rS r	S r
Srg	)
r[   i6  z(record found at beginning of substreams i	     ))   workbook)r   zdialog/worksheet)    chart)@   macroc                 p    U R                   c  S U l        g [        SU R                   SS 5      S   U l        g )Nr.   r#   rJ   r   )r   doctyper   rL   rk   s     r   finish_constructing XlsRecordBof.finish_constructing>  s3    99DLdDIIaN3A6r!   c                     SR                  U R                  U R                  ;   a  U R                  U R                     5      $ S5      $ )NzBOF Record ({0} substream)unknown)r   r   DOCTYPESr   s    r   r   XlsRecordBof._type_strE  sA    +22+/<<4==+HDMM$,,' 	 	r!   )r   N)r>   r?   r@   rA   rB   r\   SIZEdictr   r   r   rD   r=   r!   r   r[   r[   6  s(    3DD 7 8H7r!   r[   c                   &    \ rS rSrSrSrSrS rSrg)r]   iK  z"record found at end of substreams 
   r   c                     g)Nz
EOF Recordr=   r   s    r   r   XlsRecordEof._type_strP  s    r!   r=   N)	r>   r?   r@   rA   rB   r\   r   r   rD   r=   r!   r   r]   r]   K  s    -DDr!   r]   c                   D    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rS rS rSrg)r^   iT  zThe SupBook record specifies a supporting link

"... The collection of records specifies the contents of an external
workbook, DDE data source, or OLE data source." (MS-XLS, paragraph 2.4.271)
i  r   zself-referencingzaddin-referencingunusedz
same-sheetzole/dde data sourcezexternal workbookc                    SU l         SU l        SU l        U R                  U l        U R
                  c  gU R                  S:  a$  [        SR                  U R                  5      5      e[        SU R
                  SS 5      u  U l         U l        SU R                  s=:  a  S::  a-  O  O*[        U R
                  SU R                  5      u  U l        nO
Su  U l        nU R                  S:X  a  U R                  U l        gU R                   S	:X  a"  U R                  S
:X  a  U R                  U l        gU R                  S:X  a  U R                  U l        gU R                  S:X  a  U R                  U l        gU R                   S:X  a#  U R                  (       a  U R                  U l        gU R                   S:  a$  U R                  (       a  U R                   U l        ggg)z>Finish constructing this record; called at end of constructor.NrJ   z+not enough data (size is {0} but need >= 4)rI   r   r   )r0   rJ   i  r   i:    )ctabcch	virt_pathLINK_TYPE_UNKNOWNsupport_link_typer   size
ValueErrorr   r   r    LINK_TYPE_SELFLINK_TYPE_ADDINLINK_TYPE_UNUSEDLINK_TYPE_SAMESHEETLINK_TYPE_OLE_DDELINK_TYPE_EXTERNALr   s     r   r   $XlsRecordSupBook.finish_constructinge  ss    	!%!7!799 99q=J$fTYY/1 1$UDIIbqM:	48txx4 ,TYY488 DDNA &DNA 88u%)%8%8D"YY#$((f"4%)%9%9D"^^y(%)%:%:D"^^y(%)%=%=D"YY#$..%)%;%;D"YY]t~~%)%<%<D"  .]r!   c                 8    SR                  U R                  5      $ )NzSupBook Record ({0}))r   r   r   s    r   r   XlsRecordSupBook._type_str  s    %,,T-C-CDDr!   )r   r   r   r   N)r>   r?   r@   rA   rB   r\   r   r   r   r   r   r   r   r   r   rD   r=   r!   r   r^   r^   T  sB     D!'N)O&-,"=HEr!   r^   c                   "    \ rS rSrSrSrS rSrg)ro   i  zilike an xls record, but from binary part of xlsb file

has no MAX_SIZE and types have different meanings
Nc                      [         U R                     $ ! [         a    SR                  U R                  5      s $ f = f)r   zXlsbRecord type {0})FREQUENT_RECORDS_XLSBr   r   r   r   s    r   r   XlsbRecord._type_str  s:    	;(33 	;(//		::	;r   r=   r   r=   r!   r   ro   ro     s    
 H;r!   ro   c                   <    \ rS rSrSrSrSrSrSrSr	Sr
S	 rS
 rSrg)rn   i  zRecord beginning an external link in xlsb file

contains information about the link itself (e.g. for DDE the link is
string1 + ' ' + string2)
ih  r   DDEOLE
unexpectedr   c                    U R                   U l        SU l        SU l        U R                  c  g [        SU R                  SS 5      S   U l        U R                  S:X  a  U R                  U l        OU R                  S:X  a  U R                  U l        OeU R                  S:X  a  U R                  U l        OC[        R                  " SR                  U R                  S   5      5        U R                  U l        Sn[        SU R                  X"S-    5      S   nUS	:X  a  [        R                  " S
5        OkU R                  US-  U-   S-   :  a0  [        R                  " SR                  X0R                  5      5        O"[        U R                  US-   U5      u  U l        n[        SU R                  X"S-    5      S   nUS	:X  a  [        R                  " S
5        g U R                  US-  U-   S-   :  a3  [        R                  " SR                  X0R                  5      S-   5        g [        U R                  US-   U5      u  U l        ng )Nr0   r.   r   r#   r   z$Unexpected link type {0} encounteredz<IrJ   l    z*Max string length 0xFFFFFFF is not allowedz0Impossible string length {0} for data length {1}z for string2)r   	link_typestring1string2r   r   sbtLINK_TYPE_WORKBOOKLINK_TYPE_DDELINK_TYPE_OLEr   warningr   LINK_TYPE_UNEXPECTEDr   r   )rL   rk   r   r   s       r   r   $XlsbBeginSupBook.finish_constructing  s   //99$		!A/288q=!44DNXX]!//DNXX]!//DNOOB#VDIIaL13!66DN	tyyQ;?@Cj OOHIYYY.q00OON#VGYY79 '99B1g'O#DL) tyyQ;?@Cj OOHIYYY.q00OON#VGYY7.I J 1IaK18:ODL!r!   c                 d    SR                  U R                  U R                  U R                  5      $ )Nz+XlsbBeginSupBook Record ({0}, "{1}", "{2}"))r   r   r   r   r   s    r   r   XlsbBeginSupBook._type_str  s%    <t~~t||T\\B	Cr!   )r   r   r   r   N)r>   r?   r@   rA   rB   r\   r   r   r   r  r   r   r   rD   r=   r!   r   rn   rn     s6     D#MM'!%:NCr!   rn   c              #     #    Sn [        X R                  U[        R                  5      nUR	                  5        H  nUv   M	      Ub  UR                  5         gg! [
         a    e f = f! Ub  UR                  5         f f = f7f)zBExcel xlsb files also have bin files with record structure. iter! N)ra   r   r   STGTY_STREAMiter_recordsr   r   )file_streamrk   r   xlsb_streamrecords        r   parse_xlsb_partr    s     K	  .>.>!,!9!9;!..0FL 1
 " #   " #s)   BA A BA((A+ +BB__main__r   ),rB   __version__sysos.pathosstructr   r   pathnormpathdirnameabspath__file__
PARENT_DIRinsertoletoolsr   version_infochrr&   r   r    r   OleRecordFiler   OleRecordStreamr8   r   ra   r   r   r   OleRecordBaserS   r[   r]   r^   ro   rn   r  r>   exittestargvr=   r!   r   <module>r#     s  L "     WWbggoobggooGGOOH/   !
SXXHHOOAz"  
 A!F2	>	' k''  ++  ($Y $&'%,, '%^  ) ) X    *:)) :9 *9 6Ey 6Er;** ; 7Cz 7C~ ( zHH[chhqrlG^DE r!   