h$gLb-      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                              None 8haspara instance for .Aeson.encode AccountKindAsset "\"ASSET\""!Aeson.encode AccountKindLiability"\"LIABILITY\""Aeson.encode AccountKindEquity "\"EQUITY\""Aeson.encode AccountKindRevenue "\"REVENUE\""Aeson.encode AccountKindExpense "\"EXPENSE\""haspara instance for .-Aeson.decode "\"Asset\"" :: Maybe AccountKindJust AccountKindAsset-Aeson.decode "\"aSSET\"" :: Maybe AccountKindJust AccountKindAsset-Aeson.decode "\"ASSET\"" :: Maybe AccountKindJust AccountKindAsset1Aeson.decode "\"LIABILITY\"" :: Maybe AccountKindJust AccountKindLiability.Aeson.decode "\"EQUITY\"" :: Maybe AccountKindJust AccountKindEquity/Aeson.decode "\"REVENUE\"" :: Maybe AccountKindJust AccountKindRevenue/Aeson.decode "\"EXPENSE\"" :: Maybe AccountKindJust AccountKindExpenseNone /8<=hasparaAccount model.7import Haspara.Accounting.AccountKind (AccountKind(..))$import qualified Data.Aeson as Aeson,let acc = Account AccountKindAsset (1 ::Int)Aeson.encode acc#"{\"kind\":\"ASSET\",\"object\":1}"6Aeson.decode (Aeson.encode acc) :: Maybe (Account Int)Just (Account {accountKind = AccountKindAsset, accountObject = 1})+Aeson.decode (Aeson.encode acc) == Just accTrueNone ;?B hasparaType encoding for currencies. hasparaSmart constructor for  values within  context.%currency "" :: Either String CurrencyLeft "Currency code error! Expecting at least 3 uppercase characters, but received: \"\""¤cy " " :: Either String CurrencyLeft "Currency code error! Expecting at least 3 uppercase characters, but received: \" \""'currency "AB" :: Either String CurrencyLeft "Currency code error! Expecting at least 3 uppercase characters, but received: \"AB\""*currency " ABC " :: Either String CurrencyLeft "Currency code error! Expecting at least 3 uppercase characters, but received: \" ABC \""(currency "ABC" :: Either String Currency Right ABC!hasparaSmart constructor for  values within  context.!currencyFail "" :: Maybe CurrencyNothing#currencyFail "US" :: Maybe CurrencyNothing$currencyFail "usd" :: Maybe CurrencyNothing$currencyFail "USD" :: Maybe CurrencyJust USD"haspara"Parser that parses currency codes.,MP.runParser currencyCodeParser "Example" ""Left (ParseErrorBundle {bundleErrors = TrivialError 0 (Just EndOfInput) (fromList []) :| [], bundlePosState = PosState {pstateInput = "", pstateOffset = 0, pstateSourcePos = SourcePos {sourceName = "Example", sourceLine = Pos 1, sourceColumn = Pos 1}, pstateTabWidth = Pos 8, pstateLinePrefix = ""}})-MP.runParser currencyCodeParser "Example" " "Left (ParseErrorBundle {bundleErrors = TrivialError 0 (Just (Tokens (' ' :| ""))) (fromList []) :| [], bundlePosState = PosState {pstateInput = " ", pstateOffset = 0, pstateSourcePos = SourcePos {sourceName = "Example", sourceLine = Pos 1, sourceColumn = Pos 1}, pstateTabWidth = Pos 8, pstateLinePrefix = ""}})-MP.runParser currencyCodeParser "Example" "a"Left (ParseErrorBundle {bundleErrors = TrivialError 0 (Just (Tokens ('a' :| ""))) (fromList []) :| [], bundlePosState = PosState {pstateInput = "a", pstateOffset = 0, pstateSourcePos = SourcePos {sourceName = "Example", sourceLine = Pos 1, sourceColumn = Pos 1}, pstateTabWidth = Pos 8, pstateLinePrefix = ""}})-MP.runParser currencyCodeParser "Example" "A"Left (ParseErrorBundle {bundleErrors = TrivialError 1 (Just EndOfInput) (fromList []) :| [], bundlePosState = PosState {pstateInput = "A", pstateOffset = 0, pstateSourcePos = SourcePos {sourceName = "Example", sourceLine = Pos 1, sourceColumn = Pos 1}, pstateTabWidth = Pos 8, pstateLinePrefix = ""}}).MP.runParser currencyCodeParser "Example" "AB"Left (ParseErrorBundle {bundleErrors = TrivialError 2 (Just EndOfInput) (fromList []) :| [], bundlePosState = PosState {pstateInput = "AB", pstateOffset = 0, pstateSourcePos = SourcePos {sourceName = "Example", sourceLine = Pos 1, sourceColumn = Pos 1}, pstateTabWidth = Pos 8, pstateLinePrefix = ""}})/MP.runParser currencyCodeParser "Example" "ABC" Right "ABC"(haspara instance for .Aeson.encode (MkCurrency "USD") "\"USD\"")haspara instance for .3Aeson.eitherDecode "\"\"" :: Either String CurrencyLeft "Error in $: Currency code error! Expecting at least 3 uppercase characters, but received: \"\""6Aeson.eitherDecode "\"ABC\"" :: Either String Currency Right ABC*haspara instance for ."USD" :: CurrencyUSD+haspara instance for .MkCurrency "USD"USD,haspara instance for currency pairs.MkCurrencyPair ("EUR", "USD")EUR/USD !"#$%&' !"#$%&'None |  !#$%&'  !#$%&'None !5hasparaType encoding for date values.%This is a convenience wrapper around Day7 type. It helps us to avoid defining orphan instances.7haspara Builds a 5 from a given Day.fromDay (read "2021-01-01") 2021-01-018haspara Builds a 5; from a given year, month and day as in Gregorian calendar.fromYMD 2021 1 1 2021-01-019hasparaAttempts to parse and return 5 from a given  with ISO format.%fromString "2021-01-01" :: Maybe DateJust 2021-01-01#fromString "20210101" :: Maybe DateNothing:hasparaAttempts to parse and return 5 from a given  with given date format.9fromFormattedString "%Y-%m-%d" "2021-01-01" :: Maybe DateJust 2021-01-015fromFormattedString "%Y%m%d" "20210101" :: Maybe DateJust 2021-01-013fromFormattedString "%Y%m%d" "202101" :: Maybe DateNothing;hasparaAttempts to parse and return 5 from a given  with ISO format.#fromText "2021-01-01" :: Maybe DateJust 2021-01-01!fromText "20210101" :: Maybe DateNothing<hasparaAttempts to parse and return 5 from a given  with ISO format.7fromFormattedText "%Y-%m-%d" "2021-01-01" :: Maybe DateJust 2021-01-013fromFormattedText "%Y%m%d" "20210101" :: Maybe DateJust 2021-01-011fromFormattedText "%Y%m%d" "202101" :: Maybe DateNothing=haspara Converts 5 value to a  value.toDay (read "2021-01-01") 2021-01-01>haspara Converts 5+ value to a 3-tuple of year, month and day.toYMD (read "2020-12-31") (2020,12,31)?haspara Converts 5 value into a  value with ISO format.toString (read "2021-01-01") "2021-01-01"@haspara Converts 5 value into a  value with the given format.0toFormattedString "%Y-%m-%d" (read "2021-01-01") "2021-01-01"0toFormattedString "%d/%m/%Y" (read "2021-01-01") "01/01/2021"Ahaspara Converts 5 value into a  value with ISO format.toText (read "2021-01-01") "2021-01-01"Bhaspara Converts 5 value into a  value with the given format..toFormattedText "%Y-%m-%d" (read "2021-01-01") "2021-01-01".toFormattedText "%d/%m/%Y" (read "2021-01-01") "01/01/2021"ChasparaAdds (or subtracts) some days.addDays (-1) $ fromYMD 2021 1 1 2020-12-31+addDays 1 $ addDays (-1) $ fromYMD 2021 1 1 2021-01-01Dhaspara instance for 5.)Aeson.encode (MkDate (read "2021-01-01"))"\"2021-01-01\""Ehaspara instance for 5.+Aeson.decode "\"2020-12-31\"" :: Maybe DateJust 2020-12-31Fhaspara instance for 5.fromYMD 2020 12 31 2020-12-31Ghaspara instance for 5.read "2021-01-01" :: Date 2021-01-01$read "Just 2021-01-01" :: Maybe DateJust 2021-01-01Hhaspara instance for 5.56789:;<=>?@ABC56789:;<=>?@ABCNone !5789:;<=>?@ABC5789:;<=>?@ABCNone %Lhaspara-Type encoding for a lookup table from entity Ms to corresponding entities.#data A = A Int String deriving Showtype IdA = Id A Intlet a1 = A 1 "a1"let a2 = A 2 "a2"let a3 = A 3 "a3"let table = HM.fromList [(Id 1, a1), (Id 2, a2), (Id 3, a3)] :: IdLookup A IntHM.lookup (Id 1) tableJust (A 1 "a1")Mhaspara%Type encoding for entity identifiers.This encoding allows us to provide a phantom type for distinguishing between identifiers of varying types and an underlying identifier type. For example: data A = A data B = B data C = Ctype IdA = Id A Inttype IdB = Id B Inttype IdC = Id C Stringlet idA = Id 1 :: IdAlet idB = Id 1 :: IdBlet idC = Id "C1" :: IdCidA1idB1idC"C1" idA == idATrue-- idA == idB -- Compile error as: Couldn't match type @B@ with @A@*Hashes, on the otherhand, can be compared:import Data.Hashablehash idA == hash idBTrueLMNOMNOLNone &LMNOMNOLNone /28;>?B#VhasparaType encoding for common quantity values with given scaling (digits after the decimal point).42 :: Quantity 04242 :: Quantity 142.042 :: Quantity 242.0041 + 1 :: Quantity 242.0043 - 1 :: Quantity 242.002 * 3 * 7 :: Quantity 242.00negate (-42) :: Quantity 242.00abs (-42) :: Quantity 242.00signum (-42) :: Quantity 2-1.00fromInteger 42 :: Quantity 242.00quantity 0.415 :: Quantity 20.42quantity 0.425 :: Quantity 20.423quantityLossless 0.42 :: Either String (Quantity 2) Right 0.424quantityLossless 0.415 :: Either String (Quantity 2)7Left "Underflow while trying to create quantity: 0.415"Yhaspara Constructs V values from  values in a lossy way.This function uses Z> in case that the lossless attempt fails. We could have used Z directly. However, Z is doing too much (see _). Therefore, we are first attempting a lossless construction (see [) and we fallback to Z* in case the lossless construction fails.quantity 0 :: Quantity 00quantity 0 :: Quantity 10.0quantity 0 :: Quantity 20.00quantity 0.04 :: Quantity 10.0quantity 0.05 :: Quantity 10.0quantity 0.06 :: Quantity 10.1quantity 0.14 :: Quantity 10.1quantity 0.15 :: Quantity 10.2quantity 0.16 :: Quantity 10.2quantity 0.04 :: Quantity 20.04quantity 0.05 :: Quantity 20.05quantity 0.06 :: Quantity 20.06quantity 0.14 :: Quantity 20.14quantity 0.15 :: Quantity 20.15quantity 0.16 :: Quantity 20.16quantity 0.04 :: Quantity 30.040quantity 0.05 :: Quantity 30.050quantity 0.06 :: Quantity 30.060quantity 0.14 :: Quantity 30.140quantity 0.15 :: Quantity 30.150quantity 0.16 :: Quantity 30.160ZhasparaAuxiliary function for Y implementation.See Y why we need this function and why we haven't used it as the direct implementation of Y.Call-sites should avoid using this function directly due to its performance characteristics.[haspara Constructs V values from  values in a lossy way.0quantityLossless 0 :: Either String (Quantity 0)Right 00quantityLossless 0 :: Either String (Quantity 1) Right 0.00quantityLossless 0 :: Either String (Quantity 2) Right 0.003quantityLossless 0.04 :: Either String (Quantity 1)8Left "Underflow while trying to create quantity: 4.0e-2"3quantityLossless 0.05 :: Either String (Quantity 1)8Left "Underflow while trying to create quantity: 5.0e-2"3quantityLossless 0.06 :: Either String (Quantity 1)8Left "Underflow while trying to create quantity: 6.0e-2"3quantityLossless 0.14 :: Either String (Quantity 1)6Left "Underflow while trying to create quantity: 0.14"3quantityLossless 0.15 :: Either String (Quantity 1)6Left "Underflow while trying to create quantity: 0.15"3quantityLossless 0.16 :: Either String (Quantity 1)6Left "Underflow while trying to create quantity: 0.16"3quantityLossless 0.04 :: Either String (Quantity 2) Right 0.043quantityLossless 0.05 :: Either String (Quantity 2) Right 0.053quantityLossless 0.06 :: Either String (Quantity 2) Right 0.063quantityLossless 0.14 :: Either String (Quantity 2) Right 0.143quantityLossless 0.15 :: Either String (Quantity 2) Right 0.153quantityLossless 0.16 :: Either String (Quantity 2) Right 0.163quantityLossless 0.04 :: Either String (Quantity 3) Right 0.0403quantityLossless 0.05 :: Either String (Quantity 3) Right 0.0503quantityLossless 0.06 :: Either String (Quantity 3) Right 0.0603quantityLossless 0.14 :: Either String (Quantity 3) Right 0.1403quantityLossless 0.15 :: Either String (Quantity 3) Right 0.1503quantityLossless 0.16 :: Either String (Quantity 3) Right 0.160\hasparaRounds given quantity by k digits.:roundQuantity (quantity 0.415 :: Quantity 3) :: Quantity 20.42:roundQuantity (quantity 0.425 :: Quantity 3) :: Quantity 20.42]hasparaMultiplies two quantities with different scales and rounds back to the scale of the frst operand.times (quantity 0.42 :: Quantity 2) (quantity 0.42 :: Quantity 2)0.18^haspara0Multiplies two quantities with different scales.timesLossless (quantity 0.42 :: Quantity 2) (quantity 0.42 :: Quantity 2)0.1764_hasparaRounds a given scientific into a new scientific with given max digits after decimal point.$This uses half-even rounding method.roundScientific 0 0.40.0roundScientific 0 0.50.0roundScientific 0 0.61.0roundScientific 0 1.41.0roundScientific 0 1.52.0roundScientific 0 1.62.0roundScientific 1 0.040.0roundScientific 1 0.050.0roundScientific 1 0.060.1roundScientific 1 0.140.1roundScientific 1 0.150.2roundScientific 1 0.160.2roundScientific 1 3.6503.6roundScientific 1 3.7403.7roundScientific 1 3.7493.7roundScientific 1 3.7503.8roundScientific 1 3.7513.8roundScientific 1 3.7603.8roundScientific 1 (-3.650)-3.6roundScientific 1 (-3.740)-3.7roundScientific 1 (-3.749)-3.7roundScientific 1 (-3.750)-3.8roundScientific 1 (-3.751)-3.8roundScientific 1 (-3.760)-3.8;TODO: Refactor to improve the performance of this function.`haspara instance for V.show (42 :: Quantity 2)"42.00"42 :: Quantity 242.00ahasparaFractional arithmetic over V values. import Numeric.Decimal?arithM (fromRational 0.42) :: Either SomeException (Quantity 2) Right 0.42arithM (fromRational 0.415) :: Either SomeException (Quantity 2)1Left PrecisionLoss (83 % 200) to 2 decimal spacesarithM $ (fromRational 0.84) / (fromRational 2) :: Either SomeException (Quantity 2) Right 0.42arithM $ (fromRational 0.42) / (fromRational 0) :: Either SomeException (Quantity 2)Left divide by zerolet a = 84 :: Quantity 2let b = 2 :: Quantity 2let c = 0 :: Quantity 2?arithM (Arith a / Arith b) :: Either SomeException (Quantity 2) Right 42.00arithM (Arith a / Arith b / Arith c) :: Either SomeException (Quantity 2)Left divide by zerobhasparaNumeric arithmetic over V values. import Numeric.Decimallet a = Arith (quantity 10) + Arith (quantity 32) :: Arith (Quantity 2) arithMaybe a Just 42.004arithM (41 + 1) :: Either SomeException (Quantity 2) Right 42.004arithM (43 - 1) :: Either SomeException (Quantity 2) Right 42.007arithM (2 * 3 * 7) :: Either SomeException (Quantity 2) Right 42.007arithM (signum 42) :: Either SomeException (Quantity 2) Right 1.00:arithM (signum (-42)) :: Either SomeException (Quantity 2) Right -1.004arithM (abs 42) :: Either SomeException (Quantity 2) Right 42.007arithM (abs (-42)) :: Either SomeException (Quantity 2) Right 42.00?@ABCLMNOVXY[\]^komnpqx{yz|}~ None /?VQhaspara)Encoding of an increment/decrement event. :set -XDataKindsimport Refinedlet date = read "2021-01-01"let oid = 1 :: Int/let qty = $$(refineTH 42) :: UnsignedQuantity 2'let event = EventDecrement date oid qtylet json = Aeson.encode eventjson"{\"qty\":42.0,\"obj\":1,\"date\":\"2021-01-01\",\"type\":\"DECREMENT\"}"(Aeson.decode json :: Maybe (Event Int 2)2Just (EventDecrement 2021-01-01 1 (Refined 42.00))Aeson.decode json == Just eventTrue None /Y\hasparaEncoding of a posting entry. :set -XDataKindsimport Refinedlet date = read "2021-01-01"let oid = 1 :: Int/let qty = $$(refineTH 42) :: UnsignedQuantity 2#let entry = EntryDebit date oid qtylet json = Aeson.encode entryjson"{\"qty\":42.0,\"obj\":1,\"date\":\"2021-01-01\",\"type\":\"DEBIT\"}"(Aeson.decode json :: Maybe (Entry Int 2).Just (EntryDebit 2021-01-01 1 (Refined 42.00))Aeson.decode json == Just entryTruehasparaKind of accountDebitCreditAssetIncreaseDecrease LiabilityDecreaseIncreaseEquity/CapitalDecreaseIncreaseIncome/RevenueDecreaseIncreaseExpenseCostDividendIncreaseDecrease   None /8<=\hasparaType encoding for a posting.:set -XDataKindsimport Haspara.Accountingimport Refined$import qualified Data.Aeson as Aeson)import qualified Data.List.NonEmpty as NElet date = read "2021-01-01"let oid = 1 :: Int/let qty = $$(refineTH 42) :: UnsignedQuantity 2'let event = EventDecrement date oid qtylet account = Account AccountKindAsset ("Cash" :: String, 1 ::Int)9let posting = Posting . NE.fromList $ [(event, account)]let json = Aeson.encode postingjson"[[{\"qty\":42.0,\"obj\":1,\"date\":\"2021-01-01\",\"type\":\"DECREMENT\"},{\"kind\":\"ASSET\",\"object\":[\"Cash\",1]}]]"8Aeson.decode json :: Maybe (Posting (String, Int) Int 2)Just (Posting ((EventDecrement 2021-01-01 1 (Refined 42.00),Account {accountKind = AccountKindAsset, accountObject = ("Cash",1)}) :| []))!Aeson.decode json == Just postingTrueNone /8<=?]3  None ],,None ahaspara Constructs a V value at compile-time using -XTemplateHaskell.:set -XDataKinds!$$(quantityTH 0.00) :: Quantity 20.00!$$(quantityTH 0.09) :: Quantity 20.09"$$(quantityTH 0.009) :: Quantity 2...6..."Underflow while trying to create quantity: 9.0e-3"..."$$(quantityTH 0.009) :: Quantity 30.009haspara Constructs a  value at compile-time using -XTemplateHaskell.$$(currencyTH "USD")USD$$(currencyTH "usd")......Currency code error! Expecting at least 3 uppercase characters, but received: "usd"...haspara Constructs a  value at compile-time using -XTemplateHaskell.$$(currencyPairTH "EUR" "USD")EUR/USD$$(currencyPairTH "USD" "USD")......Can not create currency pair from same currencies: USD and USD...$$(currencyPairTH "USD" "eur")......Currency code error! Expecting at least 3 uppercase characters, but received: "eur"... Safe-Inferred b !"#$%&'(()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeefghijklmnopqrstuvwxyz{|}~                                              &haspara-0.0.0.1-GIZpgp6So3jGG6B29GnUafHaspara.Accounting.AccountKindHaspara.Accounting.AccountHaspara.Internal.CurrencyHaspara.Internal.DateHaspara.Internal.IdHaspara.Internal.QuantityHaspara.Internal.FXQuoteHaspara.Internal.Money Haspara.Internal.FXQuoteDatabaseHaspara.Accounting.TypesHaspara.Accounting.EventHaspara.Accounting.EntryHaspara.Accounting.PostingHaspara.Accounting.Ledger Haspara.THHaspara.Currency Haspara.Date Haspara.IdHaspara.FXQuote Haspara.MoneyHaspara.QuantityHasparaHaspara.Accounting Paths_haspara AccountKindAccountKindAssetAccountKindLiabilityAccountKindEquityAccountKindRevenueAccountKindExpenseaccountKindText$fToJSONAccountKind$fFromJSONAccountKind$fHashableAccountKind$fEnumAccountKind$fEqAccountKind$fGenericAccountKind$fOrdAccountKind$fShowAccountKindAccount accountKind accountObject$fHashableAccount $fEqAccount$fGenericAccount $fOrdAccount $fShowAccount$fFromJSONAccount$fToJSONAccount CurrencyPairMkCurrencyPairunCurrencyPairCurrency MkCurrency currencyCodecurrency currencyFailcurrencyCodeParsertoTuple baseCurrency quoteCurrency currencyPaircurrencyPairFail$fToJSONCurrency$fFromJSONCurrency$fIsStringCurrency$fShowCurrency$fShowCurrencyPair$fEqCurrencyPair$fHashableCurrencyPair$fOrdCurrencyPair$fLiftLiftedRepCurrencyPair $fEqCurrency$fHashableCurrency $fOrdCurrency$fLiftLiftedRepCurrencyDateMkDatefromDayfromYMD fromStringfromFormattedStringfromTextfromFormattedTexttoDaytoYMDtoStringtoFormattedStringtoTexttoFormattedTextaddDays $fToJSONDate$fFromJSONDate $fShowDate $fReadDate$fHashableDate$fEqDate $fEnumDate $fOrdDateIdLookupIdunId $fToJSONId $fFromJSONId$fShowId$fEqId$fOrdId $fHashableIdQuantity MkQuantity unQuantityquantity quantityAuxquantityLossless roundQuantitytimes timesLosslessroundScientific$fShowQuantity$fFractionalArith $fNumArith$fToJSONQuantity$fFromJSONQuantity $fEqQuantity $fOrdQuantity$fGenericQuantity $fNumQuantity$fLiftLiftedRepQuantity$fLiftLiftedRepDecimalFXQuote MkFXQuote fxQuoteDate fxQuotePair fxQuoteRatefxquote fxquoteFail fxquoteUnsafe$fToJSONFXQuote$fFromJSONFXQuote $fShowFXQuote $fEqFXQuote $fOrdFXQuoteMoney MoneySome MoneyZero MoneyFailmkMoneymkMoneyFromScientific moneyDate moneyCurrency moneyQuantityconvertconvertWithQuote $fToJSONMoney$fFromJSONMoney $fEqMoney $fOrdMoney $fShowMoneyFXQuotePairDatabasefxQuotePairDatabasePairfxQuotePairDatabaseTablefxQuotePairDatabaseSincefxQuotePairDatabaseUntilFXQuoteDatabase findFXQuotefindFXQuoteAuxUnsignedQuantityEventEventDecrementEventIncrement eventDate eventObject negateEventmkEvent $fToJSONEvent$fFromJSONEvent $fEqEvent $fOrdEvent $fShowEventEntry EntryDebit EntryCredit entryDate entryQuantity entryObject entryDebit entryCredit buildEntry $fToJSONEntry$fFromJSONEntry $fEqEntry $fOrdEntry $fShowEntryPosting postingEventspost $fEqPosting$fGenericPosting $fOrdPosting $fShowPosting$fFromJSONPosting$fToJSONPosting LedgerItemledgerItemEntryledgerItemBalanceLedger ledgerAccount ledgerOpening ledgerClosing ledgerRunningmkLedgeraddEntry $fEqLedger$fGenericLedger $fOrdLedger $fShowLedger$fFromJSONLedger$fToJSONLedger$fEqLedgerItem$fGenericLedgerItem$fOrdLedgerItem$fShowLedgerItem$fFromJSONLedgerItem$fToJSONLedgerItem quantityTH currencyTHcurrencyPairTH$aeson-1.5.6.0-6q3F4UvhVOcAvcXT4WASpUData.Aeson.Types.ToJSONToJSONData.Aeson.Types.FromJSONFromJSON mtl-2.2.2Control.Monad.Error.Class MonadErrorbaseControl.Monad.Fail MonadFail Data.StringIsStringGHC.ShowShowGHC.BaseString#text-1.2.5.0-LkZshtXQYe46X71oLWingHData.Text.InternalText time-1.9.3Data.Time.Calendar.DaysDayGHC.ReadRead'hashable-1.3.5.0-1tOwgLRyyokHOhyIXuRuxyData.Hashable.ClassHashable)scientific-0.3.7.0-HweDyyDQK8kCSs1SatrZFIData.Scientific Scientifictemplate-haskellLanguage.Haskell.TH.SyntaxLiftGHC.Errerrorversion getBinDir getLibDir getDynLibDir getDataDir getLibexecDir getSysconfDirgetDataFileName