o
    pj{  ã                   @   sÜ  d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZ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" 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.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8 dd„ Z9de:de7de:fdd„Z;G dd„ de(j<ƒZ=G dd„ de=ƒZ>G dd „ d e(j<ƒZ?G d!d"„ d"e(j<ƒZ@G d#d$„ d$e*ƒZAG d%d&„ d&e*ƒZBG d'd(„ d(e*ƒZCG d)d*„ d*e*ƒZDG d+d,„ d,ƒZEd-ZFG d.d/„ d/ejGejHƒZId0ee	e eJf ded1 fd2d3„ZKee8ƒG d4d5„ d5ƒƒZLG d6d7„ d7e*ƒZMd8d9„ ZNd:ZOeƒ ZPee8ƒG d;d<„ d<ƒƒZQee8ƒG d=d>„ d>ƒƒZRh d?£ZSG d@dA„ dAƒZTeTƒ ZU	B	dIde7dCe6dDee: dEeee"gdFf  deVf
dGdH„ZWdS )JzG
twisted.web.util and twisted.web.template merged to avoid cyclic deps
é    N)ÚOrderedDict©Úescape)ÚIOÚAnyÚAnyStrÚCallableÚDictÚListÚMappingÚOptionalÚTupleÚUnionÚcast)ÚhandlerÚmake_parser)ÚLocator)Úimplementer)ÚDeferred)ÚLogger)Úurlpath)ÚFailure)ÚFilePath)ÚfullyQualifiedName)Úresource)ÚElementÚrenderer)ÚFlattenableÚflattenÚflattenString)ÚCDATAÚCommentÚTagÚslot)ÚIRenderableÚIRequestÚITemplateLoaderc                 C   s   dt | ƒ› d�S )aK  
    Wraps <pre> tags around some text and HTML-escape it.

    This is here since once twisted.web.html was deprecated it was hard to
    migrate the html.PRE from current code to twisted.web.template.

    For new code consider using twisted.web.template.

    @return: Escaped text wrapped in <pre> tags.
    @rtype: C{str}
    z<pre>z</pre>r   )Útext© r(   ú</usr/lib/python3/dist-packages/twisted/web/_template_util.pyÚ_PRE,   s   r*   ÚURLÚrequestÚreturnc                 C   sH   t | tƒs	tdƒ‚| dd¡ | | ¡ ddt|  d¡ƒ d¡i }|S )a¿  
    Generate a redirect to the given location.

    @param URL: A L{bytes} giving the location to which to redirect.

    @param request: The request object to use to generate the redirect.
    @type request: L{IRequest<twisted.web.iweb.IRequest>} provider

    @raise TypeError: If the type of C{URL} a L{str} instead of L{bytes}.

    @return: A L{bytes} containing HTML which tries to convince the client
        agent
        to visit the new location even if it doesn't respect the I{FOUND}
        response code.  This is intended to be returned from a render method,
        eg::

            def render_GET(self, request):
                return redirectTo(b"http://example.com/", request)
    zURL must be bytess   Content-Types   text/html; charset=utf-8sÀ   
<html>
    <head>
        <meta http-equiv="refresh" content="0;URL=%(url)s">
    </head>
    <body bgcolor="#FFFFFF" text="#000000">
    <a href="%(url)s">click here</a>
    </body>
</html>
s   urlúutf-8)Ú
isinstanceÚbytesÚ	TypeErrorÚ	setHeaderÚredirectr   ÚdecodeÚencode)r+   r,   Úcontentr(   r(   r)   Ú
redirectTo;   s   


ÿ÷r7   c                       s:   e Zd ZdZdZdef‡ fdd„Zdd„ Zdd	„ Z‡  Z	S )
ÚRedirectz›
    Resource that redirects to a specific URL.

    @ivar url: Redirect target URL to put in the I{Location} response header.
    @type url: L{bytes}
    TÚurlc                    s   t ƒ  ¡  || _d S ©N)ÚsuperÚ__init__r9   ©Úselfr9   ©Ú	__class__r(   r)   r<   n   s   

zRedirect.__init__c                 C   s   t | j|ƒS r:   )r7   r9   )r>   r,   r(   r(   r)   Úrenderr   s   zRedirect.renderc                 C   ó   | S r:   r(   ©r>   Únamer,   r(   r(   r)   ÚgetChildu   ó   zRedirect.getChild)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚisLeafr0   r<   rA   rE   Ú__classcell__r(   r(   r?   r)   r8   d   s    r8   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚChildRedirectorFc                 C   s>   |  d¡dkr| d¡s| d¡std| ƒ‚t | |¡ d S )Nz://éÿÿÿÿz..ú/zvIt seems you've given me a redirect (%s) that is a child of myself! That's not good, it'll cause an infinite redirect.)ÚfindÚ
startswithÚ
ValueErrorr8   r<   r=   r(   r(   r)   r<   }   s   ÿþüÿzChildRedirector.__init__c                 C   s(   | j }| d¡s|d7 }||7 }t|ƒS )NrO   )r9   ÚendswithrM   )r>   rD   r,   ÚnewUrlr(   r(   r)   rE   �   s
   
zChildRedirector.getChildN)rG   rH   rI   rK   r<   rE   r(   r(   r(   r)   rM   z   s    rM   c                   @   s&   e Zd ZdZdZdedefdd„ZdS )ÚParentRedirectuÆ  
    Redirect to the nearest directory and strip any query string.

    This generates redirects like::

        /              â†’  /
        /foo           â†’  /
        /foo?bar       â†’  /
        /foo/          â†’  /foo/
        /foo/bar       â†’  /foo/
        /foo/bar?baz   â†’  /foo/

    However, the generated I{Location} header contains an absolute URL rather
    than a path.

    The response is the same regardless of HTTP method.
    é   r,   r-   c                 C   s$   t tj |¡ ¡ ƒ d¡}t||ƒS )zN
        Respond to all requests by redirecting to nearest directory.
        Úascii)Ústrr   ÚURLPathÚfromRequestÚherer5   r7   )r>   r,   r[   r(   r(   r)   rA   ª   s   
zParentRedirect.renderN)rG   rH   rI   rJ   rK   r%   r0   rA   r(   r(   r(   r)   rU   •   s    rU   c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚDeferredResourcezT
    I wrap up a Deferred that will eventually result in a Resource
    object.
    rV   c                 C   s   t j | ¡ || _d S r:   )r   ÚResourcer<   Úd)r>   r^   r(   r(   r)   r<   º   ó   
zDeferredResource.__init__c                 C   rB   r:   r(   rC   r(   r(   r)   rE   ¾   rF   zDeferredResource.getChildc                 C   s*   | j  | j|¡ | j|¡ ddlm} |S )Nr   )ÚNOT_DONE_YET)r^   ÚaddCallbackÚ_cbChildÚ
addErrbackÚ_ebChildÚtwisted.web.serverr`   )r>   r,   r`   r(   r(   r)   rA   Á   s   zDeferredResource.renderc                 C   s   |  t ||¡¡ d S r:   )rA   r   ÚgetChildForRequest)r>   Úchildr,   r(   r(   r)   rb   Ç   s   zDeferredResource._cbChildc                 C   s   |  |¡ d S r:   )ÚprocessingFailed)r>   Úreasonr,   r(   r(   r)   rd   Ê   ó   zDeferredResource._ebChildN)
rG   rH   rI   rJ   rK   r<   rE   rA   rb   rd   r(   r(   r(   r)   r\   ²   s    r\   c                   @   s0   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdS )	Ú_SourceLineElementa  
    L{_SourceLineElement} is an L{IRenderable} which can render a single line of
    source code.

    @ivar number: A C{int} giving the line number of the source code to be
        rendered.
    @ivar source: A C{str} giving the source code to be rendered.
    c                 C   s   t  | |¡ || _|| _d S r:   )r   r<   ÚnumberÚsource)r>   Úloaderrl   rm   r(   r(   r)   r<   Ø   s   
z_SourceLineElement.__init__c                 C   s   || j  dd¡ƒS )zA
        Render the line of source as a child of C{tag}.
        z  u    Â )rm   Úreplace©r>   r,   Útagr(   r(   r)   Ú
sourceLineÝ   s   z_SourceLineElement.sourceLinec                 C   s   |t | jƒƒS )z>
        Render the line number as a child of C{tag}.
        )rX   rl   rp   r(   r(   r)   Ú
lineNumberä   ó   z_SourceLineElement.lineNumberN)rG   rH   rI   rJ   r<   r   rr   rs   r(   r(   r(   r)   rk   Î   s    	
rk   c                   @   s,   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdS )	Ú_SourceFragmentElementa¾  
    L{_SourceFragmentElement} is an L{IRenderable} which can render several lines
    of source code near the line number of a particular frame object.

    @ivar frame: A L{Failure<twisted.python.failure.Failure>}-style frame object
        for which to load a source line to render.  This is really a tuple
        holding some information from a frame object.  See
        L{Failure.frames<twisted.python.failure.Failure>} for specifics.
    c                 C   ó   t  | |¡ || _d S r:   ©r   r<   Úframe©r>   rn   rx   r(   r(   r)   r<   ÷   r_   z_SourceFragmentElement.__init__c                 c   sH   � | j d }| j d }t|d |d ƒD ]}|t ||¡ ¡ fV  qdS )a$  
        Find the source line references by C{self.frame} and yield, in source
        line order, it and the previous and following lines.

        @return: A generator which yields two-tuples.  Each tuple gives a source
            line number and the contents of that source line.
        rV   é   N)rx   ÚrangeÚ	linecacheÚgetlineÚrstrip)r>   Úfilenamers   ÚsnipLineNumberr(   r(   r)   Ú_getSourceLinesû   s   €

ÿz&_SourceFragmentElement._getSourceLinesc                 c   s\   � |   ¡ D ]&\}}| ¡ }|| jd krd}nd}t|di d|i¤Žƒ}t|||ƒV  qdS )zý
        Render the source line indicated by C{self.frame} and several
        surrounding lines.  The active line will be given a I{class} of
        C{"snippetHighlightLine"}.  Other lines will be given a I{class} of
        C{"snippetLine"}.
        rz   ÚsnippetHighlightLineÚsnippetLineÚclassNr(   )r�   Úclonerx   Ú	TagLoaderrk   )r>   r,   rq   rs   rr   ÚnewTagÚcssClassrn   r(   r(   r)   ÚsourceLines  s   €ùz"_SourceFragmentElement.sourceLinesN)rG   rH   rI   rJ   r<   r�   r   r‰   r(   r(   r(   r)   ru   ì   s    
ru   c                   @   sH   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	dS )Ú_FrameElementa°  
    L{_FrameElement} is an L{IRenderable} which can render details about one
    frame from a L{Failure<twisted.python.failure.Failure>}.

    @ivar frame: A L{Failure<twisted.python.failure.Failure>}-style frame object
        for which to load a source line to render.  This is really a tuple
        holding some information from a frame object.  See
        L{Failure.frames<twisted.python.failure.Failure>} for specifics.
    c                 C   rv   r:   rw   ry   r(   r(   r)   r<   %  r_   z_FrameElement.__init__c                 C   ó   || j d ƒS )zY
        Render the name of the file this frame references as a child of C{tag}.
        rV   ©rx   rp   r(   r(   r)   r   )  rt   z_FrameElement.filenamec                 C   s   |t | jd ƒƒS )zc
        Render the source line number this frame references as a child of
        C{tag}.
        rz   )rX   rx   rp   r(   r(   r)   rs   0  s   z_FrameElement.lineNumberc                 C   r‹   )zV
        Render the function name this frame references as a child of C{tag}.
        r   rŒ   rp   r(   r(   r)   Úfunction8  rt   z_FrameElement.functionc                 C   s   t t|ƒ| jƒS )zn
        Render the source code surrounding the line this frame references,
        replacing C{tag}.
        )ru   r†   rx   rp   r(   r(   r)   rm   ?  s   z_FrameElement.sourceN)
rG   rH   rI   rJ   r<   r   r   rs   r�   rm   r(   r(   r(   r)   rŠ     s    



rŠ   c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )Ú_StackElementzW
    L{_StackElement} renders an L{IRenderable} which can render a list of frames.
    c                 C   rv   r:   )r   r<   ÚstackFrames)r>   rn   r�   r(   r(   r)   r<   M  r_   z_StackElement.__init__c                    s   ‡ fdd„| j D ƒS )zW
        Render the list of frames in this L{_StackElement}, replacing C{tag}.
        c                    s   g | ]}t tˆ  ¡ ƒ|ƒ‘qS r(   )rŠ   r†   r…   )Ú.0rx   ©rq   r(   r)   Ú
<listcomp>V  s    ÿz(_StackElement.frames.<locals>.<listcomp>)r�   rp   r(   r‘   r)   ÚframesQ  s   
ÿz_StackElement.framesN)rG   rH   rI   rJ   r<   r   r“   r(   r(   r(   r)   rŽ   H  s
    rŽ   c                   @   s€   e Zd ZdZdded  fdd„Zddee dee dee fd	d
„Zdee dee ddfdd„Zdee dee fdd„Z	dS )Ú
_NSContextzL
    A mapping from XML namespaces onto their prefixes in the document.
    NÚparentc                 C   s,   || _ |durt|jƒ| _dS ddi| _dS )ze
        Pull out the parent's namespaces, if there's no parent then default to
        XML.
        Nz$http://www.w3.org/XML/1998/namespaceÚxml)r•   r   Únss)r>   r•   r(   r(   r)   r<   `  s   z_NSContext.__init__Úkr^   r-   c                 C   s   | j  ||¡S )z\
        Get a prefix for a namespace.

        @param d: The default prefix value.
        )r—   Úget)r>   r˜   r^   r(   r(   r)   r™   k  s   z_NSContext.getÚvc                 C   s   | j  ||¡ dS )zH
        Proxy through to setting the prefix for the namespace.
        N)r—   Ú__setitem__)r>   r˜   rš   r(   r(   r)   r›   s  s   z_NSContext.__setitem__c                 C   s   | j  |¡S )zH
        Proxy through to getting the prefix for the namespace.
        )r—   Ú__getitem__)r>   r˜   r(   r(   r)   rœ   y  s   z_NSContext.__getitem__r:   )
rG   rH   rI   rJ   r   r<   rX   r™   r›   rœ   r(   r(   r(   r)   r”   [  s    $r”   z4http://twistedmatrix.com/ns/twisted.web.template/0.1c                	   @   sN  e Zd ZdZdee fdd„Zdeddfdd	„Zd1d
d„Z	d1dd„Z
dededdfdd„Zdee deddfdd„Zdee ddfdd„Zdeeef dee deeee ef ef ddfdd„Zdeddfdd„Zd eeef dee ddfd!d"„Zd ed#ed$eddfd%d&„Zd'eddfd(d)„Zd1d*d+„Zd1d,d-„Zd.eddfd/d0„ZdS )2Ú_ToStanzd
    A SAX parser which converts an XML document to the Twisted STAN
    Document Object Model.
    ÚsourceFilenamec                 C   s   || _ tƒ | _d| _dS )zP
        @param sourceFilename: the filename the XML was loaded out of.
        FN)rž   r”   Ú	prefixMapÚinCDATA)r>   rž   r(   r(   r)   r<   ‰  s   
z_ToStan.__init__Úlocatorr-   Nc                 C   ó
   || _ dS )zY
        Set the document locator, which knows about line and character numbers.
        N)r¡   )r>   r¡   r(   r(   r)   ÚsetDocumentLocator‘  s   
z_ToStan.setDocumentLocatorc                 C   s   g | _ | j | _g | _g | _dS )z*
        Initialise the document.
        N)ÚdocumentÚcurrentÚstackÚ
xmlnsAttrs©r>   r(   r(   r)   ÚstartDocument—  s   
z_ToStan.startDocumentc                 C   ó   dS )z!
        Document ended.
        Nr(   r¨   r(   r(   r)   ÚendDocument£  ó    z_ToStan.endDocumentÚtargetÚdatac                 C   rª   )z6
        Processing instructions are ignored.
        Nr(   )r>   r­   r®   r(   r(   r)   ÚprocessingInstruction¨  r¬   z_ToStan.processingInstructionÚprefixÚuric                 C   sV   t | jƒ| _|| j|< |tkrdS |du r| j d|f¡ dS | j d| |f¡ dS )z×
        Set up the prefix mapping, which maps fully qualified namespace URIs
        onto namespace prefixes.

        This gets called before startElementNS whenever an C{xmlns} attribute
        is seen.
        NÚxmlnszxmlns:%s)r”   rŸ   ÚTEMPLATE_NAMESPACEr§   Úappend)r>   r°   r±   r(   r(   r)   ÚstartPrefixMapping­  s   	
z_ToStan.startPrefixMappingc                 C   s"   | j j}|dusJ dƒ‚|| _ dS )zb
        "Pops the stack" on the prefix mapping.

        Gets called after endElementNS.
        Nz$More prefix mapping ends than starts)rŸ   r•   )r>   r°   r•   r(   r(   r)   ÚendPrefixMappingÃ  s   
z_ToStan.endPrefixMappingÚnamespaceAndNameÚqnameÚattrsc                 C   sP  | j }| j ¡ }| j ¡ }|\}}|tkrO|dkrd}n3|dkrOz|d }	W n ty1   d}	Y nw t|d |	|||d�}
| j |
¡ | j	 |
¡ |
j
| _	dS d}t|ƒ}t| ¡ ƒD ]\}}|\}}|tkrhq[|dkrq|}||= q[tƒ }| ¡ D ]\\}}}| j |¡}|du rŒ|}n|› d	|› �}|||< qy|tkrÖ|d
krÖ| js«tdt› d�ƒ‚d|vr·tdt› d�ƒ‚td||||d�}|| jd j|d < | j |¡ |j
| _	dS | jrä| t| jƒ¡ g | _|tkrÿ|durÿ| j| }|durÿ| j| › d	|› �}t|ttttttf tf |ƒƒ||||d�}| j |¡ | j	 |¡ |j
| _	dS )a]  
        Gets called when we encounter a new xmlns attribute.

        @param namespaceAndName: a (namespace, name) tuple, where name
            determines which type of action to take, if the namespace matches
            L{TEMPLATE_NAMESPACE}.
        @param qname: ignored.
        @param attrs: attributes on the element being started.
        ÚtransparentÚ r#   )NÚdefaultN)NrD   )r¼   r   rs   ÚcolumnNumberrA   ú:Úattrz<{z}attr> as top-level elementrD   z }attr> requires a name attribute)rA   r   rs   r½   rN   )Ú
attributesrA   r   rs   r½   )rž   r¡   ÚgetLineNumberÚgetColumnNumberr³   ÚKeyErrorr#   r¦   r´   r¥   Úchildrenr   ÚlistÚitemsrŸ   r™   ÚAssertionErrorr"   rÀ   r§   Úupdater   r   r   r0   rX   )r>   r·   r¸   r¹   r   rs   r½   ÚnsrD   r¼   ÚslrA   r˜   rš   ÚattrNSÚjustTheNameÚnonTemplateAttrsÚattrNsÚattrNameÚnsPrefixÚattrKeyÚelr°   r(   r(   r)   ÚstartElementNSÍ  s¢   

ýû€	

ÿ
ÿû
ÿø
z_ToStan.startElementNSÚchc                 C   s*   | j r| jd  |¡ dS | j |¡ dS )zm
        Called when we receive some characters.  CDATA characters get passed
        through as is.
        rN   N)r    r¦   r´   r¥   )r>   rÔ   r(   r(   r)   Ú
charactersE  s   z_ToStan.charactersrD   c                 C   s.   | j  ¡  | j r| j d j| _dS | j| _dS )z’
        A namespace tag is closed.  Pop the stack, if there's anything left in
        it, otherwise return to the document's namespace.
        rN   N)r¦   ÚpoprÄ   r¥   r¤   )r>   rD   r¸   r(   r(   r)   ÚendElementNSO  s   
z_ToStan.endElementNSÚpublicIdÚsystemIdc                 C   rª   ©z#
        DTDs are ignored.
        Nr(   )r>   rD   rØ   rÙ   r(   r(   r)   ÚstartDTDZ  r¬   z_ToStan.startDTDÚargsc                 G   rª   rÚ   r(   )r>   rÜ   r(   r(   r)   ÚendDTD_  r¬   z_ToStan.endDTDc                 C   s   d| _ | j g ¡ dS )zO
        We're starting to be in a CDATA element, make a note of this.
        TN)r    r¦   r´   r¨   r(   r(   r)   Ú
startCDATAd  s   z_ToStan.startCDATAc                 C   s*   d| _ d | j ¡ ¡}| j t|ƒ¡ dS )z‰
        We're no longer in a CDATA element.  Collect up the characters we've
        parsed and put them in a new CDATA object.
        Fr»   N)r    Újoinr¦   rÖ   r¥   r´   r    )r>   Úcommentr(   r(   r)   ÚendCDATAk  s   z_ToStan.endCDATAr6   c                 C   s   | j  t|ƒ¡ dS )z=
        Add an XML comment which we've encountered.
        N)r¥   r´   r!   )r>   r6   r(   r(   r)   rà   t  s   z_ToStan.comment)r-   N)rG   rH   rI   rJ   r   rX   r<   r   r£   r©   r«   r¯   rµ   r¶   r   r   rÓ   rÕ   r×   rÛ   ÚobjectrÝ   rÞ   rá   rà   r(   r(   r(   r)   r�   ƒ  s2    



þýü
ûx"


	r�   Úflr   c                 C   s€   t ƒ }| tjd¡ | tjd¡ | tjd¡ | tjd¡ tt| ddƒƒ}| 	|¡ | 
|¡ | tj|¡ | | ¡ |jS )z 
    Perform a SAX parse of an XML document with the _ToStan class.

    @param fl: The XML document to be parsed.

    @return: a C{list} of Stan objects.
    r   rV   rD   N)r   Ú
setFeaturer   Úfeature_validationÚfeature_namespacesÚfeature_external_gesÚfeature_external_pesr�   ÚgetattrÚsetContentHandlerÚsetEntityResolverÚsetPropertyÚproperty_lexical_handlerÚparser¤   )rã   ÚparserÚsr(   r(   r)   Ú_flatsaxParse{  s   


rñ   c                   @   s8   e Zd ZdZdeeef fdd„Zded fdd„Z	d	S )
Ú	XMLStringzH
    An L{ITemplateLoader} that loads and parses XML from a string.
    rð   c                 C   s(   t |tƒs
| d¡}tt |¡ƒ| _dS )z¸
        Run the parser on a L{io.StringIO} copy of the string.

        @param s: The string from which to load the XML.
        @type s: L{str}, or a UTF-8 encoded L{bytes}.
        Úutf8N)r/   rX   r4   rñ   ÚioÚStringIOÚ_loadedTemplate)r>   rð   r(   r(   r)   r<   ™  s   

zXMLString.__init__r-   r   c                 C   s   | j S )zM
        Return the document.

        @return: the loaded document.
        )rö   r¨   r(   r(   r)   Úload¦  s   zXMLString.loadN)
rG   rH   rI   rJ   r   rX   r0   r<   r
   r÷   r(   r(   r(   r)   rò   “  s    rò   c                   @   sF   e Zd ZdZedƒZddd„Zedd„ ƒZedd	„ ƒZ	ed
d„ ƒZ
dS )ÚFailureElementa  
    L{FailureElement} is an L{IRenderable} which can render detailed information
    about a L{Failure<twisted.python.failure.Failure>}.

    @ivar failure: The L{Failure<twisted.python.failure.Failure>} instance which
        will be rendered.

    @since: 12.1
    ao  
<div xmlns:t="http://twistedmatrix.com/ns/twisted.web.template/0.1">
  <style type="text/css">
    div.error {
      color: red;
      font-family: Verdana, Arial, helvetica, sans-serif;
      font-weight: bold;
    }

    div {
      font-family: Verdana, Arial, helvetica, sans-serif;
    }

    div.stackTrace {
    }

    div.frame {
      padding: 1em;
      background: white;
      border-bottom: thin black dashed;
    }

    div.frame:first-child {
      padding: 1em;
      background: white;
      border-top: thin black dashed;
      border-bottom: thin black dashed;
    }

    div.location {
    }

    span.function {
      font-weight: bold;
      font-family: "Courier New", courier, monospace;
    }

    div.snippet {
      margin-bottom: 0.5em;
      margin-left: 1em;
      background: #FFFFDD;
    }

    div.snippetHighlightLine {
      color: red;
    }

    span.code {
      font-family: "Courier New", courier, monospace;
    }
  </style>

  <div class="error">
    <span t:render="type" />: <span t:render="value" />
  </div>
  <div class="stackTrace" t:render="traceback">
    <div class="frame" t:render="frames">
      <div class="location">
        <span t:render="filename" />:<span t:render="lineNumber" /> in
        <span class="function" t:render="function" />
      </div>
      <div class="snippet" t:render="source">
        <div t:render="sourceLines">
          <span class="lineno" t:render="lineNumber" />
          <code class="code" t:render="sourceLine" />
        </div>
      </div>
    </div>
  </div>
  <div class="error">
    <span t:render="type" />: <span t:render="value" />
  </div>
</div>
Nc                 C   s   t  | |¡ || _d S r:   )r   r<   Úfailure)r>   rù   rn   r(   r(   r)   r<     r_   zFailureElement.__init__c                 C   s   |t | jjƒƒS )zA
        Render the exception type as a child of C{tag}.
        )r   rù   Útyperp   r(   r(   r)   rú     s   zFailureElement.typec                 C   s   |t | jjƒ d¡ƒS )zB
        Render the exception value as a child of C{tag}.
        ró   )rX   rù   Úvaluer5   rp   r(   r(   r)   rû     s   zFailureElement.valuec                 C   s   t t|ƒ| jjƒS )z–
        Render all the frames in the wrapped
        L{Failure<twisted.python.failure.Failure>}'s traceback stack, replacing
        C{tag}.
        )rŽ   r†   rù   r“   rp   r(   r(   r)   Ú	traceback  s   zFailureElement.tracebackr:   )rG   rH   rI   rJ   rò   rn   r<   r   rú   rû   rü   r(   r(   r(   r)   rø   ¯  s    
ÿ
M

rø   c                 C   sN   g }t dt| ƒƒ |j¡ t|d tƒr|d  d¡ dd¡S |d  ¡  dS )a  
    Construct an HTML representation of the given failure.

    Consider using L{FailureElement} instead.

    @type myFailure: L{Failure<twisted.python.failure.Failure>}

    @rtype: L{bytes}
    @return: A string containing the HTML representation of the given failure.
    Nr   r.   rW   Úxmlcharrefreplace)	r   rø   ÚaddBothr´   r/   r0   r4   r5   ÚraiseException)Ú	myFailureÚresultr(   r(   r)   ÚformatFailure#  s
   r  rV   c                   @   s,   e Zd ZdZd
dd„Zded fdd„Zd	S )r†   zJ
    An L{ITemplateLoader} that loads an existing flattenable object.
    rq   r   c                 C   r¢   )z>
        @param tag: The object which will be loaded.
        Nr‘   )r>   rq   r(   r(   r)   r<   I  s   zTagLoader.__init__r-   c                 C   s   | j gS r:   r‘   r¨   r(   r(   r)   r÷   Q  s   zTagLoader.loadN)rq   r   )rG   rH   rI   rJ   r<   r
   r÷   r(   r(   r(   r)   r†   C  s    
r†   c                   @   sP   e Zd ZdZdefdd„Zded fdd„Zdefd	d
„Z	ded fdd„Z
dS )ÚXMLFilezF
    An L{ITemplateLoader} that loads and parses XML from a file.
    Úpathc                 C   s,   t |tƒstjdtdd� d| _	 || _dS )zf
        Run the parser on a file.

        @param path: The file from which to load the XML.
        zhPassing filenames or file objects to XMLFile is deprecated since Twisted 12.1.  Pass a FilePath instead.rz   )ÚcategoryÚ
stacklevelN)r/   r   ÚwarningsÚwarnÚDeprecationWarningrö   Ú_path)r>   r  r(   r(   r)   r<   [  s   
üzXMLFile.__init__r-   r   c                 C   sN   t | jtƒst| jƒS | j d¡�}t|ƒW  d  ƒ S 1 s w   Y  dS )zP
        Read and parse the XML.

        @return: the loaded document.
        ÚrN)r/   r
  r   rñ   Úopen)r>   Úfr(   r(   r)   Ú_loadDoco  s
   
$ÿzXMLFile._loadDocc                 C   s   d| j ›d�S )Nz<XMLFile of ú>)r
  r¨   r(   r(   r)   Ú__repr__{  rj   zXMLFile.__repr__c                 C   s   | j du r
|  ¡ | _ | j S )zl
        Return the document, first loading it if necessary.

        @return: the loaded document.
        N)rö   r  r¨   r(   r(   r)   r÷   ~  s   

zXMLFile.loadN)rG   rH   rI   rJ   r   r<   r
   r  rX   r  r÷   r(   r(   r(   r)   r  U  s    r  >x   ÚaÚbÚiÚpÚqrð   ÚuÚbrÚddÚdlÚdtÚemÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚrpÚrtÚtdÚthÚtrÚttÚulÚbdiÚbdoÚbigÚcolÚdelÚdfnÚdirÚdivÚimgÚinsÚkbdÚmapÚnavÚpreÚsubÚsupÚvarÚwbrÚabbrÚareaÚbaseÚbodyÚciteÚcodeÚfontÚformÚheadÚhtmlÚlinkÚmarkÚmenuÚmetaÚrubyÚsampÚspanÚtimeÚasideÚaudioÚembedrx   ÚinputÚlabelÚmeterÚparamÚsmallÚstyleÚtableÚtbodyÚtfootÚtheadÚtitleÚvideoÚappletÚbuttonÚcanvasÚcenterÚfigureÚfooterÚheaderÚhgroupÚiframeÚkeygenÚlegendrâ   ÚoptionÚoutputÚscriptÚselectrm   ÚstrikeÚstrongÚacronymÚaddressÚarticleÚcaptionÚcommandÚdetailsÚisindexÚsectionÚsummaryÚbasefontÚcolgroupÚdatalistÚfieldsetÚframesetÚnoframesÚnoscriptÚoptgroupÚprogressÚtextareaÚ
blockquoteÚ
figcaptionc                   @   s"   e Zd ZdZdedefdd„ZdS )Ú_TagFactorya‚  
    A factory for L{Tag} objects; the implementation of the L{tags} object.

    This allows for the syntactic convenience of C{from twisted.web.html import
    tags; tags.a(href="linked-page.html")}, where 'a' can be basically any HTML
    tag.

    The class is not exposed publicly because you only ever need one of these,
    and we already made it for you.

    @see: L{tags}
    ÚtagNamer-   c                 C   s8   |dkrt dƒS | d¡}|tvrtd|›�ƒ‚t |ƒS )Nrº   r»   Ú_zunknown tag )r"   r~   ÚVALID_HTML_TAG_NAMESÚAttributeError)r>   r†  r(   r(   r)   Ú__getattr__  s   
z_TagFactory.__getattr__N)rG   rH   rI   rJ   rX   r"   rŠ  r(   r(   r(   r)   r…  	  s    r…  ó   <!DOCTYPE html>ÚelementÚdoctypeÚ_failElementr   c                    sŠ   |durˆ  |¡ ˆ  d¡ ˆ du rt‰ tˆ|ˆj ƒ}dtdttd  f‡ ‡fdd„}ˆdœdtd	tdtfd
d„}| |¡ | 	|¡ t
S )aã  
    Render an element or other L{IRenderable}.

    @param request: The L{IRequest} being rendered to.
    @param element: An L{IRenderable} which will be rendered.
    @param doctype: A L{bytes} which will be written as the first line of
        the request, or L{None} to disable writing of a doctype.  The argument
        should not include a trailing newline and will default to the HTML5
        doctype C{'<!DOCTYPE html>'}.

    @returns: NOT_DONE_YET

    @since: 12.1
    Nó   
rù   r-   c                    sT   t jd| d� tˆdd ƒ}|d ur#|jr#ˆ d usJ ‚tˆˆ | ƒˆjƒS ˆ d¡ d S )Nz/An error occurred while rendering the response.)rù   Úsitesr   <div style="font-size:800%;background-color:#FFF;color:#F00">An error occurred while rendering the response.</div>)Ú
_moduleLogrù   ré   ÚdisplayTracebacksr   Úwrite)rù   r�  ©rŽ  r,   r(   r)   ÚebA  s   ÿÿzrenderElement.<locals>.eb)r,   r  r,   c                S   s   |  ¡  | S r:   )Úfinish)r  r,   r(   r(   r)   r–  R  s   zrenderElement.<locals>.finish)r“  rø   r   r   r   r   râ   r%   rc   rþ   r`   )r,   rŒ  r�  rŽ  r^   r•  r–  r(   r”  r)   ÚrenderElement$  s   

 

r—  )r‹  N)XrJ   rô   r|   r  Úcollectionsr   rG  r   Útypingr   r   r   r   r	   r
   r   r   r   r   r   Úxml.saxr   r   Úxml.sax.xmlreaderr   Úzope.interfacer   Útwisted.internet.deferr   Útwisted.loggerr   Útwisted.pythonr   Útwisted.python.failurer   Útwisted.python.filepathr   Útwisted.python.reflectr   Útwisted.webr   Útwisted.web._elementr   r   Útwisted.web._flattenr   r   r   Útwisted.web._stanr    r!   r"   r#   Útwisted.web.iwebr$   r%   r&   r*   r0   r7   r]   r8   rM   rU   r\   rk   ru   rŠ   rŽ   r”   r³   ÚContentHandlerÚEntityResolverr�   rX   rñ   rò   rø   r  r`   r‘  r†   r  rˆ  r…  Útagsrâ   r—  r(   r(   r(   r)   Ú<module>   s|   4)..% "yt7|üÿþýüû