!9c!g      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCD E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                                None=?M ginger&Types that support conversion to HTML.gingerA chunk of HTML source. ginger!Extract HTML source code from an Html value. ginger,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. ginger"Safely convert plain text to HTML.ginger$HTML-encode an individual character. ginger!Html itself is a trivial instance ginger6String is automatically HTML-encoded and converted to ginger"Text is automatically HTML-encoded  None=?@ASX/7gingerQA key/value pair, used for constructing dictionary GVals using a compact syntax.ginger#Types that implement conversion to .gingerGA function that can be called from within a template execution context.gingerA 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  / ginger"Convert value to list, if possibleginger=Convert value to association list ("dictionary"), if possible ginger"Convert value to a lookup function!gingerRender value as HTML"gingerRender value as plain-text#gingerGet value's truthiness$ginger&Convert value to a number, if possible%ginger1Access value as a callable function, if it is one&ginger6Get length of value, if it is a collection (list/dict)'gingerCheck if the value is null(ginger1Provide a custom JSON representation of the value*ginger7Marshal 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.+ginger/Marshal a GVal between carrier monads. Unlike *, %V information is retained by hoisting them using the provided hoisting functions. For Run monads, which is what  is typically used with, the hoistRun@ function can be used to construct suitable hoisting functions.-gingerConvenience wrapper around  to represent a  as a ..ginger]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.5ginger4Silly helper function, needed to bypass the default  instance of  in order to make integral s look like integers.7gingerTurn a  into a 8ginger{Construct a dictionary GVal from a list of pairs. Internally, this uses a hashmap, so element order will not be preserved.9gingerConstruct 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.:ginger(Construct a pair from a key and a value.;gingerAlias for '(~:)'.<gingerTThis operator allows constructing heterogenous lists using cons-style syntax, e.g.:EasText $ list ("Found " ~: (6 :: Int) ~: " items" ~: [] :: [GVal IO])"Found 6 items"=gingerAConstruct a GVal from a list of GVals. This is equivalent to the  implementation of [GVal m]:, but typed more narrowly for clarity and disambiguation.>ginger-Check if the given GVal is a list-like object?ginger3Check if the given GVal is a dictionary-like object@gingerTreat 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 .AgingerHelper function; look up a value by an integer index when the index may or may not be available. If no index is given, return .BgingereStrictly-typed lookup: treat value as a dictionary-like object and look up the value at a given key.CgingerLoosely-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.DgingerLike C, 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.FgingerTreat a E as a dictionary and list all the keys, with no particular ordering.Gginger Convert a  to a number.Hginger 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 .Iginger Convert a  to an ; The conversion will fail when the value is not an integerJginger Convert a  to an =, falling back to the given default if the conversion fails.Kginger Convert a  to an 4, falling back to zero (0) if the conversion fails.LgingerLoose 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.Mginger-Dynamically cast to a function. This yields  a  if the value is a function,  if it's not.TgingerString ->  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.Vginger6Converting to HTML hooks into the ToHtml instance for W for most tags. Tags that have no obvious textual representation render as empty HTML.WgingerFor convenience, A is implemented in a way that looks similar to JavaScript / JSONXgingerGConversion 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*.Yginger The default  is equivalent to NULL.ZgingerConvert 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.[ginger%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).^ginger*Single characters are treated as length-1 s._gingerGBooleans render as 1 or empty string, and otherwise behave as expected.lginger of  becomes a dictionary-like mgingerHaskell lists become list-like snginger becomes NULL,  unwraps.pgingerTrivial instance for  itself.@('%$#"! &)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS@('%$#"! &)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS:8<5None4!ginger=Expressions, building blocks for the expression minilanguage.ginger#String literal expression: "foobar"ginger!Numeric literal expression: 123.4ginger Boolean literal expression: trueginger Literal nullgingerVariable reference: foobarginger$List construct: [ expr, expr, expr ]ginger1Object construct: { expr: expr, expr: expr, ... }gingerfoo[bar] (also dot access)gingerfoo(bar=baz, quux)ginger(foo, bar) -> exprgingerexpr ? expr : exprgingerdo { statement; }gingerA catch blockgingerGinger statements.ginger!A sequence of multiple statementsginger&Run wrapped statement in a local scopeginger:Establish an indented context around the wrapped statementginger,Literal output (anything outside of any tag)ginger{{ expression }}gingerEvaluate expressionginger:{% if expression %}statement{% else %}statement{% endif %}gingerz{% switch expression %}{% case expression %}statement{% endcase %}...{% default %}statement{% enddefault %}{% endswitch %}ginger;{% for index, varname in expression %}statement{% endfor %}ginger{% set varname = expr %}ginger+{% macro varname %}statements{% endmacro %}ginger{% include "template" %}gingerThe do-nothing statement (NOP)gingerTry  catch  finallygingerA block definition (  {% block %} )gingerA macro definition (  {% macro %} )ginger?Top-level data structure, representing a fully parsed template.gingerA context variable name.33None 7=?@APXginger How to load templates / includesginger Current source file name, if anygingerDisable newline strippinggingerEnable auto-stripping of  {% block %}sgingerEnable auto-trimming of  {% block %}sginger*Interpolation, tag, and comment delimitersgingerDelimiter configuration.ginger+Error information for Ginger parser errors.gingerHuman-readable error messagegingerUsed 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.ginger(Input type for the parser (source code).gingerFormats a parser errror into something human-friendly. If template source code is not provided, only the line and column numbers and the error message are printed. If template source code is provided, the offending source line is also printed, with a caret (^+) marking the exact location of the error.gingerDHelper function to create a Ginger parser error from a Parsec error.gingerxParse Ginger source from a file. Both the initial template and all subsequent includes are loaded through the provided . A consequence of this is that if you pass a "null resolver" (like `const (return Nothing)`), this function will always fail.ginger[Parse Ginger source from memory. The initial template is taken directly from the provided A, while all subsequent includes are loaded through the provided .ginger+Parse Ginger source from a file. Flavor of  that takes additional .ginger+Parse Ginger source from memory. Flavor of  that takes additional .ginger!Default delimiter configuration: {{ }} for interpolation, {% %} for tags, { } for comments.ginger+Default parser options for a given resolverginger#Template source code (not filename)gingerError to format##SafeESX=None =>?@APXcginger8Internal type alias for our template-runner monad stack.gingerGeneric runtime errorgingereTried to use a block that isn't defined | Invalid arguments to function (function name, explanation)gingerWrong type, expected one of...ginger Invalid indexgingerA ! determines the rules by which a h~ value can be split into lines, how a list of lines can be joined into a single value, and how to remove leading whitespace.ginger%Typeclass that defines how to encode s into a given type. gingersExecution context. Determines how to look up variables from the environment, and how to write out template output.ginger/Hoist a context onto a different output type. hoistContext fwd rev context? returns a context over a different output type, applying the fwd and revG projections to convert between the original and desired output types.gingerCreate 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).gingerCreate 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  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.gingerHoist a R onto a different output type. You don't normally need to use this directly; see & and/or .ginger.Helper; reinstates newlines after splitting a  into lines. gingerHoist a R onto a different output type. You don't normally need to use this directly; see & and/or .$ginger!Lift a value from the host monad m into the  monad.%ginger$Lift a function from the host monad m into the  monad.&gingerHoist a ' action onto a different output type. hoistRun fwd rev action hoists the action from  Run p m h a to  Run p m t a , applying fwd and rev& to convert between the output types.+gingerwithSourcePos pos action runs action; in a context where the current source location is set to pos1. The original source position is restored when action finishes.,ginger1Encoding to Html is implemented as returning the ! representation.-gingerPEncoding to text just takes the text representation without further processing.=      !"#$%&'()*+=     $%!#"& '(*+)None =>?@APX7gingerYMatch 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.8ginger6Parse argument list into type-safe argument structure.9ginger8Parse argument list into flat list of matched arguments. 123456789:; 123456789:;None<gingerxHelper function to run a State action with a temporary state, reverting to the old state after the action has finished.=gingerxHelper function to run a Scope action with a temporary scope, reverting to the old scope after the action has finished.>ginger)Override the encoder used for converting \s to the output type. This can be used for things like temporarily disabling HTML encoding.<=>?@ABC<=>?@ABC None =>?@APX_DDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~DDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ None =>?@APX__ ginger@Simplified interface to render a ginger template "into" a monad.!easyRenderM emit context template renders the template with the given contextc object (which should represent some sort of dictionary-like object) by feeding any output to the emit function.gingerCSimplified interface to render a ginger template in a pure fashion.easyRender context template renders the template with the given contextk object (which should represent some sort of dictionary-like object) by returning the concatenated output.gingerAPurely expand a Ginger template. The underlying carrier monad is  h;, which is used to collect the output and render it into a h value.ginger'Monadically run a Ginger template. The m parameter is the carrier monad.ginger8Find the effective base template of an inheritance chaingingerRun a template.ginger2Run an action within a different template context.ginger$Run an action within a block contextgingerRun one statement.ginger(Deeply magical function that converts a  into a Function.gingerHRun p (evaluate) an expression and return its value into the Run p monadginger[Helper function to output a HTML value using whatever print function the context provides.(  !"#$%&789:( $%789:& !#" None =>?@AMX Nonec& !"#$%'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS  !"#$%&789: !"#$%&'()*+  ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                                           %ginger-0.8.4.1-3Aur7Rc6RCeK6qeyXhTbDFText.Ginger.ParseText.Ginger.HtmlText.Ginger.GValText.Ginger.AST Text.PrintfAText.Ginger.Run.TypeText.Ginger.Run.FuncUtilsText.Ginger.Run.VMText.Ginger.Run.BuiltinsText.Ginger.RunText.Ginger.Optimizer Text.GingerGVal&parsec-3.1.13.0-7YG0z3Ym0FM9fuFlCpMf1nText.Parsec.Pos setSourceName sourceColumn sourceLine sourceName SourceName SourcePosToHtmltoHtmlHtml htmlSource unsafeRawHtmlhtml $fToHtmlHtml $fToHtml[] $fToHtmlText$fSemigroupHtml $fMonoidHtml $fShowHtml$fEqHtml $fOrdHtmlFromGValfromGValEitherfromGValConsPairToGValtoGValFunctionasList asDictItemsasLookupasHtmlasText asBooleanasNumber asFunctionlengthisNullasJSONgappend marshalGVal marshalGValExmarshalFunction asHashMap matchFuncArgs dayToDict timeToDictlocalTimeToDicttimeZoneToDicttimeLocaleToDictzonedTimeToDictscientificToText rawJSONToGVal fromFunctiondict orderedDict~>gcons~:listisListisDict lookupIndexlookupIndexMay lookupKey lookupLooselookupLooseDef~!keystoNumbertoInt toIntegertoIntDeftoInt0 toBoolean toFunctionpicoToScientificscientificToPico fromGValMpairwisepackPair unpackPair$fIsStringGVal$fPrintfArgGVal $fToHtmlGVal $fShowGVal $fToJSONGVal $fDefaultGVal$fToGValmValue $fToGValmHtml $fToGValmText$fToGValmText0 $fToGValmChar $fToGValmBool$fToGValm(,,,) $fToGValm(,,) $fToGValm(,)$fToGValmZonedTime$fToGValmTimeLocale$fToGValmTimeZone$fToGValmLocalTime$fToGValmTimeOfDay $fToGValmDay$fToGValmScientific$fToGValmInteger $fToGValmInt$fToGValmHashMap $fToGValm[]$fToGValmMaybe $fToGValm() $fToGValmGVal$fFromGValmTimeLocale$fFromGValmTimeZone$fFromGValmZonedTime$fFromGValmLocalTime$fFromGValmTimeOfDay$fFromGValmDay$fFromGValm(,,,)$fFromGValm(,,)$fFromGValm(,) $fFromGValm[] $fFromGValm()$fFromGValmValue$fFromGValmBool$fFromGValmMaybe$fFromGValmGVal$fFromGValmText$fFromGValmInteger$fFromGValmScientific$fFromGValmInt Annotated annotation ExpressionStringLiteralENumberLiteralE BoolLiteralE NullLiteralEVarEListEObjectE MemberLookupECallELambdaETernaryEDoE CatchBlockCatch catchWhatcatchCaptureAs catchBody StatementMultiSScopedSIndentSLiteralSInterpolationS ExpressionSIfSSwitchSForSSetVarS DefMacroS BlockRefSPreprocessedIncludeSNullS TryCatchSBlock blockBodyMacro macroArgs macroBodyTemplate templateBodytemplateBlockstemplateParentVarNamestmtAnnotationexprAnnotation$fAnnotatedTemplate$fAnnotatedMacro$fAnnotatedBlock$fAnnotatedStatement$fAnnotatedExpression$fShowExpression$fFunctorExpression$fShowStatement$fFunctorStatement$fShowCatchBlock$fFunctorCatchBlock $fShowMacro$fFunctorMacro$fShowTemplate$fFunctorTemplate $fShowBlock$fFunctorBlock ParserOptionspoIncludeResolver poSourceNamepoKeepTrailingNewlinepoLStripBlocks poTrimBlocks poDelimiters DelimitersdelimOpenInterpolationdelimCloseInterpolation delimOpenTag delimCloseTagdelimOpenCommentdelimCloseComment ParserErrorpeErrorMessagepeSourcePositionIncludeResolverSourceformatParserErrorparseGingerFile parseGingerparseGingerFile' parseGinger' defDelimitersmkParserOptions$fToGValmSourcePos$fExceptionParserError$fShowParserError$fGenericParserError PrintfTypeTTunT PrintfArgTPprintfaRun RuntimeErrorUndefinedBlockErrorArgumentsError TypeError IndexErrorEvalParseErrorNotAFunctionErrorRuntimeErrorAtRunStatersScope rsCapturersCurrentTemplatersCurrentBlockName rsIndentation rsAtLineStartrsCurrentSourcePosNewlines splitLines joinLines stripIndentendsWithNewlineContextEncodableencodenewlines GingerContext contextLookup contextWrite contextWarn contextEncodecontextNewlines hoistContext easyContext makeContextM'makeContextExM' makeContext' makeContext makeContextMmakeContextHtmlmakeContextHtmlMmakeContextHtmlExMmakeContextTextmakeContextTextMmakeContextTextExM hoistNewlines hoistRunStateruntimeErrorWhatruntimeErrorMessageruntimeErrorWhereliftRunliftRun2hoistRunwarn warnFromMaybe getSourcePos throwHere withSourcePos$fContextEncodableHtml$fContextEncodableText$fToGValmRuntimeError$fDefaultRuntimeError$fShowRuntimeError unaryFunc binaryFuncignoreArgNamesvariadicNumericFuncunaryNumericFuncvariadicStringFunc extractArgs extractArgsT extractArgsLextractArgsDefLinjectDefaultswithLocalStatewithLocalScope withEncodersetVargetVar clearCapture appendCapture fetchCapturetshow gfnRawHtml gfnUrlEncode gfnDefault gfnEscape gfnEscapedgfnAnygfnAllgfnIninListinDictgfnApply gfnEquals gfnNEquals gfnContains gfnConcat looseEqualsgfnLess gfnGreater gfnLessEqualsgfnGreaterEqualslessgreaterlessEq greaterEq differenceratiointRatiomodulo capitalize gfnCenter gfnLengthgfnSlice gfnReplace gfnCompose gfnPartialgfnZip gfnZipWithgfnMapgfnSortonFstlistToIndexedDictcentergfnFileSizeFormatformatFileSize gfnPrintf gvalToDategvalDictToDategvalListToDategvalAutoParseDategvalToTZparseTZ gfnDateFormat getTimeLocale gfnFilterprintfG gfnDictsortgfnJSONgfnDivisibleBygfnEvengfnOddgfoRegex gfnReMatchOne gfnReMatch gfnReTestmatchTextToGVal fnReMatch parseCompOpts easyRenderM easyRender runGinger runGingerT Optimizableoptimize$fOptimizableExpression$fOptimizableMacro$fOptimizableBlock$fOptimizableStatement$fOptimizableTemplate$fMonoidPurity$fSemigroupPurity$fToGValmCollected $fShowPurity $fEqPurity $fEnumPurity $fReadPurity $fOrdPurity$fBoundedPurity$fSemigroupCollected$fMonoidCollectedhtmlEncodeChar text-1.2.3.1Data.Text.InternalTextbaseGHC.BaseMonadghc-prim GHC.TypesTrue GHC.MaybeNothingFalse4unordered-containers-0.2.10.0-LgoTL3wbBEY5bZIDJiyxW4Data.HashMap.BaseHashMapGHC.ShowShow)scientific-0.3.6.2-91XCjWlEe6MDVJ0U2TzxxAData.Scientific ScientificInt integer-gmpGHC.Integer.TypeIntegerJust Data.StringIsStringfromParsecError+transformers-0.5.6.2-I9SzqoyagSNIbUNkJkeRZ3Control.Monad.Trans.Writer.LazyWriter reNewline baseTemplate runTemplate withTemplate withBlockName runStatement macroToGVal runExpressionecho