Ë
    Ü_Ëi,  ã            	      óf  — d Z ddlmZ ddlZddlZddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZ  ej                  d«      j                   Z ej                  d«      j$                  ZdZd	Zd
ZdZdZdZdZdZdZeez   dfZedfZeez   dfZedfZ eez   dfZ!edfZ"eejF                  eedg ejH                  ejJ                  ejL                  gddœZ' ejP                  di e'jS                  «       ¤ŽZ*eej
                  e+e,e	e-ee-   e-f   f   Z. G d„ de«      Z/ G d„ de«      Z0dd„Z1dd„Z2 G d„ d«      Z3y)zHTools for working with the BSON decimal128 type.

.. versionadded:: 3.4
é    )ÚannotationsN©ÚDecimal)ÚAnyÚSequenceÚTupleÚTypeÚUnion)ÚTypeDecoderÚTypeEncoderz<Ql            i   i   ièÿÿé"   l          @ l          ` l          p l            é   )ÚprecÚroundingÚEminÚEmaxÚcapitalsÚflagsÚtrapsÚclampc                  ó*   — e Zd ZdZedd„«       Zdd„Zy)ÚDecimalEncodera  Converts Python :class:`decimal.Decimal` to BSON :class:`Decimal128`.

    For example::
        opts = CodecOptions(type_registry=TypeRegistry([DecimalEncoder()]))
        bson.encode({"d": decimal.Decimal('1.0')}, codec_options=opts)

    .. versionadded:: 4.15
    c                ó   — t         S ©Nr   ©Úselfs    úR/var/www/pod-logistic/pod-api/venv/lib/python3.12/site-packages/bson/decimal128.pyÚpython_typezDecimalEncoder.python_typeJ   s   € äˆó    c                ó   — t        |«      S r   ©Ú
Decimal128©r   Úvalues     r   Útransform_pythonzDecimalEncoder.transform_pythonN   s   € Ü˜%Ó Ð r   N)ÚreturnzType[Decimal])r$   r   r&   r"   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r%   © r   r   r   r   @   s    „ ñð òó ðô!r   r   c                  ó*   — e Zd ZdZedd„«       Zdd„Zy)ÚDecimalDecoderzóConverts BSON :class:`Decimal128` to Python :class:`decimal.Decimal`.

    For example::
        opts = CodecOptions(type_registry=TypeRegistry([DecimalDecoder()]))
        bson.decode(data, codec_options=opts)

    .. versionadded:: 4.15
    c                ó   — t         S r   r!   r   s    r   Ú	bson_typezDecimalDecoder.bson_type\   s   € äÐr   c                ó"   — |j                  «       S r   )Ú
to_decimalr#   s     r   Útransform_bsonzDecimalDecoder.transform_bson`   s   € Ø×ÑÓ!Ð!r   N)r&   úType[Decimal128])r$   r   r&   údecimal.Decimal)r'   r(   r)   r*   r+   r0   r3   r,   r   r   r.   r.   R   s    „ ñð òó ðô"r   r.   c                 ó^   — t         j                  «       } g | d<   t        j                  di | ¤ŽS )z…Returns an instance of :class:`decimal.Context` appropriate
    for working with IEEE-754 128-bit decimal floating point values.
    r   r,   )Ú_CTX_OPTIONSÚcopyÚdecimalÚContext)Úoptss    r   Úcreate_decimal128_contextr<   d   s-   € ô ×ÑÓ€DØ€Dˆ�MÜ�?‰?Ñ"˜TÑ"Ð"r   c           
     ó„  — t        j                  t        «      5 }|j                  | «      } ddd«       | j	                  «       r| j                  «       rt        S t        S | j                  «       \  }}}| j                  «       rU|rt        d«      ‚| j                  «       r| j                  «       rt        S t        S | j                  «       rt        S t        S t!        dj#                  |D �cg c]  }t%        |«      ‘Œ c}«      «      }|j'                  «       }d}d}	t)        t+        d|«      «      D ]  }
|d|
z  z  sŒ|	d|
z  z  }	Œ t)        d|«      D ]  }
|d|
z  z  sŒ|d|
dz
  z  z  }Œ |t,        z   }|dz	  dk(  r|dz  }|t.        z  }||d	z  d
z  z  }n||dz  z  }|r	|t0        z  }||	fS # 1 sw Y   �Œ†xY wc c}w )zoConverts a decimal.Decimal to BID (high bits, low bits).

    :param value: An instance of decimal.Decimal
    Nz'NaN with debug payload is not supportedÚ r   é@   r   é1   l   ÿÿÿ iÿ?  é/   )r9   ÚlocalcontextÚ_DEC128_CTXÚcreate_decimalÚis_infiniteÚ	is_signedÚ_NINFÚ_PINFÚas_tupleÚis_nanÚ
ValueErrorÚis_snanÚ_NSNANÚ_PSNANÚ_NNANÚ_PNANÚintÚjoinÚstrÚ
bit_lengthÚrangeÚminÚ_EXPONENT_BIASÚ_EXPONENT_MASKÚ_SIGN)r$   ÚctxÚsignÚdigitsÚexponentÚdigitÚsignificandrT   ÚhighÚlowÚiÚbiased_exponents               r   Ú_decimal_to_128rd   m   sÄ  € ô
 
×	Ñ	œkÓ	*ð *¨cØ×"Ñ" 5Ó)ˆ÷*ð ×ÑÔØŸ™Ô)ŒuÐ4¬uÐ4à"Ÿ^™^Ó-Ñ€Dˆ&�(à‡|�|„~ÙÜÐFÓGÐGØ�=‰=Œ?Ø"Ÿ_™_Ô.”6Ð:´FÐ:ØŸ™Ô)ŒuÐ4¬uÐ4ä�b—g‘g°vÖ>¨eœs 5�zÒ>Ó?Ó@€KØ×'Ñ'Ó)€Jà€DØ
€CÜ”3�r˜:Ó&Ó'ò ˆØ˜!˜q™&Ó!Ø�1˜‘6‰M‰Cðô �2�zÓ"ò "ˆØ˜!˜q™&Ó!Ø�A˜!˜b™&‘MÑ!‰Dð"ð ¤Ñ/€Oàˆr�z�Q‚Ø�nÑ$ˆØ”ÑˆØ� 6Ñ)¨bÑ0Ñ0‰à� 2Ñ%Ñ%ˆáØ”‰ˆà�ˆ9Ð÷Q*ñ *üò ?s   šF0Ã-F=Æ0F:c                  ó|   — e Zd ZdZdZdZdd„Zdd„Zedd„«       Z	e
dd„«       Zdd„Zdd	„Zdd
„Zdd„Zdd„Zdd„Zy)r"   a»  BSON Decimal128 type::

      >>> Decimal128(Decimal("0.0005"))
      Decimal128('0.0005')
      >>> Decimal128("0.0005")
      Decimal128('0.0005')
      >>> Decimal128((3474527112516337664, 5))
      Decimal128('0.0005')

    :param value: An instance of :class:`decimal.Decimal`, string, or tuple of
        (high bits, low bits) from Binary Integer Decimal (BID) format.

    .. note:: :class:`~Decimal128` uses an instance of :class:`decimal.Context`
      configured for IEEE-754 Decimal128 when validating parameters.
      Signals like :class:`decimal.InvalidOperation`, :class:`decimal.Inexact`,
      and :class:`decimal.Overflow` are trapped and raised as exceptions::

        >>> Decimal128(".13.1")
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          ...
        decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
        >>>
        >>> Decimal128("1E-6177")
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          ...
        decimal.Inexact: [<class 'decimal.Inexact'>]
        >>>
        >>> Decimal128("1E6145")
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          ...
        decimal.Overflow: [<class 'decimal.Overflow'>, <class 'decimal.Rounded'>]

      To ensure the result of a calculation can always be stored as BSON
      Decimal128 use the context returned by
      :func:`create_decimal128_context`::

        >>> import decimal
        >>> decimal128_ctx = create_decimal128_context()
        >>> with decimal.localcontext(decimal128_ctx) as ctx:
        ...     Decimal128(ctx.create_decimal(".13.3"))
        ...
        Decimal128('NaN')
        >>>
        >>> with decimal.localcontext(decimal128_ctx) as ctx:
        ...     Decimal128(ctx.create_decimal("1E-6177"))
        ...
        Decimal128('0E-6176')
        >>>
        >>> with decimal.localcontext(DECIMAL128_CTX) as ctx:
        ...     Decimal128(ctx.create_decimal("1E6145"))
        ...
        Decimal128('Infinity')

      To match the behavior of MongoDB's Decimal128 implementation
      str(Decimal(value)) may not match str(Decimal128(value)) for NaN values::

        >>> Decimal128(Decimal('NaN'))
        Decimal128('NaN')
        >>> Decimal128(Decimal('-NaN'))
        Decimal128('NaN')
        >>> Decimal128(Decimal('sNaN'))
        Decimal128('NaN')
        >>> Decimal128(Decimal('-sNaN'))
        Decimal128('NaN')

      However, :meth:`~Decimal128.to_decimal` will return the exact value::

        >>> Decimal128(Decimal('NaN')).to_decimal()
        Decimal('NaN')
        >>> Decimal128(Decimal('-NaN')).to_decimal()
        Decimal('-NaN')
        >>> Decimal128(Decimal('sNaN')).to_decimal()
        Decimal('sNaN')
        >>> Decimal128(Decimal('-sNaN')).to_decimal()
        Decimal('-sNaN')

      Two instances of :class:`Decimal128` compare equal if their Binary
      Integer Decimal encodings are equal::

        >>> Decimal128('NaN') == Decimal128('NaN')
        True
        >>> Decimal128('NaN').bid == Decimal128('NaN').bid
        True

      This differs from :class:`decimal.Decimal` comparisons for NaN::

        >>> Decimal('NaN') == Decimal('NaN')
        False
    )Ú__highÚ__lowé   c                ó  — t        |t        t        j                  f«      rt	        |«      \  | _        | _        y t        |t        t        f«      r)t        |«      dk7  rt        d«      ‚|\  | _        | _        y t        d|›d�«      ‚)Né   zYInvalid size for creation of Decimal128 from list or tuple. Must have exactly 2 elements.zCannot convert z to Decimal128)Ú
isinstancerS   r9   r   rd   Ú_Decimal128__highÚ_Decimal128__lowÚlistÚtupleÚlenrK   Ú	TypeErrorr#   s     r   Ú__init__zDecimal128.__init__ÿ   sw   € Ü�eœc¤7§?¡?Ð3Ô4Ü&5°eÓ&<Ñ#ˆDŒK˜�Ü˜¤¤e˜}Ô-Ü�5‹z˜QŠÜ ð óð ð
 ',Ñ#ˆDŒK˜�ä˜o¨e¨Y°nÐEÓFÐFr   c           	     ó„  — | j                   }| j                  }|t        z  rdnd}|t        z  t        k(  rt	        j
                  |ddf«      S |t        z  t        k(  rt	        j
                  |ddf«      S |t        z  t        k(  rt	        j
                  |ddf«      S |t        z  t        k(  r'|dz  dz	  t        z
  }t	        j
                  |d	|f«      S |d
z  dz	  t        z
  }t        d«      }d}t        ddd«      D ]  }||z  d|z
  dz  z	  ||<   |dz  }Œ d}t        ddd«      D ]  }||z  d|z
  dz  z	  ||<   |dz  }Œ d}||z  dz	  |d<   t        d„ t        t        j                  |d«      «      D «       «      }t	        j                   t"        «      5 }	|	j%                  |||f«      cddd«       S # 1 sw Y   yxY w)z^Returns an instance of :class:`decimal.Decimal` for this
        :class:`Decimal128`.
        r   r   r,   ÚNÚnÚFl         ÿ rA   )r   l         ü r@   é   éÿ   é   é   éÿÿÿÿé   é   l          é0   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   )rQ   )Ú.0r^   s     r   ú	<genexpr>z(Decimal128.to_decimal.<locals>.<genexpr>1  s   è ø€ ÒO e”s˜5—zÑOùs   ‚ÚbigN)rl   rm   rY   Ú_SNANr9   r   Ú_NANÚ_INFrX   rW   Ú	bytearrayrU   ro   rS   rQ   Ú
from_bytesrB   rC   rD   )
r   r`   ra   r[   r]   ÚarrÚmaskrb   r\   rZ   s
             r   r2   zDecimal128.to_decimal  sÖ  € ð �{‰{ˆØ�j‰jˆØœE’\‰q¨ˆà”5‰LœUÒ"Ü—?‘? D¨"¨c ?Ó3Ð3Ø”T‰kœdÒ"Ü—?‘? D¨"¨c ?Ó3Ð3Ø”T‰kœdÒ"Ü—?‘? D¨"¨c ?Ó3Ð3à”>Ñ!¤nÒ4ØÐ 2Ñ2°rÑ9¼^ÑKˆHÜ—?‘? D¨$°Ð#9Ó:Ð:àÐ 2Ñ2°rÑ9¼^ÑKˆHä˜‹mˆØ!ˆÜ�r˜1˜bÓ!ò 	ˆAØ˜D‘j r¨A¡v°!¡mÑ4ˆC�‰FØ˜1‘9‰Dð	ð "ˆÜ�q˜!˜R“ò 	ˆAØ˜T‘k¨¨A©°!¡|Ñ4ˆC�‰FØ˜1‘9‰Dð	ð "ˆØ˜‘+ "Ñ$ˆˆA‰ô ÑO¬s´3·>±>À#ÀuÓ3MÓ/NÔOÓOˆä×!Ñ!¤+Ó.ð 	@°#Ø×%Ñ% t¨V°XÐ&>Ó?÷	@÷ 	@ò 	@ús   ÆF6Æ6F?c                óÒ   — t        |t        «      st        dt        |«      › �«      ‚t	        |«      dk7  rt        d«      ‚ | t        |dd «      d   t        |dd «      d   f«      S )zçCreate an instance of :class:`Decimal128` from Binary Integer
        Decimal string.

        :param value: 16 byte string (128-bit IEEE 754-2008 decimal floating
            point in Binary Integer Decimal (BID) format).
        z(value must be an instance of bytes, not é   zvalue must be exactly 16 bytesr}   Nr   )rk   Úbytesrq   Útyperp   rK   Ú
_UNPACK_64)Úclsr$   s     r   Úfrom_bidzDecimal128.from_bid6  sm   € ô ˜%¤Ô'ÜÐFÄtÈEÃ{ÀmÐTÓUÐUÜˆu‹:˜ÒÜÐ=Ó>Ð>Ù”J˜u Q R˜yÓ)¨!Ñ,¬j¸¸rÀ¸Ó.CÀAÑ.FÐGÓHÐHr   c                óX   — t        | j                  «      t        | j                  «      z   S )z;The Binary Integer Decimal (BID) encoding of this instance.)Ú_PACK_64rm   rl   r   s    r   ÚbidzDecimal128.bidD  s!   € ô ˜Ÿ
™
Ó#¤h¨t¯{©{Ó&;Ñ;Ð;r   c                óZ   — | j                  «       }|j                  «       ryt        |«      S )NÚNaN)r2   rJ   rS   )r   Údecs     r   Ú__str__zDecimal128.__str__I  s#   € Ø�o‰oÓˆØ�:‰:Œ<àÜ�3‹xˆr   c                ó   — d| ›d�S )NzDecimal128('z')r,   r   s    r   Ú__repr__zDecimal128.__repr__P  s   € Ø˜d˜X RÐ(Ð(r   c                ó"   — |\  | _         | _        y r   ©rl   rm   r#   s     r   Ú__setstate__zDecimal128.__setstate__S  s   € Ø"'ÑˆŒ�T•Zr   c                ó2   — | j                   | j                  fS r   r›   r   s    r   Ú__getstate__zDecimal128.__getstate__V  s   € Ø�{‰{˜DŸJ™JÐ&Ð&r   c                ó`   — t        |t        «      r| j                  |j                  k(  S t        S r   )rk   r"   r“   ÚNotImplemented©r   Úothers     r   Ú__eq__zDecimal128.__eq__Y  s%   € Ü�eœZÔ(Ø—8‘8˜uŸy™yÑ(Ð(ÜÐr   c                ó   — | |k(   S r   r,   r¡   s     r   Ú__ne__zDecimal128.__ne__^  s   € Ø˜5‘=Ð Ð r   N)r$   Ú_VALUE_OPTIONSr&   ÚNone)r&   r5   )r�   r4   r$   rŒ   r&   r"   )r&   rŒ   )r&   rS   )r$   úTuple[int, int]r&   r§   )r&   r¨   )r¢   r   r&   Úbool)r'   r(   r)   r*   Ú	__slots__Ú_type_markerrr   r2   Úclassmethodr�   r+   r“   r—   r™   rœ   rž   r£   r¥   r,   r   r   r"   r"   �   sj   „ ñ[ðz $€Ià€LóGó'@ðR òIó ðIð ò<ó ð<óó)ó(ó'óô
!r   r"   r,   )r&   zdecimal.Context)r$   r¦   r&   r¨   )4r*   Ú
__future__r   r9   Ústructr   Útypingr   r   r   r	   r
   Úbson.codec_optionsr   r   ÚStructÚpackr’   ÚunpackrŽ   rX   rW   Ú_EXPONENT_MAXÚ_EXPONENT_MINÚ_MAX_DIGITSr…   r„   rƒ   rY   rG   rH   rO   rP   rM   rN   ÚROUND_HALF_EVENÚInvalidOperationÚOverflowÚInexactr7   r:   r8   rC   ÚfloatrS   rQ   r¦   r   r.   r<   rd   r"   r,   r   r   ú<module>r¼      sq  ðñõ #ã Û Ý ß 4Õ 4ç 7àˆ6�=‰=˜Ó×#Ñ#€ØˆV�]‰]˜4Ó ×'Ñ'€
à€Ø€Ø€Ø€Ø€à€Ø€Ø€Ø€à	�‰�qÐ€Ø	ˆqˆ	€Ø	�‰�qÐ€Ø	ˆqˆ	€Ø
�%‰-˜Ð	€Ø
�ˆ€ð Ø×'Ñ'ØØØØØ×&Ñ&¨×(8Ñ(8¸'¿/¹/ÐJØñ	€ð ˆg�o‰oÑ4 × 1Ñ 1Ó 3Ñ4€Ø�w—‘¨¨s°E¸#¸xÈ¹}ÈcÐ:QÑ4RÐRÑS€ô!�[ô !ô$"�[ô "ó$#ó-÷`B!ò B!r   