a
    ¥Q•hÜf  ã                   @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ G dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ deeeƒZG dd„ deƒZG dd„ deeƒZG dd„ deeƒZ G dd„ dee ƒZ!G d d!„ d!eeeƒZ"G d"d#„ d#ee"ƒZ#G d$d%„ d%eeeƒZ$G d&d'„ d'ee$ƒZ%G d(d)„ d)eeeeƒZ&G d*d+„ d+ee&ƒZ'G d,d-„ d-e&ƒZ(G d.d/„ d/ee(ƒZ)G d0d1„ d1eeeeeƒZ*G d2d3„ d3ee*ƒZ+d<d6d7„Z,d8d9„ Z-d:d;„ Z.dS )=é    N)Úsettings)ÚImproperlyConfigured)Úmodels)ÚHttp404)Útimezone)Úcached_property)Úgettext)ÚView)ÚBaseDetailViewÚ!SingleObjectTemplateResponseMixin)ÚMultipleObjectMixinÚ#MultipleObjectTemplateResponseMixinc                   @   sH   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )Ú	YearMixinz-Mixin for views manipulating year-based data.z%YNc                 C   s   | j S )zv
        Get a year format string in strptime syntax to be used to parse the
        year from url variables.
        )Úyear_format©Úself© r   úS/var/www/sistema_ama/venv/lib/python3.9/site-packages/django/views/generic/dates.pyÚget_year_format   s    zYearMixin.get_year_formatc                 C   sd   | j }|du r`z| jd }W nB ty^   z| jjd }W n tyX   ttdƒƒ‚Y n0 Y n0 |S )z8Return the year for which this view should display data.NÚyearzNo year specified)r   ÚkwargsÚKeyErrorÚrequestÚGETr   Ú_)r   r   r   r   r   Úget_year"   s    zYearMixin.get_yearc                 C   s   t | |ddd�S )zGet the next valid year.Fr   ©Úis_previousÚperiod©Ú_get_next_prev©r   Údater   r   r   Úget_next_year/   s    zYearMixin.get_next_yearc                 C   s   t | |ddd�S )zGet the previous valid year.Tr   r   r   r!   r   r   r   Úget_previous_year3   s    zYearMixin.get_previous_yearc                 C   s<   z|j |jd ddd�W S  ty6   ttdƒƒ‚Y n0 dS )úŒ
        Return the start date of the next interval.

        The interval is defined by start date <= item date < next start date.
        é   ©r   ÚmonthÚdayúDate out of rangeN)Úreplacer   Ú
ValueErrorr   r   r!   r   r   r   Ú_get_next_year7   s    zYearMixin._get_next_yearc                 C   s   |j ddd�S )ú.Return the start date of the current interval.r&   ©r(   r)   ©r+   r!   r   r   r   Ú_get_current_yearB   s    zYearMixin._get_current_year)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r#   r$   r-   r1   r   r   r   r   r      s   r   c                   @   sH   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )Ú
MonthMixinz.Mixin for views manipulating month-based data.z%bNc                 C   s   | j S )zx
        Get a month format string in strptime syntax to be used to parse the
        month from url variables.
        )Úmonth_formatr   r   r   r   Úget_month_formatM   s    zMonthMixin.get_month_formatc                 C   sd   | j }|du r`z| jd }W nB ty^   z| jjd }W n tyX   ttdƒƒ‚Y n0 Y n0 |S )z9Return the month for which this view should display data.Nr(   zNo month specified)r(   r   r   r   r   r   r   )r   r(   r   r   r   Ú	get_monthT   s    zMonthMixin.get_monthc                 C   s   t | |ddd�S )zGet the next valid month.Fr(   r   r   r!   r   r   r   Úget_next_montha   s    zMonthMixin.get_next_monthc                 C   s   t | |ddd�S )zGet the previous valid month.Tr(   r   r   r!   r   r   r   Úget_previous_monthe   s    zMonthMixin.get_previous_monthc                 C   s\   |j dkrDz|j|jd ddd�W S  ty@   ttdƒƒ‚Y qX0 n|j|j d dd�S dS )r%   é   r&   r'   r*   r/   N)r(   r+   r   r,   r   r   r!   r   r   r   Ú_get_next_monthi   s    
zMonthMixin._get_next_monthc                 C   s   |j dd�S )z/Return the start date of the previous interval.r&   )r)   r0   r!   r   r   r   Ú_get_current_monthw   s    zMonthMixin._get_current_month)r2   r3   r4   r5   r7   r(   r8   r9   r:   r;   r=   r>   r   r   r   r   r6   G   s   r6   c                   @   sH   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )ÚDayMixinz,Mixin for views manipulating day-based data.z%dNc                 C   s   | j S )zt
        Get a day format string in strptime syntax to be used to parse the day
        from url variables.
        )Ú
day_formatr   r   r   r   Úget_day_format‚   s    zDayMixin.get_day_formatc                 C   sd   | j }|du r`z| jd }W nB ty^   z| jjd }W n tyX   ttdƒƒ‚Y n0 Y n0 |S )z7Return the day for which this view should display data.Nr)   zNo day specified)r)   r   r   r   r   r   r   )r   r)   r   r   r   Úget_day‰   s    zDayMixin.get_dayc                 C   s   t | |ddd�S )zGet the next valid day.Fr)   r   r   r!   r   r   r   Úget_next_day–   s    zDayMixin.get_next_dayc                 C   s   t | |ddd�S )zGet the previous valid day.Tr)   r   r   r!   r   r   r   Úget_previous_dayš   s    zDayMixin.get_previous_dayc                 C   s   |t jdd� S )r%   r&   ©Údays)ÚdatetimeÚ	timedeltar!   r   r   r   Ú_get_next_dayž   s    zDayMixin._get_next_dayc                 C   s   |S ©r.   r   r!   r   r   r   Ú_get_current_day¦   s    zDayMixin._get_current_day)r2   r3   r4   r5   r@   r)   rA   rB   rC   rD   rI   rK   r   r   r   r   r?   |   s   r?   c                   @   sP   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú	WeekMixinz-Mixin for views manipulating week-based data.ú%UNc                 C   s   | j S )zv
        Get a week format string in strptime syntax to be used to parse the
        week from url variables.
        )Úweek_formatr   r   r   r   Úget_week_format±   s    zWeekMixin.get_week_formatc                 C   sd   | j }|du r`z| jd }W nB ty^   z| jjd }W n tyX   ttdƒƒ‚Y n0 Y n0 |S )z8Return the week for which this view should display data.NÚweekzNo week specified)rP   r   r   r   r   r   r   )r   rP   r   r   r   Úget_week¸   s    zWeekMixin.get_weekc                 C   s   t | |ddd�S )zGet the next valid week.FrP   r   r   r!   r   r   r   Úget_next_weekÅ   s    zWeekMixin.get_next_weekc                 C   s   t | |ddd�S )zGet the previous valid week.TrP   r   r   r!   r   r   r   Úget_previous_weekÉ   s    zWeekMixin.get_previous_weekc                 C   s@   z|t jd|  |¡ d� W S  ty:   ttdƒƒ‚Y n0 dS )r%   é   rE   r*   N)rG   rH   Ú_get_weekdayÚOverflowErrorr   r   r!   r   r   r   Ú_get_next_weekÍ   s    zWeekMixin._get_next_weekc                 C   s   |t  |  |¡¡ S rJ   )rG   rH   rU   r!   r   r   r   Ú_get_current_weekØ   s    zWeekMixin._get_current_weekc                 C   s@   |   ¡ }|dv r| ¡ S |dkr0| ¡ d d S td| ƒ‚dS )z†
        Return the weekday for a given date.

        The first day according to the week format is 0 and the last day is 6.
        >   ú%Vú%WrM   r&   rT   zunknown week format: %sN)rO   Úweekdayr,   )r   r"   rN   r   r   r   rU   Ü   s    zWeekMixin._get_weekday)r2   r3   r4   r5   rN   rP   rO   rQ   rR   rS   rW   rX   rU   r   r   r   r   rL   «   s   rL   c                   @   sD   e Zd ZdZdZdZdd„ Zdd„ Zedd	„ ƒZ	d
d„ Z
dd„ ZdS )Ú	DateMixinz3Mixin class for views manipulating date-based data.NFc                 C   s    | j du rtd| jj ƒ‚| j S )z7Get the name of the date field to be used to filter by.Nz%s.date_field is required.)Ú
date_fieldr   Ú	__class__r2   r   r   r   r   Úget_date_fieldñ   s
    

ÿzDateMixin.get_date_fieldc                 C   s   | j S )zi
        Return `True` if the view should be allowed to display objects from
        the future.
        )Úallow_futurer   r   r   r   Úget_allow_futureù   s    zDateMixin.get_allow_futurec                 C   s6   | j du r|  ¡ j n| j }|j |  ¡ ¡}t|tjƒS )zq
        Return `True` if the date field is a `DateTimeField` and `False`
        if it's a `DateField`.
        N)ÚmodelÚget_querysetÚ_metaÚ	get_fieldr_   Ú
isinstancer   ÚDateTimeField)r   rb   Úfieldr   r   r   Úuses_datetime_field  s    zDateMixin.uses_datetime_fieldc                 C   s,   | j r(tj |tjj¡}tjr(t |¡}|S )zó
        Convert a date into a datetime when the date field is a DateTimeField.

        When time zone support is enabled, `date` is assumed to be in the
        current time zone, so that displayed items are consistent with the URL.
        )	ri   rG   ÚcombineÚtimeÚminr   ÚUSE_TZr   Ú
make_aware)r   Úvaluer   r   r   Ú_make_date_lookup_arg  s
    
zDateMixin._make_date_lookup_argc                 C   sN   |   ¡ }| jrB|  |¡}|  |tjdd� ¡}d| |d| |iS ||iS dS )z×
        Get the lookup kwargs for filtering on a single date.

        If the date field is a DateTimeField, we can't just filter on
        date_field=date because that doesn't take the time into account.
        r&   rE   ú%s__gteú%s__ltN)r_   ri   rp   rG   rH   )r   r"   r]   ÚsinceÚuntilr   r   r   Ú_make_single_date_lookup  s    
þz"DateMixin._make_single_date_lookup)r2   r3   r4   r5   r]   r`   r_   ra   r   ri   rp   ru   r   r   r   r   r\   ë   s   

	r\   c                   @   sJ   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
ddd„ZdS )ÚBaseDateListViewzFAbstract base class for date-based views displaying a list of objects.Fr   c                 O   s6   |   ¡ \| _| _}| jf | j| jdœ|¤Ž}|  |¡S )N)Úobject_listÚ	date_list)Úget_dated_itemsrx   rw   Úget_context_dataÚrender_to_response)r   r   Úargsr   Úextra_contextÚcontextr   r   r   Úget4  s    ÿÿzBaseDateListView.getc                 C   s   t dƒ‚dS )z#Obtain the list of dates and items.z>A DateView must provide an implementation of get_dated_items()N)ÚNotImplementedErrorr   r   r   r   ry   ;  s    ÿz BaseDateListView.get_dated_itemsc                 C   s   | j du rd|  ¡  S | j S )zu
        Return the field or fields to use for ordering the queryset; use the
        date field by default.
        Nú-%s)Úorderingr_   r   r   r   r   Úget_orderingA  s    zBaseDateListView.get_orderingc           	      K   s¤   |   ¡ jf i |¤Ž}|  ¡ }|  ¡ }|  ¡ }|  |¡}|sf| jrHt ¡ nt	ƒ }|jf i d| |i¤Ž}|s |du rx| n| 
¡  }|r ttdƒd|jjji ƒ‚|S )zs
        Get a queryset properly filtered according to `allow_future` and any
        extra lookup kwargs.
        ú%s__lteNú$No %(verbose_name_plural)s availableÚverbose_name_plural)rc   Úfilterr_   ra   Úget_allow_emptyZget_paginate_byri   r   ÚnowÚtimezone_todayÚexistsr   r   rb   rd   r†   )	r   ÚlookupÚqsr]   r`   Úallow_emptyZpaginate_byr‰   Úis_emptyr   r   r   Úget_dated_querysetH  s$    

ÿÿÿz#BaseDateListView.get_dated_querysetc                 C   s   | j S )zf
        Get the aggregation period for the list of dates: 'year', 'month', or
        'day'.
        )Údate_list_periodr   r   r   r   Úget_date_list_periode  s    z%BaseDateListView.get_date_list_periodNÚASCc                 C   sr   |   ¡ }|  ¡ }|du r |  ¡ }| jr6| |||¡}n| |||¡}|durn|sn|snttdƒd|jj	j
i ƒ‚|S )zŽ
        Get a date list by calling `queryset.dates/datetimes()`, checking
        along the way for empty lists that aren't allowed.
        Nr…   r†   )r_   rˆ   r’   ri   Ú	datetimesÚdatesr   r   rb   rd   r†   )r   ÚquerysetZ	date_typer‚   r]   rŽ   rx   r   r   r   Úget_date_listl  s    
ÿÿÿzBaseDateListView.get_date_list)Nr“   )r2   r3   r4   r5   rŽ   r‘   r   ry   rƒ   r�   r’   r—   r   r   r   r   rv   .  s   rv   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚBaseArchiveIndexViewzQ
    Base class for archives of date-based items. Requires a response mixin.
    Úlatestc                 C   s,   |   ¡ }| j|dd�}|s"| ¡ }||i fS )ú:Return (date_list, items, extra_context) for this request.ÚDESC)r‚   )r�   r—   Únone)r   r�   rx   r   r   r   ry   Œ  s
    z$BaseArchiveIndexView.get_dated_itemsN)r2   r3   r4   r5   Zcontext_object_namery   r   r   r   r   r˜   …  s   r˜   c                   @   s   e Zd ZdZdZdS )ÚArchiveIndexViewz&Top-level archive of date-based items.Z_archiveN©r2   r3   r4   r5   Ztemplate_name_suffixr   r   r   r   r�   —  s   r�   c                   @   s(   e Zd ZdZdZdZdd„ Zdd„ ZdS )	ÚBaseYearArchiveViewú*List of objects published in a given year.r(   Fc           	      C   s”   |   ¡ }|  ¡ }t||  ¡ ƒ}|  |¡}|  |  |¡¡}d| |d| |i}| jf i |¤Ž}|  |¡}|  ¡ sv| 	¡ }||||  
|¡|  |¡dœfS )rš   rq   rr   )r   Z	next_yearZprevious_year)r   r_   Ú_date_from_stringr   rp   r-   r�   r—   Úget_make_object_listrœ   r#   r$   )	r   r   r]   r"   rs   rt   Úlookup_kwargsr�   rx   r   r   r   ry   £  s&    
þ
ýýz#BaseYearArchiveView.get_dated_itemsc                 C   s   | j S )zo
        Return `True` if this view should contain the full list of objects in
        the given year.
        )Úmake_object_listr   r   r   r   r¢   Ã  s    z(BaseYearArchiveView.get_make_object_listN)r2   r3   r4   r5   r‘   r¤   ry   r¢   r   r   r   r   rŸ   �  s
    rŸ   c                   @   s   e Zd ZdZdZdS )ÚYearArchiveViewr    Z_archive_yearNrž   r   r   r   r   r¥   Ë  s   r¥   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚBaseMonthArchiveViewú+List of objects published in a given month.r)   c           
      C   s”   |   ¡ }|  ¡ }|  ¡ }t||  ¡ ||  ¡ ƒ}|  |¡}|  |  |¡¡}d| |d| |i}| jf i |¤Ž}|  	|¡}	|	|||  
|¡|  |¡dœfS )rš   rq   rr   )r(   Ú
next_monthÚprevious_month)r   r9   r_   r¡   r   r8   rp   r=   r�   r—   r:   r;   )
r   r   r(   r]   r"   rs   rt   r£   r�   rx   r   r   r   ry   Ö  s(    ÿ
þ
ýýz$BaseMonthArchiveView.get_dated_itemsN)r2   r3   r4   r5   r‘   ry   r   r   r   r   r¦   Ñ  s   r¦   c                   @   s   e Zd ZdZdZdS )ÚMonthArchiveViewr§   Z_archive_monthNrž   r   r   r   r   rª   õ  s   rª   c                   @   s   e Zd ZdZdd„ ZdS )ÚBaseWeekArchiveViewú*List of objects published in a given week.c              
   C   sü   |   ¡ }|  ¡ }|  ¡ }|  ¡ }ddddœ}z|| }W n, tyd   td|d t|ƒ¡f ƒ‚Y n0 |  ¡ }|dkrŽ|dkrŽtd||f ƒ‚t	|||d	||ƒ}|  
|¡}	|  
|  |¡¡}
d
| |	d| |
i}| jf i |¤Ž}d|||  |¡|  |¡dœfS )rš   Ú1Ú0)rZ   rM   rY   z'Unknown week format %r. Choices are: %sz, rY   z%GzeISO week directive '%s' is incompatible with the year directive '%s'. Use the ISO year '%%G' instead.z%wrq   rr   N)rP   Z	next_weekZprevious_week)r   rQ   r_   rO   r   r,   ÚjoinÚsortedr   r¡   rp   rW   r�   rR   rS   )r   r   rP   r]   rN   Zweek_choicesZ
week_startr   r"   rs   rt   r£   r�   r   r   r   ry   þ  sL    þÿÿ
þþÿ
þýýz#BaseWeekArchiveView.get_dated_itemsN©r2   r3   r4   r5   ry   r   r   r   r   r«   û  s   r«   c                   @   s   e Zd ZdZdZdS )ÚWeekArchiveViewr¬   Z_archive_weekNrž   r   r   r   r   r²   /  s   r²   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚBaseDayArchiveViewú)List of objects published on a given day.c                 C   s@   |   ¡ }|  ¡ }|  ¡ }t||  ¡ ||  ¡ ||  ¡ ƒ}|  |¡S ©rš   )r   r9   rB   r¡   r   r8   rA   Ú_get_dated_items)r   r   r(   r)   r"   r   r   r   ry   8  s    ú	z"BaseDayArchiveView.get_dated_itemsc              	   C   sH   |   |¡}| jf i |¤Ž}d|||  |¡|  |¡|  |¡|  |¡dœfS )z•
        Do the actual heavy lifting of getting the dated items; this accepts a
        date object so that TodayArchiveView can be trivial.
        N)r)   Zprevious_dayZnext_dayr©   r¨   )ru   r�   rD   rC   r;   r:   )r   r"   r£   r�   r   r   r   r¶   I  s    
ûýz#BaseDayArchiveView._get_dated_itemsN)r2   r3   r4   r5   ry   r¶   r   r   r   r   r³   5  s   r³   c                   @   s   e Zd ZdZdZdS )ÚDayArchiveViewr´   Ú_archive_dayNrž   r   r   r   r   r·   ^  s   r·   c                   @   s   e Zd ZdZdd„ ZdS )ÚBaseTodayArchiveViewú List of objects published today.c                 C   s   |   tj ¡ ¡S rµ   )r¶   rG   r"   Útodayr   r   r   r   ry   g  s    z$BaseTodayArchiveView.get_dated_itemsNr±   r   r   r   r   r¹   d  s   r¹   c                   @   s   e Zd ZdZdZdS )ÚTodayArchiveViewrº   r¸   Nrž   r   r   r   r   r¼   l  s   r¼   c                       s"   e Zd ZdZd‡ fdd„	Z‡  ZS )ÚBaseDateDetailViewú’
    Detail view of a single object on a single date; this differs from the
    standard DetailView by accepting a year/month/day in the URL.
    Nc                    s¨   |   ¡ }|  ¡ }|  ¡ }t||  ¡ ||  ¡ ||  ¡ ƒ}|du rF|  ¡ n|}|  ¡ s€|t	j
 ¡ kr€ttdƒ|jjj| jjdœ ƒ‚|  |¡}|jf i |¤Ž}tƒ j|d�S )z%Get the object this request displays.NzZFuture %(verbose_name_plural)s not available because %(class_name)s.allow_future is False.)r†   Ú
class_name)r–   )r   r9   rB   r¡   r   r8   rA   rc   ra   rG   r"   r»   r   r   rb   rd   r†   r^   r2   ru   r‡   ÚsuperÚ
get_object)r   r–   r   r(   r)   r"   r�   r£   ©r^   r   r   rÁ   x  s2    ú
ÿþüÿ
zBaseDateDetailView.get_object)N)r2   r3   r4   r5   rÁ   Ú__classcell__r   r   rÂ   r   r½   r  s   r½   c                   @   s   e Zd ZdZdZdS )ÚDateDetailViewr¾   Z_detailNrž   r   r   r   r   rÄ   ž  s   rÄ   Ú Ú__c           	      C   sv   || | | | }t | ƒ| t |ƒ | t |ƒ }ztj ||¡ ¡ W S  typ   ttdƒ||dœ ƒ‚Y n0 dS )z”
    Get a datetime.date object given a format string and a year, month, and day
    (only year is mandatory). Raise a 404 for an invalid date.
    uC   Invalid date string â€œ%(datestr)sâ€� given format â€œ%(format)sâ€�)ÚdatestrÚformatN)ÚstrrG   Ústrptimer"   r,   r   r   )	r   r   r(   r7   r)   r@   ÚdelimrÈ   rÇ   r   r   r   r¡   §  s     þÿÿr¡   c                 C   sN  |   ¡ }|  ¡ }|  ¡ }t| d| ƒ}t| d| ƒ}||ƒ||ƒ }	}
|r€|rd||	tjdd� ƒ}n|
}|sv|tƒ krz|S dS nÊ|r d| |  |	¡i}d| }nd| |  |
¡i}|}|sÜ| jrÊt	 
¡ }ntƒ }||d	| < |  ¡ jf i |¤Ž |¡}zt|d
 |ƒ}W n t�y   Y dS 0 | j�rBtj�r:t	 |¡}| ¡ }||ƒS dS )aV  
    Get the next or the previous valid date. The idea is to allow links on
    month/day views to never be 404s by never providing a date that'll be
    invalid for the given view.

    This is a bit complicated since it handles different intervals of time,
    hence the coupling to generic_view.

    However in essence the logic comes down to:

        * If allow_empty and allow_future are both true, this is easy: just
          return the naive result (just the next/previous day/week/month,
          regardless of object existence.)

        * If allow_empty is true, allow_future is false, and the naive result
          isn't in the future, then return it; otherwise return None.

        * If allow_empty is false and allow_future is true, return the next
          date *that contains a valid object*, even if it's in the future. If
          there are no next objects, return None.

        * If allow_empty is false and allow_future is false, return the next
          date that contains a valid object. If that date is in the future, or
          if there are no next objects, return None.
    z_get_current_%sz_get_next_%sr&   rE   Nrr   r�   rq   r„   r   )r_   rˆ   ra   ÚgetattrrG   rH   rŠ   rp   ri   r   r‰   rc   r‡   Úorder_byÚ
IndexErrorr   rm   Ú	localtimer"   )Zgeneric_viewr"   r   r   r]   rŽ   r`   Zget_currentZget_nextÚstartÚendÚresultrŒ   r‚   r‰   r�   r   r   r   r    ¼  sB    


r    c                   C   s   t jrt ¡ S tj ¡ S dS )z1Return the current date in the current time zone.N)r   rm   r   Ú	localdaterG   r"   r»   r   r   r   r   rŠ     s    rŠ   )rÅ   rÅ   rÅ   rÅ   rÆ   )/rG   Údjango.confr   Údjango.core.exceptionsr   Ú	django.dbr   Údjango.httpr   Údjango.utilsr   Údjango.utils.functionalr   Údjango.utils.translationr   r   Údjango.views.generic.baser	   Údjango.views.generic.detailr
   r   Údjango.views.generic.listr   r   r   r6   r?   rL   r\   rv   r˜   r�   rŸ   r¥   r¦   rª   r«   r²   r³   r·   r¹   r¼   r½   rÄ   r¡   r    rŠ   r   r   r   r   Ú<module>   sD   25/@CW.$4),
 ÿ
Z