h&*(f.      !"#$%&'()*+,- Safe-Inferred"56df1Convert an arbitrary type to a . uence of s.$You are encouraged to create custom  instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.Any characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here.df1 The leftmost + is the closest to the root. The rightmost 4 is the one closest to where the log was generated.See the documentation for .df1: represents the hierarchical structure of logged messages.For example, consider a df1 log line as like the following: 1999-12-20T07:11:39.230553031Z /foo x=a y=b /bar /qux z=c z=d WARNING Something For that line, the  attribute of the & datatype will contain the following: [  (  "foo") ,  (  "x") ( "a") ,  (  "y") ( "b") ,  (  "bar") ,  (  "qux") ,  (  "z") ( "c") ,  (  "z") ( "d") ] :: .  Please notice that [] :: .  is a valid path insofar as df1 is concerned, and that  and % can be juxtapositioned in any order.df1Convert an arbitrary type to a .$You are encouraged to create custom  instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.Any characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here.df1An attribute value (see ).If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use / or . Notice that "" ::  is acceptable, and will be correctly rendered and parsed back.df1Convert an arbitrary type to a  .$You are encouraged to create custom  instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.Any characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here. df1An attribute key (see ).If you have the OverloadedStrings) GHC extension enabled, you can build a   using a string literal:  "foo" ::   Otherwise, you can use / or  . Notice that "" ::   is acceptable, and will be correctly rendered and parsed back. df1Convert an arbitrary type to a  .$You are encouraged to create custom   instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.Any characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here. df1A path segment.If you have the OverloadedStrings) GHC extension enabled, you can build a   using a string literal:  "foo" ::   Otherwise, you can use / or  . Notice that "" ::   is acceptable, and will be correctly rendered and parsed back.df1!Importance of the logged message.These levels, listed in increasing order of importance, correspond to the levels used by  "https://linux.die.net/man/3/syslog syslog(3).df1Message intended to be useful only when deliberately debugging a program.df1Informational message.df1A condition that is not an error, but should possibly be handled specially.df1A warning condition, such as an exception being gracefully handled or some missing configuration setting being assigned a default value.df10Error condition, such as an unhandled exception.df1Critical condition that could result in system failure, such as a disk running out of space.df1A condition that should be corrected immediately, such as a corrupted database.df1System is unusable.df1Convert an arbitrary type to a .$You are encouraged to create custom  instances for your types making sure you avoid rendering sensitive details such as passwords, so that they don't accidentally end up in logs.Any characters that need to be escaped for rendering will be automatically escaped at rendering time. You don't need to escape them here.df1A message text.If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use / or . Notice that "" ::  is acceptable, and will be correctly rendered and parsed back.df11First known timestamp when the log was generated.We use 0 rather than 1> because it is cheaper to obtain and to render. You can use  to convert it if necessary.df1'Importance level of the logged message.df1+ where the logged message was created from. The leftmost + is the closest to the root. The rightmost 4 is the one closest to where the log was generated.An 2 .7 is acceptable, conveying the idea of the @root path@.df1Human-readable message itself.3df1 x :: 4 == 5 (  ( x)) 6df1 x :: 7 == 8 (  ( x)) 9df1 x :: : ==   ( x) ;df1 Identity.<df1 x :: 4 == 5 (! (  x)) =df1 x :: 7 == 8 (! (  x)) >df1 x :: : == ! (  x) ?df1 Identity.@df1 x :: 4 == 5 (" (  x)) Adf1 x :: 7 == 8 (" (  x)) Bdf1 x :: : == " (  x) Cdf1 Identity.Ddf1 Lowercase monday, tuesday, etc.Edf1 123456sFdf1 123456sGdf1See H.Idf1See H.Jdf1See H.Kdf1See H.Ldf1See H.Mdf1See H.Ndf1See H.Odf1Chops trailing zeros.Pdf1 x :: 4 == 5 (# ( x)) Qdf1 x :: 7 == 8 (# ( x)) Rdf1 x :: : == # ( x) Sdf1 Identity.Tdf1  = U . V Wdf1 Identity.Xdf1"Order of importance. For example,  is more important than :  >  == Y $  !"# Safe-Inferred"&L$df1Like %, but with ANSI colors.%df1 Renders a ? on its own line. Doesn't include a trailing newline character. For example: 2019-11-15T18:05:54.949470902Z NOTICE Welcome to my program! 2019-11-15T18:05:54.949623731Z /initialization NOTICE Starting web server 2019-11-15T18:05:54.949630205Z /initialization ALERT Disk is almost full!!! 2019-11-15T18:05:54.949640299Z /server port=80 INFO Listening for new clients 2019-11-15T18:05:54.949652133Z /server port=80 /handler client-address=10.0.0.8 INFO Connection established 2019-11-15T18:05:54.949664482Z /server port=80 /handler client-address=10.0.0.8 WARNING user error (Oops!) Zdf1Z a b c p renders p using a as the default color (for things like whitespace or attribute values), b# as the color for path names, and c as the color for attribute keys. This adds a trailing whitespace if necessary.[df1Like Z, but without color.&df1Escaping rules for  :0A '%' anywhere is always percent-escaped ("%25")An ASCII-7 control character anywhere is always percent-escaped.The output is encoded as UTF-8.'df1Escaping rules for  :An ASCII-7 punctuation character as first character is always percent-escaped.An ASCII-7 punctuation character anywhere else is always percent-escaped, unless it is '-' or '_'.An ASCII-7 control character anywhere is always percent-escaped.The output is encoded as UTF-8.(df1Escaping rules for  :7An ASCII-7 control character is always percent-escaped.;An ASCII-7 punctuation character is always percent-escaped.An ASCII-7 punctuation character anywhere else is always percent-escaped, unless it is '-' or '_'.The output is encoded as UTF-8.)df1Escaping rules for :1A ' ' anywhere is always percent-escaped ("%20").1A '%' anywhere is always percent-escaped ("%25")"1A '=' anywhere is always percent-escaped ("%3d").An ASCII-7 control character anywhere is always percent-escaped.The output is encoded as UTF-8.\df1 Reset all]df1Default foreground^df1green foreground_df1green foreground`df1Yellow foregroundadf1Cyan foregroundbdf1Blue foregroundcdf1Black foregroundddf1White foregroundedf1Red backgroundfdf1Red backgroundgdf1Render % followed by the given h& rendered as two hexadecimal nibbles.*df1Renders YYYY-MM-DDThh:mm:ss.sssssssssZ (nanosecond precision).The rendered string is 30 characters long, and it's encoded as ASCII/UTF-8.idf1Like *, but takes a 1.jdf1INTERNAL. Used by * and i.kdf1Y( for all ASCII-7 punctuation characters.ldf1Y for ASCII-7 control characters.+df1See *.,df1See *.$%&'()*%$(&*') Safe-Inferred"'-df1If sucessful, parsing will stop after the first CR or LF newline marker if any, otherwise it will consume all input.mdf1Parse "%FF"8. Always consumes 3 bytes from the input, if successful.ndf1Like o but takes strict bytes.odf1 Decodes all m! occurences from the given input.+TODO: Make faster and more space efficient.-- Safe-Inferred($  !"#$ ! " #       !!"#$%&'()*+ ,-.+/01234567589/0:;2<=>?@A>BC>?DE>FCGHIJKLMNOPQRS5TUVWXYZ[\]^_`a/0b2cdefghijklmnopqrstuvw2xyz{|}~ df1-0.4.1-8eY2xtEsux57xmawerbpttDf1 Df1.Render Df1.Parse Df1.TypesData.Time.Clock.SystemsystemToUTCTimeToPathpathPathPushAttrToValuevalueValueToKeykeyKey ToSegmentsegmentSegmentLevelDebugInfoNoticeWarningErrorCriticalAlert Emergency ToMessagemessageMessageLoglog_time log_levellog_path log_message unMessage unSegmentunKeyunValue logColorANSIlogiso8601$fToValueUTCTime$fToValueSystemTimecontainers-0.6.5.1Data.Sequence.InternalSeqbase Data.String fromString time-1.11.1.1#Data.Time.Clock.Internal.SystemTime SystemTime Data.Time.Clock.Internal.UTCTimeUTCTimeempty $fToMessage[]GHC.BaseString text-1.2.5.0Data.Text.Lazyunpack$fToMessageTextData.Text.InternalTexttoStrict$fToMessageText0Data.Text.Internal.Lazy$fToMessageMessage $fToSegment[]$fToSegmentText$fToSegmentText0$fToSegmentSegment $fToKey[] $fToKeyText $fToKeyText0 $fToKeyKey$fToValueDayOfWeek$fToValueDiffTime$fToValueNominalDiffTime$fToValueZonedTimeData.Time.Format.ISO8601ISO8601$fToValueLocalTime$fToValueTimeOfDay$fToValueTimeZone $fToValueDay$fToValueCalendarDiffTime$fToValueCalendarDiffDays$fToValueFixed $fToValue[] $fToValueText$fToValueText0$fToValueValue $fToPathffromList Data.FoldabletoList $fToPathSeq $fOrdLevelghc-prim GHC.TypesTruerenderPathColor renderPathreset fgDefaultfgGreenfgRedfgYellowfgCyanfgBluefgBlackfgWhitebgRedbgWhiteword8HexPercentGHC.WordWord8iso8601UTCTimeiso8601SystemTimeUTCTimeisPunctuation7 isControl7 pNumPercentpDecodePercentspDecodePercentsL