o
    ðäjZÀ  ã                   @   sð  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZm	Z	mZ d dlZddlmZmZmZ e	dddƒZe ¡ Zzd dlmZ W n eyd   d dlZejdd„ ƒZY nw d	Zejrod
d„ Znejd	d�Zedd„ ƒZdd„ ZG dd„ deƒZ ej!dko�ej"dk Z#dd„ Z$dd„ Z%dd„ Z&dZ'G dd„ de(ƒZ)G dd„ de(ƒZ*e*dddƒZ+d d!„ Z,e-ed"d ƒZ.d8d#d$„Z/d%d&„ Z0d'd(„ Z1d)d*„ Z2d+d,„ Z3d-d.„ Z4G d/d0„ d0e(ƒZ5d1Z6d2d3„ Z7G d4d5„ d5e(ƒZ8G d6d7„ d7e(ƒZ9dS )9é    N)ÚMAXYEARÚMINYEARÚdatetimeÚ	timedeltaé   )Ú_tzinfoÚenfoldÚtzname_in_python2i²  )Únullcontextc                 c   s   � | V  d S ©N© )Úcontextr   r   úW/var/www/ticemtrilhas/avaliacao_env/lib/python3.10/site-packages/dateutil/tz/_tzfile.pyÚ_nullcontext   s   €
r   i   c                    sD   ddl m} ddlm} | ¡ ‰ |ƒ ‰t ˆ¡‡ ‡‡fdd„ƒ}|S )Nr   )ÚOrderedDict)Ú_threadc                    sv   ˆ �/ ˆ  | d ¡}|d u rˆ| ƒ}|ˆ| < tˆƒtkr)ˆjdd� W d   ƒ |S W d   ƒ |S 1 s4w   Y  |S )NF)Úlast)ÚpopÚlenÚ_TIMEDELTA_CACHE_SIZEÚpopitem)ÚsecondsÚrv©Ú
CACHE_LOCKÚTIMEDELTA_CACHEÚfr   r   Úcached_load_timedelta6   s   
ø
ý
ù
ö
z4_cache_load_timedelta.<locals>.cached_load_timedelta)Úcollectionsr   Ú	six.movesr   Úallocate_lockÚ	functoolsÚwraps)r   r   r   r   r   r   r   Ú_cache_load_timedelta.   s   r#   )Úmaxsizec                 C   s
   t | d�S )N©r   )r   r%   r   r   r   Ú_load_timedeltaL   s   
r&   c                 C   s$   |   | ¡}||_||_| |¡ |S r   )Ú__new__Ú_keyÚ	_filenameÚ_load_from_data)ÚclsÚkeyÚfilenameÚdataÚobjr   r   r   Ú	_unpickleQ   s
   

r0   c                       sÜ   e Zd ZdZd,‡ fdd„	Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
edd„ ƒZdd„ Zd,dd„Zdd„ Zeg d¢ƒZdd„ Zdd„ Zdd„ Zdd„ Zed d!„ ƒZed"d#„ ƒZd$d%„ Zd&d'„ ZdZd(d)„ Zd*d+„ Z‡  ZS )-ÚtzfileaK  
    This is a ``tzinfo`` subclass that allows one to use the ``tzfile(5)``
    format timezone files to extract current and historical zone information.

    :param fileobj:
        This can be an opened file stream or a file name that the time zone
        information can be read from.

    :param filename:
        This is an optional parameter specifying the source of the time zone
        information in the event that ``fileobj`` is a file object. If omitted
        and ``fileobj`` is a file stream, this parameter will be set either to
        ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``.

    This class is intended to be mostly equivalent to the standard library
    :py:class:`zoneinfo.ZoneInfo` class. The primary differences are:

        * All caching in ``tzfile`` is handled by :func:`tz.gettz` level (you
          should generally not attempt to construct a ``tzfile`` directly).
        * ``tzfile`` objects are pickled by value rather than by reference to
          the IANA key.
        * ``tzfile`` has equality-by-value semantics, whereas
          :py:class:`~zoneinfo.ZoneInfo` has equality-by-identity semantics.

    See `Sources for Time Zone and Daylight Saving Time Data
    <https://data.iana.org/time-zones/tz-link.html>`_ for more information.
    Time zone files can be compiled from the `IANA Time Zone database files
    <https://www.iana.org/time-zones>`_ with the `zic time zone compiler
    <https://www.freebsd.org/cgi/man.cgi?query=zic&sektion=8>`_

    .. note::

        Only construct a ``tzfile`` directly if you have a specific timezone
        file on disk that you want to read into a Python ``tzinfo`` object.
        If you want to get a ``tzfile`` representing a specific IANA zone,
        (e.g. ``'America/New_York'``), you should call
        :func:`dateutil.tz.gettz` with the zone identifier.

    .. versionchanged:: 3.0.0
        ``tzfile`` is now a partial backport of :py:class:`zoneinfo.ZoneInfo`,
        which brings with it support for Version 2 and 3 ``tzfile(5)`` binaries.

    **Examples:**

    Using the US Eastern time zone as an example, we can see that a ``tzfile``
    provides time zone information for the standard Daylight Saving offsets:

    .. testsetup:: tzfile

        from dateutil.tz import gettz
        from datetime import datetime

    .. doctest:: tzfile

        >>> NYC = gettz('America/New_York')
        >>> NYC
        tzfile('/usr/share/zoneinfo/America/New_York')

        >>> print(datetime(2016, 1, 3, tzinfo=NYC))     # EST
        2016-01-03 00:00:00-05:00

        >>> print(datetime(2016, 7, 7, tzinfo=NYC))     # EDT
        2016-07-07 00:00:00-04:00


    The ``tzfile`` structure contains a fully history of the time zone,
    so historical dates will also have the right offsets. For example, before
    the adoption of standard time on November 18, 1883, New York used local
    mean time:

    .. doctest:: tzfile

       >>> print(datetime(1883, 11, 18, tzinfo=NYC))    # LMT
       1883-11-18 00:00:00-04:56:02

    Python versions before 3.6 do not support sub-minute offsets, so there the
    offset is rounded to ``-04:56``.

    And during World War II, New York was on "Eastern War Time", which was a
    state of permanent daylight saving time:

    .. doctest:: tzfile

        >>> print(datetime(1944, 2, 7, tzinfo=NYC))    # EWT
        1944-02-07 00:00:00-04:00

    Nc                    s¾   t t| ƒ ¡  d}t|tjƒr|| _t|dƒ}d}n|d ur"|| _nt|dƒr,|j	| _n|d ur4|| _nt
|ƒ| _|d urZ|sCt|ƒ}|�}|  |¡ W d   ƒ n1 sUw   Y  || _d S )NFÚrbTÚname)Úsuperr1   Ú__init__Ú
isinstanceÚsixÚstring_typesr)   ÚopenÚhasattrr3   Úreprr   Ú
_load_filer(   )ÚselfÚfileobjr-   r,   Úfile_opened_hereÚfile_stream©Ú	__class__r   r   r5   ´   s(   



ÿ
ztzfile.__init__c                 C   ó   | j S )u  
        Read-only attribute returning the ``key`` constructor argument.

        For zones generated from :func:`gettz`, this will be the IANA key
        passed to ``gettz`` â€” no normalization is done, so although in most
        distributions of the time zone database "US/Eastern" is a link to
        "America/New_York", ``tz.gettz("US/Eastern").key`` should always return
        ``"US/Eastern"``.

        For zones constructed via another mechanism without specifying ``key``,
        this returns :obj:`None`.
        )r(   ©r=   r   r   r   r,   Î   s   z
tzfile.keyc                 C   s   |   |¡dkS )a6  
        Whether or not the "wall time" of a given datetime is ambiguous in this
        zone.

        :param dt:
            A :py:class:`datetime.datetime`, naive or time zone aware.


        :return:
            Returns ``True`` if ambiguous, ``False`` otherwise.

        .. versionadded:: 2.6.0
        r   )Ú_is_ambiguous_or_imaginary©r=   Údtr   r   r   Úis_ambiguousÞ   s   ztzfile.is_ambiguousc                 C   s\   |d u s| j r	dS |  |¡}| j|d|d�}| j|d|d�}t|j|jkƒt|j|jkƒ S )Nr   )ÚfoldÚ	timestampr   )Ú_fixed_offsetÚ_get_local_timestampÚ_find_transÚintÚutcoff)r=   rG   rJ   Útti_0Útti_1r   r   r   rE   î   s   

ÿz!tzfile._is_ambiguous_or_imaginaryc                 C   ó   |   |¡jS r   )rM   rO   rF   r   r   r   Ú	utcoffsetû   ó   ztzfile.utcoffsetc                 C   rR   r   )rM   ÚdstoffrF   r   r   r   Údstþ   rT   z
tzfile.dstc                 C   rR   r   )rM   ÚtznamerF   r   r   r   rW     s   ztzfile.tznamec           	      C   s–  t |tƒs	tdƒ‚|j| urtdƒ‚|  |¡}t| jƒ}|dkr-|| jd k r-| j}d}n�|dks8|| jd krkt | j	t
ƒsk| j	 ||j¡\}}|rj|sj|dkrV| jd }n| j}|j|j }| ¡ || jd  k}nQ|dkru| j	}d}nGt | j|¡}|dkr“|| jd kr“| j|d |… \}}n|| jd kr¡| j}| j	}n| j}| jd }|j|j }| ¡ || j|d   k}||j7 }|rÉt|dd�S |S )	a  
        The ``tzfile`` implementation of :py:func:`datetime.tzinfo.fromutc`.

        :param dt:
            A :py:class:`datetime.datetime` object.

        :raises TypeError:
            Raised if ``dt`` is not a :py:class:`datetime.datetime` object.

        :raises ValueError:
            Raised if this is called with a ``dt`` which does not have this
            ``tzinfo`` attached.

        :return:
            Returns a :py:class:`datetime.datetime` object representing the
            wall time in ``self``'s time zone.
        z&fromutc() requires a datetime argumentzdt.tzinfo is not selfr   r   éÿÿÿÿéþÿÿÿé   )rI   )r6   r   Ú	TypeErrorÚtzinfoÚ
ValueErrorrL   r   Ú
_trans_utcÚ_tti_beforeÚ	_tz_afterÚ_ttinfoÚget_trans_info_fromutcÚyearÚ_ttinfosrO   Útotal_secondsÚbisectÚbisect_rightr   )	r=   rG   rJ   Ú	num_transÚttirI   Útti_prevÚshiftÚidxr   r   r   Úfromutc  sN   




ÿÿ€

ztzfile.fromutcc           
      C   s  |d u r| j r
| jS tS |d u r|  |¡}n|}|d u r"t|ddƒ}| j| }t|ƒ}|r6||d k r6| jS |r>||d krst| jt	ƒrp| j 
||j|¡}|rT| jd nd }|d urn|j|jkrn||j ¡  | jd k rn|S |S | jS t ||¡d }	|	dks�J ‚| j|	 S )NrI   r   rX   r   )rK   r`   Ú
_NO_TTINFOrL   ÚgetattrÚ_trans_localr   r_   r6   Ú_TZStrÚget_trans_inforc   rd   rO   re   r^   rf   rg   )
r=   rG   rI   rJ   ÚtsÚltrh   ri   Úlast_ttirl   r   r   r   rM   N  s4   

ztzfile._find_transc                 C   s*   |  ¡ t d |jd  |jd  |j S )Né€Q é  é<   )Ú	toordinalÚEPOCHORDINALÚhourÚminuteÚsecondrF   r   r   r   rL     s   ÿþýÿztzfile._get_local_timestamp)r)   rK   Ú_isdstr(   Ú
_trans_idxrp   r^   r_   Ú_ttinfo_listrd   r`   Ú_tz_strÚ_utcoff_rawc                 C   s
   |   d ¡S r   )Ú__reduce_ex__rD   r   r   r   Ú
__reduce__š  ó   
ztzfile.__reduce__c                    s–   dd„ ˆ j D ƒ}tˆ d|ƒ}dd„ ˆ j D ƒ}ˆ j}ˆ j}ˆ j}ˆ j}||||||f}ˆ jˆ jˆ j|f}	‡ fdd„t	ˆ ƒ 
¡ D ƒ}
|
rGt|	|
fS t|	fS )Nc                 S   s   g | ]	}t |j ¡ ƒ‘qS r   )rN   rO   re   ©Ú.0Úttinfor   r   r   Ú
<listcomp>ž  s    ÿz(tzfile.__reduce_ex__.<locals>.<listcomp>r‚   c                 S   s   g | ]}|j ‘qS r   )rW   r†   r   r   r   r‰   ¢  s    c                    s    i | ]\}}|ˆ j vr||“qS r   )Ú_UNPICKLE_ATTRS)r‡   ÚkÚvrD   r   r   Ú
<dictcomp>±  s    z(tzfile.__reduce_ex__.<locals>.<dictcomp>)r€   ro   r   r~   r^   r�   rB   r(   r)   ÚvarsÚitemsr0   )r=   ÚprotocolrO   ÚabbrÚ	trans_idxÚisdstÚ	trans_utcÚtz_strr.   ÚargsÚstater   rD   r   rƒ   �  s"   ÿ

ÿ
ztzfile.__reduce_ex__c                 C   s6   t |ƒr	t|dƒst | ¡ ¡}t|ƒ}|  |¡ d S )NÚreadline)Ú_is_seekabler:   ÚioÚBytesIOÚreadÚ	load_datar*   )r=   Úfobjr.   r   r   r   r<   ¹  s   ztzfile._load_filec                 C   s  |\}}}}}}|   ||||¡}dd„ |D ƒ}	t||ƒD ]\}
}||	|
< qtjdk rCdd„ |D ƒ}dd„ |	D ƒ}	dd„ |D ƒ}|| _n|}|  |||¡}dd„ t||	|ƒD ƒ}|| _|| _|| _|| _	|| _
i }g | _t||ƒD ]-\}
}||
 }|j ¡ |kr—|
|f}||vr“t|jt|ƒ|jƒ||< || }| j |¡ qptt|ƒƒD ]}|| s±|| | _ nq¤| jr¼| jd | _nd | _|| _|d urÒ|d	krÒt| ¡ ƒ| _n| jsÛ|sÛtd
ƒ‚| jrå| jd | _n|d | _t|ƒdksöt| jtƒsûd| _d S |�sd| _d S |d | jk| _d S )Nc                 S   s   g | ]}|rd nd‘qS )rw   r   r   )r‡   rV   r   r   r   r‰   Ì  s    z*tzfile._load_from_data.<locals>.<listcomp>©é   é   c                 S   ó   g | ]
}d |d d   ‘qS ©rx   é   r   ©r‡   Úsr   r   r   r‰   Õ  ó    c                 S   r¢   r£   r   r¥   r   r   r   r‰   Ö  r§   c                 S   r¢   r£   r   r¥   r   r   r   r‰   ×  r§   c                 S   s&   g | ]\}}}t t|ƒt|ƒ|ƒ‘qS r   )ra   r&   )r‡   rS   Ú	dstoffsetrW   r   r   r   r‰   à  s    ýÿÿr   ó    zNo time zone information found.rX   r   FT)Ú_utcoff_to_dstoffÚzipÚsysÚversion_infor‚   Ú_ts_to_localr€   r   r~   r^   rp   rd   rU   re   ra   rO   r&   rW   ÚappendÚranger   r_   r�   Ú_parse_tz_strÚdecoder`   r]   r6   rK   )r=   r.   r’   r”   rO   r“   r‘   r•   Útrans_dstoffrU   rl   Ú	trans_offÚutcoff_adjustedÚtrans_localr€   Úttinfosri   r,   Úir   r   r   r*   Ä  sr   ÿ

ÿü	ÿ
þ



ztzfile._load_from_datac                    s|  t | ƒ}tdd„ t||ƒD ƒdƒ}dg| ‰dg| ‰ t|ƒˆ|ft|d ddƒˆ dffD ]#\}}}|D ]‰| ˆ }	||	 sC||	 }q4|durO||	 | |ˆ< q4q-‡ ‡‡fdd„t|ƒD ƒ}
dg| }t|ƒD ]T‰|| ˆ  spqgd	d
„ ˆˆ ˆ ˆ fD ƒ}t |ƒdkrŽdd
„ |D ƒ}|p�|}t |ƒdkrª‡‡fdd
„|
D ƒ}||@ }t |ƒdkrª|}|r·t|dd„ d�|ˆ< qgd|ˆ< qg|S )aD  Infer the DST offset (the value of dst()) for each transition.

        TZif files give the total UTC offset of each local time type and
        whether it is DST, but not how much of the offset is DST, so this has
        to be worked out from the standard time on either side of each DST
        period. That is done for each transition rather than for each local
        time type, because zic reuses a local time type for periods with
        different standard offsets (e.g. UTC+0 DST in the Azores was double
        summer time in the 1940s and summer time later).
        c                 s   s   � | ]	\}}|s|V  qd S r   r   )r‡   rO   rV   r   r   r   Ú	<genexpr>E  ó   € z+tzfile._utcoff_to_dstoff.<locals>.<genexpr>Nr   rX   c                    s4   g | ]}ˆ| rˆ| ˆ | krˆ| ˆ| f‘qS r   r   ©r‡   r¸   )ÚafterÚbeforer”   r   r   r‰   V  s    ýþz,tzfile._utcoff_to_dstoff.<locals>.<listcomp>r   c                 S   s   h | ]}|r|’qS r   r   ©r‡   Úcr   r   r   Ú	<setcomp>a  s    z+tzfile._utcoff_to_dstoff.<locals>.<setcomp>c                 S   s   h | ]
}|d  dkr|’qS )i,  r   r   r¾   r   r   r   rÀ   f  r§   c                    s(   h | ]\}}t |ˆˆ   ƒtkr|’qS r   )ÚabsÚ_DST_CONSENSUS_WINDOW)r‡   rs   rU   )r¸   r”   r   r   rÀ   p  s
    þc                 S   s   | dk t | ƒfS ©Nr   )rÁ   )r¿   r   r   r   Ú<lambda>}  s    z*tzfile._utcoff_to_dstoff.<locals>.<lambda>©r,   rw   )r   Únextr«   r°   Úmin)r’   r”   Ú
utcoffsetsÚisdstsÚnÚfirst_std_utcoffÚindicesÚimpliedÚ
std_utcoffrl   Ú	clear_cutÚdstoffsÚ
candidatesÚ	plausibleÚnearbyÚ	consensusr   )r¼   r½   r¸   r”   r   rª   3  sP   þ

þ
€ûþ
þ
ztzfile._utcoff_to_dstoffc                 C   sò   |sg g gS t |ƒt |ƒg}t|ƒdkr(|d }|| d  }||kr'||}}n|d  }}|d d  |7  < |d d  |7  < tdt| ƒƒD ]-}|| |d   }|| |  }||krb||}}|d |  |7  < |d |  |7  < qI|S )z‡Generate number of seconds since 1970 *in the local time*.

        This is necessary to easily find the transition times in local timer   r   )Úlistr   r°   )r’   Útrans_list_utcrÈ   Útrans_list_wallÚoffset_0Úoffset_1r¸   r   r   r   r®   …  s(   
€
ztzfile._ts_to_localc                 C   sN   t |tƒstS | j|jko&| j|jko&| j|jko&| j|jko&|  ¡ | ¡ kS r   )r6   r1   ÚNotImplementedr^   rp   rd   r_   Ú_fallback_key©r=   Úotherr   r   r   Ú__eq__§  s   

ÿ
þ
ýûztzfile.__eq__c                 C   s   t | jtƒr	| jS | jS r   )r6   r`   ra   r�   rD   r   r   r   rÛ   ³  s   ztzfile._fallback_keyc                 C   s
   | |k S r   r   rÜ   r   r   r   Ú__ne__½  r…   ztzfile.__ne__c                 C   s   d| j jt| jƒf S )Nz%s(%s))rB   Ú__name__r;   r)   rD   r   r   r   Ú__repr__À  s   ztzfile.__repr__©NN)rà   Ú
__module__Ú__qualname__Ú__doc__r5   Úpropertyr,   rH   rE   rS   rV   r	   rW   rm   rM   rL   Ú	frozensetrŠ   r„   rƒ   r<   r*   Ústaticmethodrª   r®   rÞ   rÛ   Ú__hash__rß   rá   Ú__classcell__r   r   rA   r   r1   [   s<    X


I1	ÿo
Q
!r1   Úwin32)r    é   c              
   C   s†   t | dƒsdS t| dd ƒ}|d ur|ƒ sdS tsdS z|  ¡ }W n tttfy-   Y dS w z
t t	 
|¡j¡W S  tyB   Y dS w )NÚseekFÚseekableT)r:   ro   Ú_SEEKABLE_PIPES_BUGÚfilenoÚAttributeErrorÚOSErrorr]   ÚstatÚS_ISREGÚosÚfstatÚst_mode)rž   rî   Úfdr   r   r   r™   É  s"   
þÿr™   c              
   C   sD   zt | ƒW S  tjy! } zt tdƒ|¡ W Y d }~d S d }~ww )Nú)Invalid TZif file: unexpected end of file)Ú
_load_dataÚstructÚerrorr7   Ú
raise_fromr]   )rž   Úer   r   r   r�   â  s   
ÿ€þr�   c                    sÈ  t  ˆ¡}|jdkrd}d}n'd}d}|jd |jd  |j |jd  |j |j }ˆ 	|d¡ t  ˆ¡}|j}|j}|j}|rjt
 d||f ˆ || ¡¡}t
 d	| ˆ |¡¡}	t|	ƒ|kritd
t|	ƒ ƒ‚nd}d}	|r�t‡fdd„t|ƒD ƒŽ \}
}}nd}
d}d}i ‰ˆ |¡‰ ‡ ‡fdd„‰t‡fdd„|D ƒƒ}|j|j |j|d   }ˆ 	|d¡ |jdkrÚˆ d¡}|dkrÇtd| ƒ‚ˆ ¡ }| d¡sÔtdƒ‚| d¡}nd }|	||
|||fS )Nr   é   Úlé   Úqé   r¡   z>%s%sz>%sBz5Invalid transition index found while reading TZif: %sr   c                 3   s"   � | ]}t  d ˆ  d¡¡V  qdS )z>lbbr¡   N)rû   Úunpackrœ   r»   )rž   r   r   r¹     s   €  z_load_data.<locals>.<genexpr>c                    s0   | ˆvrˆ   d| ¡}ˆ | |…  ¡ ˆ| < ˆ|  S )Nó    )Úfindr²   )rl   Úspan_end)Ú
abbr_charsÚ	abbr_valsr   r   Úget_abbr-  s   z_load_data.<locals>.get_abbrc                 3   s   � | ]}ˆ |ƒV  qd S r   r   )r‡   rl   )r
  r   r   r¹   >  ó   € rZ   ó   
z+Invalid TZif file: expected newline, got %rrù   )Ú_TZifHeaderÚ	from_fileÚversionÚtimecntÚtypecntÚcharcntÚleapcntÚisstdcntÚisutcntrí   rû   r  rœ   Úmaxr]   r«   r°   Útupler˜   ÚendswithÚrstrip)rž   ÚheaderÚ	time_sizeÚ	time_typeÚ
skip_bytesr  r  r  rÖ   r’   rO   r“   Úabbrindr‘   r¿   Úliner•   r   )r  r	  rž   r
  r   rú   ì  sz   

ÿþýüûÿ	
ÿÿÿÿÿ
	ÿ


rú   i Ìc                   @   s(   e Zd Zg d¢Zdd„ Zedd„ ƒZdS )r  )r  r  r  r  r  r  r  c                 G   s<   t | jƒt |ƒksJ ‚t| j|ƒD ]
\}}t| ||ƒ qd S r   )r   Ú	__slots__r«   Úsetattr)r=   r–   ÚattrÚvalr   r   r   r5   i  s   ÿz_TZifHeader.__init__c                 C   sd   |  d¡dkrtdƒ‚|  d¡}|dkrd}nt|ƒ}|  d¡ |f}|t d|  d¡¡ }| |Ž S )	Nrÿ   s   TZifz"Invalid TZif file: magic not foundr   r  é   z>6lé   )rœ   r]   rN   rû   r  )r+   ÚstreamÚ_versionr  r–   r   r   r   r  n  s   

z_TZifHeader.from_fileN)rà   rã   rä   r   r5   Úclassmethodr  r   r   r   r   r  ^  s
    
r  c                   @   s4   e Zd Zg d¢Zdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ra   ©rO   rU   rW   c                 C   s   || _ || _|| _d S r   r)  )r=   rO   rU   rW   r   r   r   r5   †  s   
z_ttinfo.__init__c                 C   s2   t |tƒstS | j|jko| j|jko| j|jkS r   )r6   ra   rÚ   rO   rU   rW   rÜ   r   r   r   rÞ   ‹  s   

ÿ
ýz_ttinfo.__eq__c                 C   s   |   |¡}|tu r|S | S r   )rÞ   rÚ   )r=   rÝ   Úeqr   r   r   rß   •  s   
z_ttinfo.__ne__c                 C   s   d| j j| j| j| jf S )Nz%s(%s, %s, %s))rB   rà   rO   rU   rW   rD   r   r   r   rá   œ  s   üz_ttinfo.__repr__N)rà   rã   rä   r   r5   rÞ   rß   rá   r   r   r   r   ra   ƒ  s    
ra   c                 C   s   | d | dd … fS )Nr   r   r   ©Útr   r   r   Ú_unpack¨  s   r-  ÚASCIIc                 C   s   t  d|  ||¡S )Nz(?:%s)\Z)ÚreÚmatch)ÚpatternÚstringÚflagsr   r   r   Ú
_fullmatch²  s   r4  c                 C   s   t jdk rd| d d  S | S )NrŸ   rx   r¤   )r¬   r­   r%   r   r   r   Ú_round_offset·  s   
r5  c              
   C   sž  t |  dd¡ƒ\}}d}t||tƒ}|d u rtd|  ƒ‚| d¡}| d¡}d }| d¡}|r4| d¡}| d¡}|rVztt|ƒƒ}W n tyU }	 ztd	|  ƒ‚d }	~	ww td	|  ƒ‚|d ur½| d
¡}|r‚ztt|ƒƒ}W n ty� }	 ztd|  ƒ‚d }	~	ww |d }|sŽtd|  ƒ‚|d  dd¡}
zdd„ |
D ƒ\}}W n ty³ }	 ztd|  ƒ‚d }	~	ww t	||||||ƒS |rÅtd|  ƒ‚t
t|ƒtdƒ|ƒS )Nú,r   z­(?P<std>[a-zA-Z]+|<[a-zA-Z0-9+-]+>)(?:(?P<stdoff>[+-]?\d{1,3}(?::\d{2}(?::\d{2})?)?)(?:(?P<dst>[a-zA-Z]+|<[a-zA-Z0-9+-]+>)(?P<dstoff>[+-]?\d{1,3}(?::\d{2}(?::\d{2})?)?)?)?)?z%s is not a valid TZ stringÚstdrV   z<>ÚstdoffzInvalid STD offset in %srU   zInvalid DST offset in %srw   zMissing transition rules: %sr   c                 s   s   � | ]}t |ƒV  qd S r   )Ú_parse_dst_start_end)r‡   Úxr   r   r   r¹      r  z _parse_tz_str.<locals>.<genexpr>zInvalid TZ string: %sz'Transition rule present without DST: %s)r-  Úsplitr4  Ú	_RE_ASCIIr]   ÚgroupÚstripr5  Ú_parse_tz_deltarq   ra   r&   )r•   Ú
offset_strÚstart_end_strÚ	parser_reÚmÚstd_abbrÚdst_abbrÚ
dst_offsetÚ
std_offsetrþ   Ústart_end_strsÚstartÚendr   r   r   r±   ¿  s\   ÿ




€ÿ
€ÿ€ÿÿr±   c           	      C   sÔ   t |  dd¡ƒ\}}|d d… }|dkr4d}td|tƒ}|d u r&td|  ƒ‚ttt| ¡ ƒƒ}t	|Ž }n&|dkrAd}|dd … }nd}td	|tƒd u rQtd|  ƒ‚t|ƒ}t
||ƒ}|rht|d
 ƒ\|_|_|_|S )Nú/r   ÚMFzM(\d{1,2})\.(\d)\.(\d)zInvalid dst start/end date: %sÚJTz\d{1,3}r   )r-  r;  r4  r<  r]   r  ÚmaprN   ÚgroupsÚ_CalendarOffsetÚ
_DayOffsetÚ_parse_transition_timer{   r|   r}   )	ÚdststrÚdateÚtimeÚ	date_typeÚn_is_julianrC  Údate_offsetÚoffsetÚdoyr   r   r   r9    s,   

ÿr9  c                 C   s~   t d| tƒ}|d u rtd|  ƒ‚dd„ t|jdƒD ƒ\}}}|dkr(td|  ƒ‚| d¡d	kr:| | | }}}|||fS )
Nú=(?P<sign>[+-])?(?P<h>\d{1,3})(:(?P<m>\d{2})(:(?P<s>\d{2}))?)?zInvalid time: %sc                 s   ó   � | ]	}t |pd ƒV  qdS ©r   N©rN   ©r‡   rŒ   r   r   r   r¹   5  rº   z)_parse_transition_time.<locals>.<genexpr>©ÚhrC  r¦   é§   zHour must be in [0, 167]: %sÚsignú-)r4  r<  r]   rN  r=  )Útime_strr0  ra  rC  r¦   r   r   r   rR  ,  s   ý
rR  c                 C   sz   t d| tƒ}|d usJ | ƒ‚dd„ t|jdƒD ƒ\}}}|d |d  | }|dkr0td|  ƒ‚| d	¡d
kr;|d9 }|S )Nr[  c                 s   r\  r]  r^  r_  r   r   r   r¹   J  rº   z"_parse_tz_delta.<locals>.<genexpr>r`  rw   rx   r%  z#Offset hours must be in [0, 24]: %src  rd  rX   )r4  r<  rN  r=  r]   )Útz_deltar0  ra  rC  r¦   Útotalr   r   r   r?  @  s   ýr?  c                   @   sL   e Zd ZdZ	ddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )rq   )r7  rV   rI  rJ  rr   rb   Údst_diffNc                 C   sˆ   || | _ t|ƒ}t|tdƒ|d�| _|| _|| _t|ƒ}t| j ƒ}t|||d�| _|d us2J dƒ‚|d us:J dƒ‚| j| _| j	| _
d S )Nr   r)  zNo transition start specifiedzNo transition end specified)rh  r&   ra   r7  rI  rJ  rV   Ú_get_trans_inforr   Ú_get_trans_info_fromutcrb   )r=   rD  rG  rE  rF  rI  rJ  Údeltar   r   r   r5   c  s   

ÿ
z_TZStr.__init__c                 C   s    | j  |¡}| j |¡}||fS r   )rI  Úyear_to_epochrJ  )r=   rc   rI  rJ  r   r   r   Útransitions{  s   z_TZStr.transitionsc                 C   s4   t |ƒd }t |d ƒd }||t k p||t kS )zmWhether ts is close enough to the new year that the rules for the
        previous or next year might matter.rv   r   )Ú_post_epoch_days_before_yearÚ_NEW_YEAR_MARGIN)r=   rs   rc   Ú
year_startÚyear_endr   r   r   Ú_near_new_year€  s
   
þz_TZStr._near_new_yearc                 C   s–   |   ||¡r|  ||¡S |  |¡\}}|| jdkkr || j8 }n|| j7 }||k r6||  ko2|k n  }n||  ko?|k n   }|rH| jS | jS )z6Get the information about the current transition - ttir   )rr  Ú_get_trans_info_near_new_yearrm  rh  rV   r7  )r=   rs   rc   rI   rI  rJ  r“   r   r   r   ri  Š  s   

z_TZStr._get_trans_infoc              	   C   sÒ   g }| j | jfD ]6}||j ¡  }z
tt|d� j}W n ty,   |dk r(tnt	}Y nw |  
||¡\}}||u r>| |¡ qt|ƒdkrI|d S t| j | jfdd„ d�\}	}
|ra|dkr_|
S |	S |dkrg|	S |
S )Nr%   r   r   c                 S   rC   r   )rO   r+  r   r   r   rÄ   »  s    z6_TZStr._get_trans_info_near_new_year.<locals>.<lambda>rÅ   )r7  rV   rO   re   ÚEPOCHr   rc   ÚOverflowErrorr   r   Ú%_get_trans_info_fromutc_near_new_yearr¯   r   Úsorted)r=   rs   rI   Úvalidri   Úutc_tsÚutc_yearÚactualÚ_ÚsmallerÚlargerr   r   r   rs  ¥  s(   þÿ
€z$_TZStr._get_trans_info_near_new_yearc                 C   sz  | j j ¡ }| jj ¡ }g }|d ||d fD ]}|  |¡\}}| || df¡ | || df¡ q| ¡  |d d  }	d }
d}|t|ƒk r”|| d |kr”|| d }|	}|t|ƒk r~|| d |kr~|| d }|d7 }|t|ƒk r~|| d |ksf||	kr†|}	|}
|t|ƒk r”|| d |ksP|	rž| j| j }}n| j | j}}d}|
d ur¹|j|j  ¡ }|||
 k}||fS )Nr   TFr   )r7  rO   re   rV   rm  r¯   Úsortr   )r=   rs   rc   rÎ   Ú
dst_utcoffrm  ÚyrI  rJ  r“   Úlast_changer¸   Útrans_tsÚ	new_isdstri   rj   rI   rk   r   r   r   rv  Ã  s<   þ÷z,_TZStr._get_trans_info_fromutc_near_new_yearc           	      C   sÚ   |   ||¡r|  ||¡S |  |¡\}}|| jj ¡ 8 }|| jj ¡ 8 }||k r4||  ko0|k n  }n||  ko=|k n   }| jdkrN|}|| j }n|}|| j }||  ko^|k n  }|rh| j|fS | j|fS rÃ   )rr  rv  rm  r7  rO   re   rV   rh  )	r=   rs   rc   rI  rJ  r“   Úambig_startÚ	ambig_endrI   r   r   r   rj  ò  s   

z_TZStr._get_trans_info_fromutcrâ   )rà   rã   rä   r   r5   rm  rr  ri  rs  rv  rj  r   r   r   r   rq   X  s    
ÿ
/rq   i / c                 C   s0   | d }|d |d  |d  |d  d t  S )z8Get the number of days between 1970-01-01 and YEAR-01-01r   ém  rÿ   éd   i�  )rz   )rc   r�  r   r   r   rn    s   (rn  c                   @   s&   e Zd Zg d¢Zd	dd„Zdd„ ZdS )
rQ  )ÚdÚjulianr{   r|   r}   rZ   r   c                 C   sP   d| }||  krdksn t d||f ƒ‚|| _|| _|| _|| _|| _d S )Nr   r‡  zd must be in [%s, 365], not: %s)r]   r‰  rŠ  r{   r|   r}   )r=   r‰  rŠ  r{   r|   r}   Úmin_dayr   r   r   r5     s   
z_DayOffset.__init__c                 C   sd   t |ƒ}| j}| jr|d8 }|dkrt |¡r|d7 }|| d }|| jd | jd  | j 7 }|S )Nr   é;   rv   rw   rx   )rn  r‰  rŠ  ÚcalendarÚisleapr{   r|   r}   )r=   rc   Údays_before_yearr‰  Úepochr   r   r   rl  )  s   z_DayOffset.year_to_epochN©rZ   r   r   )rà   rã   rä   r   r5   rl  r   r   r   r   rQ    s    
rQ  c                   @   s6   e Zd Zg d¢ZdZddd„Zedd„ ƒZd	d
„ ZdS )rP  )rC  Úwr‰  r{   r|   r}   )rX   r   é   rŒ  éZ   éx   é—   éµ   éÔ   éó   i  i0  iN  rZ   r   c                 C   s”   d|  krdkst dƒ‚ t dƒ‚d|  krdks$t dƒ‚ t dƒ‚d|  kr1dks6t dƒ‚ t dƒ‚|| _|| _|| _|| _|| _|| _d S )	Nr   é   zm must be in [1, 12]r  zw must be in [1, 5]r   r¡   zd must be in [0, 6])r]   rC  r’  r‰  r{   r|   r}   )r=   rC  r’  r‰  r{   r|   r}   r   r   r   r5   N  s$   ÿÿÿ
z_CalendarOffset.__init__c                 C   s,   t |ƒ| j|  |dkot |¡ | d S )NrZ   r   )rn  Ú_DAYS_BEFORE_MONTHr�  rŽ  )r+   rc   ÚmonthÚdayr   r   r   Ú_ymd2ord_  s   ÿþýüÿz_CalendarOffset._ymd2ordc           	      C   sÈ   |   || jd¡}|d d }| jdkr|   |d dd¡}n
|   || jd d¡}|| }| j|d  d d }|| jd d 7 }||krG|d8 }|   || j|¡}|d }|| jd | jd  | j 7 }|S )z7Calculates the datetime of the occurrence from the yearr   r    é   rš  rv   rw   rx   )rž  rC  r‰  r’  r{   r|   r}   )	r=   rc   Úfirst_ordinalÚ	first_dayÚnext_ordinalÚdays_in_monthÚ	month_dayÚordinalr�  r   r   r   rl  j  s   
	z_CalendarOffset.year_to_epochNr‘  )	rà   rã   rä   r   r›  r5   r(  rž  rl  r   r   r   r   rP  ;  s    


rP  )r   ):rf   r�  r!   rš   rõ   r/  ró   rû   r¬   r   r   r   r   r7   Ú_commonr   r   r	   rt  ry   rz   Ú
contextlibr
   r   ÚImportErrorÚcontextmanagerr   ÚPY2r#   Ú	lru_cacher&   r0   r1   Úplatformr­   rï   r™   r�   rú   rÂ   Úobjectr  ra   rn   r-  ro   r<  r4  r5  r±   r9  rR  r?  rq   ro  rn  rQ  rP  r   r   r   r   Ú<module>   sn   ü


    o
o%"
O ; 