
    ih                        d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZ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 ddlmZ ddlm Z! ddl"m#Z# dZ$dZ% G d de&          Z'e G d d                      Z( G d de(          Z)e G d d                      Z*d Z+ G d de,          Z- G d d e-!          Z. G d" d#e.          Z/ G d$ d%e/          Z0 G d& d'e/          Z1 G d( d)e/          Z2 G d* d+e/          Z3 G d, d-e/          Z4 G d. d/e/          Z5 G d0 d1e/          Z6 G d2 d3e/          Z7 G d4 d5e/          Z8 G d6 d7e8          Z9 G d8 d9e/          Z: e;            Z< G d: d;e:          Z= G d< d=e.          Z> G d> d?e0          Z? G d@ dAe?          Z@ G dB dCe?          ZA G dD dEe?          ZBdF ZC G dG dHe/          ZD G dI dJe.          ZE G dK dLeE          ZF G dM dNeF          ZG G dO dPeF          ZH G dQ dReE          ZI G dS dTeI          ZJ G dU dVe.          ZK G dW dXeK          ZL G dY dZeL          ZM G d[ d\e.          ZNdS )]z
HTML Widget classes
    N)defaultdict)
CycleErrorTopologicalSorter)chain)flatattto_current_timezone)static)formats)normalize_choices)MONTHS
get_format)format_html	html_safe)_lazy_re_compile)	mark_safe)gettext_lazy   )get_default_renderer)ScriptMediaMediaDefiningClassWidget	TextInputNumberInput
EmailInputURLInput
ColorInputSearchInputTelInputPasswordInputHiddenInputMultipleHiddenInput	FileInputClearableFileInputTextarea	DateInputDateTimeInput	TimeInputCheckboxInputSelectNullBooleanSelectSelectMultipleRadioSelectCheckboxSelectMultipleMultiWidgetSplitDateTimeWidgetSplitHiddenDateTimeWidgetSelectDateWidget)cssjsc                       e Zd ZdS )MediaOrderConflictWarningN)__name__
__module____qualname__     K/var/www/histauto/venv/lib/python3.11/site-packages/django/forms/widgets.pyr7   r7   =   s        Dr<   r7   c                   F    e Zd ZdZd Zd Zd Zd Zd Ze	d             Z
dS )	
MediaAssetz{path}c                 "    || _         || _        d S N)_path
attributes)selfpathrC   s      r=   __init__zMediaAsset.__init__E   s    
$r<   c                 ~    | j         |j         u r| j        |j        k    pt          |t                    o
| j        |k    S rA   )	__class__rE   
isinstancestrrB   )rD   others     r=   __eq__zMediaAsset.__eq__I   s?    %/1Mdi5:6M 
uc"":tzU':	
r<   c                 *    t          | j                  S rA   )hashrB   rD   s    r=   __hash__zMediaAsset.__hash__O   s    DJr<   c                 ^    t          | j        | j        t          | j                            S )N)rE   rC   )r   element_templaterE   r   rC   rO   s    r=   __str__zMediaAsset.__str__S   s1    !t//
 
 
 	
r<   c                 @    t          |           j         d| j        dS )N())typer:   rB   rO   s    r=   __repr__zMediaAsset.__repr__Z   s$    t**);;DJ;;;;r<   c                 l    | j                             d          r| j         S t          | j                   S )zq
        Ensure an absolute path.
        Relative paths are resolved via the {% static %} template tag.
        zhttp://zhttps:///)rB   
startswithr	   rO   s    r=   rE   zMediaAsset.path]   s5     :  !=>> 	:dj!!!r<   N)r8   r9   r:   rR   rF   rL   rP   rS   rX   propertyrE   r;   r<   r=   r?   r?   A   s        % % %
 
 
     
 
 
< < < " " X" " "r<   r?   c                   "     e Zd ZdZ fdZ xZS )r   z*<script src="{path}"{attributes}></script>c                 <     t                      j        |fi | d S rA   )superrF   )rD   srcrC   rH   s      r=   rF   zScript.__init__k   s(    ++
+++++r<   )r8   r9   r:   rR   rF   __classcell__rH   s   @r=   r   r   h   s>        C, , , , , , , , ,r<   r   c                       e Zd ZddZd Zd Zed             Zed             Zd Z	d Z
d	 Zd
 Zd Zed             Zd ZdS )r   Nc                     |#t          |di           }t          |dg           }n|i }|g }|g| _        |g| _        d S )Nr4   r5   )getattr
_css_lists	_js_lists)rD   mediar4   r5   s       r=   rF   zMedia.__init__r   sV    %++Cb))BB{z%r<   c                 (    d| j         d| j        dS )Nz
Media(css=z, js=rV   )_css_jsrO   s    r=   rX   zMedia.__repr__~   s     )-DHHH==r<   c                 *    |                                  S rA   )renderrO   s    r=   rS   zMedia.__str__   s    {{}}r<   c                      t          t                    } j        D ]7}|                                D ] \  }}||                             |           !8 fd|                                D             S )Nc                 ,    i | ]\  }}| j         | S r;   )merge).0mediumlistsrD   s      r=   
<dictcomp>zMedia._css.<locals>.<dictcomp>   s(    LLL}vu

E*LLLr<   )r   listrg   itemsappend)rD   r4   css_listrs   sublists   `    r=   rk   z
Media._css   s    $ 	, 	,H#+>>#3#3 , ,F""7++++,LLLL		LLLLr<   c                       | j         | j         S rA   )rq   rh   rO   s    r=   rl   z	Media._js   s    tz4>**r<   c                      t          d                    t          j         fdt          D                                           S )N
c              3   N   K   | ]} t          d |z                         V   dS )render_N)rf   )rr   namerD   s     r=   	<genexpr>zMedia.render.<locals>.<genexpr>   sL       $ $:>3GD)d"23355$ $ $ $ $ $r<   )r   joinr   from_iterableMEDIA_TYPESrO   s   `r=   rn   zMedia.render   s\    II# $ $ $ $BM$ $ $   
 
 	
r<   c                 *      fd j         D             S )Nc                     g | ]I}t          |d           r|                                n"t          d                    |                    JS )__html__z<script src="{}"></script>hasattrr   r   absolute_path)rr   rE   rD   s     r=   
<listcomp>z#Media.render_js.<locals>.<listcomp>   sd     
 
 
  4,,Y !=t?Q?QRV?W?WXX	
 
 
r<   )rl   rO   s   `r=   	render_jszMedia.render_js   s2    
 
 
 
 
 
 
 	
r<   c                 l     t           j                  }t          j         fd|D                       S )Nc              3   N   K   | ]fd j                  D             V  dS )c                     g | ]J}t          |d           r|                                n#t          d                    |                    KS )r   z,<link href="{}" media="{}" rel="stylesheet">r   )rr   rE   rs   rD   s     r=   r   z.Media.render_css.<locals>.<genexpr>.<listcomp>   sj         tZ00DMMOOO$F**400 	  r<   N)rk   )rr   rs   rD   s    @r=   r   z#Media.render_css.<locals>.<genexpr>   si       #
 #
      !If-  #
 #
 #
 #
 #
 #
r<   )sortedrk   r   r   )rD   ri   s   ` r=   
render_csszMedia.render_css   sQ     ty!!" #
 #
 #
 #
  #
 #
 #
 
 
 	
r<   c                 N    |                     d          r|S t          |          S )z
        Given a relative or absolute path to a static asset, return an absolute
        path. An absolute path will be returned unchanged while a relative path
        will be passed to django.templatetags.static.static().
        rZ   )r\   r	   )rD   rE   s     r=   r   zMedia.absolute_path   s*     ??788 	Kd||r<   c           
          |t           v r,t          di t          |          t          | d|z             iS t	          d|z            )zAReturn a Media object that only contains media of the given type._zUnknown media type "%s"Nr;   )r   r   rJ   rf   KeyErrorrD   r   s     r=   __getitem__zMedia.__getitem__   sN    ;BBCIIwtS4Z'@'@ABBB047888r<   c                  >   t                      }t          d|           D ]<^}}|                    |           |D ] }||k    r|                    ||           |}!=	 t          |                                          S # t
          $ r t          j        d                    d	                    d | D                                 t                     t          t                              t          j        t          d|                                         cY S w xY w)a  
        Merge lists while trying to keep the relative order of the elements.
        Warn if the lists have the same elements in a different relative order.

        For static assets it can be important to have them included in the DOM
        in a certain order. In JavaScript you may not be able to reference a
        global or in CSS you might want to override a style.
        Nz7Detected duplicate Media files in an opposite order: {}z, c              3   4   K   | ]}t          |          V  d S rA   )repr)rr   list_s     r=   r   zMedia.merge.<locals>.<genexpr>   s(      ==ed5kk======r<   )r   filteraddrv   static_orderr   warningswarnformatr   r7   dictfromkeysr   r   )rt   tsheadtailitems        r=   rq   zMedia.merge   s1      !$.. 	 	KD4FF4LLL  4<<FF4&&&		Q))*** 	Q 	Q 	QMIPPII==u=====  *	   e&9&u:M:M&N&NOOPPPPP	Qs    A> >BDDc                 .   t                      }| j        d d          |_        | j        d d          |_        |j        D ]'}|r#|| j        vr|j                            |           (|j        D ]'}|r#|| j        vr|j                            |           (|S rA   )r   rg   rh   rx   )rD   rK   combinedr   s       r=   __add__zMedia.__add__   s    77"oaaa0!^AAA.$ 	1 	1D 1DO33#**4000O 	0 	0D 0DN22"))$///r<   NNN)r8   r9   r:   rF   rX   rS   r]   rk   rl   rn   r   r   r   r   staticmethodrq   r   r;   r<   r=   r   r   p   s        
 
 
 
> > >   M M XM + + X+
 
 

 
 

 
 
(  9 9 9 Q Q \Q6
 
 
 
 
r<   r   c                 ,      fd}t          |          S )Nc                 N   t          |           }	 |j        }n# t          $ r t                      }Y nw xY wt	          dd           }|rYt	          |dd          }|r7|du r|}nt                      }|D ]}|||         z  }|t          |          z   S t          |          S |S )Nr   extendT)r`   ri   AttributeErrorr   rf   )rD   sup_clsbase
definitionr   mrs   clss          r=   _mediazmedia_property.<locals>._media   s    T""	=DD 	 	 	77DDD	 S'400
 
	%Z488F -T>>AAA"( * *T&\)5,,,,$$$s    66)r]   )r   r   s   ` r=   media_propertyr      s,        . Fr<   c                   "     e Zd ZdZ fdZ xZS )r   z@
    Metaclass for classes that can have media definitions.
    c                     t                                          | |||          }d|vrt          |          |_        |S )Nri   )r`   __new__r   ri   )mcsr   basesattrs	new_classrH   s        r=   r   zMediaDefiningClass.__new__  s>    GGOOCue<<	%,Y77IOr<   )r8   r9   r:   __doc__r   rb   rc   s   @r=   r   r     sB                 r<   r   c                       e Zd ZdZdZdZdZdZddZd Z	e
d             ZddZd Zd	 Zdd
ZddZddZd Zd Zd Zd ZdS )r   FTNc                 @    |i n|                                 | _        d S rA   )copyr   )rD   r   s     r=   rF   zWidget.__init__   s     =RRejjll


r<   c                     t          j         |           }| j                                         |_        ||t          |           <   |S rA   )r   r   idrD   memoobjs      r=   __deepcopy__zWidget.__deepcopy__#  s6    iooJOO%%	RXX
r<   c                 <    t          | d          r| j        dk    ndS )N
input_typehiddenF)r   r   rO   s    r=   	is_hiddenzWidget.is_hidden)  s#    .5dL.I.ITt(**uTr<   c              #   L   K   |                      |||          }|d         V  d S )Nwidget)get_context)rD   r   valuer   contexts        r=   
subwidgetszWidget.subwidgets-  s4      ""466hr<   c                 j    |dk    s|dS | j         rt          j        |          S t          |          S )zQ
        Return a value as it should appear when rendered in a template.
         N)is_localizedr
   localize_inputrJ   rD   r   s     r=   format_valuezWidget.format_value1  s>     B;;%-4 	1)%0005zzr<   c           	          d|| j         | j        |                     |          |                     | j        |          | j        diS )Nr   )r   r   requiredr   r   template_name)r   is_requiredr   build_attrsr   r   rD   r   r   r   s       r=   r   zWidget.get_context;  sS    !^ ,**511))$*e<<!%!3 	
 		
r<   c                 h    |                      |||          }|                     | j        ||          S )z$Render the widget as an HTML string.)r   _renderr   )rD   r   r   r   rendererr   s         r=   rn   zWidget.renderG  s2    ""466||D.BBBr<   c                 h    |t                      }t          |                    ||                    S rA   )r   r   rn   )rD   r   r   r   s       r=   r   zWidget._renderL  s/    +--H@@AAAr<   c                     i ||pi S )zBuild an attribute dictionary.r;   )rD   
base_attrsextra_attrss      r=   r   zWidget.build_attrsQ  s    4*4!244r<   c                 ,    |                     |          S )z
        Given a dictionary of data and this widget's name, return the value
        of this widget or None if it's not provided.
        getrD   datafilesr   s       r=   value_from_datadictzWidget.value_from_datadictU  s    
 xx~~r<   c                 
    ||vS rA   r;   r   s       r=   value_omitted_from_datazWidget.value_omitted_from_data\  s    4r<   c                     |S )a  
        Return the HTML ID attribute of this Widget for use by a <label>, given
        the ID of the field. Return an empty string if no ID is available.

        This hook is necessary because some widgets have multiple HTML
        elements and, thus, multiple IDs. In that case, this method should
        return an ID value that corresponds to the first ID in the widget's
        tags.
        r;   rD   id_s     r=   id_for_labelzWidget.id_for_label_  s	     
r<   c                     | j          S rA   r   rD   initials     r=   use_required_attributezWidget.use_required_attributek  s    >!!r<   rA   NN)r8   r9   r:   needs_multipart_formr   r   supports_microsecondsuse_fieldsetrF   r   r]   r   r   r   r   rn   r   r   r   r   r   r   r;   r<   r=   r   r     s"        LK L; ; ; ;   U U XU         

 

 

C C C C
B B B B
5 5 5 5       
 
 
" " " " "r<   r   )	metaclassc                   6     e Zd ZdZdZdZd fd	Z fdZ xZS )Inputz-
    Base class for all <input> widgets.
    Nzdjango/forms/widgets/input.htmlc                     |4|                                 }|                    d| j                  | _        t                                          |           d S )NrW   )r   popr   r`   rF   rD   r   rH   s     r=   rF   zInput.__init__w  sK    JJLLE#ii@@DOr<   c                 n    t                                          |||          }| j        |d         d<   |S )Nr   rW   )r`   r   r   rD   r   r   r   r   rH   s        r=   r   zInput.get_context}  s4    ''%%dE599$(O&!r<   rA   )	r8   r9   r:   r   r   r   rF   r   rb   rc   s   @r=   r   r   o  sl          J5M                   r<   r   c                       e Zd ZdZdZdS )r   textzdjango/forms/widgets/text.htmlNr8   r9   r:   r   r   r;   r<   r=   r   r     s        J4MMMr<   r   c                       e Zd ZdZdZdS )r   numberz django/forms/widgets/number.htmlNr  r;   r<   r=   r   r             J6MMMr<   r   c                       e Zd ZdZdZdS )r   emailzdjango/forms/widgets/email.htmlNr  r;   r<   r=   r   r             J5MMMr<   r   c                       e Zd ZdZdZdS )r   urlzdjango/forms/widgets/url.htmlNr  r;   r<   r=   r   r             J3MMMr<   r   c                       e Zd ZdZdZdS )r   colorzdjango/forms/widgets/color.htmlNr  r;   r<   r=   r   r     r  r<   r   c                       e Zd ZdZdZdS )r   searchz django/forms/widgets/search.htmlNr  r;   r<   r=   r   r     r	  r<   r   c                       e Zd ZdZdZdS )r    telzdjango/forms/widgets/tel.htmlNr  r;   r<   r=   r    r      r  r<   r    c                   2     e Zd ZdZdZd fd	Z fdZ xZS )r!   passwordz"django/forms/widgets/password.htmlNFc                 X    t                                          |           || _        d S rA   )r`   rF   render_value)rD   r   r  rH   s      r=   rF   zPasswordInput.__init__  s)    (r<   c                 \    | j         sd }t                                          |||          S rA   )r  r`   r   rD   r   r   r   rH   s       r=   r   zPasswordInput.get_context  s/      	Eww""4666r<   NF)r8   r9   r:   r   r   rF   r   rb   rc   s   @r=   r!   r!     s`        J8M) ) ) ) ) )7 7 7 7 7 7 7 7 7r<   r!   c                       e Zd ZdZdZdS )r"   r   z django/forms/widgets/hidden.htmlNr  r;   r<   r=   r"   r"     r	  r<   r"   c                   2     e Zd ZdZdZ fdZd Zd Z xZS )r#   zQ
    Handle <input type="hidden"> for fields that have a list
    of values.
    z)django/forms/widgets/multiple_hidden.htmlc                    t                                          |||          }|d         d         }|d         d                             d          }g }t          |d         d                   D ]o\  }}	|                                }
|r
|d||
d<   t                      }| j        |_        |                    |                    ||	|
          d                    p||d         d<   |S )Nr   r   r   r   r   r   )r`   r   r   	enumerater   r"   r   rx   )rD   r   r   r   r   final_attrsr   r   indexvalue_widget_attrsr   rH   s               r=   r   zMultipleHiddenInput.get_context  s    ''%%dE599h'0h(,,T22
&wx'8'ABB 	X 	XME6&++--L < 14UU%;T" ]]F!%!1Ff00v|LLXVWWWW*4,'r<   c                 X    	 |j         }n# t          $ r
 |j        }Y nw xY w ||          S rA   getlistr   r   rD   r   r   r   getters        r=   r   z'MultipleHiddenInput.value_from_datadict  D    	\FF 	 	 	XFFF	vd||   
 c                     |g n|S rA   r;   r   s     r=   r   z MultipleHiddenInput.format_value  s    ]rr-r<   )	r8   r9   r:   r   r   r   r   r   rb   rc   s   @r=   r#   r#     sh         
 @M    &  . . . . . . .r<   r#   c                   L     e Zd ZdZdZdZdZd fd	Zd Zd Z	d	 Z
 fd
Z xZS )r$   FfileTzdjango/forms/widgets/file.htmlNc                    |9| j         s2|                    dd          rt          d| j        j        z            | j         r|ddi}n|                    dd           t                                          |           d S )NmultipleFz,%s doesn't support uploading multiple files.T)allow_multiple_selectedr   
ValueErrorrH   r:   
setdefaultr`   rF   r  s     r=   rF   zFileInput.__init__  s    0 		*e,,  >.-.   ' 	3}#T*  T222r<   c                     dS )z!File input never renders a value.Nr;   r   s     r=   r   zFileInput.format_value  s    r<   c                 f    |j         }| j        r	 |j        }n# t          $ r Y nw xY w ||          S )z+File widgets take data from FILES, not POSTr   r1  r'  r   r(  s        r=   r   zFileInput.value_from_datadict  sP    ' 	!   vd||    
%%c                 
    ||vS rA   r;   r   s       r=   r   z!FileInput.value_omitted_from_data  s    5  r<   c                 L    t                                          |          o| S rA   )r`   r   )rD   r   rH   s     r=   r   z FileInput.use_required_attribute  s"    ww--g66Fw;Fr<   rA   )r8   r9   r:   r1  r   r   r   rF   r   r   r   r   rb   rc   s   @r=   r$   r$     s        #J4M           "    ! ! !G G G G G G G G Gr<   r$   c                        e Zd Z ed          Z ed          Z ed          ZdZdZd Z	d Z
d Zd	 Z fd
Z fdZ fdZ xZS )r%   Clear	CurrentlyChangez.django/forms/widgets/clearable_file_input.htmlFc                     |dz   S )zh
        Given the name of the file input, return the name of the clear checkbox
        input.
        z-clearr;   r   s     r=   clear_checkbox_namez&ClearableFileInput.clear_checkbox_name  s    
 hr<   c                     |dz   S )zX
        Given the name of the clear checkbox input, return the HTML id for it.
        _idr;   r   s     r=   clear_checkbox_idz$ClearableFileInput.clear_checkbox_id  s     e|r<   c                 B    t          |ot          |dd                    S )zI
        Return whether value is considered to be initial value.
        r  F)boolrf   r   s     r=   
is_initialzClearableFileInput.is_initial"  s#     E:geUE::;;;r<   c                 4    |                      |          r|S dS )zK
        Return the file object if it has a defined url attribute.
        N)rE  r   s     r=   r   zClearableFileInput.format_value(  s'     ??5!! 	L	 	r<   c           	         t                                          |||          }|                     |          }|                     |          }|d                             |||                     |          | j        | j        | j        d           |d         d         	                    dd           | j
        |d         d         d<   |S )Nr   )checkbox_namecheckbox_idrE  
input_textinitial_textclear_checkbox_labelr   disabledFchecked)r`   r   r?  rB  updaterE  rJ  rK  rL  r3  rN  )rD   r   r   r   r   rH  rI  rH   s          r=   r   zClearableFileInput.get_context/  s    ''%%dE5990066,,];;  !.*"ooe44"o $ 1(,(A 		
 		
 		
 	'"--j%@@@04'"9-r<   c                    t                                          |||          }|                     |          |v | _        | j        sAt                                          |||                     |                    r|rt          S dS |S r  )r`   r   r?  rN  r   r*   FILE_INPUT_CONTRADICTION)rD   r   r   r   uploadrH   s        r=   r   z&ClearableFileInput.value_from_datadictA  s    ,,T5$??//55= 		MOO$G$G%11$77%
 %
 		  0 0/5r<   c                 x    t                                          |||          o|                     |          |vS rA   )r`   r   r?  )rD   r   r   r   rH   s       r=   r   z*ClearableFileInput.value_omitted_from_dataP  s<    GG++D%>> ;((..d:	
r<   )r8   r9   r:   r   rL  rK  rJ  r   rN  r?  rB  rE  r   r   r   r   rb   rc   s   @r=   r%   r%     s        1W::1[>>L8JDMG    < < <      $    
 
 
 
 
 
 
 
 
r<   r%   c                   $     e Zd ZdZd fd	Z xZS )r&   z"django/forms/widgets/textarea.htmlNc                     ddd}|r|                     |           t                                          |           d S )N4010)colsrows)rO  r`   rF   )rD   r   default_attrsrH   s      r=   rF   zTextarea.__init__Z  sJ    !%t44 	(  ''''''''r<   rA   )r8   r9   r:   r   rF   rb   rc   s   @r=   r&   r&   W  sB        8M( ( ( ( ( ( ( ( ( (r<   r&   c                   .     e Zd ZdZdZd fd	Zd Z xZS )DateTimeBaseInputr   FNc                 \    t                                          |           |pd | _        d S rA   )r`   rF   r   )rD   r   r   rH   s      r=   rF   zDateTimeBaseInput.__init__f  s*    nr<   c                 t    t          j        || j        pt          j        | j                  d                   S )Nr   )r
   r   r   r   
format_keyr   s     r=   r   zDateTimeBaseInput.format_valuej  s5    %4;H'"4T_"E"Ea"H
 
 	
r<   r   )r8   r9   r:   r_  r   rF   r   rb   rc   s   @r=   r\  r\  b  sW        J!% % % % % %
 
 
 
 
 
 
r<   r\  c                       e Zd ZdZdZdS )r'   DATE_INPUT_FORMATSzdjango/forms/widgets/date.htmlNr8   r9   r:   r_  r   r;   r<   r=   r'   r'   p          %J4MMMr<   r'   c                       e Zd ZdZdZdS )r(   DATETIME_INPUT_FORMATSz"django/forms/widgets/datetime.htmlNrb  r;   r<   r=   r(   r(   u  s        )J8MMMr<   r(   c                       e Zd ZdZdZdS )r)   TIME_INPUT_FORMATSzdjango/forms/widgets/time.htmlNrb  r;   r<   r=   r)   r)   z  rc  r<   r)   c                      | du p	| d u p| dk     S )NFr   r;   )vs    r=   boolean_checkrj    s!    U
2a4i21733r<   c                   D     e Zd ZdZdZd	 fd	Zd Z fdZd Zd Z	 xZ
S )
r*   checkboxz"django/forms/widgets/checkbox.htmlNc                 j    t                                          |           |t          n|| _        d S rA   )r`   rF   rj  
check_test)rD   r   rn  rH   s      r=   rF   zCheckboxInput.__init__  s1     ,6+=--:r<   c                 D    |du s|du s||dk    rdS t          |          S )z7Only return the 'value' attribute if value isn't empty.TFNr   rJ   r   s     r=   r   zCheckboxInput.format_value  s0    D==EUNNemu{{F5zzr<   c                     |                      |          r
i |pi ddi}t                                          |||          S )NrN  T)rn  r`   r   r  s       r=   r   zCheckboxInput.get_context  sK    ??5!! 	766i66Eww""4666r<   c                     ||vrdS |                     |          }ddd}t          |t                    r(|                     |                                |          }t	          |          S )NFT)truefalse)r   rI   rJ   lowerrD  )rD   r   r   r   r   valuess         r=   r   z!CheckboxInput.value_from_datadict  si    t 5//eS!! 	5JJu{{}}e44EE{{r<   c                     dS r  r;   r   s       r=   r   z%CheckboxInput.value_omitted_from_data  	     ur<   r   )r8   r9   r:   r   r   rF   r   r   r   r   rb   rc   s   @r=   r*   r*     s        J8MN N N N N N  7 7 7 7 7

 
 
      r<   r*   c                        e Zd ZdZdZdZdZdZddiZdZ	d fd	Z
d ZddZdd	Zdd
Z	 ddZ fdZddZd Zd Zed             Zej        d             Z xZS )ChoiceWidgetFNTrN  r;   c                 X    t                                          |           || _        d S rA   )r`   rF   choicesrD   r   r|  rH   s      r=   rF   zChoiceWidget.__init__  s&    r<   c                     t          j         |           }| j                                         |_        t          j         | j                  |_        ||t          |           <   |S rA   )r   r   r|  r   r   s      r=   r   zChoiceWidget.__deepcopy__  sI    iooJOO%%	i--RXX
r<   c              #   n   K   |                      |          }|                     |||          E d{V  dS )z
        Yield all "subwidgets" of this widget. Used to enable iterating
        options from a BoundField for choice widgets.
        N)r   optionsr   s       r=   r   zChoiceWidget.subwidgets  sI      
 !!%((<<eU33333333333r<   c              #   Z   K   |                      |||          D ]}|d         E d{V  dS )z-Yield a flat list of options for this widget.r   N)	optgroups)rD   r   r   r   groups        r=   r  zChoiceWidget.options  sN      ^^D%77 	  	 EQx	  	 r<   c                    g }d}t          | j                  D ]\  }\  }}|d}g }	t          |t          t          f          r|}
d}|}n	d}
d}||fg}|                    |
|	|f           |D ][\  }}| s| j        ot          |          |v }||z  }|	                    |                     |||||||                     ||dz  }\|S )z+Return a list of optgroups for this widget.FNr   r   )subindexr   r   )	r   r|  rI   rv   tuplerx   r1  rJ   create_option)rD   r   r   r   groupshas_selectedr"  option_valueoption_labelsubgroup
group_namer  r|  subvaluesublabelselecteds                   r=   r  zChoiceWidget.optgroups  sG   3<T\3J3J  	"  	"/E/L,#!H,u66 9)
&!
(,78MM:x7888&- " ""( ,,L0L RUS SS (&&   !)# '  
 
 
 'MH#"$ r<   c           
      $   |t          |          n|d|}| j        r|                     | j        |          ni }|r|                    | j                   d|v r|                     |d         |          |d<   ||||||| j        | j        dd	S )Nr   r   T)	r   r   labelr  r"  r   rW   r   
wrap_label)	rJ   option_inherits_attrsr   r   rO  checked_attributer   r   option_template_name)	rD   r   r   r  r  r"  r  r   option_attrss	            r=   r  zChoiceWidget.create_option  s     '.E


uuuhh4O373MUDTZ///SU 	  	8 6777<!%!2!2<3Eu!M!ML !O!6

 

 
	
r<   c                     t                                          |||          }|                     ||d         d         |          |d         d<   |S )Nr   r   r  )r`   r   r  r  s        r=   r   zChoiceWidget.get_context  sS    ''%%dE599)-'(#G,e*
 *
+& r<   0c                 &    |r| j         r|d|}|S )zp
        Use an incremented id for each option where the main widget
        references the zero index.
        r   )add_id_index)rD   r   r"  s      r=   r   zChoiceWidget.id_for_label  s+    
  	)4$ 	) SS%%(C
r<   c                 f    |j         }| j        r	 |j        }n# t          $ r Y nw xY w ||          S rA   r6  r(  s        r=   r   z ChoiceWidget.value_from_datadict  sP    ' 	!   vd||r7  c                 n    |	| j         rg S t          |t          t          f          s|g}d |D             S )z!Return selected values as a list.Nc                 4    g | ]}|t          |          ndS Nr   rp  )rr   ri  s     r=   r   z-ChoiceWidget.format_value.<locals>.<listcomp>*  s&    ???A!-AR???r<   )r1  rI   r  rv   r   s     r=   r   zChoiceWidget.format_value$  sD    =T9=I%%// 	GE??????r<   c                     | j         S rA   )_choicesrO   s    r=   r|  zChoiceWidget.choices,  s
    }r<   c                 .    t          |          | _        d S rA   )r   r  r   s     r=   r|  zChoiceWidget.choices0  s    )%00r<   )Nr;   rA   r   )r  )r8   r9   r:   r1  r   r   r  r  r  r  rF   r   r   r  r  r  r   r   r   r   r]   r|  setterrb   rc   s   @r=   rz  rz    sV       #JML"D)        4 4 4 4       
& & & &R IM
 
 
 
.         @ @ @   X ^1 1 ^1 1 1 1 1r<   rz  c                   Z     e Zd ZdZdZdZdZddiZdZ fdZ	e
d             Z fd	Z xZS )
r+   selectz django/forms/widgets/select.htmlz'django/forms/widgets/select_option.htmlFr  Tc                 ~    t                                          |||          }| j        rd|d         d         d<   |S )NTr   r   r0  )r`   r   r1  r  s        r=   r   zSelect.get_context=  sB    ''%%dE599' 	:59GHg&z2r<   c                      | \  }}|du p|dk    S )z:Return True if the choice's value is empty string or None.Nr   r;   )choicer   r   s      r=   _choice_has_empty_valuezSelect._choice_has_empty_valueC  s      q}++r<   c                     t                                          |          }| j        r|S t          t	          | j                  d          }|o|duo|                     |          S )zl
        Don't render 'required' if the first <option> has a value, as that's
        invalid HTML.
        N)r`   r   r1  nextiterr|  r  )rD   r   r   first_choicerH   s       r=   r   zSelect.use_required_attributeI  sr    
 "'!?!?!H!H' 	*))D..55" ;D(;,,\::	
r<   )r8   r9   r:   r   r   r  r  r  r  r   r   r  r   rb   rc   s   @r=   r+   r+   5  s        J6MDL#T*!     , , \,

 
 
 
 
 
 
 
 
r<   r+   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )r,   zD
    A Select Widget intended to be used with NullBooleanField.
    Nc                     dt          d          fdt          d          fdt          d          ff}t                                          ||           d S )NunknownUnknownrs  Yesrt  No)r   r`   rF   r}  s      r=   rF   zNullBooleanSelect.__init__`  sV    )%QuXXagg

 	(((((r<   c                 D    	 ddddddd|         S # t           $ r Y dS w xY w)Nrs  rt  )TFrs  rt  23r  )r   r   s     r=   r   zNullBooleanSelect.format_valueh  sV    	      	 	 	99	s    
c           	      h    |                     |          }ddddddddd                     |          S )NTF)TTrueFalseFrs  rt  r  r  r   )rD   r   r   r   r   s        r=   r   z%NullBooleanSelect.value_from_datadictv  sE    

 

 #e**
	r<   rA   )r8   r9   r:   r   rF   r   r   rb   rc   s   @r=   r,   r,   [  se         ) ) ) ) ) )        r<   r,   c                       e Zd ZdZd Zd ZdS )r-   Tc                 X    	 |j         }n# t          $ r
 |j        }Y nw xY w ||          S rA   r&  r(  s        r=   r   z"SelectMultiple.value_from_datadict  r*  r+  c                     dS r  r;   r   s       r=   r   z&SelectMultiple.value_omitted_from_data  rx  r<   N)r8   r9   r:   r1  r   r   r;   r<   r=   r-   r-     s8        "      r<   r-   c                   0     e Zd ZdZdZdZdZd fd	Z xZS )r.   radiozdjango/forms/widgets/radio.htmlz&django/forms/widgets/radio_option.htmlTNc                 P    |dS t                                          ||          S )z
        Don't include for="field_0" in <label> to improve accessibility when
        using a screen reader, in addition clicking such a label would toggle
        the first input.
        Nr   )r`   r   )rD   r   r"  rH   s      r=   r   zRadioSelect.id_for_label  s)     =2ww##C///r<   rA   )	r8   r9   r:   r   r   r  r   r   rb   rc   s   @r=   r.   r.     sR        J5MCL0 0 0 0 0 0 0 0 0 0r<   r.   c                   *    e Zd ZdZdZdZdZd Zd ZdS )r/   Trl  z)django/forms/widgets/checkbox_select.htmlz)django/forms/widgets/checkbox_option.htmlc                     dS r  r;   r   s     r=   r   z-CheckboxSelectMultiple.use_required_attribute  rx  r<   c                     dS r  r;   r   s       r=   r   z.CheckboxSelectMultiple.value_omitted_from_data  rx  r<   N)	r8   r9   r:   r1  r   r   r  r   r   r;   r<   r=   r/   r/     sH        "J?MF  
    r<   r/   c                        e Zd ZdZdZdZd fd	Zed             Z fdZ	d Z
d	 Zd
 Zd Zd Z ee          Z fdZed             Z xZS )r0   aI  
    A widget that is composed of multiple widgets.

    In addition to the values added by Widget.get_context(), this widget
    adds a list of subwidgets to the context as widget['subwidgets'].
    These can be looped over and rendered like normal widgets.

    You'll probably want to use this class with MultiValueField.
    z%django/forms/widgets/multiwidget.htmlTNc                 8   t          |t                    r&d |D             | _        |                                }n+d t	          t          |                    D             | _        d |D             | _        t                                          |           d S )Nc                      g | ]}|rd |z  ndS )_%sr   r;   )rr   r   s     r=   r   z(MultiWidget.__init__.<locals>.<listcomp>  s%    !U!U!UTD"@54<<b!U!U!Ur<   c                     g | ]}d |z  S )r  r;   rr   is     r=   r   z(MultiWidget.__init__.<locals>.<listcomp>  s    !I!I!I%!)!I!I!Ir<   c                 P    g | ]#}t          |t                    r
 |            n|$S r;   )rI   rW   rr   ws     r=   r   z(MultiWidget.__init__.<locals>.<listcomp>  s1    KKKaz!T229KKKr<   )	rI   r   widgets_namesrv  rangelenwidgetsr`   rF   )rD   r  r   rH   s      r=   rF   zMultiWidget.__init__  s    gt$$ 	J!U!UW!U!U!UDnn&&GG!I!IU3w<<5H5H!I!I!IDKK7KKKr<   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rA   r   r  s     r=   r   z(MultiWidget.is_hidden.<locals>.<genexpr>  s$      5511;555555r<   )allr  rO   s    r=   r   zMultiWidget.is_hidden  s!    55555555r<   c                    t                                          |||          }| j        r| j        D ]}| j        |_        t	          |t
          t          f          s|                     |          }|d         d         }|                    dd           }|	                    d          }g }	t          t          | j        | j                            D ]\  }
\  }}|||_        ||z   }	 ||
         }n# t          $ r d }Y nw xY w|r|                                }|d|
|d<   n|}|	                    |                    |||          d                    |	|d         d<   |S )Nr   r   rW   r   r   r   )r`   r   r   r  rI   rv   r  
decompressr   r   r   zipr  r   
IndexErrorr   rx   )rD   r   r   r   r   r   r!  r   r   r   r  widget_namewidget_valuer$  rH   s                 r=   r   zMultiWidget.get_context  s   ''%%dE599 	8, 8 8&*&7## %$// 	+OOE**Eh'0 __VT22
ood##
(1"DL11)
 )
 	 	$A$V %$.!,K$$Qx $ $ $#$ +*//1103QQ%7T""*"";lKKHU    +5,'s   ,C55DDc                     dS r  r;   r   s     r=   r   zMultiWidget.id_for_label  s    rr<   c                 X    fdt          | j        | j                  D             S )Nc                 J    g | ]\  }}|                     |z              S r;   )r   rr   r  r   r   r   r   s      r=   r   z3MultiWidget.value_from_datadict.<locals>.<listcomp>  sD     
 
 
#V &&tUD;4FGG
 
 
r<   )r  r  r  r   s    ```r=   r   zMultiWidget.value_from_datadict  sI    
 
 
 
 
 
'*4+=t|'L'L
 
 
 	
r<   c                 r    t          fdt          | j        | j                  D                       S )Nc              3   R   K   | ]!\  }}|                     |z             V  "d S rA   )r   r  s      r=   r   z6MultiWidget.value_omitted_from_data.<locals>.<genexpr>  sR       
 
#V **4{8JKK
 
 
 
 
 
r<   )r  r  r  r  r   s    ```r=   r   z#MultiWidget.value_omitted_from_data  sV     
 
 
 
 
 
'*4+=t|'L'L
 
 
 
 
 	
r<   c                      t          d          )z
        Return a list of decompressed values for the given compressed value.
        The given value can be assumed to be valid, but not necessarily
        non-empty.
        z&Subclasses must implement this method.)NotImplementedErrorr   s     r=   r  zMultiWidget.decompress  s     ""JKKKr<   c                 J    t                      }| j        D ]}||j        z  }|S )zd
        Media for a multiwidget is the combination of all media of the
        subwidgets.
        )r   r  ri   )rD   ri   r  s      r=   
_get_mediazMultiWidget._get_media  s1    
  	 	AQWEEr<   c                     t                                          |          }t          j        | j                  |_        |S rA   )r`   r   r   deepcopyr  )rD   r   r   rH   s      r=   r   zMultiWidget.__deepcopy__  s2    gg""4((mDL11
r<   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rA   )r   r  s     r=   r   z3MultiWidget.needs_multipart_form.<locals>.<genexpr>  s%      @@a1)@@@@@@r<   )anyr  rO   s    r=   r   z MultiWidget.needs_multipart_form  s!    @@4<@@@@@@r<   rA   )r8   r9   r:   r   r   r   rF   r]   r   r   r   r   r   r  r  ri   r   r   rb   rc   s   @r=   r0   r0     s"         <ML            6 6 X6! ! ! ! !F  
 
 

 
 
L L L   HZ  E    
 A A XA A A A Ar<   r0   c                   <     e Zd ZdZdZdZ	 	 	 	 	 d fd	Zd Z xZS )r1   zQ
    A widget that splits datetime input into two <input type="text"> boxes.
    Fz'django/forms/widgets/splitdatetime.htmlNc                     t          ||n||          t          ||n||          f}t                                          |           d S )N)r   r   )r'   r)   r`   rF   )rD   r   date_formattime_format
date_attrs
time_attrsr  rH   s          r=   rF   zSplitDateTimeWidget.__init__*  sp     )1eez"   )1eez"  	
 	!!!!!r<   c                 |    |r7t          |          }|                                |                                gS d d gS rA   )r   datetimer   s     r=   r  zSplitDateTimeWidget.decompress>  s<     	0'..EJJLL%**,,//d|r<   NNNNN)	r8   r9   r:   r   r   r   rF   r  rb   rc   s   @r=   r1   r1   "  st          "=M " " " " " "(      r<   r1   c                   2     e Zd ZdZdZ	 	 	 	 	 d fd	Z xZS )r2   zT
    A widget that splits datetime input into two <input type="hidden"> inputs.
    z-django/forms/widgets/splithiddendatetime.htmlNc                 t    t                                          |||||           | j        D ]	}d|_        
d S )Nr   )r`   rF   r  r   )rD   r   r  r  r  r  r   rH   s          r=   rF   z"SplitHiddenDateTimeWidget.__init__L  sK     	[*jQQQl 	) 	)F (F	) 	)r<   r  )r8   r9   r:   r   r   rF   rb   rc   s   @r=   r2   r2   E  s`          DM 
) 
) 
) 
) 
) 
) 
) 
) 
) 
)r<   r2   c                        e Zd ZdZdZdZdZdZdZdZ	e
Z ed          Zd	ZddZ fdZd Zed             Zd Zd Zd Z xZS )r3   z
    A widget that splits date input into three <select> boxes.

    This also serves as an example of a Widget that has more than one HTML
    element and hence implements value_from_datadict.
    )r   z---%s_monthz%s_dayz%s_yearz%django/forms/widgets/select_date.htmlr  z(\d{4}|0)-(\d\d?)-(\d\d?)$TNc                    |pi | _         |r|| _        n;t          j                                        j        }t          ||dz             | _        |r|| _        nt          | _        t          |t          t          f          rQt          |          dk    st          d          d|d         f| _        d|d         f| _        d|d         f| _        d S |	d|f| _        | j        | _        | j        | _        | j        | _        d S )N
      z,empty_label list/tuple must have 3 elements.r   r   r      )r   yearsdatetimer  todayyearr  monthsr   rI   rv   r  r  r2  year_none_valuemonth_none_valueday_none_value
none_value)rD   r   r  r  empty_label	this_years         r=   rF   zSelectDateWidget.__init__k  s   [b
  	:DJJ ++--2Iy)b.99DJ  	! DKK DK kD%=11 	2{##q(( !OPPP$&A#7D %'Q$8D!#%{1~"6D&#%{"3#'?D $(OD!"&/Dr<   c                    t                                          |||          }i }d | j        D             }| j        s|                    d| j                   | j        |z  }|                     ||                              ||d         d         d         i |d         d         dd	|z  i
          |d<   t          | j	        
                                          }| j        s|                    d| j                   | j        |z  }	|                     ||                              |	|d         d         d         i |d         d         dd	|	z  i
          |d<   d t          dd          D             }
| j        s|
                    d| j                   | j        |z  }|                     ||
                              ||d         d         d         i |d         d         dd	|z  i
          |d<   g }|                                 D ]#}|                    ||         d                    $||d         d<   |S )Nc                 0    g | ]}|t          |          fS r;   rp  r  s     r=   r   z0SelectDateWidget.get_context.<locals>.<listcomp>  s"    888CFF888r<   r   )r|  r   r   r  r   r   zid_%s)r   r   r   monthc                     g | ]}||fS r;   r;   r  s     r=   r   z0SelectDateWidget.get_context.<locals>.<listcomp>  s    444!1v444r<   r       dayr   )r`   r   r  r   insertr   
year_fieldselect_widgetrv   r  rw   r  month_fieldr  r  	day_field_parse_date_fmtrx   )rD   r   r   r   r   date_contextyear_choices	year_namemonth_choices
month_nameday_choicesday_namer   fieldrH   s                 r=   r   zSelectDateWidget.get_context  s   ''%%dE59988TZ888 	94#7888Od*	#11<  2  
  

+(#G,V4KWX&w/Kw7JKK  
 
 	V T[..0011 	;  D$9:::%,
 $ 2 2= !3 !
 !

+(#G,W5LWX&w/Lw7KLL  
 
 	W 54uQ||444 	7q$"5666>D("00 1 
 
 +(#G,U3JWX&w/Jw7IJJ  
 
 	U 
))++ 	= 	=El51(;<<<<*4,'r<   c                    d\  }}}t          |t          j        t          j        f          r|j        |j        |j        }}}nt          |t                    r| j                            |          }|r#d |	                                D             \  }}}n\t          d          d         }	 t          j                            ||          }|j        |j        |j        }}}n# t          $ r Y nw xY w|||dS )z
        Return a dict containing the year, month, and day of the current value.
        Use dict instead of a datetime to allow invalid dates such as February
        31 to display correctly.
        r   c                 0    g | ]}t          |          pd S )r   )int)rr   vals     r=   r   z1SelectDateWidget.format_value.<locals>.<listcomp>  s"    #M#M#MsCHHN#M#M#Mr<   ra  r   r  r  r  )rI   r  r  r  r  r  rJ   date_rematchr  r   strptimer2  )rD   r   r  r  r  r   input_formatds           r=   r   zSelectDateWidget.format_value  s    ,eSehmX->?@@ 	>$z5;	%DDs## 	>L&&u--E > $N#Mellnn#M#M#M eSS)*>??B> )225,GGA ()vqw%DD "   D uS999s   - C# #
C0/C0c               #      K   t          d          } d}| D ]*}|rd}|dk    rd}|dv rdV  |dv rdV  "|d	v rd
V  +d S )NDATE_FORMATF\TYyr  bEFMmNnr  djr  r   )fmtescapedchars      r=   r  z SelectDateWidget._parse_date_fmt  s      '' 
	 
	D 	""
	 
	r<   c                 J    |                                  D ]
}|d|c S d|z  S )Nr   r  )r  )rD   r   first_selects      r=   r   zSelectDateWidget.id_for_label  s?     0022 	1 	1L!cc<<0000Cr<   c                 j   |                     | j        |z            }|                     | j        |z            }|                     | j        |z            }||cxk    r|cxk    rdk    rn nd S |||t	          d          d         }t          j        |          }	 t          j        t          |          t          |          t          |                    }n,# t          $ r |pdd|pdd|pdcY S t          $ r Y dS w xY w|                    |          S |                     |          S )Nr   ra  r   -z0-0-0)r   r  r  r  r   r
   sanitize_strftime_formatr  r  r  r2  OverflowErrorstrftime)	rD   r   r   r   yr   r#  r"  
date_values	            r=   r   z$SelectDateWidget.value_from_datadict  s_   HHT_t+,,HHT%,--HHT^d*++Q"4=Q]q}%&:;;A>L";LIIL%]3q663q663q66BB

 = = = &'V!VVQV!VVQV!V<<<<    ww&&|444xx~~s   !=C D;	DDc                 @    t          fddD                        S )Nc              3   H   K   | ]}d                      |          v V  dS )z{}_{}N)r   )rr   intervalr   r   s     r=   r   z;SelectDateWidget.value_omitted_from_data.<locals>.<genexpr>  sJ       
 
 ^^D(++t3
 
 
 
 
 
r<   r  )r  r   s    ` `r=   r   z(SelectDateWidget.value_omitted_from_data  sF     
 
 
 
 
4
 
 
 
 
 
 	
r<   )NNNN)r8   r9   r:   r   r  r  r  r  r   r   r+   r  r   r  r   rF   r   r   r   r  r   r   r   rb   rc   s   @r=   r3   r3   Y  s          JKIJ;MJM<==GL2 2 2 2@) ) ) ) )V: : :2   \     
  (
 
 
 
 
 
 
r<   r3   )Or   r   r  r   collectionsr   graphlibr   r   	itertoolsr   django.forms.utilsr   r   django.templatetags.staticr	   django.utilsr
   django.utils.choicesr   django.utils.datesr   django.utils.formatsr   django.utils.htmlr   r   django.utils.regex_helperr   django.utils.safestringr   django.utils.translationr   r   	renderersr   __all__r   RuntimeWarningr7   r?   r   r   r   rW   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   objectrQ  r%   r&   r\  r'   r(   r)   rj  r*   rz  r+   r,   r-   r.   r/   r0   r1   r2   r3   r;   r<   r=   <module>rJ     s       # # # # # # 2 2 2 2 2 2 2 2       ; ; ; ; ; ; ; ; - - - - - -             2 2 2 2 2 2 % % % % % % + + + + + + 4 4 4 4 4 4 4 4 6 6 6 6 6 6 - - - - - - 6 6 6 6 6 6 + + + + + +B 	 	 	 	 	 	 	 	 #" #" #" #" #" #" #" #"L, , , , ,Z , , , | | | | | | | |~  6       S" S" S" S" S") S" S" S" S"l    F   (5 5 5 5 5 5 5 5
7 7 7 7 7% 7 7 7
6 6 6 6 6 6 6 6
4 4 4 4 4u 4 4 4
6 6 6 6 6 6 6 6
7 7 7 7 7% 7 7 7
4 4 4 4 4u 4 4 4
7 7 7 7 7E 7 7 77 7 7 7 7% 7 7 7
#. #. #. #. #.+ #. #. #.L)G )G )G )G )G )G )G )GX "688 F
 F
 F
 F
 F
 F
 F
 F
R( ( ( ( (v ( ( (
 
 
 
 
	 
 
 
5 5 5 5 5! 5 5 5
9 9 9 9 9% 9 9 9
5 5 5 5 5! 5 5 54 4 4$ $ $ $ $E $ $ $NG1 G1 G1 G1 G16 G1 G1 G1T#
 #
 #
 #
 #
\ #
 #
 #
L' ' ' ' ' ' ' 'T    V    0 0 0 0 0, 0 0 0"    [   "hA hA hA hA hA& hA hA hAV         +      F) ) ) ) ) 3 ) ) )(c
 c
 c
 c
 c
v c
 c
 c
 c
 c
r<   