§
    �’jù*  ã                   óv   — d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	  G d„ de¦  «        Z
 G d„ d	e
¦  «        ZdS )
z™
This module is for codecs only.

While the codec implementation can contain details of the PDF specification,
the module should not do any PDF parsing.
é    N)ÚABCÚabstractmethod)Úlogger_warning)ÚLimitReachedErrorÚPdfStreamErrorc                   óR   — e Zd ZdZededefd„¦   «         Zededefd„¦   «         ZdS )ÚCodecz#Abstract base class for all codecs.ÚdataÚreturnc                 ó   — dS )z†
        Encode the input data.

        Args:
            data: Data to encode.

        Returns:
            Encoded data.

        N© ©Úselfr
   s     úCC:\Projects\DSCons\.venv\Lib\site-packages\pypdf\_codecs\_codecs.pyÚencodezCodec.encode   ó   € € € ó    c                 ó   — dS )z†
        Decode the input data.

        Args:
            data: Data to decode.

        Returns:
            Decoded data.

        Nr   r   s     r   ÚdecodezCodec.decode   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úbytesr   r   r   r   r   r	   r	      st   € € € € € Ø-Ð-àð
˜5ð 
 Uð 
ð 
ð 
ñ „^ð
ð ð
˜5ð 
 Uð 
ð 
ð 
ñ „^ð
ð 
ð 
r   r	   c                   ó¬   — e Zd ZdZdZdZdZdZddedd	fd
„Z	dd„Z
dd„Zdedefd„Zdee         defd„Zdd„Zdedefd„Zdedefd„Zdededd	fd„Zd	S )ÚLzwCodecz2Lempel-Ziv-Welch (LZW) adaptive compression codec.é   i  é	   é   éÀhxÚmax_output_lengthr   Nc                 ó   — || _         d S )N)r!   )r   r!   s     r   Ú__init__zLzwCodec.__init__5   s   € Ø!2ˆÔÐÐr   c                 óœ   — d„ t          d¦  «        D ¦   «         | _        | j        dz   | _        | j        | _        d| j        z  dz
  | _        dS )z>Initialize the encoding table and state to initial conditions.c                 ó0   — i | ]}t          |g¦  «        |“ŒS r   ©r   ©Ú.0Úis     r   ú
<dictcomp>z7LzwCodec._initialize_encoding_table.<locals>.<dictcomp>:   s"   € Ð0SÐ0SÐ0SÀ1µ¸°s±´¸QÐ0SÐ0SÐ0Sr   r   é   N)ÚrangeÚencoding_tableÚ
EOD_MARKERÚ	next_codeÚINITIAL_BITS_PER_CODEÚbits_per_codeÚmax_code_value©r   s    r   Ú_initialize_encoding_tablez#LzwCodec._initialize_encoding_table8   sR   € à0SÐ0SÍÈcÉ
Ì
Ð0SÑ0SÔ0SˆÔØœ¨1Ñ,ˆŒØ!Ô7ˆÔØ  DÔ$6Ñ6¸!Ñ;ˆÔÐÐr   c                 ó²   — | xj         dz  c_         | j         | j        k    r4| j        | j        k     r&| xj        dz  c_        d| j        z  dz
  | _        dS dS dS )z5Update bits_per_code and max_code_value if necessary.r+   N)r/   r2   r1   ÚMAX_BITS_PER_CODEr3   s    r   Ú_increase_next_codezLzwCodec._increase_next_code?   sp   € àˆŒ˜!ÑˆŒàŒN˜TÔ0Ò0Ð0ØÔ" TÔ%;Ò;Ð;àÐÔ !Ñ#ÐÔØ#$¨Ô(:Ñ#:¸aÑ"?ˆDÔÐÐð	 1Ð0Ø;Ð;r   r
   c                 ó€  — g }|                      | j        ¦  «         |                      ¦   «          d}|D ]¹}|t          |g¦  «        z   }|| j        v r|}Œ!|                      | j        |         ¦  «         | j        d| j        z  dz
  k    r$| j        | j        |<   |                      ¦   «          n.|                      | j        ¦  «         |                      ¦   «          t          |g¦  «        }Œº|r |                      | j        |         ¦  «         |                      | j        ¦  «         |  	                    |¦  «        S )zˆ
        Encode data using the LZW compression algorithm.

        Taken from PDF 1.7 specs, "7.4.4.2 Details of LZW Encoding".
        r   r+   )
ÚappendÚCLEAR_TABLE_MARKERr4   r   r-   r/   r6   r7   r.   Ú_pack_codes_into_bytes)r   r
   Úresult_codesÚcurrent_sequenceÚbyteÚnext_sequences         r   r   zLzwCodec.encodeI   sa  € ð #%ˆð 	×Ò˜DÔ3Ñ4Ô4Ð4Ø×'Ò'Ñ)Ô)Ð)àÐØð 	1ð 	1ˆDØ,­u°d°V©}¬}Ñ<ˆMà Ô 3Ð3Ð3à#0Ð Ð ð ×#Ò# DÔ$7Ð8HÔ$IÑJÔJÐJð ”> a¨4Ô+AÑ&AÀQÑ%FÒFÐFØ9=¼�DÔ'¨Ñ6Ø×,Ò,Ñ.Ô.Ð.Ð.ð !×'Ò'¨Ô(?Ñ@Ô@Ð@Ø×3Ò3Ñ5Ô5Ð5õ $)¨$¨¡=¤=Ð Ð ð ð 	GØ×Ò Ô 3Ð4DÔ EÑFÔFÐFØ×Ò˜DœOÑ,Ô,Ð,à×*Ò*¨<Ñ8Ô8Ð8r   Úcodesc                 óÄ  — |                       ¦   «          d}d}t          ¦   «         }|D ]…}|| j        z  |z  }|| j        z  }|dk    r&|dz  }|                     ||z	  dz  ¦  «         |dk    °&|| j        k    r|                       ¦   «          Œe|| j        k    rŒq|                      ¦   «          Œ†|dk    r|                     |d|z
  z  dz  ¦  «         t          |¦  «        S )z¼
        Convert the list of result codes into a continuous byte stream, with codes packed as per the code bit-width.
        The bit-width starts at 9 bits and expands as needed.
        r   é   éÿ   )r4   Ú	bytearrayr1   r9   r:   r.   r7   r   )r   r@   ÚbufferÚbits_in_bufferÚoutputÚcodes         r   r;   zLzwCodec._pack_codes_into_bytess   s  € ð
 	×'Ò'Ñ)Ô)Ð)ØˆØˆÝ‘”ˆàð 	+ð 	+ˆDØ Ô 2Ñ2°dÑ:ˆFØ˜dÔ0Ñ0ˆNð
 ! AÒ%Ð%Ø !Ñ#�Ø—’˜v¨Ñ7¸4Ñ?Ñ@Ô@Ð@ð ! AÒ%Ð%ð �tÔ.Ò.Ð.Ø×/Ò/Ñ1Ô1Ð1Ð1Ø˜œÒ(Ð(Øà×(Ò(Ñ*Ô*Ð*Ð*ð ˜AÒÐØ�MŠM˜6 a¨.Ñ&8Ñ9¸TÑAÑBÔBÐBå�V‰}Œ}Ðr   c                 óÊ   — d| j         z  dz
  | _        d„ t          | j        ¦  «        D ¦   «         dg| j        | j        z
  dz   z  z   | _        | j        dz   | _        d| _        d S )Nr+   c                 ó.   — g | ]}t          |g¦  «        ‘ŒS r   r&   r'   s     r   ú
<listcomp>z7LzwCodec._initialize_decoding_table.<locals>.<listcomp>—   s    € ÐRÐRÐR¨a�u a S™zœzÐRÐRÐRr   r   r   )r6   r2   r,   r:   Údecoding_tabler.   Ú_table_indexÚ_bits_to_getr3   s    r   Ú_initialize_decoding_tablez#LzwCodec._initialize_decoding_table•   s€   € Ø  DÔ$:Ñ:¸aÑ?ˆÔØRÐRµ5¸Ô9PÑ3QÔ3QÐRÑRÔRØðV
àÔ  4Ô#:Ñ:¸QÑ>ñV@ñ @ˆÔð !œO¨aÑ/ˆÔØˆÔÐÐr   c                 ó–  — |  	 | j         | j        k     rM| j        dz  || j                 z  | _        | xj        dz  c_        | xj         dz  c_         | j         | j        k     °M| j        | j         | j        z
  z	  | j        | j        dz
           z  }| xj         | j        z  c_         | j        dz  | _        |S # t
          $ r
 | j        cY S w xY w)NrB   r+   r   iÿÿ )Ú
_next_bitsrN   Ú
_next_dataÚ_byte_pointerÚ
_and_tableÚ
IndexErrorr.   )r   r
   rH   s      r   Ú_next_code_decodezLzwCodec._next_code_decode�   sõ   € ØÐð	#Ø”/ DÔ$5Ò5Ð5Ø#'¤?°aÑ#7Ø˜Ô+Ô,ñ#�”ð Ð"Ô" aÑ'Ð"Ô"Ø�” 1Ñ$�”ð ”/ DÔ$5Ò5Ð5ð ” D¤O°dÔ6GÑ$GÑHØ” Ô 1°AÑ 5Ô6ñ7ˆDð ˆOŒO˜tÔ0Ñ0ˆOŒOð #œo°Ñ7ˆDŒOàˆKøÝð 	#ð 	#ð 	#Ø”?Ð"Ð"Ð"ð	#øøøs   „B/B4 Â4CÃCc                 ó(  — g d¢| _         d| _        d| _        d| _        d| _        d| _        t          j        ¦   «         }d}|                      ¦   «          d| _        d| _        d| _        | j	        }	 |  
                    |¦  «        }|| j        k    r�nk|| j	        k    r[|                      ¦   «          |  
                    |¦  «        }|| j        k    r�n*|                     | j        |         x}¦  «         |}nÌ|| j        k     rW| j        |         }|                     |¦  «         || j	        k    r'|                      | j        |         |d         ¦  «         |}nj| j        |         }|st          d|› d| j        › d�¦  «        ‚||dd	…         z   }|                     |¦  «         |                      ||d         ¦  «         |}|t!          |¦  «        z  }|| j        k    rt%          d
|› d| j        › �¦  «        ‚�Œ�|                     ¦   «         S )zÎ
        The following code was converted to Python from the following code:
        https://github.com/empira/PDFsharp/blob/master/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.Filters/LzwDecode.cs
        )éÿ  éÿ  éÿ  iÿ  r   r   Tz	LZW code z- out of range with empty base at table index ú.Nr+   z#Limit reached while decompressing: z > )rT   rM   rN   rS   rR   rQ   ÚioÚBytesIOrO   r:   rV   r.   ÚwriterL   Ú_add_entry_decoder   Úlenr!   r   Úgetvalue)r   r
   Úoutput_streamÚoutput_lengthÚold_coderH   ÚdecodedÚbases           r   r   zLzwCodec.decodeÓ   s[  € ð
 2Ð1Ð1ˆŒØˆÔØˆÔØˆÔØˆŒØˆŒåœ
™œˆØˆà×'Ò'Ñ)Ô)Ð)ØˆÔØˆŒØˆŒØÔ*ˆð"	Ø×)Ò)¨$Ñ/Ô/ˆDØ�t”Ò&Ð&Ùà�tÔ.Ò.Ð.Ø×/Ò/Ñ1Ô1Ð1Ø×-Ò-¨dÑ3Ô3�Ø˜4œ?Ò*Ð*ÙØ×#Ò#¨tÔ/BÀ4Ô/HÐ$H GÑIÔIÐIØ��Ø˜Ô)Ò)Ð)ØÔ-¨dÔ3�Ø×#Ò# GÑ,Ô,Ð,Ø˜tÔ6Ò6Ð6Ø×*Ò*¨4Ô+>¸xÔ+HÈ'ÐRSÌ*ÑUÔUÐUØ��ð Ô*¨8Ô4�Øð Ý(Øk DÐkÐkÐW[ÔWhÐkÐkÐkñô ð ð   b q b¤™/�Ø×#Ò# GÑ,Ô,Ð,Ø×&Ò& t¨W°Q¬ZÑ8Ô8Ð8Ø�à�S ™\œ\Ñ)ˆMØ˜tÔ5Ò5Ð5Ý'Ød¸-ÐdÐdÈDÔLbÐdÐdñô ð ñA"	ðH ×%Ò%Ñ'Ô'Ð'r   Ú
old_stringÚnew_charc                 ó2  — |t          |g¦  «        z   }| j        | j        k    rt          dt          ¬¦  «         d S || j        | j        <   | xj        dz  c_        | j        dk    r	d| _        d S | j        dk    r	d| _        d S | j        dk    r	d	| _        d S d S )
Nz#Ignoring too large LZW table index.)Úsourcer+   rX   é
   rY   é   rZ   r   )r   rM   r2   r   r   rL   rN   )r   rg   rh   Ú
new_strings       r   r_   zLzwCodec._add_entry_decode  sÂ   € Ø¥%¨¨
Ñ"3Ô"3Ñ3ˆ
ØÔ˜tÔ2Ò2Ð2ÝÐ@ÍÐRÑRÔRÐRØˆFØ1;ˆÔ˜DÔ-Ñ.ØÐÔ˜QÑÐÔð Ô Ò#Ð#Ø "ˆDÔÐÐØÔ $Ò&Ð&Ø "ˆDÔÐÐØÔ $Ò&Ð&Ø "ˆDÔÐÐð 'Ð&r   )r    )r   N)r   r   r   r   r:   r.   r0   r6   Úintr#   r4   r7   r   r   Úlistr;   rO   rV   r   r_   r   r   r   r   r   -   sQ  € € € € € Ø<Ð<àÐØ€JØÐØÐð3ð 3¨#ð 3¸tð 3ð 3ð 3ð 3ð<ð <ð <ð <ð@ð @ð @ð @ð(9˜5ð (9 Uð (9ð (9ð (9ð (9ðT ¨D°¬Ið  ¸%ð  ð  ð  ð  ðDð ð ð ð# eð #°ð #ð #ð #ð #ðl9(˜5ð 9( Uð 9(ð 9(ð 9(ð 9(ðv#¨Eð #¸Sð #ÀTð #ð #ð #ð #ð #ð #r   r   )r   r\   Úabcr   r   Úpypdf._utilsr   Úpypdf.errorsr   r   r	   r   r   r   r   ú<module>rs      sÄ   ððð ð 
€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ðð ð ð ð ˆCñ ô ð ð<o#ð o#ð o#ð o#ð o#ˆuñ o#ô o#ð o#ð o#ð o#r   