úÎçþÓXÛ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒ Ó Ô Õ Ö × Ø ÙÚ SafeAOTNone9;I &Types that support conversion to HTML.A chunk of HTML source. !Extract HTML source code from an Html value. ,Convert a chunk of HTML source code into an Htmlö value as-is. Note that this bypasses any and all HTML encoding; the caller is responsible for taking appropriate measures against XSS and other potential vulnerabilities. In other words, the input to this function is considered pre-sanitized. "Safely convert plain text to HTML.Û$HTML-encode an individual character. !Html itself is a trivial instance 6String is automatically HTML-encoded and converted to Ü"Text is automatically HTML-encoded ÝÞ Û    ÝÞ Û None9;<=T5QA key/value pair, used for constructing dictionary GVals using a compact syntax.#Types that implement conversion to .GA function that can be called from within a template execution context.²A variant type designed as the unitype for the template language. Any value referenced in a template, returned from within a template, or used in a template context, will be a . m, in most cases, should be a ß.#Some laws apply here, most notably:when & is à, then all of $, !, #,  , , , and % should produce áwhen & is à, then " should produce âwhen # is not á, then " should only return â for exactly zeroá -ness of % should match one or both of  / "Convert value to list, if possible=Convert value to association list ("dictionary"), if possible"Convert value to a lookup function Render value as HTML!Render value as plain-text"Get value's truthiness#&Convert value to a number, if possible$1Access value as a callable function, if it is one%6Get length of value, if it is a collection (list/dict)&Check if the value is null'1Provide a custom JSON representation of the value(7Marshal a GVal between carrier monads. This will lose $ƒ information, because functions cannot be transferred to other carrier monads, but it will keep all other data structures intact.)Convenience wrapper around  to represent a  as a ã.*]Match arguments passed to a function at runtime against a list of declared argument names. !matchFuncArgs argNames argsPassed returns ((matchedArgs, positionalArgs, namedArgs) , where  matchedArgsR is a list of arguments matched against declared names (by name or by position), positionalArgs5 are the unused positional (unnamed) arguments, and  namedArgs are the unused named arguments.14Silly helper function, needed to bypass the default ä instance of å in order to make integral ås look like integers.3Turn a  into a 4{Construct a dictionary GVal from a list of pairs. Internally, this uses a hashmap, so element order will not be preserved.5ÝConstruct an ordered dictionary GVal from a list of pairs. Internally, this conversion uses both a hashmap (for O(1) lookup) and the original list, so element order is preserved, but there is a bit of a memory overhead.6(Construct a pair from a key and a value.7Alias for '(~:)'.8TThis operator allows constructing heterogenous lists using cons-style syntax, e.g.:EasText $ list ("Found " ~: (6 :: Int) ~: " items" ~: [] :: [GVal IO])"Found 6 items"9AConstruct a GVal from a list of GVals. This is equivalent to the  implementation of [GVal m]:, but typed more narrowly for clarity and disambiguation.:-Check if the given GVal is a list-like object;3Check if the given GVal is a dictionary-like object<Treat a „ as a flat list and look up a value by integer index. If the value is not a List, or if the index exceeds the list length, return á.=Helper function; look up a value by an integer index when the index may or may not be available. If no index is given, return á.>eStrictly-typed lookup: treat value as a dictionary-like object and look up the value at a given key.?ÿLoosely-typed lookup: try dictionary-style lookup first (treat index as a string, and container as a dictionary), if that doesn't yield anything (either because the index is not string-ish, or because the container doesn't provide dictionary-style access), try index-based lookup.@Like ?„, but fall back to the given default value if the key is not in the dictionary, or if the indexee is not a dictionary-like object.BTreat a E as a dictionary and list all the keys, with no particular ordering.C Convert a  to a number.D Convert a  to an æe. The conversion will fail when the value is not numeric, and also if it is too large to fit in an æ.E Convert a  to an æ=, falling back to the given default if the conversion fails.F Convert a  to an æ4, falling back to zero (0) if the conversion fails.GLoose cast to boolean.9Numeric zero, empty strings, empty lists, empty objects, Null, and boolean âS are considered falsy, anything else (including functions) is considered true-ish.H-Dynamically cast to a function. This yields ç a  if the value is a function, á if it's not.aConvert Aeson Values to ps over an arbitrary host monad. Because JSON cannot represent functions, this conversion will never produce a . Further, the ToJSON instance for such a  will always produce the exact Value" that was use to construct the it.b%This instance is slightly wrong; the ", #, and !e methods all treat the HTML source as plain text. We do this to avoid parsing the HTML back into a Üÿ¤ (and dealing with possible parser errors); the reason this instance exists at all is that we still want to be able to pass pre-rendered HTML around sometimes, and as long as we don't call any numeric or string functions on it, everything is fine. When such HTML values accidentally do get used as strings, the HTML source will bleed into the visible text, but at least this will not introduce an XSS vulnerability.-It is therefore recommended to avoid passing K values into templates, and also to avoid calling any string functions on f values inside templates (e.g. capturing macro output and then passing it through a textual filter).e*Single characters are treated as length-1 Üs.fString ->  conversion uses the è class; because String, is an alias for '[Char]', there is also a  instance for StringA, but it marshals strings as lists of characters, i.e., calling 3 on a string produces a list of characters on the  side.gGBooleans render as 1 or empty string, and otherwise behave as expected.tã of Ü becomes a dictionary-like uHaskell lists become list-like svá becomes NULL, ç unwraps.wTrivial instance for  itself.y6Converting to HTML hooks into the ToHtml instance for ÜW for most tags. Tags that have no obvious textual representation render as empty HTML.zFor convenience, äA is implemented in a way that looks similar to JavaScript / JSON{GConversion to JSON values attempts the following conversions, in order: check the & property; if it is à, always return Null!, even if the GVal implements '' (through ))#!DNote that the default conversions will never return booleans unless ' explicitly does this, because ! will always return *something*.| The default  is equivalent to NULL.j !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|<%& !"#$'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNj !"#$%&'()|{zyx*wvutsrqp+o,n-m.l/k0jih1gfedcba23456789:;<=>?@ABCDEFGHIJK`_^]\[ZYXWVUTSRQPOLMN[  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|6885None}=Expressions, building blocks for the expression minilanguage.~#String literal expression: "foobar"!Numeric literal expression: 123.4€ Boolean literal expression: true Literal null‚Variable reference: foobarƒ$List construct: [ expr, expr, expr ]„1Object construct: { expr: expr, expr: expr, ... }…foo[bar] (also dot access)†foo(bar=baz, quux)‡(foo, bar) -> exprˆexpr ? expr : expr‰Ginger statements.Š!A sequence of multiple statements‹&Run wrapped statement in a local scopeŒ,Literal output (anything outside of any tag){{ expression }}Ž:{% if expression %}statement{% else %}statement{% endif %};{% for index, varname in expression %}statement{% endfor %}{% set varname = expr %}‘+{% macro varname %}statements{% endmacro %}“{% include "template" %}”The do-nothing statement (NOP)•A block definition (  {% block %} )˜A macro definition (  {% macro %} )œ?Top-level data structure, representing a fully parsed template.¡A context variable name.%}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡%}‚ƒ~€„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡%¡œžŸ ˜™š›•–—‰Š‹ŒŽ‘’“”}~€‚ƒ„…†‡ˆ} ~€‚ƒ„…†‡ˆ‰ Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡None§¨éêëìíîïðñòóô©ª«¬­§¨§¨§¨éêëìíîïðñòóô©ª«¬­None5LT ®+Error information for Ginger parser errors.°Human-readable error message±Source name, if any²Line number, if available³Column number, if available´ØUsed to resolve includes. Ginger will call this function whenever it encounters an {% include %}, {% import %}, or {% extends %} directive. If the required source code is not available, the resolver should return Nothing, else Just the source.µ+A source identifier (typically a filename).¶(Input type for the parser (source code).õDHelper function to create a Ginger parser error from a Parsec error.· Parse Ginger source from a file.¸ Parse Ginger source from memory.kö÷øùúûüý®¯°±²³´µ¶õ·þ¸ÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS¹ ®¯°±²³´µ¶·¸ ¸·®¯°±²³´¶µaö÷øùúûüý®¯°±²³´µ¶õ·þ¸ÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS¹ None 9:;<=LT¼8Internal type alias for our template-runner monad stack.½sExecution context. Determines how to look up variables from the environment, and how to write out template output.¾ìCreate an execution context for runGingerT. Takes a lookup function, which returns ginger values into the carrier monad based on a lookup key, and a writer function (outputting HTML by whatever means the carrier monad provides, e.g. putStr for IO, or tell for Writers).¿‚Create an execution context for runGinger. The argument is a lookup function that maps top-level context keys to ginger values. À is a specialized version of Á, targeting the T H monad (which is what is used for the non-monadic template interpreter  runGinger).ŒThe type of the lookup function may look intimidating, but in most cases, marshalling values from Haskell to Ginger is a matter of calling S on them, so the 'GVal (Run (Writer Html))' part can usually be ignored. See the    module for details.Æ!Lift a value from the host monad m into the ¼ monad.Ç$Lift a function from the host monad m into the ¼ monad.¼UVWXYZ½[\]^_¾`¿ÀÁÂÃÄÅÆÇ¼UVWXYZ½[\]^¾¿ÀÁÂÃÄÅÆÇ¼UVWXYZ½[\]^_¾`¿ÀÁÂÃÄÅÆÇNone 9:;<=LTÍYMatch args according to a given arg spec, Python style. The return value is a triple of '(matched, args, kwargs, unmatchedNames) , where matches§ is a hash map of named captured arguments, args is a list of remaining unmatched positional arguments, kwargs is a list of remaining unmatched named arguments, and unmatchedNames8 contains the argument names that haven't been matched.Î6Parse argument list into type-safe argument structure.Ï8Parse argument list into flat list of matched arguments. ÈÉÊËÌÍÎÏÐÑ ÈÉÊËÌÍÎÏÐÑ ÈÉÊËÌÍÎÏÐÑ ÈÉÊËÌÍÎÏÐÑ NoneÒxHelper function to run a State action with a temporary state, reverting to the old state after the action has finished.ÓxHelper function to run a Scope action with a temporary scope, reverting to the old scope after the action has finished.ÒÓÔÕÖרÒÓÔÕÖרÒÓÔÕÖרÒÓÔÕÖר None 9:;<=LT[*abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š*abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š*abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰ŠNone 9:;<=LT ÙAPurely expand a Ginger template. The underlying carrier monad is T h;, which is used to collect the output and render it into a h value.Ú'Monadically run a Ginger template. The m parameter is the carrier monad.‹8Find the effective base template of an inheritance chainŒRun a template.2Run an action within a different template context.Ž$Run an action within a block contextRun one statement.(Deeply magical function that converts a ˜ into a Function.‘DRun (evaluate) an expression and return its value into the Run monad’[Helper function to output a HTML value using whatever print function the context provides. “ÙÚ‹ŒŽ”‘’•¼½¾¿ÀÁÂÃÄÅÆÇÍÎÏÐÙÚÚÙ½ÀÁ¿¾ÂÃÄżÆÇÍÎÏÐ “ÙÚ‹ŒŽ”‘’• None€%& !"#$'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN}‚ƒ~€„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡§¨®¯°±²³´µ¶·¸¼½¾¿ÀÁÂÃÄÅÆÇÍÎÏÐÙÚ– !"#$%&'(  )*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¡¢££¤¥¦¦§¨©ª«¬­®¯°±²³´µ¶··¸¹º»¼½¾¿ÀÁÂà Ä Å Æ Ç È É Ê Ë Ì Í Î ÏÐÑÒÓÔÕÖ×ØÙ Ú Û Ü Ý Þ ß àáâãäåæçèéêëìíèéîëìïðñòèóôõö÷ëìøèéùèúûüýþÿ        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg h h i j k l Å m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š ›œžŸ ¡¢£¤¥¦§%ginger-0.3.5.1-FC1a0JM0NcRDCpQuGN60Gv Text.PrintfAText.Ginger.HtmlText.Ginger.GValText.Ginger.ASTText.Ginger.OptimizerText.Ginger.ParseText.Ginger.RunText.Ginger.Run.FuncUtilsText.Ginger.Run.VMText.Ginger.Run.Type Text.GingerGValText.Ginger.Run.Builtins PrintfTypeTTunT PrintfArgTPprintfaToHtmltoHtmlHtml htmlSource unsafeRawHtmlhtml $fToHtmlHtml $fToHtml[] $fToHtmlText $fMonoidHtml $fShowHtml$fEqHtml $fOrdHtmlFromGValfromGValEitherfromGValConsPairToGValtoGValFunctionasList asDictItemsasLookupasHtmlasText asBooleanasNumber asFunctionlengthisNullasJSON marshalGVal asHashMap matchFuncArgs dayToDict timeToDictlocalTimeToDicttimeZoneToDicttimeLocaleToDictzonedTimeToDictscientificToText rawJSONToGVal fromFunctiondict orderedDict~>gcons~:listisListisDict lookupIndexlookupIndexMay lookupKey lookupLooselookupLooseDef~!keystoNumbertoInttoIntDeftoInt0 toBoolean toFunctionpicoToScientificscientificToPico fromGValMpairwisepackPair unpackPair$fFromGValmTimeLocale$fFromGValmTimeZone$fFromGValmZonedTime$fFromGValmLocalTime$fFromGValmTimeOfDay$fFromGValmDay$fFromGValm(,,,)$fFromGValm(,,)$fFromGValm(,) $fFromGValm[] $fFromGValm()$fFromGValmValue$fFromGValmBool$fFromGValmMaybe$fFromGValmGVal$fFromGValmText$fFromGValmScientific$fFromGValmInt$fToGValmValue $fToGValmHtml $fToGValmText$fToGValmText0 $fToGValmChar$fIsStringGVal $fToGValmBool$fToGValm(,,,) $fToGValm(,,) $fToGValm(,)$fToGValmZonedTime$fToGValmTimeLocale$fToGValmTimeZone$fToGValmLocalTime$fToGValmTimeOfDay $fToGValmDay$fToGValmScientific$fToGValmInteger $fToGValmInt$fToGValmHashMap $fToGValm[]$fToGValmMaybe $fToGValmGVal$fPrintfArgGVal $fToHtmlGVal $fShowGVal $fToJSONGVal $fDefaultGVal ExpressionStringLiteralENumberLiteralE BoolLiteralE NullLiteralEVarEListEObjectE MemberLookupECallELambdaETernaryE StatementMultiSScopedSLiteralSInterpolationSIfSForSSetVarS DefMacroS BlockRefSPreprocessedIncludeSNullSBlock blockBodyMacro macroArgs macroBodyTemplate templateBodytemplateBlockstemplateParentVarName$fShowExpression$fShowStatement $fShowMacro$fShowTemplate $fShowBlock Optimizableoptimize$fOptimizableExpression$fOptimizableMacro$fOptimizableBlock$fOptimizableStatement$fOptimizableTemplate ParserErrorpeErrorMessage peSourceName peSourceLinepeSourceColumnIncludeResolver SourceNameSourceparseGingerFile parseGinger$fExceptionParserError$fShowParserError$fGenericParserErrorRun GingerContext makeContextM' makeContext' makeContext makeContextMmakeContextHtmlmakeContextHtmlMmakeContextTextmakeContextTextMliftRunliftRun2 unaryFuncignoreArgNamesvariadicNumericFuncunaryNumericFuncvariadicStringFunc extractArgs extractArgsT extractArgsLextractArgsDefLinjectDefaultswithLocalStatewithLocalScopesetVargetVar clearCapture appendCapture fetchCapture runGinger runGingerThtmlEncodeChar#text-1.2.2.1-9Yh8rJoh8fO2JMLWffT3QsData.Text.InternalTextunHtmlbaseGHC.BaseMonadghc-prim GHC.TypesTrueNothingFalse2unordered-containers-0.2.7.1-5INwdG7O5Jdakf1CqKoOBData.HashMap.BaseHashMapGHC.ShowShow)scientific-0.3.4.9-JxsEP2U97KeHjUTI8Fv24jData.Scientific ScientificIntJust Data.StringIsStringoptimizeTemplateoptimizeStatement optimizeBlock optimizeMacrooptimizeStatementList cullNulls mergeLiteralsoptimizeExpressionexpandConstExpressionsoptimizeSubexpressionsisConstExpressioncompileTimeEvalfromParsecErrorParser ParseStatepsBlocks ParseContext pcResolvepcCurrentSource defParseStateignore getResolverincludeincludeTemplatereduceStatements templatePderivedTemplateP baseTemplateP statementsP statementPinterpolationStmtP literalStmtP endOfLiteralP commentStmtPifStmtP elseBranchP elifBranchPsetStmtP setStmtInnerP defineBlock blockStmtPblockP macroStmtP macroHeadP callStmtP callHeadP scopeStmtPforStmtPincludePforHeadP forIteratorPforIndexedIteratorPforSimpleIteratorP forHeadInP forHeadAsP fancyTagP simpleTagPopenInterpolationPcloseInterpolationP openCommentP closeCommentPopenTagP closeTagPopenPopenWPopenNWPclosePcloseWPcloseNWP expressionP lambdaExprPoperativeExprP ternaryExprP cTernaryTailPpyTernaryTailP booleanExprPcomparativeExprP additiveExprPmultiplicativeExprP postfixExprPpostfixP dotPostfixP arrayAccessP funcCallPfuncArgP namedFuncArgPpositionalFuncArgPfilterP atomicExprPparenthesizedExprP listExprP objectExprPexpressionPairPgroupPbracedPvarExprP identifierP identCharPstringLiteralExprPstringLiteralP stringCharPnumberLiteralExprPnumberLiteralP followedBybeforetransformers-0.5.2.0Control.Monad.Trans.Writer.LazyWriterRunStatersScope rsCapturersCurrentTemplatersCurrentBlockName contextLookup contextWrite contextEncodecontextWriteEncoded liftLookup gfnRawHtml gfnUrlEncode gfnDefault gfnEscapegfnAnygfnAll gfnEquals gfnNEquals gfnContains looseEqualsgfnLess gfnGreater gfnLessEqualsgfnGreaterEqualslessgreaterlessEq greaterEq differenceratiointRatiomodulo capitalize gfnCentergfnSlice gfnReplacegfnSortcentergfnFileSizeFormatformatFileSize gfnPrintf gvalToDategvalDictToDategvalListToDategvalAutoParseDategvalToTZparseTZ gfnDateFormat getTimeLocale gfnFilterprintfG gfnDictsort baseTemplate runTemplate withTemplate withBlockName runStatement macroToGVal runExpressionecho defaultScope lookupBlock defRunState