K i& dZddlZddlmZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZmZmZddlmZmZmZmZmZmZmZmZddlZej6rddlmZmZd ZGd d ZeZ d e!d e!de!fdZ"GddZ#GddZ$Gdde$Z%Gdde$Z&GddZ'Gdde'Z(Gdde'Z)Gdde'Z*Gd d!e'Z+Gd"d#e'Z,Gd$d%e'Z-Gd&d'e'Z.Gd(d)e'Z/Gd*d+e'Z0Gd,d-e'Z1Gd.d/e1Z2Gd0d1e'Z3Gd2d3e4Z5Gd4d5Z6Gd6d7Z7d8e!de!fd9Z8 d?d:e7d;e#dZ9y)@aA simple template system that compiles templates to Python code. Basic usage looks like:: t = template.Template("{{ myvalue }}") print(t.generate(myvalue="XXX")) `Loader` is a class that loads templates from a root directory and caches the compiled templates:: loader = template.Loader("/home/btaylor") print(loader.load("test.html").generate(myvalue="XXX")) We compile all templates to raw Python. Error-reporting is currently... uh, interesting. Syntax for the templates:: ### base.html {% block title %}Default title{% end %} ### bold.html {% extends "base.html" %} {% block title %}A bolder title{% end %} {% block student %}
  • {{ escape(student.name) }}
  • {% end %} Unlike most other template systems, we do not put any restrictions on the expressions you can include in your statements. ``if`` and ``for`` blocks get translated exactly into Python, so you can do complex expressions like:: {% for student in [p for p in people if p.student and p.age > 23] %}
  • {{ escape(student.name) }}
  • {% end %} Translating directly to Python means you can apply functions to expressions easily, like the ``escape()`` function in the examples above. You can pass functions in to your template just like any other variable (In a `.RequestHandler`, override `.RequestHandler.get_template_namespace`):: ### Python code def add(x, y): return x + y template.execute(add=add) ### The template {{ add(1, 2) }} We provide the functions `escape() <.xhtml_escape>`, `.url_escape()`, `.json_encode()`, and `.squeeze()` to all templates by default. Typical applications do not create `Template` or `Loader` instances by hand, but instead use the `~.RequestHandler.render` and `~.RequestHandler.render_string` methods of `tornado.web.RequestHandler`, which load templates automatically based on the ``template_path`` `.Application` setting. Variable names beginning with ``_tt_`` are reserved by the template system and should not be used by application code. Syntax Reference ---------------- Template expressions are surrounded by double curly braces: ``{{ ... }}``. The contents may be any python expression, which will be escaped according to the current autoescape setting and inserted into the output. Other template directives use ``{% %}``. To comment out a section so that it is omitted from the output, surround it with ``{# ... #}``. To include a literal ``{{``, ``{%``, or ``{#`` in the output, escape them as ``{{!``, ``{%!``, and ``{#!``, respectively. ``{% apply *function* %}...{% end %}`` Applies a function to the output of all template code between ``apply`` and ``end``:: {% apply linkify %}{{name}} said: {{message}}{% end %} Note that as an implementation detail apply blocks are implemented as nested functions and thus may interact strangely with variables set via ``{% set %}``, or the use of ``{% break %}`` or ``{% continue %}`` within loops. ``{% autoescape *function* %}`` Sets the autoescape mode for the current file. This does not affect other files, even those referenced by ``{% include %}``. Note that autoescaping can also be configured globally, at the `.Application` or `Loader`.:: {% autoescape xhtml_escape %} {% autoescape None %} ``{% block *name* %}...{% end %}`` Indicates a named, replaceable block for use with ``{% extends %}``. Blocks in the parent template will be replaced with the contents of the same-named block in a child template.:: {% block title %}Default title{% end %} {% extends "base.html" %} {% block title %}My page title{% end %} ``{% comment ... %}`` A comment which will be removed from the template output. Note that there is no ``{% end %}`` tag; the comment goes from the word ``comment`` to the closing ``%}`` tag. ``{% extends *filename* %}`` Inherit from another template. Templates that use ``extends`` should contain one or more ``block`` tags to replace content from the parent template. Anything in the child template not contained in a ``block`` tag will be ignored. For an example, see the ``{% block %}`` tag. ``{% for *var* in *expr* %}...{% end %}`` Same as the python ``for`` statement. ``{% break %}`` and ``{% continue %}`` may be used inside the loop. ``{% from *x* import *y* %}`` Same as the python ``import`` statement. ``{% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}`` Conditional statement - outputs the first section whose condition is true. (The ``elif`` and ``else`` sections are optional) ``{% import *module* %}`` Same as the python ``import`` statement. ``{% include *filename* %}`` Includes another template file. The included file can see all the local variables as if it were copied directly to the point of the ``include`` directive (the ``{% autoescape %}`` directive is an exception). Alternately, ``{% module Template(filename, **kwargs) %}`` may be used to include another template with an isolated namespace. ``{% module *expr* %}`` Renders a `~tornado.web.UIModule`. The output of the ``UIModule`` is not escaped:: {% module Template("foo.html", arg=42) %} ``UIModules`` are a feature of the `tornado.web.RequestHandler` class (and specifically its ``render`` method) and will not work when the template system is used on its own in other contexts. ``{% raw *expr* %}`` Outputs the result of the given expression without autoescaping. ``{% set *x* = *y* %}`` Sets a local variable. ``{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}`` Same as the python ``try`` statement. ``{% while *condition* %}... {% end %}`` Same as the python ``while`` statement. ``{% break %}`` and ``{% continue %}`` may be used inside the loop. ``{% whitespace *mode* %}`` Sets the whitespace mode for the remainder of the current file (or until the next ``{% whitespace %}`` directive). See `filter_whitespace` for available options. New in Tornado 4.3. N)StringIO)escape)app_log) ObjectDictexec_in unicode_type)AnyUnionCallableListDictIterableOptionalTextIO)TupleContextManager xhtml_escapec eZdZy) _UnsetMarkerN)__name__ __module__ __qualname__V/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/tornado/template.pyrrsrrmodetextreturnc|dk(r|S|dk(r0tjdd|}tjdd|}|S|dk(rtjdd|Std |z) aTransform whitespace in ``text`` according to ``mode``. Available modes are: * ``all``: Return all whitespace unmodified. * ``single``: Collapse consecutive whitespace with a single whitespace character, preserving newlines. * ``oneline``: Collapse all runs of whitespace into a single space character, removing all newlines in the process. .. versionadded:: 4.3 allsinglez([\t ]+) z (\s*\n\s*) onelinez(\s+)zinvalid whitespace mode %s)resub Exception)rrs rfilter_whitespacer(sm u}  vvk3-vvmT40  vvhT**4t;<Ntemplate_stringnameloader BaseLoadercompress_whitespace autoescape whitespacerctj||_|tur| t d|rdnd}|B|r|j r |j }n'|j ds|j drd}nd}|Jt|dt|ts||_ n|r|j|_ n t|_ |r |jni|_ t|tj||}t|t|||_|j#||_||_ t)tj*|j$d|jj-d d zd d |_y#t$rFt1|j$j3}t5j6d|j|wxYw)aConstruct a Template. :arg str template_string: the contents of the template file. :arg str name: the filename from which the template was loaded (used for error message). :arg tornado.template.BaseLoader loader: the `~tornado.template.BaseLoader` responsible for this template, used to resolve ``{% include %}`` and ``{% extend %}`` directives. :arg bool compress_whitespace: Deprecated since Tornado 4.3. Equivalent to ``whitespace="single"`` if true and ``whitespace="all"`` if false. :arg str autoescape: The name of a function in the template namespace, or ``None`` to disable escaping by default. :arg str whitespace: A string specifying treatment of whitespace; see `filter_whitespace` for options. .. versionchanged:: 4.3 Added ``whitespace`` parameter; deprecated ``compress_whitespace``. Nz2cannot set both whitespace and compress_whitespacer!r z.htmlz.jsz%s.generated.py._execT) dont_inheritz %s code: %s)r native_strr,_UNSETr'r1endswithr( isinstancerr0_DEFAULT_AUTOESCAPE namespace_TemplateReader_File_parsefile_generate_pythoncoder-compile to_unicodereplacecompiled _format_coderstriprerror) selfr+r,r-r/r0r1readerformatted_codes r__init__zTemplate.__init__s6%%d+ f ,% TUU%8eJ  &++#.. ==)T]]5-A!)J!&J%%%*b)*l3(DO $//DO1DO-3)) v'8'8'I:V$vt 45 ))&1    $!!$)),!DII$5$5c3$??! DM  )$))4;;=N MM.$))^ D  s/AE>>AG kwargsc Ttjtjtjtjtjtj t tjttfjjddtfdd }|jj|j|tj |t#j$t&gtf|d}t)j*|S)z0Generate this template with the given arguments.r4r5cjSN)rC)r,rKs rz#Template.generate..`s TYYr) get_source) rr url_escape json_encodesqueezelinkifydatetime_tt_utf8_tt_string_typesr __loader__ _tt_execute)rrrUrVrWrXrYutf8rbytesr,rFrupdater=rrGtypingcastr linecache clearcache)rKrOr=executes` rgeneratezTemplate.generateQs))"// ++!--~~~~  !-u 5 ))#s3$0FG  (  y)++hr5y19]3KL yrcXt} i}|j|}|j|D]}|j||t ||||dj }|dj ||j|jS#|jwxYwNr) r_get_ancestorsreversefind_named_blocks _CodeWritertemplaterfgetvalueclose)rKr-buffer named_blocks ancestorsancestorwriters rrBzTemplate._generate_pythonls L++F3I    % A**6<@ A vy|?T?TUF aL ! !& )??$ LLNFLLNs A:BB)r?c2|jg}|jjjD]f}t|ts|s t d|j |j|j}|j|j|h|S)Nz1{% extends %} block found, but no template loader) rAbodychunksr; _ExtendsBlock ParseErrorloadr,extendri)rKr-rrchunkrms rrizTemplate._get_ancestors{sYYK YY^^** BE%/$N";;uzz499=  !8!8!@A Br)rrr__doc__r9r strr_rboolrrNr rfrBr rirrrr*r*s)-9?9?$(IsEz*II& I #4#56 I U3 #456 ISMI IV6 x '= #  Xl%; W rr*c eZdZdZeddfdeedeeeefdeeddfdZ ddZ dd ed eedefd Z dd ed eede fd Z d ede fd Zy)r.zBase class for template loaders. You must use a template loader to use template constructs like ``{% extends %}`` and ``{% include %}``. The loader caches all templates after they are loaded the first time. Nr0r=r1rcv||_|xsi|_||_i|_t j |_y)aConstruct a template loader. :arg str autoescape: The name of a function in the template namespace, such as "xhtml_escape", or ``None`` to disable autoescaping by default. :arg dict namespace: A dictionary to be added to the default template namespace, or ``None``. :arg str whitespace: A string specifying default behavior for whitespace in templates; see `filter_whitespace` for options. Default is "single" for files ending in ".html" and ".js" and "all" for other files. .. versionchanged:: 4.3 Added ``whitespace`` parameter. N)r0r=r1 templates threadingRLocklock)rKr0r=r1s rrNzBaseLoader.__init__s4*%"b$ OO% rcT|j5i|_dddy#1swYyxYw)z'Resets the cache of compiled templates.N)rrrKs rresetzBaseLoader.resets% YY DN   s'r, parent_pathct)z@Converts a possibly-relative path to absolute (used internally).NotImplementedErrorrKr,rs r resolve_pathzBaseLoader.resolve_paths !##rc|j||}|j5||jvr|j||j|<|j|cdddS#1swYyxYw)zLoads a template.)rN)rrr_create_templaters rrzzBaseLoader.loadsd  ; ? YY (4>>)'+'<'>$' ( ( (s ;A%%A.ctrRrrKr,s rrzBaseLoader._create_template !##r)rNrR)rrrr}r<rr~r r rNrrr*rzrrrrr.r.s%8.2$( &SM&DcN+&SM &  &@ $$8C=$C$((8C=(H($S$X$rr.c\eZdZdZdededdffd Zd dedeedefd Zdede fd Z xZ S) Loaderz:A template loader that loads from a single root directory.root_directoryrOrNc lt|di|tjj ||_yNr)superrNospathabspathroot)rKrrO __class__s rrNzLoader.__init__s' "6"GGOON3 rr,rc$|r |jds|jds|jdstjj|j|}tjj tjj |}tjj tjj||}|j|jr|t|jdzd}|S)N</) startswithrrjoinrdirnamerlen)rKr,r current_pathfile_dir relative_paths rrzLoader.resolve_paths **3/**3/OOC(77<< ;?Lwwrww|'DEHGGOOBGGLL4,HIM'' 2$S^a%7%9: rctjj|j|}t |d5}t |j ||}|cdddS#1swYyxYw)Nrbr,r-)rrrropenr*read)rKr,rfrms rrzLoader._create_templatesRww||DIIt, $  tDAH   s AA(rR) rrrr}r~r rNrrr*r __classcell__rs@rrrsQD4s4c4d4  8C= C SXrrcfeZdZdZdeeefdeddffd Zd dedeedefd Z dede fd Z xZ S) DictLoaderz/A template loader that loads from a dictionary.dictrOrNc 2t|di|||_yr)rrNr)rKrrOrs rrNzDictLoader.__init__s "6" rr,rc|rq|jds`|jdsO|jds>tj|}tjtj||}|S)Nrr)r posixpathrnormpathr)rKr,rrs rrzDictLoader.resolve_paths] **3/**3/OOC( ((5H%%innXt&DED rc8t|j|||S)Nr)r*rrs rrzDictLoader._create_templates $d4@@rrR) rrrr}r r~r rNrrr*rrrs@rrrs\9T#s(^st  8C= C ASAXArrcJeZdZdedfdZd dZdeedee dfddfdZ y) _Nodercyrrrs r each_childz_Node.each_childsrNctrRrrKrts rrfz_Node.generaterrr-rq _NamedBlockcR|jD]}|j||yrR)rrk)rKr-rqchilds rrkz_Node.find_named_blockss*__& :E  # #FL 9 :rrtrlrN) rrrrrrfrr.r r~rkrrrrrsDHW-$:z*::>sM?Q:R: :rrc:eZdZdeddddfdZd dZdedfd Zy) r?rmrv _ChunkListrNc.||_||_d|_yrh)rmrvline)rKrmrvs rrNz_File.__init__s    rcd|jd|j|j5|jd|j|jd|j|jj ||jd|jdddy#1swYyxYw)Nzdef _tt_execute():_tt_buffer = []_tt_append = _tt_buffer.append$return _tt_utf8('').join(_tt_buffer)) write_linerindentrvrfrs rrfz_File.generate s. : ]]_ Q   / ;   > J II  v &   Ddii P  Q Q Qs A0B&&B/rc|jfSrRrvrs rrz_File.each_child |rr)rrrr*rNrfrrrrrr?r?s3$ QHW-rr?c<eZdZdeeddfdZddZdedfdZy) rrwrNc||_yrRrw)rKrws rrNz_ChunkList.__init__s  rcH|jD]}|j|yrR)rwrf)rKrtr|s rrfz_ChunkList.generates![[ #E NN6 " #rrc|jSrRrrs rrz_ChunkList.each_childs {{rr) rrrr rrNrfrrrrrrrs/tE{t#HW-rrc feZdZdededededdf dZdedfd Z dd Z d e e d e edfddfd Zy)rr,rvrmrrNc<||_||_||_||_yrR)r,rvrmr)rKr,rvrmrs rrNz_NamedBlock.__init__$s     rrc|jfSrRrrs rrz_NamedBlock.each_child*rrc|j|j}|j|j|j5|j j |dddy#1swYyxYwrR)rqr,includermrrvrf)rKrtblocks rrfz_NamedBlock.generate-sS##DII. ^^ENNDII 6 ( JJ   ' ( ( (s A%%A.r-rqcP|||j<tj|||yrR)r,rrk)rKr-rqs rrkz_NamedBlock.find_named_blocks2s$#' TYY fl;rr)rrrr~rr*intrNrrrfrr.r rkrrrrr#smSQU HW-( <z*<:>sM?Q:R< rrNcB||_|j|_||_yrR)r, template_namer)rKr,rLrs rrNz_IncludeBlock.__init__?s #[[ rr-rqc|J|j|j|j}|jj ||yrR)rzr,rrArk)rKr-rqincludeds rrkz_IncludeBlock.find_named_blocksDs>!!!;;tyy$*<*<= '' =rc,|jJ|jj|j|j}|j ||j 5|j jj|dddy#1swYyxYwrR) r-rzr,rrrrArvrf)rKrtrs rrfz_IncludeBlock.generateKsq}}(((==%%dii1C1CD ^^Hdii 0 0 MM   ' ' / 0 0 0s &B  Br) rrrr~rrNrr.r rrkrfrrrrr>sUS*;34 >z*>:>sK?O:P> >0rrc>eZdZdedededdfdZdedfdZd d Z y) _ApplyBlockmethodrrvrNc.||_||_||_yrR)rrrv)rKrrrvs rrNz_ApplyBlock.__init__Ss   rrc|jfSrRrrs rrz_ApplyBlock.each_childXrrc d|jz}|xjdz c_|jd|z|j|j5|jd|j|jd|j|jj ||jd|jddd|jd|j d|d |jy#1swY7xYw) Nz _tt_apply%drz def %s():rrrz_tt_append(_tt_utf8((z())))) apply_counterrrrrvrfr)rKrt method_names rrfz_ApplyBlock.generate[s#f&:&:: !+ 3TYY? ]]_ Q   / ;   > J II  v &   Ddii P  Q "4;;-q U CTYY  Q Qs A0C::Dr rrrr~rrrNrrrfrrrrrRs9s#Ut HW-  rrc>eZdZdedededdfdZdeefdZd dZ y) _ControlBlock statementrrvrNc.||_||_||_yrR)rrrv)rKrrrvs rrNz_ControlBlock.__init__js"  rc|jfSrRrrs rrz_ControlBlock.each_childorrc|jd|jz|j|j5|jj ||jd|jdddy#1swYyxYw)N%s:pass)rrrrrvrfrs rrfz_ControlBlock.generatersc%$..0$))< ]]_ 1 II  v &   fdii 0 1 1 1s 8A;;Brrrrrrris8#S$ HUO1rrc(eZdZdededdfdZddZy)_IntermediateControlBlockrrrNc ||_||_yrRrrrKrrs rrNz"_IntermediateControlBlock.__init__{" rc|jd|j|jd|jz|j|jdz y)Nrrr)rrr indent_sizers rrfz"_IntermediateControlBlock.generatesD&$)),%$..0$))V=O=O=QTU=UVrrrrrr~rrNrfrrrrrzs"#STWrrc(eZdZdededdfdZddZy) _StatementrrrNc ||_||_yrRrrs rrNz_Statement.__init__rrcP|j|j|jyrR)rrrrs rrfz_Statement.generates$..$))4rrrrrrrrs!#ST5rrc .eZdZddedededdfdZd dZy) _Expression expressionrrawrNc.||_||_||_yrR)rrr )rKrrr s rrNz_Expression.__init__s$ rc|jd|jz|j|jd|j|jd|j|jsI|jj 3|jd|jj z|j|jd|jy)Nz _tt_tmp = %szEif isinstance(_tt_tmp, _tt_string_types): _tt_tmp = _tt_utf8(_tt_tmp)z&else: _tt_tmp = _tt_utf8(str(_tt_tmp))z_tt_tmp = _tt_utf8(%s(_tt_tmp))z_tt_append(_tt_tmp))rrrr current_templater0rs rrfz_Expression.generates.4??:DIIF V II  BDIINxxF33>>J   1F4K4K4V4VV   /;r)Fr)rrrr~rrrNrfrrrrrs(3c z_tt_append(%r))rr(r1rrr^r)rKrtrs rrfz_Text.generatesP  % %doou=E    .U1CCTYY O rrrrrrrrs)%c%%#%$% Prrc >eZdZdZ d dedeededdfdZdefdZy) ryzRaised for template syntax errors. ``ParseError`` instances have ``filename`` and ``lineno`` attributes indicating the position of the error. .. versionchanged:: 4.3 Added ``filename`` and ``lineno`` attributes. Nmessagefilenamelinenorc.||_||_||_yrRrrr)rKrrrs rrNzParseError.__init__s !  rcNd|j|j|jfzS)Nz %s at %s:%drrs r__str__zParseError.__str__s  dmmT[[IIIrrh) rrrr}r~rrrNrrrrryrysEKL&.smDG JJrryc eZdZdedeeefdeede ddf dZ de fdZ dd Z d e d e dd fd Z dd ede dee ddfdZy)rlrArqr-r rNcf||_||_||_||_d|_g|_d|_yrh)rArqr-r r include_stack_indent)rKrArqr-r s rrNz_CodeWriter.__init__s9 ( 0 rc|jSrRr!rs rrz_CodeWriter.indent_sizes ||rrc*Gfdd}|S)Nc.eZdZdfd Zdeddffd Zy)$_CodeWriter.indent..Indenterrc2xjdz c_S)Nrr#r5rKs r __enter__z._CodeWriter.indent..Indenter.__enter__s !  rargsNcRjdkDsJxjdzc_y)Nrrr#r5r*rKs r__exit__z-_CodeWriter.indent..Indenter.__exit__s#||a''' ! rrrlrrrr)r r-rsrIndenterr&s  "3 "4 "rr0r)rKr0s` rrz_CodeWriter.indents " "zrrmrcjjj|f|_Gfdd}|S)Nc.eZdZdfd Zdeddffd Zy),_CodeWriter.include..IncludeTemplatercSrRrr(s rr)z6_CodeWriter.include..IncludeTemplate.__enter__s rr*NcJjjd_yrh)r popr r,s rr-z5_CodeWriter.include..IncludeTemplate.__exit__s(,(:(:(>(>(@(C%rr.r/rsrIncludeTemplater3s  D3 D4 Drr7)r appendr )rKrmrr7s` rrz_CodeWriter.includesA !!4#8#8$"?@ ( D D  r line_numberrcT| |j}d|jj|fz}|jrM|jDcgc]\}}d|j|fz}}}|ddj t |zz }t d|z|z|z|jycc}}w)Nz # %s:%dz%s:%dz (via %s)z, z )rA)r!r r,r rreversedprintrA)rKrr9r line_commenttmplrrrs rrz_CodeWriter.write_lines >\\F"d&;&;&@&@+%NN   DHDVDV2@4499f--I K$))HY4G*HH HL fvo$|3$))D sB$)rrrR)rrrrr r~rrr.r*rNrrrrrrrrrlrls  3 +, $  #   S  ! ! !8H !DH E E&) E3;C= E  Errlc eZdZdedededdfdZddeded eedefd Zdd eedefd Zdefd Z defdZ de ee fdefdZ defdZdeddfdZy)r>r,rr1rNcJ||_||_||_d|_d|_y)Nrr)r,rr1rpos)rKr,rr1s rrNz_TemplateReader.__init__s%  $ rneedlestartendc|dk\sJ||j}||z }||jj||}n)||z }||k\sJ|jj|||}|dk7r||z}|S)Nr)rArfind)rKrBrCrDrAindexs rrGz_TemplateReader.finds~z 5 zhh   ;IINN651E 3JC%< <IINN65#6E B; SLE rcountc |"t|j|jz }|j|z}|xj|jj d|j|z c_|j|j|}||_|S)Nr#)rrrArrI)rKrInewposss rconsumez_TemplateReader.consume#sn = NTXX-EE! TYY__T488V<< IIdhh (rcFt|j|jz SrR)rrrArs r remainingz_TemplateReader.remaining,s499~((rc"|jSrR)rOrs r__len__z_TemplateReader.__len__/s~~rkeycTt|trit|}|j|\}}}| |j}n||jz }|||jz }|j t|||S|dkr|j |S|j |j|zSrh)r;slicerindicesrAr)rKrRsizerCstopsteps r __getitem__z_TemplateReader.__getitem__2s c5 !t9D # D 1 E4}! 99U5$56 6 1W99S> !99TXX^, ,rc4|j|jdSrR)rrArs rrz_TemplateReader.__str__Bsyy$$rmsgcDt||j|jrR)ryr,r)rKr[s rraise_parse_errorz!_TemplateReader.raise_parse_errorEsdii33r)rNrR)rrrr~rNrrrGrMrOrQr rTrYrr]rrrr>r> sS 3 s Xc] c Xc]c)3)  -uS%Z0-S- %%4S4T4rr>rCc |j}dttt|dzz}djt |Dcgc]\}}||dz|fzc}}Scc}}w)Nz %%%dd %%s rr3) splitlinesrreprr enumerate)rClinesformatirs rrHrHIs] OO E c$s5zA~"67 7F 77Ieiffortrywhilermro)elseelifexceptfinallyz outside z blockz block cannot be attached to rDzExtra {% end %} block) extendsrsetimportfromcommentr0r1r moduleryru"'zextends missing file path)rwrxzimport missing statementrzinclude missing file pathrvzset missing statementr0Noner1r3r rrz)applyrrormrnrp)rnrpr~zapply missing method namerzblock missing name)breakcontinuez{} outside {} blockrnrpzunknown operator: %r)rrGrOr]rwr8rrMrr1stripr partitiongetrrxrrr0r(rr@rrrrc)rLrmrerfrvcurlycons start_bracerrDcontentsoperatorspacesuffixintermediate_blocksallowed_parentsrfnr block_bodys rr@r@OsT b>D KKU+E{eai6+;+;+==,,:XE ""&..*FKK9J9JK eai 7   F,,..519%,519%,   19>>%(D KK  uT6;;8I8IJ KnnQ' {{    &)s"2 NN1  KK  u[$8I8IJ K  $ ++d#Cby(()AB~~c*002H NN1   $ ++d#Cby(()DE~~c*002H NN1 (();< KK  {8T: ; d"/K/"kk$ "9  $ $%; <>>#&,,.q  $ $%> ?"*"4"4S"9%2Fgw   .11(;  &((H:Y>Ov)VW.((j =hZvN KK  84H I  (()@AK    9$9$c*005,,-HI%f-//,,-GH"8T2Y&c*005,,-HI%ffd;U",,-DE"640\)\\^<B&(#\)||~!$+$(!U"#FDd;X%- KK  u %  H H++#FHhI W$$FHhE #FHhH 7",,-HI#FD*=W$,,-AB#FJ$G%hjA KK  u %  . .(()00E7;KL KK  z(D9 :   $ $%;h%F G r)NN):r}rYiorrcos.pathrrr%rtornador tornado.logr tornado.utilrrrrar r r r r rrr TYPE_CHECKINGrrr<rr9r~r(r*r.rrrr?rrrxrrrrrrrrr'ryrlr>rHr@rrrrs un ::OOO  ,$   =C=s=s=2IIX:$:$zZ8AA, : :E$  <%<,E 0E0( % .1E1"WW55<%<.FkF PEP$JJ.7E7Et9494xOsOsO#! FH FHFHsmFHc] FH  FHr