!]Z?&      !"#$%Safe?&tiniRename src to dst, overwriting dst if it already exists.&Safez'()*NoneM Otini>The name of an INI section. Must not contain the character ']'.tiniA key into an INI file.$A valid key is either of the format  "sect.prop" or just "prop"+. The first key will match the property prop in section sect,, and the second will match the property prop outside of any section. prop must not begin with ; or # or contain a = , and sect must not contain ] . Both parts are case-sensitive.tini=An ordered, comment-preserving representation of an INI file.tini Serialize an Ini to a String.+,-./012345Nonetini)Parses an INI file from the given string.\A valid INI file may contain zero or more lines, where each line is any of the following:A [section header] in square brackets;a  key = value pair; a comment, starting with either ; or #; or whitespace.4Note that a valid INI file must not contain duplicate section headers, and keys must be unique within their section. Section headers and keys are case-sensitive. Values must be contained on a single line. Whitespace is ignored at the start and end of each line, section header, key, and value.Safe8=?P#tiniIValid types for values of INI properties. Default implementation uses 6 and 7 for  showValue and  readValue respectively.8tiniITuples follow the same rules as lists, but must be of the correct length.9tini readValue returns Left val6 If the value is readable at the type on the left,  Right val3 if it's readable at the type on the right, and Nothing if it's not readable as either.:tiniNothingX is encoded as the empty string, and any non-empty value of the correct type encodes Just val.;tini{Lists are zero or more valid values, separated by commas. To include a comma in a string within a list, escape it using \,.<tinisStrings are the raw values of properties, with whitespace trimmed on both ends. They are not enclosed in quotes.=tiniaValid values for booleans (case-insensitive): true, false, yes, no, t, f, y, n, 1, 0, on, off.None6 tini&An INI with no sections or properties. tinigReturns the value at the given key, if it exists and is valid at the function's result type. See O for more information regarding how Haskell values are encoded in INI files. tini\Sets the given key to the given value. If the key already exists, it will be overwritten.|New sections are added at the end of the given INI, and new properties are added at the end of their respective sections. tini)Removes the given key from the given INI. tini3Modify the value at the given key in the given INI.3If the key exists, the given function will receive  Just value/ as its argument, otherwise it will receive Nothing.If the given function returns Just new_value7, the given key will be created or overwritten with  new_value. If it returns Nothing, the key will be deleted.tini#Convert the given INI to s list of  (key, value) pairs.tini%Create an INI from the given list of  (key, value) pairs.tiniMerge the given INIs. Values from the second INI override values from the first in cases where a key exists in both. Comments from the second INI are discarded. Nonek9rtini5Attempt to read the given file as an INI. Returns NothingC if the file does not exist or can not be parsed as an INI file.tini1Atomically write the given INI to the given file.  None,.8=>?@AHUVXkY tiniEAny type which can be stored and loaded as an INI configuration file.Using the default implementation, this includes all record types with a single data constructor, and where all fields implement .tiniFields of the configuration type which should not be read from or written to an INI. The default is to allow configuration of all fields.tiniAUpdate the given configuration using settings from the given INI.]In the default implementation, settings are looked up by record selector. A record called  playerName. will be overwritten with the value at key  playerNameG in the given INI, if such a key is present and of the correct type.tiniUpdate the given INI with the values from the given config. Implementations should preserve comments in the given INI (i.e. only update it using  ).tinijThe section of an INI under which to place settings from this configuration. The default is no section.tini*The default values for this configuration.tiniInvariants on : all names appearing in ExcludedFields must be names of fields of a.tini4Read the given INI file into a configuration, using 7 to fill in any values missing from the config file.tiniQUpdate the given configuration with the settings read from the given INI file.tini:Update the given configuration file with the given config.fThis function first reads the given file as an INI, overwrites all its values with values from from the given config, then writes the result back to disk atomically. This ensures that no data is lost in the event of a crash, and that the resulting file preserves both comments and keys which are not recognized by the config are not clobbered.tinigWrite the given configuration to the given file. If the file already exists, it will be overwritten.tiniTCreate a configuration from the given INI. Missing values will be filled in from .tini5Create a new INI configuration from the given config.>     !"#$%&'()*+,-./0123456789:; <=> ?@ ABCDEFGHI#tini-0.1.0.0-BZjduWegqGOI3xoz5fDH09Data.Tini.Configurable Data.TiniData.Tini.RenameData.Tini.UtilsData.Tini.TypesData.Tini.ParserData.Tini.IniValue Data.Tini.Opsbase GHC.GenericsGeneric SectionNameKeyInishowIniparseIniIniValue showValue readValueemptygetsetremovemodifytoListfromListmerge readIniFile writeIniFile ConfigurableExcludedFields updateConfig updateIni sectionName defaultConfigConfigInvariantsreadConfigFilereadConfigFileWithupdateConfigFilewriteConfigFilefromInitoIni$fGConfigurable:*:$fGConfigurableK1$fGConfigurableM1$fGConfigurableM10 $fSymList[] $fSymList:renameltrimrtrimtrimsplitOnPropertySectionSN KeyOrCommentCommentKeyPartunInivalidshowSNGHC.Showshow Text.Readreads $fIniValue(,)$fIniValueEither$fIniValueMaybe $fIniValue[] $fIniValue[]0$fIniValueBool