אY      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ Safe!"%&"Why did the computation terminate?HA step in a pipeline: either a shell computation or an external process."PA shell command: either an IO computation or a pipeline of at least one step.#A shell environment: consists of the current standard input, output and error handles used by the computation, as well as the current working directory and set of environment variables.$A command name plus a ProcessHandle.*Lift an IO computation into a shell. The lifted computation is not thread-safe, and should thus absolutely not use environment variables, relative paths or standard input/output.+Run a shell computation. If part of the computation fails, the whole computation fails. The computation's environment is initially that of the whole process.Start a pipeline step.sPair up pipe steps with corresponding environments, ensuring that each step is connected to the next via a pipe.)Terminate a pid, be it process or thread.|Wait for all processes in the given list. If a process has failed, its error message is returned and the rest are killed.-Execute an external command. No globbing, escaping or other external shell magic is performed on either the command or arguments. The program's stdout will be written to stdout..#Terminate the program successfully./Connect the standard output of the first argument to the standard input of the second argument, and run the two computations in parallel.+Run a computation in the given environment.Get the current environment.0Attempt to run a computation. If the inner computation fails, the outer computations returns its error message, otherwise its result is returned.) !"#$%&'()*+,-./0 !"#$%&'()*+,-./0 !"#$%&'()*+,-./0/5SafeDR25The type of the guard's return value, if it succeeds.3Perform a Shell computation; if the computation succeeds but returns a false-ish value, the outer Shell computation fails with the given error message.4{Attempt to run the first command. If the first command fails, run the second. Forces serialization of the first command.5Perform a Shell computation; if the computation succeeds but returns a false-ish value, the outer Shell computation fails. Corresponds to .6Perform the given computation if the given guard passes, otherwise do nothing.The guard raising an error counts as failure as far as this function is concerned. Corresponds to .7Perform the given computation if the given guard fails, otherwise do nothing. The guard raising an error counts as failure as far as this function is concerned. Corresponds to  . 1234567.12345671234567 SafeA*Apply the given color to the given string.B5Apply the given background color to the given string.C>Apply the terminal's default highlighting to the given string.D%Output the given string in bold font.EUnderline the given string.3Escape sequence to reset formatting back to normal.An escape character.89:;<=>?@ABCDE89:;<=>?@ABCDE 89:;<=>?@ABCDE NoneF0Perform a file operation in binary or text mode?ICreate an absolute path from the environment and a potentially relative path. Has no effect if the path is already absolute.!Take the global environment lock.$Release the global environment lock.Set the global shell environment to the one of the current computation. Returns the current global environment. Should never, ever, be called without holding the global environment lock.JGet the current global shell environment, including standard input, output and error handles. Only safe to call within a computation lifted into " by .KKRun a shell computation and return its result. If the computation calls .[, the return value will be undefined. If the computation fails, an error will be thrown.L=Perform the given computation and return its standard output.M<Perform the given computation and return its standard error.NYPerform the given computation and return its standard output and error, in that order.OPLift a pure function to a computation over standard input/output. Similar to .PLLift a shell computation to a function over stdin and stdout. Similar to .Q5Get the contents of the computation's standard input.R9Write a string to standard output, followed by a newline.S?Write a string to standard output, without appending a newline.T(Read a line of text from standard input.UPropagate an explicit  ExitResult through the computation.FGHIJKLMNOPQRSTU^      !"#$ !"#$%&'()*+,-./0FGHIJKLMNOPQRSTUFGHIJKLMNOPQRSTU None VLazily read a file.WLazily write a file.XRemove a file.YoRename a file or directory. If the target is a directory, then the source will be moved into that directory.ZCopy a file. Fails if the source is a directory. If the target is a directory, the source file is copied into that directory using its current name.["Perform a computation over a file.\)Perform a computation over a binary file.]&Open a file, returning a handle to it.^5Open a file in binary mode, returning a handle to it. VWXYZ[\]^ VWXYZ[\]^ VWXYZ[\]^ None_"Get the current working directory.`Recursively copy a directory. If the target is a directory that already exists, the source directory is copied into that directory using its current name.aRecursively perform an action on each subdirectory of the given directory. The path passed to the callback is relative to the given directory. The action will *not* be performed on the given directory itself.bLike a, but discards its result.cPerform an action on each file in the given directory. This function will traverse any subdirectories of the given as well. File paths are given relative to the given directory; the current working directory is not affected.dLike  forEachFile! but only performs a side effect.e'List the contents of a directory, sans . and ...fRCreate a directory. Optionally create any required missing directories as well.g@Recursively remove a directory. Follows symlinks, so be careful.h,Do something with the user's home directory.iJPerform an action with the user's home directory as the working directory.j9Do something with the given application's data directory.kUDo something with the given application's data directory as the working directory.laExecute a command in the given working directory, then restore the previous working directory.m(Does the given path lead to a directory?n#Does the given path lead to a file?_`abcdefghijklmn_`abcdefghijklmn_`abcdefghijklmnNone oWrite a string to a handle.p2Write a string to a handle, followed by a newline.qClose a handle.rFlush a handle.s Is the handle ready for reading?t+Set the buffering mode of the given handle.u+Get the buffering mode of the given handle.v#Read a line of input from a handle.w.Lazily read all remaining input from a handle.xRead n bytes from a handle.y6Read a line of input from a handle and return it as a %.z:Read all remaining input from a handle and return it as a %.{Write a %& to a handle. Newline is not appended. opqrstuvwxyz{opqrstuvwxyz{ opqrstuvwxyz{None|gCreate a temp directory in the standard system temp directory, do something with it, then remove it.}TCreate a temp directory in given directory, do something with it, then remove it.~bCreate a temp file in the standard system temp directory, do something with it, then remove it.bCreate a temp file in the standard system temp directory, do something with it, then remove it.|}~|}~|}~NoneDR  Convert an  into a &. Successful termination yields the empty string, while abnormal termination yields the termination error message. If the program terminaged abnormally but without an error message - i.e. the error message is empty string - the error message will be shown as "abnormal termination".9Get the complete environment for the current computation.(The executable's command line arguments.:Run a computation with the given environment variable set.<Run a computation with the given environment variable unset.\Get the value of an environment variable. Returns Nothing if the variable doesn't exist.dGet the value of an environment variable. Returns the empty string if the variable doesn't exist.'Run a command with elevated privileges.pPerforms a command inside a temporary directory. The directory will be cleaned up after the command finishes.pPerforms a command inside a temporary directory. The directory will be cleaned up after the command finishes.=Get the standard input, output and error handle respectively.=Get the standard input, output and error handle respectively.=Get the standard input, output and error handle respectively.'(       !"#$ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~z" !+K/LMNOP04.123567#$%&'()-*IJU,`_efglmhijkcdabnXYZVW[\]^FGH~|} rqsutopRSTQvw89:;<=>?@ABCDEx{yz'(None A future is a computation which is run in parallel with a program's main thread and which may at some later point finish and return a value.BNote that future computations are killed when their corresponding FutureI is garbage collected. This means that a future should *always* be Ued at some point or otherwise kept alive, to ensure that the computation finishes.0Note that all any code called in a future using * must refrain from using environment variables, standard input/output, relative paths and the current working directory, in order to avoid race conditions. Code within the " monad, code imported using / and external processes spawned from within " is perfectly safe.)HOnly used to have something reliable to attach the futures' weakrefs to.Create a future value.Wait for a future value.0Check whether a future value has arrived or not.NPerform the given computations in parallel. The race condition warning for O when modifying environment variables or using relative paths still applies.Like !, but discards any return values.Break a list into chunks. This is quite useful for when performing *every* computation in parallel is too much. For instance, to download a list of files three at a time, one would do /mapM_ (parallel_ downloadFile) (chunks 3 files).Run a computation in a separate thread. If the thread throws an error, it will simply die; the error will not propagate to its parent thread.Run a computation in a separate thread, with its standard input and output provided by the first and second handles returned respectively. The handles are line buffered by default.Like -, but adds a third handle for standard error.Terminate a thread spawned by . *)   *)None\Daemonize a shellmate computation. This should be the last thing a computation does, as this function will terminate the parent computation. In short, daemonizing a computation involves setting the file creation mask to 0, closing standard input, output and error file descriptors, blocking sighup and changing the working directory to /.On Windows without Cygwin,  daemonizeM is a no-op. Consider running any program intended to be deamonized using START /B your_app6, or better yet, rewriting it as a Windows service.None 3Set the mode (permissions, etc.) of the given file.Get the mode of the given file.&Get the currently effective user name.;Get the list of groups associated with the current process. Set the owner of the given file. Set the group of the given file.*Set the owner and group of the given file. Get the owner of the given file. Get the group of the given file.*Get the owner and group of the given file.+Set the file creation mask of this process.   + !"#$%&'%&(%&)%&*%&+%&,%&-%&.%&/%&0%&1%&2%&3%&4%&5%&6%&789:;<<=>?@ABCDEFGHIJKL 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 { | } ~                                  ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ ABCDEFGHI&shellmate-0.3.3-3b2rEasc7Qp55dseGAbJNK Control.ShellControl.Shell.PosixControl.Shell.ConcurrentControl.Shell.InternalControl.Shell.ControlCMguardwhenunlessControl.Shell.ColorControl.Shell.BaseControl.Shell.FileControl.Shell.DirectoryControl.Shell.HandleControl.Shell.TempControl.Shell.DaemonbaseGHC.IO.Handle.TypesHandleControl.Monad.IO.ClassliftIOMonadIOSystem.Posix.TypesCMode GHC.Conc.SyncThreadIdBlockBuffering LineBuffering NoBuffering BufferMode GHC.IO.IOMode ReadWriteMode AppendMode WriteModeReadModeIOMode unix-2.7.2.0System.Posix.Files.CommonintersectFileModesunionFileModes accessModes otherModes groupModes ownerModes stdFileModeotherExecuteModeotherWriteMode otherReadModegroupExecuteModegroupWriteMode groupReadModeownerExecuteModeownerWriteMode ownerReadMode nullFileMode ExitReasonSuccessFailureShellEnvenvStdIn envStdOut envStdErr envWorkDir envEnvVars unsafeLiftIOshellrunShrunexit|>tryGuardResultassertorElseColorBlackRedGreenYellowBluePurpleMagentaWhitecolor background highlightbold underlineFileMode BinaryModeTextModeabsPathshellEnvshell_capture captureStdErrcapture2streamliftstdinechoecho_ask joinResultinputoutputrmmvcpwithFilewithBinaryFileopenFileopenBinaryFilepwdcpdirforEachDirectoryforEachDirectory_ forEachFile forEachFile_lsmkdirrmdirwithHomeDirectoryinHomeDirectorywithAppDirectoryinAppDirectory inDirectory isDirectoryisFilehPutStr hPutStrLnhClosehFlushhReady hSetBuffering hGetBufferinghGetLine hGetContents hGetBytes hGetByteLinehGetByteContents hPutByteswithTempDirectorywithCustomTempDirectory withTempFilewithCustomTempFile exitString getShellEnvcmdlinewithEnv withoutEnv lookupEnvgetEnvsudoinTempDirectoryinCustomTempDirectorygetStdIn getStdOut getStdErrFuturefutureawaitcheckparallel parallel_chunksforkIOfork2fork3 killThread daemonizeGroupUser setFileMode getFileModegetCurrentUsergetCurrentGroupssetOwnersetGroup setOwnershipgetOwnergetGroup getOwnershipsetFileCreationMaskPipeStepPidrunStepmkEnvskillPidwaitPidsinEnvProcInternalLiftPipeBindGetEnvInEnvTryDoneFailPIDTID $fMonadShell$fApplicativeShell$fFunctorShell $fGuardShell $fGuardBool $fGuardMaybeGHC.BasejoinMonad>>=>>returnfailFunctorfmapData.TraversablemapMsequence Control.Monadmfilter<$!> replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMforever<=<>=>filterMforM Data.Foldablemsum sequence_forM_mapM_ Data.FunctorvoidapliftM5liftM4liftM3liftM2liftM=<< MonadPlusmzeromplusnormalesccolorNum takeEnvLockreleaseEnvLock setShellEnv System.IOinteract globalEnvLock globalEnv$fMonadIOShellGHC.IOFilePathfilepath-1.4.1.0System.FilePath.Posix makeRelative normalise isAbsolute isRelative makeValidisValid equalFilePathjoinPathsplitDirectories splitPathcombinereplaceDirectory takeDirectorydropTrailingPathSeparatoraddTrailingPathSeparatorhasTrailingPathSeparatorreplaceBaseName takeBaseName takeFileName dropFileNamereplaceFileName splitFileNameisDrivehasDrive dropDrive takeDrive joinDrive splitDrivereplaceExtensionstakeExtensionsdropExtensionssplitExtensionsstripExtension hasExtension addExtension dropExtension<.>replaceExtension-<.> takeExtensionsplitExtension getSearchPathsplitSearchPathisExtSeparator extSeparatorisSearchPathSeparatorsearchPathSeparatorisPathSeparatorpathSeparators pathSeparatorbytestring-0.10.8.1Data.ByteString.Internal ByteStringStringinsertdeleteFinalizerHandle