a
    ze:}                 
   @   sl  g d Z eZdZdZdZddlZddlZddl	Z	zddl
mZ eddZW n eyd   d	d
 ZY n0 dZdZdZdZdZdZdZdZdZdZe	jdkrdZdZdZndZdZdZeed  ZG dd deZG dd deZ G dd deZ!G d d! d!e!Z"G d"d# d#ee#Z$G d$d% d%e!Z%G d&d' d'e!e#Z&G d(d) d)eZ'G d*d+ d+e!Z(G d,d- d-eZ)G d.d/ d/eZ*G d0d1 d1e'e)Z+G d2d3 d3e'e)e*Z,G d4d5 d5ee-Z.e e$e'e+e)e,e!e*e.g	Z/e"e!e%e!e&e!e(e!iZ0eeeeeeeefZ1ddl2Z2e23d6Z4d7d8 Z5d9d: Z6[2dd;d<Z7G d=d> d>e8Z9dd@dAZ:ej;<e9 G dBdC dCe8Z=G dDdE dEe8Z>G dFdG dGe8Z?ddHdIZ@eAjBZCdJdK ZDdLdM ZEdNdO ZFdPdQ ZGddSdTZHdUdV ZIdWdX ZJG dYdZ dZe8ZKeK jLZMdd[d\ZNd]d^ ZOd_d` ZPdadbdcdddedfdgdhdidj	fdkdlZQddmdnZRddodpZSe>dqee$e+e!gg drdsdddtZTe>duee$e+e!e e,gg dvZUe>dueg g dvZVddlWZWeWXdweWjYeWjZB j[Z\eWXdxj[Z]eWXdyj[Z^eWXdzeWjYeWj_B Z`[WzddlaZbW n ey   Y n0 dd{d|Zcd}d~ Zddd ZedddZfdd Zgdd Zhe9dZie9dZje9dZke9dZle9dZme9dZneiejfZoe	jpjqZre	jpjsZte	jpjuZvewdherd erZx[	dS ))%DecimalContextDecimalTupleDefaultContextBasicContextExtendedContextDecimalExceptionClampedInvalidOperationDivisionByZeroInexactRounded	SubnormalOverflow	UnderflowFloatOperationDivisionImpossibleInvalidContextConversionSyntaxDivisionUndefined
ROUND_DOWNROUND_HALF_UPROUND_HALF_EVENROUND_CEILINGROUND_FLOORROUND_UPROUND_HALF_DOWN
ROUND_05UP
setcontext
getcontextlocalcontextMAX_PRECMAX_EMAXMIN_EMIN	MIN_ETINYHAVE_THREADSHAVE_CONTEXTVARZdecimalz1.70z2.4.2    N)
namedtupler   zsign digits exponentc                  G   s   | S N )argsr)   r)    /usr/lib/python3.9/_pydecimal.py<lambda>       r,   r   r   r   r   r   r   r   r   Tl    l   NZolNZoi@Ti   c                   @   s   e Zd Zdd ZdS )r   c                 G   s   d S r(   r)   selfcontextr*   r)   r)   r+   handle   s    zDecimalException.handleN__name__
__module____qualname__r2   r)   r)   r)   r+   r      s   r   c                   @   s   e Zd ZdS )r   Nr4   r5   r6   r)   r)   r)   r+   r      s   r   c                   @   s   e Zd Zdd ZdS )r	   c                 G   s,   |r(t |d j|d jdd}||S tS )Nr&   nT)_dec_from_triple_sign_int_fix_nan_NaN)r0   r1   r*   ansr)   r)   r+   r2      s    
zInvalidOperation.handleNr3   r)   r)   r)   r+   r	      s   r	   c                   @   s   e Zd Zdd ZdS )r   c                 G   s   t S r(   r=   r/   r)   r)   r+   r2     s    zConversionSyntax.handleNr3   r)   r)   r)   r+   r      s   r   c                   @   s   e Zd Zdd ZdS )r
   c                 G   s   t | S r(   )_SignedInfinityr0   r1   signr*   r)   r)   r+   r2     s    zDivisionByZero.handleNr3   r)   r)   r)   r+   r
   
  s   r
   c                   @   s   e Zd Zdd ZdS )r   c                 G   s   t S r(   r?   r/   r)   r)   r+   r2   "  s    zDivisionImpossible.handleNr3   r)   r)   r)   r+   r     s   r   c                   @   s   e Zd Zdd ZdS )r   c                 G   s   t S r(   r?   r/   r)   r)   r+   r2   -  s    zDivisionUndefined.handleNr3   r)   r)   r)   r+   r   %  s   r   c                   @   s   e Zd ZdS )r   Nr7   r)   r)   r)   r+   r   0  s   r   c                   @   s   e Zd Zdd ZdS )r   c                 G   s   t S r(   r?   r/   r)   r)   r+   r2   G  s    zInvalidContext.handleNr3   r)   r)   r)   r+   r   <  s   r   c                   @   s   e Zd ZdS )r   Nr7   r)   r)   r)   r+   r   J  s   r   c                   @   s   e Zd ZdS )r   Nr7   r)   r)   r)   r+   r   V  s   r   c                   @   s   e Zd Zdd ZdS )r   c                 G   s   |j ttttfv rt| S |dkrR|j tkr4t| S t|d|j |j	|j d S |dkr|j t
krlt| S t|d|j |j	|j d S d S )Nr&   9r.   )roundingr   r   r   r   r@   r   r9   precEmaxr   rA   r)   r)   r+   r2   w  s     

zOverflow.handleNr3   r)   r)   r)   r+   r   a  s   r   c                   @   s   e Zd ZdS )r   Nr7   r)   r)   r)   r+   r     s   r   c                   @   s   e Zd ZdS )r   Nr7   r)   r)   r)   r+   r     s   r   Zdecimal_contextc                  C   s6   z
t  W S  ty0   t } t |  |  Y S 0 d S r(   )_current_context_vargetLookupErrorr   setr1   r)   r)   r+   r     s    

r   c                 C   s,   | t ttfv r|  } |   t|  d S r(   )r   r   r   copyclear_flagsrG   rJ   rK   r)   r)   r+   r     s    r   c                 C   s   | d u rt  } t| S r(   )r   _ContextManager)ctxr)   r)   r+   r     s    $r   c                
   @   s  e Zd ZdZdddZedd Zdd	 Zd
d ZdddZ	dd Z
dd Zdd ZdddZdddZdddZdddZdddZdddZd d! Zd"d# Zd$d% Zd&d' Zdd)d*Zdd+d,Zdd-d.Zdd/d0Zdd2d3Zdd4d5ZeZdd6d7Zd d8d9Zdd:d;Z e Z!dd<d=Z"d>d? Z#dd@dAZ$ddBdCZ%ddDdEZ&ddFdGZ'ddHdIZ(ddJdKZ)d	dLdMZ*d
dNdOZ+dPdQ Z,dRdS Z-e-Z.e/dTdU Z0e/dVdW Z1dXdY Z2dZd[ Z3d\d] Z4d^d_ Z5d`da Z6dbdc Z7ddde Z8dfdg Z9dhdi Z:djdk Z;dldm Z<dndo Z=e>e6e7e8e9e:e;e<e=dpZ?ddqdrZ@dsdt ZAdudv ZBddwdxZCddydzZDd{d| ZEdd}d~ZFdddZGdddZHdddZIdddZJdd ZKdd ZLdddZMdddZNeNZOdddZPdddZQdddZRdd ZSdd ZTdd ZUdd ZVdddZWdddZXdddZYdd ZZdd Z[dddZ\dddZ]dd Z^dd Z_dd Z`dd ZadddZbdd Zcdd Zddd ZedddZfdd Zgdd ZhdddZiddĄ Zjd ddƄZkd!ddȄZlddʄ Zmdd̄ Znd"dd΄Zod#ddЄZpd$dd҄Zqd%ddԄZrd&ddքZsd'dd؄Ztd(ddڄZud)dd܄Zvd*ddބZwd+ddZxdd Zyd,ddZzd-ddZ{d.ddZ|dd Z}dd Z~dd Zd/ddZdS (0  r   )_expr;   r:   _is_special0Nc                 C   s  t | }t|tr$t| dd}|d u rP|d u r@t }|t	d| S |
ddkrfd|_nd|_|
d}|d ur|
d	pd}t|
d
pd}tt|| |_|t| |_d|_nZ|
d}|d urtt|pdd|_|
drd|_nd|_nd|_d|_d|_|S t|trf|dkrBd|_nd|_d|_tt||_d|_|S t|tr|j|_|j|_|j|_|j|_|S t|tr|j|_t|j|_t|j|_d|_|S t|ttfr"t|dkrtdt|d tr|d dv std|d |_|d dkrHd|_|d |_d|_ng }	|d D ]R}
t|
trd|
  kr|dkrn n|	s|
dkr|	|
 ntdqT|d dv rdtt|	|_|d |_d|_nDt|d trdtt|	pdg|_|d |_d|_ntd|S t|trx|d u r>t }|td t|}|j|_|j|_|j|_|j|_|S t d| d S )N_ zInvalid literal for Decimal: %rrB   -r.   r&   intZfracexprR   FdiagsignalNr8   FT   ztInvalid tuple size in creation of Decimal from list or tuple.  The list or tuple should have exactly three elements.r&   r.   z|Invalid sign.  The first value in the tuple should be an integer; either 0 for a positive number or 1 for a negative number.   	   zTThe second value in the tuple must be composed of integers in the range 0 through 9.r8   rZ   zUThe third value in the tuple must be an integer, or one of the strings 'F', 'n', 'N'.;strict semantics for mixing floats and Decimals are enabledzCannot convert %r to Decimal)!object__new__
isinstancestr_parserstripreplacer   _raise_errorr   groupr:   rV   r;   lenrP   rQ   lstripabsr   _WorkReprB   rW   listtuple
ValueErrorappendjoinmapfloatr   
from_float	TypeError)clsvaluer1   r0   mintpartfracpartrW   rX   digitsZdigitr)   r)   r+   rc   
  s    






(



zDecimal.__new__c                 C   s   t |tr,|dkrdnd}d}tt|}nzt |trt|sJt|rV| t|S t	d|dkrld}nd}t|
 \}}| d }t|d|  }ntdt||| }| tu r|S | |S d S )Nr&   r.   g      ?   zargument must be int or float.)rd   rV   re   rm   ru   _mathisinfisnanreprcopysignas_integer_ratio
bit_lengthrw   r9   r   )rx   frB   kcoeffr8   dresultr)   r)   r+   rv     s$    

zDecimal.from_floatc                 C   s(   | j r$| j}|dkrdS |dkr$dS dS )Nr8   r.   rZ   r^   r&   )rQ   rP   )r0   rW   r)   r)   r+   _isnan  s    zDecimal._isnanc                 C   s   | j dkr| jrdS dS dS )Nr[   r.   r&   )rP   r:   r0   r)   r)   r+   _isinfinity  s
    
zDecimal._isinfinityc                 C   s|   |   }|d u rd}n|  }|s&|rx|d u r4t }|dkrJ|td| S |dkr`|td|S |rn| |S ||S dS )NFr^   sNaNr&   )r   r   ri   r	   r<   )r0   otherr1   self_is_nanother_is_nanr)   r)   r+   _check_nans  s&    


zDecimal._check_nansc                 C   sv   |d u rt  }| js|jrr|  r0|td| S | rF|td|S |  r\|td| S | rr|td|S dS )Nzcomparison involving sNaNzcomparison involving NaNr&   )r   rQ   is_snanri   r	   is_qnanr0   r   r1   r)   r)   r+   _compare_check_nans	  s0    zDecimal._compare_check_nansc                 C   s   | j p| jdkS NrR   rQ   r;   r   r)   r)   r+   __bool__*  s    zDecimal.__bool__c                 C   s  | j s|j r8|  }| }||kr(dS ||k r4dS dS | sP|sDdS d|j  S |s^d| j S |j| jk rndS | j|jk r~dS |  }| }||kr| jd| j|j   }|jd|j| j   }||krdS ||k rd| j  S d| j S n ||krd| j S d| j  S d S )Nr&   r   r.   rR   )rQ   r   r:   adjustedr;   rP   )r0   r   Zself_infZ	other_infself_adjustedZother_adjustedself_paddedZother_paddedr)   r)   r+   _cmp1  s>    


zDecimal._cmpc                 C   s<   t | |dd\} }|tu r|S | ||r.dS | |dkS )NT)equality_opFr&   )_convert_for_comparisonNotImplementedr   r   r   r)   r)   r+   __eq__q  s    zDecimal.__eq__c                 C   s<   t | |\} }|tu r|S | ||}|r.dS | |dk S NFr&   r   r   r   r   r0   r   r1   r>   r)   r)   r+   __lt__y  s    zDecimal.__lt__c                 C   s<   t | |\} }|tu r|S | ||}|r.dS | |dkS r   r   r   r)   r)   r+   __le__  s    zDecimal.__le__c                 C   s<   t | |\} }|tu r|S | ||}|r.dS | |dkS r   r   r   r)   r)   r+   __gt__  s    zDecimal.__gt__c                 C   s<   t | |\} }|tu r|S | ||}|r.dS | |dkS r   r   r   r)   r)   r+   __ge__  s    zDecimal.__ge__c                 C   s>   t |dd}| js|r0|jr0| ||}|r0|S t| |S NTraiseit)_convert_otherrQ   r   r   r   r   r)   r)   r+   compare  s    zDecimal.comparec                 C   s   | j r4|  rtdn|  r$tS | jr0t S tS | jdkrNtd| jt	}ntt
| j t	}t| j| t	 }| dkr||n| }|dkrdS |S )Nz"Cannot hash a signaling NaN value.r&   
   r   )rQ   r   rw   is_nan_PyHASH_NANr:   _PyHASH_INFrP   pow_PyHASH_MODULUS_PyHASH_10INVrV   r;   )r0   Zexp_hashZhash_r>   r)   r)   r+   __hash__  s    

zDecimal.__hash__c                 C   s   t | jttt| j| jS r(   )r   r:   rp   rt   rV   r;   rP   r   r)   r)   r+   as_tuple  s    zDecimal.as_tuplec                 C   s   | j r |  rtdntd| s(dS t| j}| jdkrR|d| j  d }}nn| j }|dkr|d dkr|d }|d8 }qZ| j }t|| @  d |}|r||L }||8 }d| |> }| j	r| }||fS )Nz#cannot convert NaN to integer ratioz(cannot convert Infinity to integer ratior]   r&   r   r.   r~   )
rQ   r   rq   OverflowErrorrV   r;   rP   minr   r:   )r0   r8   r   Zd5Zd2Zshift2r)   r)   r+   r     s,    



zDecimal.as_integer_ratioc                 C   s   dt |  S )NzDecimal('%s'))re   r   r)   r)   r+   __repr__  s    zDecimal.__repr__Fc           	      C   sb  ddg| j  }| jrL| jdkr&|d S | jdkr>|d | j S |d | j S | jt| j }| jdkrt|d	krt|}n6|s~d
}n,| jdkr|d
 d d
 }n|d
 d d
 }|dkrd}dd|   | j }nL|t| jkr| jd|t| j   }d}n | jd | }d| j|d   }||kr(d}n*|d u r8t }ddg|j d||   }|| | | S )NrT   rU   r[   ZInfinityr8   NaNr   r&   r.   rR   r\   .eEz%+d)r:   rQ   rP   r;   rk   r   capitals)	r0   engr1   rB   
leftdigitsdotplacer{   r|   rW   r)   r)   r+   __str__  s:    




zDecimal.__str__c                 C   s   | j d|dS )NT)r   r1   )r   r0   r1   r)   r)   r+   to_eng_string;  s    zDecimal.to_eng_stringc                 C   sR   | j r| j|d}|r|S |d u r(t }| s@|jtkr@|  }n|  }||S NrK   )rQ   r   r   rD   r   copy_abscopy_negate_fixr0   r1   r>   r)   r)   r+   __neg__D  s    
zDecimal.__neg__c                 C   sR   | j r| j|d}|r|S |d u r(t }| s@|jtkr@|  }nt| }||S r   )rQ   r   r   rD   r   r   r   r   r   r)   r)   r+   __pos__Z  s    
zDecimal.__pos__Tc                 C   sJ   |s|   S | jr&| j|d}|r&|S | jr:| j|d}n| j|d}|S r   )r   rQ   r   r:   r   r   )r0   roundr1   r>   r)   r)   r+   __abs__o  s    zDecimal.__abs__c           
      C   sh  t |}|tu r|S |d u r"t }| js.|jr| ||}|rB|S |  rr| j|jkrj| rj|tdS t	| S | rt	|S t
| j|j}d}|jtkr| j|jkrd}| s|st
| j|j}|rd}t|d|}||}|S | st||j|j d }|||j}||}|S |sVt|| j|j d }| ||j}||}|S t| }t|}t|||j\}}t }	|j|jkr|j|jkrt|d|}||}|S |j|jk r|| }}|jdkrd|	_|j|j |_|_nd|	_n&|jdkrd|	_d\|_|_nd|	_|jdkr<|j|j |	_n|j|j |	_|j|	_t	|	}||}|S )Nz
-INF + INFr&   r.   rR   )r&   r&   )r   r   r   rQ   r   r   r:   ri   r	   r   r   rP   rD   r   r9   r   maxrE   _rescalern   
_normalizerB   rV   rW   )
r0   r   r1   r>   rW   ZnegativezerorB   op1op2r   r)   r)   r+   __add__  s|    





zDecimal.__add__c                 C   sH   t |}|tu r|S | js |jr6| j||d}|r6|S | j| |dS r   )r   r   rQ   r   r   r   r   r)   r)   r+   __sub__  s    zDecimal.__sub__c                 C   s"   t |}|tu r|S |j| |dS r   )r   r   r   r   r)   r)   r+   __rsub__  s    zDecimal.__rsub__c                 C   s@  t |}|tu r|S |d u r"t }| j|jA }| js:|jr| ||}|rN|S |  rn|sf|tdS t	| S | r| s|tdS t	| S | j
|j
 }| r|st|d|}||}|S | jdkrt||j|}||}|S |jdkr
t|| j|}||}|S t| }t|}t|t|j|j |}||}|S )Nz(+-)INF * 0z0 * (+-)INFrR   1)r   r   r   r:   rQ   r   r   ri   r	   r@   rP   r9   r   r;   rn   re   rV   )r0   r   r1   Z
resultsignr>   Z	resultexpr   r   r)   r)   r+   __mul__  sH    




zDecimal.__mul__c                 C   s  t |}|tu rtS |d u r"t }| j|jA }| js:|jr| ||}|rN|S |  rj| rj|tdS |  rzt	| S | r|t
d t|d| S |s| s|tdS |td|S | s| j|j }d}nt|jt| j |j d }| j|j | }t| }t|}	|dkr:t|jd|  |	j\}}
nt|j|	jd|   \}}
|
rt|d	 dkr|d7 }n8| j|j }||k r|d dkr|d }|d7 }qt|t||}||S )
Nz(+-)INF/(+-)INFzDivision by infinityrR   z0 / 0zx / 0r&   r.   r   r~   )r   r   r   r:   rQ   r   r   ri   r	   r@   r   r9   Etinyr   r
   rP   rk   r;   rE   rn   divmodrV   re   r   )r0   r   r1   rB   r>   rW   r   shiftr   r   	remainder	ideal_expr)   r)   r+   __truediv__,  sP    

zDecimal.__truediv__c                 C   s  | j |j A }| r| j}nt| j|j}|  |  }| rN| sN|dkrht|dd| ||jfS ||jkr
t	| }t	|}|j
|j
kr| jd|j
|j
  9  _n| jd|j
|j
  9  _t|j|j\}}	|d|j k r
t|t|dt| j t|	|fS |td}
|
|
fS )Nr   rR   r&   r   z%quotient too large in //, % or divmod)r:   r   rP   r   r   r9   r   rD   rE   rn   rW   rV   r   re   ri   r   )r0   r   r1   rB   r   expdiffr   r   qrr>   r)   r)   r+   _divideg  s0    
zDecimal._dividec                 C   s"   t |}|tu r|S |j| |dS r   )r   r   r   r   r)   r)   r+   __rtruediv__  s    zDecimal.__rtruediv__c                 C   s   t |}|tu r|S |d u r"t }| ||}|r:||fS | j|jA }|  r~| rj|td}||fS t| |tdfS |s| s|t	d}||fS |t
d||tdfS | ||\}}||}||fS )Nzdivmod(INF, INF)INF % xzdivmod(0, 0)x // 0x % 0)r   r   r   r   r:   r   ri   r	   r@   r   r
   r   r   )r0   r   r1   r>   rB   Zquotientr   r)   r)   r+   
__divmod__  s4    


zDecimal.__divmod__c                 C   s"   t |}|tu r|S |j| |dS r   )r   r   r   r   r)   r)   r+   __rdivmod__  s    zDecimal.__rdivmod__c                 C   s   t |}|tu r|S |d u r"t }| ||}|r6|S |  rJ|tdS |sj| r^|tdS |tdS | ||d }|	|}|S )Nr   r   z0 % 0r.   )
r   r   r   r   r   ri   r	   r   r   r   )r0   r   r1   r>   r   r)   r)   r+   __mod__  s"    
zDecimal.__mod__c                 C   s"   t |}|tu r|S |j| |dS r   )r   r   r   r   r)   r)   r+   __rmod__  s    zDecimal.__rmod__c                 C   s  |d u rt  }t|dd}| ||}|r.|S |  rB|tdS |sb| rV|tdS |tdS | r|t| }||S t	| j
|j
}| st| jd|}||S |  |  }||jd kr|tS |dkr| ||j}||S t| }t|}|j|jkr(| jd	|j|j  9  _n| jd	|j|j  9  _t|j|j\}}	d
|	 |d@  |jkr~|	|j8 }	|d7 }|d	|j kr|tS | j}
|	dk rd|
 }
|	 }	t|
t|	|}||S )NTr   zremainder_near(infinity, x)zremainder_near(x, 0)zremainder_near(0, 0)rR   r.   r   r   r^   r&   )r   r   r   r   ri   r	   r   r   r   r   rP   r9   r:   r   rE   r   r   rD   rn   rW   rV   r   re   )r0   r   r1   r>   ideal_exponentr   r   r   r   r   rB   r)   r)   r+   remainder_near  s`    






zDecimal.remainder_nearc                 C   s   t |}|tu r|S |d u r"t }| ||}|r6|S |  rb| rR|tdS t| j|jA  S |s| r|t	d| j|jA S |t
dS | ||d S )Nz
INF // INFr   z0 // 0r&   )r   r   r   r   r   ri   r	   r@   r:   r
   r   r   r   r)   r)   r+   __floordiv__'  s&    
zDecimal.__floordiv__c                 C   s"   t |}|tu r|S |j| |dS r   )r   r   r   r   r)   r)   r+   __rfloordiv__C  s    zDecimal.__rfloordiv__c                 C   s8   |   r(|  rtd| jr"dnd}nt| }t|S )Nz%Cannot convert signaling NaN to floatz-nannan)r   r   rq   r:   re   ru   r0   sr)   r)   r+   	__float__J  s    zDecimal.__float__c                 C   st   | j r(|  rtdn|  r(tdd| j }| jdkrT|t| j d| j  S |t| jd | j pjd S d S )NzCannot convert NaN to integerz"Cannot convert infinity to integerr   r&   r   rR   )	rQ   r   rq   r   r   r:   rP   rV   r;   r   r)   r)   r+   __int__T  s    


zDecimal.__int__c                 C   s   | S r(   r)   r   r)   r)   r+   realc  s    zDecimal.realc                 C   s   t dS Nr&   r   r   r)   r)   r+   imagg  s    zDecimal.imagc                 C   s   | S r(   r)   r   r)   r)   r+   	conjugatek  s    zDecimal.conjugatec                 C   s   t t| S r(   )complexru   r   r)   r)   r+   __complex__n  s    zDecimal.__complex__c                 C   sR   | j }|j|j }t||krJ|t|| d  d}t| j|| jdS t| S )NrR   T)	r;   rE   clamprk   rl   r9   r:   rP   r   )r0   r1   payloadZmax_payload_lenr)   r)   r+   r<   q  s    zDecimal._fix_nanc                 C   sX  | j r |  r| |S t| S | }| }| s|j|g|j }tt	| j
||}|| j
krx|t t| jd|S t| S t| j| j
 |j }||kr|td| j}|t |t |S ||k }|r|}| j
|k rt| j| j
 | }	|	dk rt| jd|d } d}	| j|j }
|
| |	}| jd |	 p>d}|dkr~tt|d }t||jkr~|d d }|d7 }||kr|td| j}nt| j||}|r|r|t |r|t |r|t |t |s|t |S |r|t |jdkrP| j
|krP|t | jd| j
|   }t| j||S t| S )NrR   
above Emaxr&   r   r.   r   )rQ   r   r<   r   r   EtoprF   r   r   r   rP   ri   r   r9   r:   rk   r;   rE   r   r   r   _pick_rounding_functionrD   re   rV   r   r   )r0   r1   r   r   exp_maxZnew_expZexp_minr>   Zself_is_subnormalr}   Zrounding_methodchangedr   r   r)   r)   r+   r   }  sn    
















zDecimal._fixc                 C   s   t | j|rdS dS d S )Nr&   r   )
_all_zerosr;   r0   rE   r)   r)   r+   _round_down  s    zDecimal._round_downc                 C   s   |  | S r(   )r  r  r)   r)   r+   	_round_up  s    zDecimal._round_upc                 C   s*   | j | dv rdS t| j |r"dS dS d S )NZ56789r.   r&   r   )r;   r  r  r)   r)   r+   _round_half_up  s
    zDecimal._round_half_upc                 C   s   t | j|rdS | |S d S )Nr   _exact_halfr;   r  r  r)   r)   r+   _round_half_down  s    zDecimal._round_half_downc                 C   s8   t | j|r*|dks&| j|d  dv r*dS | |S d S )Nr&   r.   02468r   r	  r  r)   r)   r+   _round_half_even  s    zDecimal._round_half_evenc                 C   s    | j r| |S | | S d S r(   r:   r  r  r)   r)   r+   _round_ceiling  s    
zDecimal._round_ceilingc                 C   s    | j s| |S | | S d S r(   r  r  r)   r)   r+   _round_floor  s    
zDecimal._round_floorc                 C   s0   |r | j |d  dvr | |S | | S d S )Nr.   Z05)r;   r  r  r)   r)   r+   _round_05up  s    
zDecimal._round_05up)r   r   r   r   r   r   r   r   c                 C   sb   |d ur2t |tstdtdd| }| |S | jrR|  rJtdntdt| 	dt
S )Nz+Second argument to round should be integralr&   r   cannot round a NaNcannot round an infinity)rd   rV   rw   r9   quantizerQ   r   rq   r   r   r   )r0   r8   rW   r)   r)   r+   	__round__&  s    /


zDecimal.__round__c                 C   s0   | j r |  rtdntdt| dtS Nr  r  r&   )rQ   r   rq   r   rV   r   r   r   r)   r)   r+   	__floor__d  s
    
zDecimal.__floor__c                 C   s0   | j r |  rtdntdt| dtS r  )rQ   r   rq   r   rV   r   r   r   r)   r)   r+   __ceil__s  s
    
zDecimal.__ceil__c                 C   s  t |dd}t |dd}| js$|jr|d u r2t }| jdkrJ|td| S |jdkrb|td|S | jdkrr| }nf|jdkr|}nV| jdkr|s|tdS t| j|jA  }n*|jdkr| s|tdS t| j|jA  }n0t| j|jA t	t
| jt
|j | j|j }|||S )	NTr   rZ   r   r8   r[   zINF * 0 in fmaz0 * INF in fma)r   rQ   r   rP   ri   r	   r@   r:   r9   re   rV   r;   r   )r0   r   thirdr1   productr)   r)   r+   fma  s<    






zDecimal.fmac                 C   s  t |}|tu r|S t |}|tu r(|S |d u r6t }|  }| }| }|sZ|sZ|r|dkrp|td| S |dkr|td|S |dkr|td|S |r| |S |r||S ||S |  r| r| s|tdS |dk r|tdS |s|tdS | |j	kr(|tdS |s@| s@|tdS |
 rPd}n| j}tt|}t|  }t| }	|j| td	|j| | }t|	jD ]}
t|d	|}qt||	j|}t|t|dS )
Nr^   r   z@pow() 3rd argument not allowed unless all arguments are integersr&   zApow() 2nd argument cannot be negative when 3rd argument specifiedzpow() 3rd argument cannot be 0zSinsufficient precision: pow() 3rd argument must not have more than precision digitszXat least one of pow() 1st argument and 2nd argument must be nonzero; 0**0 is not definedr   )r   r   r   r   ri   r	   r<   
_isintegerr   rE   _isevenr:   rm   rV   rn   to_integral_valuer   rW   ranger9   re   )r0   r   modulor1   r   r   Zmodulo_is_nanrB   baseexponentir)   r)   r+   _power_modulo  s    



zDecimal._power_moduloc                 C   s  t | }|j|j }}|d dkr4|d }|d7 }qt |}|j|j }}|d dkrh|d }|d7 }qJ|dkr||9 }|d dkr|d }|d7 }qz|dk rd S |d|  }	|jdkr|	 }	| r|jdkr| jt| }
t|	|
 |d }nd}tddd|  |	| S |jdkr|d }|dv r|| @ |krBd S t	|d }|d d }|t
t|krpd S t|| |}t|| |}|d u s|d u rd S ||krd S d	| }n|d	krt	|d
 d }td	| |\}}|rd S |d	 dkr|d	 }|d8 }q|d d }|t
t|kr6d S t|| |}t|| |}|d u sf|d u rjd S ||krxd S d| }nd S |d| krd S | | }tdt||S |dkr|d|  d }}n|dkrt
tt|| | krd S t	|}|dkr,t
tt|| | kr,d S |d|   }}|d |d   kr\dkrtn n|d }|d }q<|d	 |d	   krdkrn n|d	 }|d	 }qt|dkrX|dkr||krd S t||\}}|dkrd S dt	| |  > }t|||d  \}}||kr$q<n||d  | | }q||krP|dksTd S |}|dkr|||d t| kr|d S || }||9 }|d| krd S t|}| r|jdkr| jt| }
t||
 |t
| }nd}td|d|  || S )Nr   r&   r.   r   rR   )r^            ]   A   r~      r\   r^   d   )rn   rV   rW   rB   r  r:   rP   r   r9   _nbitsrk   re   _decimal_lshift_exactr   rm   	_log10_lb)r0   r   pxxcxeyycyer"  r   ZzerosZ
last_digitr   Zemaxr   rz   r8   Zxc_bitsremar   r   Zstr_xcr)   r)   r+   _power_exact  s    :












&&$$


 zDecimal._power_exactc                 C   s4  |d ur|  |||S t|}|tu r*|S |d u r8t }| ||}|rL|S |sd| s`|tdS tS d}| jdkr|	 r|
 sd}n| r|tdS |  } | s|jdkrt|ddS t| S |  r|jdkrt| S t|ddS | tkr|	 rZ|jdkrd}n||jkr"|j}nt|}| j| }|d|j k rxd|j }|t n|t |t d|j }t|dd|   |S |  }| r|jdk|dk krt|ddS t| S d }d}	|  |  }
|dk|jdkkr|
tt|jkrHt|d|jd }n,| }|
tt| krHt|d|d }|d u r| ||jd }|d ur|dkrtd|j|j}d}	|d u r8|j}t| }|j|j }}t|}|j|j }}|jdkr| }d	}t|||||| \}}|d
dtt|| d    rq(|d	7 }qt|t||}|	r&|	 s&t|j|jkr|jd t|j }t|j|jd|  |j| }|  }|!  t"D ]}d|j#|< q|$|}|t |j%t& r|t' |j%t( r|t(d|j t't&ttt)fD ]}|j%| r|| qn
|$|}|S )Nz0 ** 0r&   r.   z+x ** y with x negative and y not an integerrR   r   FTr\   r~   r   r   )*r$  r   r   r   r   ri   r	   _Oner:   r  r  r   r9   r@   r   rE   rV   rP   r   r   r   _log10_exp_boundrk   re   rF   r   r8  r;   rn   rW   rB   _dpowerrL   rM   _signalstrapsr   flagsr   r   r   r   )r0   r   r   r1   r>   Zresult_signZ
multiplierrW   Zself_adjexactboundr   r/  r0  r1  r2  r3  r4  r5  extrar   r   Z
newcontext	exceptionr)   r)   r+   __pow__  s    














"



zDecimal.__pow__c                 C   s"   t |}|tu r|S |j| |dS r   )r   r   rC  r   r)   r)   r+   __rpow__	  s    zDecimal.__rpow__c                 C   s   |d u rt  }| jr(| j|d}|r(|S | |}| r>|S |sPt|jddS |j| g|j	 }t
|j}|j}|j|d  dkr||k r|d7 }|d8 }qtt|j|jd | |S )NrK   rR   r&   r.   )r   rQ   r   r   r   r9   r:   rF   r   r   rk   r;   rP   )r0   r1   r>   dupr  endrW   r)   r)   r+   	normalize	  s$    


zDecimal.normalizec                 C   s  t |dd}|d u rt }|d u r(|j}| js4|jr|| ||}|rH|S | sX|  r|| rp|  rpt| S |tdS |	 |j
  kr|jksn |tdS | st| jd|j
}||S |  }||jkr|tdS ||j
 d |jkr|tdS | |j
|}| |jkr.|tdS t|j|jkrL|tdS |rl| |jk rl|t |j
| j
kr|| kr|t |t ||}|S )	NTr   zquantize with one INFz)target exponent out of bounds in quantizerR   z9exponent of quantize result too large for current contextr.   z7quantize result has too many digits for current context)r   r   rD   rQ   r   r   r   ri   r	   r   rP   rF   r9   r:   r   r   rE   r   rk   r;   Eminr   r   r   )r0   rW   rD   r1   r>   r   r)   r)   r+   r  	  s`    






zDecimal.quantizec                 C   sD   t |dd}| js|jr8|  r(| p6|  o6| S | j|jkS r   )r   rQ   r   is_infiniterP   r   r)   r)   r+   same_quantum%
  s    	zDecimal.same_quantumc                 C   s   | j rt| S | s t| jd|S | j|krHt| j| jd| j|   |S t| j| j | }|dk rzt| jd|d } d}| j| }|| |}| jd | pd}|dkrtt	|d }t| j||S )NrR   r&   r   r.   )
rQ   r   r9   r:   rP   r;   rk   r  re   rV   )r0   rW   rD   r}   Zthis_functionr  r   r)   r)   r+   r   4
  s$    


zDecimal._rescalec                 C   sf   |dkrt d| js| s"t| S | |  d | |}| |  krb|| d | |}|S )Nr&   z'argument should be at least 1 in _roundr.   )rq   rQ   r   r   r   )r0   placesrD   r>   r)   r)   r+   _roundV
  s    

zDecimal._roundc                 C   s   | j r"| j|d}|r|S t| S | jdkr4t| S | sFt| jddS |d u rTt }|d u rb|j}| d|}|| kr|	t
 |	t |S )NrK   r&   rR   )rQ   r   r   rP   r9   r:   r   rD   r   ri   r   r   r0   rD   r1   r>   r)   r)   r+   to_integral_exactm
  s$    



zDecimal.to_integral_exactc                 C   s`   |d u rt  }|d u r|j}| jr>| j|d}|r6|S t| S | jdkrPt| S | d|S d S )NrK   r&   )r   rD   rQ   r   r   rP   r   rM  r)   r)   r+   r  
  s    
zDecimal.to_integral_valuec                 C   s  |d u rt  }| jrB| j|d}|r(|S |  rB| jdkrBt| S | sdt| jd| jd }||S | jdkrz|	t
dS |jd }t| }|jd? }|jd@ r|jd }t| jd? d }n|j}t| jd d? }|| }|dkr|d| 9 }d	}	nt|d|  \}}
|
 }	||8 }d| }|| }||kr:qJn|| d? }q"|	oZ|| |k}	|	r|dkrz|d|  }n|d|  9 }||7 }n|d
 dkr|d7 }tdt||}| }|t}||}||_|S )NrK   r&   rR   r^   r.   zsqrt(-x), x > 0r   r+  Tr~   )r   rQ   r   r   r:   r   r9   rP   r   ri   r	   rE   rn   rW   rV   rk   r;   r   re   _shallow_copy_set_roundingr   rD   )r0   r1   r>   rE   opr   clr   r?  r   r8   r   rD   r)   r)   r+   sqrt
  s^    










zDecimal.sqrtc                 C   s   t |dd}|d u rt }| js&|jr~|  }| }|s>|r~|dkrX|dkrX| |S |dkrr|dkrr||S | ||S | |}|dkr| |}|dkr|}n| }||S NTr   r.   r&   r   r   r   rQ   r   r   r   r   compare_totalr0   r   r1   ZsnZonrR  r>   r)   r)   r+   r      s&    


	
zDecimal.maxc                 C   s   t |dd}|d u rt }| js&|jr~|  }| }|s>|r~|dkrX|dkrX| |S |dkrr|dkrr||S | ||S | |}|dkr| |}|dkr| }n|}||S rU  rV  rX  r)   r)   r+   r   *  s&    



zDecimal.minc                 C   s8   | j r
dS | jdkrdS | j| jd  }|dt| kS )NFr&   TrR   )rQ   rP   r;   rk   )r0   restr)   r)   r+   r  L  s    
zDecimal._isintegerc                 C   s&   | r| j dkrdS | jd| j   dv S )Nr&   Tr   r  )rP   r;   r   r)   r)   r+   r  U  s    zDecimal._isevenc                 C   s0   z| j t| j d W S  ty*   Y dS 0 d S )Nr.   r&   )rP   rk   r;   rw   r   r)   r)   r+   r   [  s    zDecimal.adjustedc                 C   s   | S r(   r)   r   r)   r)   r+   	canonicalc  s    zDecimal.canonicalc                 C   s.   t |dd}| ||}|r |S | j||dS NTr   rK   )r   r   r   r   r)   r)   r+   compare_signalk  s
    zDecimal.compare_signalc                 C   s`  t |dd}| jr|jstS | js,|jr,tS | j}|  }| }|sL|r||krt| j| jf}t|j|jf}||k r|rtS tS ||kr|rtS tS tS |r|dkrtS |dkrtS |dkrtS |dkrtS n2|dkrtS |dkrtS |dkrtS |dkrtS | |k rtS | |kr$tS | j|jk r@|r<tS tS | j|jkr\|rXtS tS tS )NTr   r.   r^   )	r   r:   _NegativeOner9  r   rk   r;   _ZerorP   )r0   r   r1   rB   Zself_nanZ	other_nanZself_keyZ	other_keyr)   r)   r+   rW  w  sf    



zDecimal.compare_totalc                 C   s&   t |dd}|  }| }||S r   )r   r   rW  )r0   r   r1   r   or)   r)   r+   compare_total_mag  s    zDecimal.compare_total_magc                 C   s   t d| j| j| jS r   )r9   r;   rP   rQ   r   r)   r)   r+   r     s    zDecimal.copy_absc                 C   s2   | j rtd| j| j| jS td| j| j| jS d S )Nr&   r.   )r:   r9   r;   rP   rQ   r   r)   r)   r+   r     s    zDecimal.copy_negatec                 C   s"   t |dd}t|j| j| j| jS r   )r   r9   r:   r;   rP   rQ   r   r)   r)   r+   	copy_sign  s    
zDecimal.copy_signc                 C   s  |d u rt  }| j|d}|r"|S |  dkr2tS | s:tS |  dkrNt| S |j}|  }| jdkr|t	t
|jd d krtdd|jd }n0| jdkr|t	t
|  d d krtdd| d }n| jdkr|| k rtddd|d   d | }n| jdkrD|| d k rDtdd|d  | d }nt| }|j|j }}|jdkrl| }d}t|||| \}	}
|	d	d
t	t
|	| d    rq|d7 }qptdt
|	|
}| }|t}||}||_|S )NrK   r   r.   r&   r\   r   rR   rC   r~   r   )r   r   r   r^  r9  r   rE   r   r:   rk   re   rF   r9   r   rn   rV   rW   rB   _dexprO  rP  r   r   rD   )r0   r1   r>   r/  adjrQ  rR  r   rA  r   rW   rD   r)   r)   r+   rW     sH    $( "

zDecimal.expc                 C   s   dS )NTr)   r   r)   r)   r+   is_canonical'  s    zDecimal.is_canonicalc                 C   s   | j  S r(   )rQ   r   r)   r)   r+   	is_finite/  s    zDecimal.is_finitec                 C   s
   | j dkS )Nr[   rP   r   r)   r)   r+   rI  7  s    zDecimal.is_infinitec                 C   s
   | j dv S )Nr`   rf  r   r)   r)   r+   r   ;  s    zDecimal.is_nanc                 C   s*   | j s
| sdS |d u rt }|j|  kS NF)rQ   r   rH  r   r   r)   r)   r+   	is_normal?  s
    
zDecimal.is_normalc                 C   s
   | j dkS )Nr8   rf  r   r)   r)   r+   r   G  s    zDecimal.is_qnanc                 C   s
   | j dkS Nr.   )r:   r   r)   r)   r+   	is_signedK  s    zDecimal.is_signedc                 C   s
   | j dkS )NrZ   rf  r   r)   r)   r+   r   O  s    zDecimal.is_snanc                 C   s*   | j s
| sdS |d u rt }|  |jk S rg  )rQ   r   r   rH  r   r)   r)   r+   is_subnormalS  s
    
zDecimal.is_subnormalc                 C   s   | j  o| jdkS r   r   r   r)   r)   r+   is_zero[  s    zDecimal.is_zeroc                 C   s   | j t| j d }|dkr4tt|d d d S |dkrXttd| d d d S t| }|j|j }}|dkrt|d|   }t|}t|t| ||k  S |ttd|  |  d S )Nr.      r   r   r   r&   rP   rk   r;   re   rn   rV   rW   r0   rc  rQ  rR  r   numZdenr)   r)   r+   _ln_exp_bound_  s    zDecimal._ln_exp_boundc           
      C   s  |d u rt  }| j|d}|r"|S | s*tS |  dkr:tS | tkrFtS | jdkr\|t	dS t
| }|j|j }}|j}||   d }t|||}|ddttt|| d    rq|d7 }qtt|dk tt|| }| }|t}	||}|	|_|S )	NrK   r.   zln of a negative valuer^   r~   r   r\   r&   )r   r   _NegativeInfinityr   	_Infinityr9  r^  r:   ri   r	   rn   rV   rW   rE   rq  _dlogrk   re   rm   r9   rO  rP  r   r   rD   
r0   r1   r>   rQ  rR  r   r/  rK  r   rD   r)   r)   r+   lnx  s:    
$


z
Decimal.lnc                 C   s   | j t| j d }|dkr,tt|d S |dkrHttd| d S t| }|j|j }}|dkrt|d|   }td| }t|t| ||k  d S td|  | }t|| |dk  d S )	Nr.   r   r   r&   r      r^   Z231rn  ro  r)   r)   r+   r:    s    zDecimal._log10_exp_boundc           
      C   sF  |d u rt  }| j|d}|r"|S | s*tS |  dkr:tS | jdkrP|tdS | jd dkr| jdd  dt	| jd  krt
| jt	| j d }nt| }|j|j }}|j}||   d }t|||}|dd	t	tt|| d    rq|d
7 }qtt|dk tt|| }| }|t}	||}|	|_|S )NrK   r.   zlog10 of a negative valuer&   r   rR   r^   r~   r   r\   )r   r   rr  r   rs  r:   ri   r	   r;   rk   r   rP   rn   rV   rW   rE   r:  _dlog10re   rm   r9   rO  rP  r   r   rD   ru  r)   r)   r+   log10  s:    
.$


zDecimal.log10c                 C   sV   | j |d}|r|S |d u r"t }|  r.tS | s@|tddS t|  }||S )NrK   zlogb(0)r.   )	r   r   r   rs  ri   r
   r   r   r   r   r)   r)   r+   logb  s    	zDecimal.logbc                 C   s6   | j dks| jdkrdS | jD ]}|dvr dS qdS )Nr&   FZ01T)r:   rP   r;   )r0   digr)   r)   r+   
_islogical  s    
zDecimal._islogicalc                 C   s   |j t| }|dkr$d| | }n|dk r<||j  d  }|j t| }|dkr`d| | }n|dk rx||j  d  }||fS )Nr&   rR   )rE   rk   )r0   r1   opaopbZdifr)   r)   r+   _fill_logical'  s    zDecimal._fill_logicalc                 C   sz   |d u rt  }t|dd}|  r*| s4|tS | || j|j\}}ddd t||D }t	d|
dptddS )NTr   rT   c                 S   s$   g | ]\}}t t|t|@ qS r)   re   rV   .0r7  br)   r)   r+   
<listcomp>B  r-   z'Decimal.logical_and.<locals>.<listcomp>r&   rR   r   r   r|  ri   r	   r  r;   rs   zipr9   rl   r0   r   r1   r}  r~  r   r)   r)   r+   logical_and4  s    
zDecimal.logical_andc                 C   s(   |d u rt  }| tdd|j d|S )Nr&   r   )r   logical_xorr9   rE   r   r)   r)   r+   logical_invertE  s
    zDecimal.logical_invertc                 C   sz   |d u rt  }t|dd}|  r*| s4|tS | || j|j\}}ddd t||D }t	d|
dptddS )NTr   rT   c                 S   s$   g | ]\}}t t|t|B qS r)   r  r  r)   r)   r+   r  Z  r-   z&Decimal.logical_or.<locals>.<listcomp>r&   rR   r  r  r)   r)   r+   
logical_orL  s    
zDecimal.logical_orc                 C   sz   |d u rt  }t|dd}|  r*| s4|tS | || j|j\}}ddd t||D }t	d|
dptddS )NTr   rT   c                 S   s$   g | ]\}}t t|t|A qS r)   r  r  r)   r)   r+   r  k  r-   z'Decimal.logical_xor.<locals>.<listcomp>r&   rR   r  r  r)   r)   r+   r  ]  s    
zDecimal.logical_xorc                 C   s   t |dd}|d u rt }| js&|jr~|  }| }|s>|r~|dkrX|dkrX| |S |dkrr|dkrr||S | ||S |  | }|dkr| |}|dkr|}n| }||S rU  	r   r   rQ   r   r   r   r   r   rW  rX  r)   r)   r+   max_magn  s&    


zDecimal.max_magc                 C   s   t |dd}|d u rt }| js&|jr~|  }| }|s>|r~|dkrX|dkrX| |S |dkrr|dkrr||S | ||S |  | }|dkr| |}|dkr| }n|}||S rU  r  rX  r)   r)   r+   min_mag  s&    


zDecimal.min_magc                 C   s   |d u rt  }| j|d}|r"|S |  dkr2tS |  dkrTtdd|j | S | }|t	 |
  | |}|| kr|S | tdd| d |S )NrK   r   r.   r&   rC   r   )r   r   r   rr  r9   rE   r   rL   rP  r   _ignore_all_flagsr   r   r   r0   r1   r>   Znew_selfr)   r)   r+   
next_minus  s$    

zDecimal.next_minusc                 C   s   |d u rt  }| j|d}|r"|S |  dkr2tS |  dkrTtdd|j | S | }|t	 |
  | |}|| kr|S | tdd| d |S )NrK   r.   r   rC   r&   r   )r   r   r   rs  r9   rE   r   rL   rP  r   r  r   r   r   r  r)   r)   r+   	next_plus  s$    

zDecimal.next_plusc                 C   s   t |dd}|d u rt }| ||}|r.|S | |}|dkrJ| |S |dkr^| |}n
| |}| r|t	d|j
 |t |t nD| |jk r|t |t |t |t |s|t |S )NTr   r&   r   z Infinite result from next_toward)r   r   r   r   ra  r  r  r   ri   r   r:   r   r   r   rH  r   r   r   )r0   r   r1   r>   Z
comparisonr)   r)   r+   next_toward  s6    	








zDecimal.next_towardc                 C   s   |   rdS |  rdS |  }|dkr,dS |dkr8dS |  rN| jrJdS dS |d u r\t }| j|d	rv| jrrd
S dS | jrdS dS d S )Nr   r   r.   z	+Infinityr   z	-Infinityz-Zeroz+ZerorK   z
-Subnormalz
+Subnormalz-Normalz+Normal)r   r   r   rl  r:   r   rk  )r0   r1   infr)   r)   r+   number_class  s,    zDecimal.number_classc                 C   s   t dS Nr   r   r   r)   r)   r+   radix0  s    zDecimal.radixc                 C   s   |d u rt  }t|dd}| ||}|r.|S |jdkrB|tS |j t|  kr`|jksln |tS |  r|t	| S t|}| j
}|jt| }|dkrd| | }n|dk r|| d  }||d  |d |  }t| j|dpd| jS NTr   r&   rR   r   r   r   rP   ri   r	   rE   rV   r   r   r;   rk   r9   r:   rl   )r0   r   r1   r>   torotrotdigtopadZrotatedr)   r)   r+   rotate4  s.    

 
zDecimal.rotatec                 C   s   |d u rt  }t|dd}| ||}|r.|S |jdkrB|tS d|j|j  }d|j|j  }|t|  krz|ksn |tS | 	 rt
| S t| j| j| jt| }||}|S )NTr   r&   r   r^   )r   r   r   rP   ri   r	   rF   rE   rV   r   r   r9   r:   r;   r   )r0   r   r1   r>   ZliminfZlimsupr   r)   r)   r+   scalebU  s"    



zDecimal.scalebc                 C   s  |d u rt  }t|dd}| ||}|r.|S |jdkrB|tS |j t|  kr`|jksln |tS |  r|t	| S t|}| j
}|jt| }|dkrd| | }n|dk r|| d  }|dk r|d | }n|d|  }||j d  }t| j|dp
d| jS r  r  )r0   r   r1   r>   r  r  r  Zshiftedr)   r)   r+   r   n  s4    

 
zDecimal.shiftc                 C   s   | j t| ffS r(   )	__class__re   r   r)   r)   r+   
__reduce__  s    zDecimal.__reduce__c                 C   s   t | tu r| S | t| S r(   typer   r  re   r   r)   r)   r+   __copy__  s    zDecimal.__copy__c                 C   s   t | tu r| S | t| S r(   r  )r0   memor)   r)   r+   __deepcopy__  s    zDecimal.__deepcopy__c                 C   sJ  |d u rt  }t||d}| jrXt| j|}t|  }|d dkrL|d7 }t|||S |d d u rvddg|j |d< |d dkrt	| j| j
| jd } |j}|d }|d ur|d dv r| |d	 |} nF|d d
v r| | |} n*|d dv rt| j
|kr| ||} | s@| jdkr@|d d
v r@| d|} | jt| j
 }	|d dv r~| sx|d urxd	| }
nd	}
nB|d d
v r|	}
n.|d dv r| jdkr|	dkr|	}
nd	}
|
dk rd}d|
  | j
 }nP|
t| j
kr| j
d|
t| j
   }d}n"| j
d |
 p d}| j
|
d  }|	|
 }t| j||||S )N)_localeconvr  %gGr^   	precisioneEr.   zfF%ZgGr&   r   rR   rT   )r   _parse_format_specifierrQ   _format_signr:   re   r   _format_alignr   r9   r;   rP   rD   rL  r   rk   _format_number)r0   Z	specifierr1   r  specrB   bodyrD   r  r   r   r{   r|   rW   r)   r)   r+   
__format__  sZ    
 

zDecimal.__format__)rR   N)NN)N)N)N)N)N)N)FN)N)N)N)TN)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)NN)N)N)NN)N)NN)NN)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)NN)r4   r5   r6   	__slots__rc   classmethodrv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __radd__r   r   r   __rmul__r   r   r   r   r   r   r   r   r   r   r   r   	__trunc__propertyr   r   r   r   r<   r   r  r  r  r  r  r  r  r  dictr  r  r  r  r  r$  r8  rC  rD  rG  r  rJ  r   rL  rN  r  to_integralrT  r   r   r  r  r   rZ  r\  rW  r`  r   r   ra  rW   rd  re  rI  r   rh  r   rj  r   rk  rl  rq  rv  r:  ry  rz  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r)   r)   r)   r+   r     s  
 
,
 !@

	
	
	
	
2
4
	



V
7;!$K


f	>,U n Y="c*"	IK23.*!'r   Fc                 C   s&   t t}| |_||_||_||_|S r(   )rb   rc   r   r:   r;   rP   rQ   )rB   Zcoefficientr"  Zspecialr0   r)   r)   r+   r9     s    
r9   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )rN   c                 C   s   |  | _d S r(   )rL   new_context)r0   r  r)   r)   r+   __init__  s    z_ContextManager.__init__c                 C   s   t  | _t| j | jS r(   )r   saved_contextr   r  r   r)   r)   r+   	__enter__  s    
z_ContextManager.__enter__c                 C   s   t | j d S r(   )r   r  )r0   tvtbr)   r)   r+   __exit__  s    z_ContextManager.__exit__N)r4   r5   r6   r  r  r  r)   r)   r)   r+   rN     s   rN   c                	   @   s  e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd ZeZdddZdd Zdd Zdd ZdZd d! Zd"d# Zd$d% Zdd'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSdT Z-dUdV Z.dWdX Z/dYdZ Z0d[d\ Z1d]d^ Z2d_d` Z3dadb Z4dcdd Z5dedf Z6dgdh Z7didj Z8dkdl Z9dmdn Z:dodp Z;dqdr Z<dsdt Z=dudv Z>dwdx Z?dydz Z@d{d| ZAd}d~ ZBdd ZCdd ZDdd ZEdd ZFdddZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUeUZVdS )r   Nc
                    s<  zt }
W n ty   Y n0 |d ur(|n|
j| _|d ur<|n|
j| _|d urP|n|
j| _|d urd|n|
j| _|d urx|n|
j| _|d ur|n|
j| _|	d u rg | _n|	| _d u r|
j	
 | _	n.ttstfddt D | _	n| _	 d u rttd| _n0t ts2t fddt  D | _n | _d S )Nc                 3   s   | ]}|t | v fV  qd S r(   rV   r  r   r=  r)   r+   	<genexpr>I  r-   z#Context.__init__.<locals>.<genexpr>r&   c                 3   s   | ]}|t | v fV  qd S r(   r  r  r>  r)   r+   r  P  r-   )r   	NameErrorrE   rD   rH  rF   r   r   _ignored_flagsr=  rL   rd   r  r<  fromkeysr>  )r0   rE   rD   rH  rF   r   r   r>  r=  r  Zdcr)   )r>  r=  r+   r  0  s.    

zContext.__init__c                 C   s   t |tstd| |dkr<||krtd||||f nJ|dkrb||k rtd||||f n$||k sr||krtd||||f t| ||S )Nz%s must be an integer-infz%s must be in [%s, %d]. got: %sr  z%s must be in [%d, %s]. got: %sz%s must be in [%d, %d]. got %s)rd   rV   rw   rq   rb   __setattr__)r0   namery   ZvminZvmaxr)   r)   r+   _set_integer_checkT  s    
zContext._set_integer_checkc                 C   s`   t |tstd| |D ]}|tvrtd| qtD ]}||vr8td| q8t| ||S )Nz%s must be a signal dictz%s is not a valid signal dict)rd   r  rw   r<  KeyErrorrb   r  )r0   r  r   keyr)   r)   r+   _set_signal_dictb  s    
zContext._set_signal_dictc                 C   s   |dkr|  ||ddS |dkr0|  ||ddS |dkrH|  ||ddS |dkr`|  ||ddS |d	krx|  ||ddS |d
kr|tvrtd| t| ||S |dks|dkr| ||S |dkrt| ||S td| d S )NrE   r.   r  rH  r  r&   rF   r   r   rD   z%s: invalid rounding moder>  r=  r  z.'decimal.Context' object has no attribute '%s')r  _rounding_modesrw   rb   r  r  AttributeError)r0   r  ry   r)   r)   r+   r  m  s*    zContext.__setattr__c                 C   s   t d| d S )Nz%s cannot be deleted)r  )r0   r  r)   r)   r+   __delattr__  s    zContext.__delattr__c              	   C   sN   dd | j  D }dd | j D }| j| j| j| j| j| j| j	||ffS )Nc                 S   s   g | ]\}}|r|qS r)   r)   r  sigr  r)   r)   r+   r    r-   z&Context.__reduce__.<locals>.<listcomp>c                 S   s   g | ]\}}|r|qS r)   r)   r  r)   r)   r+   r    r-   )
r>  itemsr=  r  rE   rD   rH  rF   r   r   )r0   r>  r=  r)   r)   r+   r    s    zContext.__reduce__c                 C   s|   g }| dt|   dd | j D }| dd| d  dd | j D }| dd| d  d|d	 S )
NzrContext(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d, clamp=%(clamp)dc                 S   s   g | ]\}}|r|j qS r)   r4   )r  r   r  r)   r)   r+   r    r-   z$Context.__repr__.<locals>.<listcomp>zflags=[z, ]c                 S   s   g | ]\}}|r|j qS r)   r  )r  r  r  r)   r)   r+   r    r-   ztraps=[))rr   varsr>  r  rs   r=  )r0   r   namesr)   r)   r+   r     s    zContext.__repr__c                 C   s   | j D ]}d| j |< qd S r   r  r0   flagr)   r)   r+   rM     s    
zContext.clear_flagsc                 C   s   | j D ]}d| j |< qd S r   r  r  r)   r)   r+   clear_traps  s    
zContext.clear_trapsc              
   C   s.   t | j| j| j| j| j| j| j| j| j		}|S r(   )
r   rE   rD   rH  rF   r   r   r>  r=  r  r0   Zncr)   r)   r+   rO    s
    zContext._shallow_copyc              
   C   s6   t | j| j| j| j| j| j| j | j	 | j
	}|S r(   )r   rE   rD   rH  rF   r   r   r>  rL   r=  r  r  r)   r)   r+   rL     s    zContext.copyc                 G   s^   t ||}|| jv r*| j| g|R  S d| j|< | j| sR| j| g|R  S ||d S ri  )_condition_maprH   r  r2   r>  r=  )r0   Z	conditionZexplanationr*   errorr)   r)   r+   ri     s    


zContext._raise_errorc                 C   s
   | j t S r(   )_ignore_flagsr<  r   r)   r)   r+   r    s    zContext._ignore_all_flagsc                 G   s   | j t| | _ t|S r(   )r  ro   )r0   r>  r)   r)   r+   r    s    zContext._ignore_flagsc                 G   s8   |rt |d ttfr|d }|D ]}| j| q"d S r   )rd   rp   ro   r  remove)r0   r>  r  r)   r)   r+   _regard_flags  s    zContext._regard_flagsc                 C   s   t | j| j d S ri  )rV   rH  rE   r   r)   r)   r+   r     s    zContext.Etinyc                 C   s   t | j| j d S ri  )rV   rF   rE   r   r)   r)   r+   r     s    zContext.Etopc                 C   s   | j }|| _ |S r(   )rD   )r0   r  rD   r)   r)   r+   rP    s    zContext._set_roundingrR   c                 C   sj   t |tr*|| ksd|v r*| tdS t|| d}| r`t|j| j	| j
 kr`| tdS || S )NrS   zAtrailing or leading whitespace and underscores are not permitted.rK   zdiagnostic info too long in NaN)rd   re   rg   ri   r   r   r   rk   r;   rE   r   r   )r0   rp  r   r)   r)   r+   create_decimal  s    zContext.create_decimalc                 C   s   t |}|| S r(   )r   rv   r   )r0   r   r   r)   r)   r+   create_decimal_from_float  s    
z!Context.create_decimal_from_floatc                 C   s   t |dd}|j| dS r[  )r   r   r0   r7  r)   r)   r+   rm   !  s    zContext.absc                 C   s8   t |dd}|j|| d}|tu r0td| n|S d S NTr   rK   Unable to convert %s to Decimal)r   r   r   rw   r0   r7  r  r   r)   r)   r+   add6  s
    zContext.addc                 C   s   t || S r(   )re   r   r  r)   r)   r+   _applyK  s    zContext._applyc                 C   s   t |tstd| S )Nz,canonical requires a Decimal as an argument.)rd   r   rw   rZ  r  r)   r)   r+   rZ  N  s    	
zContext.canonicalc                 C   s   t |dd}|j|| dS r[  )r   r   r0   r7  r  r)   r)   r+   r   [  s    !zContext.comparec                 C   s   t |dd}|j|| dS r[  )r   r\  r  r)   r)   r+   r\    s     zContext.compare_signalc                 C   s   t |dd}||S r   )r   rW  r  r)   r)   r+   rW    s    zContext.compare_totalc                 C   s   t |dd}||S r   )r   r`  r  r)   r)   r+   r`    s    zContext.compare_total_magc                 C   s   t |dd}| S r   )r   r   r  r)   r)   r+   r     s    
zContext.copy_absc                 C   s   t |dd}t|S r   )r   r   r  r)   r)   r+   copy_decimal  s    
zContext.copy_decimalc                 C   s   t |dd}| S r   )r   r   r  r)   r)   r+   r     s    
zContext.copy_negatec                 C   s   t |dd}||S r   )r   ra  r  r)   r)   r+   ra    s    zContext.copy_signc                 C   s8   t |dd}|j|| d}|tu r0td| n|S d S r  )r   r   r   rw   r  r)   r)   r+   divide  s
    zContext.dividec                 C   s8   t |dd}|j|| d}|tu r0td| n|S d S r  )r   r   r   rw   r  r)   r)   r+   
divide_int+  s
    zContext.divide_intc                 C   s8   t |dd}|j|| d}|tu r0td| n|S d S r  )r   r   r   rw   r  r)   r)   r+   r   B  s
    zContext.divmodc                 C   s   t |dd}|j| dS r[  )r   rW   r  r)   r)   r+   rW   W  s    zContext.expc                 C   s   t |dd}|j||| dS r[  )r   r  )r0   r7  r  rR  r)   r)   r+   r  o  s    zContext.fmac                 C   s   t |tstd| S )Nz/is_canonical requires a Decimal as an argument.)rd   r   rw   rd  r  r)   r)   r+   rd    s    	
zContext.is_canonicalc                 C   s   t |dd}| S r   )r   re  r  r)   r)   r+   re    s    zContext.is_finitec                 C   s   t |dd}| S r   )r   rI  r  r)   r)   r+   rI    s    zContext.is_infinitec                 C   s   t |dd}| S r   )r   r   r  r)   r)   r+   r     s    zContext.is_nanc                 C   s   t |dd}|j| dS r[  )r   rh  r  r)   r)   r+   rh    s    zContext.is_normalc                 C   s   t |dd}| S r   )r   r   r  r)   r)   r+   r     s    zContext.is_qnanc                 C   s   t |dd}| S r   )r   rj  r  r)   r)   r+   rj    s    zContext.is_signedc                 C   s   t |dd}| S r   )r   r   r  r)   r)   r+   r     s    zContext.is_snanc                 C   s   t |dd}|j| dS r[  )r   rk  r  r)   r)   r+   rk    s    zContext.is_subnormalc                 C   s   t |dd}| S r   )r   rl  r  r)   r)   r+   rl  %  s    zContext.is_zeroc                 C   s   t |dd}|j| dS r[  )r   rv  r  r)   r)   r+   rv  6  s    z
Context.lnc                 C   s   t |dd}|j| dS r[  )r   ry  r  r)   r)   r+   ry  L  s    zContext.log10c                 C   s   t |dd}|j| dS r[  )r   rz  r  r)   r)   r+   rz  h  s    zContext.logbc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r    s    zContext.logical_andc                 C   s   t |dd}|j| dS r[  )r   r  r  r)   r)   r+   r    s    zContext.logical_invertc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r    s    zContext.logical_orc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r    s    zContext.logical_xorc                 C   s   t |dd}|j|| dS r[  )r   r   r  r)   r)   r+   r     s    zContext.maxc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r    s    zContext.max_magc                 C   s   t |dd}|j|| dS r[  )r   r   r  r)   r)   r+   r     s    zContext.minc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r  -  s    zContext.min_magc                 C   s   t |dd}|j| dS r[  )r   r   r  r)   r)   r+   minus>  s    zContext.minusc                 C   s8   t |dd}|j|| d}|tu r0td| n|S d S r  )r   r   r   rw   r  r)   r)   r+   multiplyO  s
    zContext.multiplyc                 C   s   t |dd}|j| dS r[  )r   r  r  r)   r)   r+   r  o  s    zContext.next_minusc                 C   s   t |dd}|j| dS r[  )r   r  r  r)   r)   r+   r    s    zContext.next_plusc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r    s     zContext.next_towardc                 C   s   t |dd}|j| dS r[  )r   rG  r  r)   r)   r+   rG    s    zContext.normalizec                 C   s   t |dd}|j| dS r[  )r   r  r  r)   r)   r+   r    s    /zContext.number_classc                 C   s   t |dd}|j| dS r[  )r   r   r  r)   r)   r+   plus  s    zContext.plusc                 C   s:   t |dd}|j||| d}|tu r2td| n|S d S r  )r   rC  r   rw   )r0   r7  r  r   r   r)   r)   r+   power  s
    IzContext.powerc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r  e  s    7zContext.quantizec                 C   s   t dS r  r   r   r)   r)   r+   r    s    zContext.radixc                 C   s8   t |dd}|j|| d}|tu r0td| n|S d S r  )r   r   r   rw   r  r)   r)   r+   r     s
    zContext.remainderc                 C   s   t |dd}|j|| dS r[  )r   r   r  r)   r)   r+   r     s    zContext.remainder_nearc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r    s    zContext.rotatec                 C   s   t |dd}||S r   )r   rJ  r  r)   r)   r+   rJ    s    zContext.same_quantumc                 C   s   t |dd}|j|| dS r[  )r   r  r  r)   r)   r+   r  $  s    zContext.scalebc                 C   s   t |dd}|j|| dS r[  )r   r   r  r)   r)   r+   r   7  s    zContext.shiftc                 C   s   t |dd}|j| dS r[  )r   rT  r  r)   r)   r+   rT  U  s    zContext.sqrtc                 C   s8   t |dd}|j|| d}|tu r0td| n|S d S r  )r   r   r   rw   r  r)   r)   r+   subtractu  s
    zContext.subtractc                 C   s   t |dd}|j| dS r[  )r   r   r  r)   r)   r+   r     s    zContext.to_eng_stringc                 C   s   t |dd}|j| dS r[  )r   r   r  r)   r)   r+   to_sci_string  s    zContext.to_sci_stringc                 C   s   t |dd}|j| dS r[  )r   rN  r  r)   r)   r+   rN    s    zContext.to_integral_exactc                 C   s   t |dd}|j| dS r[  )r   r  r  r)   r)   r+   r    s    zContext.to_integral_value)	NNNNNNNNN)N)rR   )N)Wr4   r5   r6   r  r  r  r  r  r  r   rM   r  rO  rL   r  ri   r  r  r  r   r   r   rP  r  r  rm   r  r  rZ  r   r\  rW  r`  r   r  r   ra  r  r  r   rW   r  rd  re  rI  r   rh  r   rj  r   rk  rl  rv  ry  rz  r  r  r  r  r   r  r   r  r  r  r  r  r  rG  r  r  r  r  r  r   r   r  rJ  r  r   rT  r  r   r  rN  r  r  r)   r)   r)   r+   r     s      
$

$#% #2
P:&" r   c                   @   s"   e Zd ZdZdddZdd ZdS )rn   rB   rV   rW   Nc                 C   sf   |d u rd | _ d| _d | _nFt|trD|j| _ t|j| _|j| _n|d | _ |d | _|d | _d S )Nr&   r.   r^   )rB   rV   rW   rd   r   r:   r;   rP   )r0   ry   r)   r)   r+   r    s    



z_WorkRep.__init__c                 C   s   d| j | j| jf S )Nz(%r, %r, %r)r  r   r)   r)   r+   r     s    z_WorkRep.__repr__)N)r4   r5   r6   r  r  r   r)   r)   r)   r+   rn     s   
rn   c                 C   s   | j |j k r|}| }n| }|}tt|j}tt|j}|j td|| d  }||j  d |k rpd|_||_ | jd|j |j   9  _|j |_ | |fS )Nr   r^   r.   r   )rW   rk   re   rV   r   )r   r   rE   tmpr   Ztmp_lenZ	other_lenrW   r)   r)   r+   r     s    r   c                 C   sb   | dkrdS |dkr | d|  S t t| }t|t|d }|| k rPd S | d|   S d S )Nr&   r   rR   )re   rm   rk   rstrip)r8   r   Zstr_nZval_nr)   r)   r+   r-  (  s    r-  c                 C   sB   | dks|dkrt dd}||kr>|||  |  d?  }}q|S )Nr&   z3Both arguments to _sqrt_nearest should be positive.r.   )rq   )r8   r7  r  r)   r)   r+   _sqrt_nearest=  s    r  c                 C   s2   d|> | |?  }}|d| |d @  |d@  |k S )Nr.   r^   r)   )r0  r   r  r   r)   r)   r+   _rshift_nearestL  s    r  c                 C   s&   t | |\}}|d| |d@  |k S )Nr^   r.   )r   )r7  r  r   r   r)   r)   r+   _div_nearestT  s    r  r'  c           	   	   C   s   | | }d}||kr(t ||| > |ksD||krxt ||| ? |krxt|| d> |t||t||  | }|d7 }qtdtt| d|   }t||}t||}t|d ddD ]}t||t|| | }qt|| |S )Nr&   r.   r\   r   )rm   r  r  r  rV   rk   re   r  )	r0  MLr3  RTZyshiftwr   r)   r)   r+   _ilog\  s"    


r  c           
      C   s   |d7 }t t| }|| || dk }|dkrd| }|| | }|dkrZ| d| 9 } nt| d|  } t| |}t|}t|| |}|| }	nd}t|d|  }	t|	| dS Nr^   r.   r&   r   r+  )rk   re   r  r  _log10_digits)
rR  r   r/  rS  r   r  r   log_dZlog_10Zlog_tenpowerr)   r)   r+   rx    s     

rx  c           	      C   s   |d7 }t t| }|| || dk }|dkrr|| | }|dkrR| d| 9 } nt| d|  } t| d| }nd}|rt tt|d }|| dkrt|t||  d| }qd}nd}t|| dS r  )rk   re   r  r  rm   r  )	rR  r   r/  rS  r   r   r  rA  Z	f_log_tenr)   r)   r+   rt    s"    rt  c                   @   s   e Zd Zdd Zdd ZdS )_Log10Memoizec                 C   s
   d| _ d S )NZ/23025850929940456840179914546843642076011014886)r}   r   r)   r)   r+   r    s    z_Log10Memoize.__init__c                 C   s   |dk rt d|t| jkrd}d|| d  }tttd| |d}|| d  d| krbql|d7 }q"|dd d | _t| jd |d	  S )
Nr&   zp should be nonnegativer\   r   r^   r+  rR   r   r.   )rq   rk   r}   re   r  r  r  rV   )r0   r/  rA  r  r}   r)   r)   r+   	getdigits  s    	
z_Log10Memoize.getdigitsN)r4   r5   r6   r  r	  r)   r)   r)   r+   r    s   r  c           	      C   s   t | |> | }tdtt| d|   }t| |}||> }t|d ddD ]}t| ||  || }qPt|d ddD ]"}||d > }t|||  |}q||| S )Nr  r\   r.   r&   r   r^   )r,  rV   rk   re   r  r  )	r0  r  r   r  r  r3  ZMshiftr#  r   r)   r)   r+   _iexp  s    
r
  c           	      C   s   |d7 }t d|tt|  d }|| }|| }|dkrH| d|  }n| d|   }t|t|\}}t|d| }tt|d| d|| d fS )Nr^   r&   r.   r   i  r\   )r   rk   re   r   r  r  r
  )	rR  r   r/  rA  r   r   ZcshiftZquotr6  r)   r)   r+   rb  $  s    rb  c                 C   s   t tt|| }t| ||| d }|| }|dkrJ|| d|  }nt|| d|  }|dkrt t| | dk|dkkrd|d  d d|  }	}
qd| d |  }	}
n,t||d  |d \}	}
t|	d}	|
d7 }
|	|
fS )Nr.   r&   r   )rk   re   rm   rt  r  rb  )r1  r2  r4  r5  r/  r  Zlxcr   Zpcr   rW   r)   r)   r+   r;  H  s    
r;  r+  F   5   (      rm     r   r~   )	r   2345678rC   c                 C   s0   | dkrt dt| }dt| ||d   S )Nr&   z0The argument to _log10_lb should be nonnegative.r+  )rq   re   rk   )rR  Z
correctionZstr_cr)   r)   r+   r.  r  s    r.  c                 C   sL   t | tr| S t | tr t| S |r8t | tr8t| S |rHtd|  tS )Nr  )rd   r   rV   ru   rv   rw   r   )r   r   Zallow_floatr)   r)   r+   r   }  s    


r   c                 C   s   t |tr| |fS t |tjrR| jsDt| jtt| j	|j
 | j} | t|jfS |rrt |tjrr|jdkrr|j}t |trt }|rd|jt< n|td | t|fS ttfS )Nr&   r.   ra   )rd   r   _numbersZRationalrQ   r9   r:   re   rV   r;   denominatorrP   	numeratorZComplexr   r   ru   r   r>  r   ri   rv   r   )r0   r   r   r1   r)   r)   r+   r     s(    

r   r*  i?B i)rE   rD   r=  r>  rF   rH  r   r   r_   )rE   rD   r=  r>  a          # A numeric string consists of:
#    \s*
    (?P<sign>[-+])?              # an optional sign, followed by either...
    (
        (?=\d|\.\d)              # ...a number (with at least one digit)
        (?P<int>\d*)             # having a (possibly empty) integer part
        (\.(?P<frac>\d*))?       # followed by an optional fractional part
        (E(?P<exp>[-+]?\d+))?    # followed by an optional exponent, or...
    |
        Inf(inity)?              # ...an infinity, or...
    |
        (?P<signal>s)?           # ...an (optionally signaling)
        NaN                      # NaN
        (?P<diag>\d*)            # with (possibly empty) diagnostic info.
    )
#    \s*
    \Z
z0*$z50*$z\A
(?:
   (?P<fill>.)?
   (?P<align>[<>=^])
)?
(?P<sign>[-+ ])?
(?P<alt>\#)?
(?P<zeropad>0)?
(?P<minimumwidth>(?!0)\d+)?
(?P<thousands_sep>,)?
(?:\.(?P<precision>0|(?!0)\d+))?
(?P<type>[eEfFgGn%])?
\Z
c                 C   s  t | }|d u rtd|  | }|d }|d }|d d u|d< |d rv|d urbtd|  |d urvtd|  |p|d|d< |pd|d< |d	 d u rd
|d	< t|d pd|d< |d d urt|d |d< |d dkr|d d u s|d dv rd|d< |d dkrfd|d< |d u r&t }|d d ur@td|  |d |d< |d |d< |d |d< n*|d d u r|d|d< ddg|d< d|d< |S )NzInvalid format specifier: fillalignzeropadz7Fill character conflicts with '0' in format specifier: z2Alignment conflicts with '0' in format specifier:  >rB   rU   minimumwidthrR   r  r&   r  ZgGnr.   r8   r  thousands_sepzJExplicit thousands separator conflicts with 'n' type in format specifier: groupingdecimal_pointrT   r\   r   )_parse_format_specifier_regexmatchrq   	groupdictrV   _locale
localeconv)format_specr  rz   Zformat_dictr  r  r)   r)   r+   r    sT    

r  c           	      C   s   |d }|d }||t |  t |  }|d }|dkrF| | | }nj|dkr\||  | }nT|dkrr| | | }n>|dkrt |d }|d | |  | ||d   }ntd	|S )
Nr  r  r  <r  =^r^   zUnrecognised alignment field)rk   rq   )	rB   r  r  r  r  Zpaddingr  r   Zhalfr)   r)   r+   r  m  s    "r  c                 C   sp   ddl m}m} | sg S | d dkrJt| dkrJ|| d d || d S | d tjkrd| d d S tdd S )Nr&   )chainrepeatr   r^   r   z unrecognised format for grouping)	itertoolsr,  r-  rk   r&  CHAR_MAXrq   )r!  r,  r-  r)   r)   r+   _group_lengths  s    r0  c                 C   s   |d }|d }g }t |D ]}|dkr0tdttt| |d|}|d|t|   | | d    | d |  } ||8 }| s|dkr q|t|8 }qtt| |d}|d|t|   | | d    |t|S )Nr   r!  r&   zgroup length should be positiver.   rR   )r0  rq   r   r   rk   rr   rs   reversed)r}   r  	min_widthsepr!  groupsrS  r)   r)   r+   _insert_thousands_sep  s     $$r5  c                 C   s$   | rdS |d dv r|d S dS d S )NrU   rB   z +rT   r)   )is_negativer  r)   r)   r+   r    s
    r  c                 C   s   t | |}|s|d r"|d | }|dks6|d dv r\ddddd|d  }|d	||7 }|d d
krp|d
7 }|d r|d t| t| }nd}t|||}t||| |S )NZaltr"  r&   r  r  r   r   )r   r   r  r  z{0}{1:+}r  r  r  )r  formatrk   r5  r  )r6  r{   r|   rW   r  rB   Zecharr2  r)   r)   r+   r    s    
r  ZInfz-Infr   r   r^   )N)F)r&   )r'  )r'  )FF)F)N)r.   )y__all__r4   Z	__xname____version__Z__libmpdec_version__mathr   Znumbersr  syscollectionsr'   Z_namedtupler   ImportErrorr   r   r   r   r   r   r   r   r$   r%   maxsizer    r!   r"   r#   ArithmeticErrorr   r   r	   r   ZeroDivisionErrorr
   r   r   r   r   r   r   r   r   rw   r   r<  r  r  ZcontextvarsZ
ContextVarrG   r   r   r   rb   r   r9   NumberregisterrN   r   rn   r   rV   r   r,  r-  r  r  r  r  rx  rt  r  r	  r  r
  rb  r;  r.  r   r   r   r   r   recompileVERBOSE
IGNORECASEr$  rf   r  r
  DOTALLr#  localer&  r  r  r0  r5  r  r  rs  rr  r=   r^  r9  r]  r@   	hash_infomodulusr   r  r   r   r   r   r   r)   r)   r)   r+   <module>s   s`  #

&


.                          
             ^

0",#
%$+


*


P
%
)