"^      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 2016 Mark Karpov BSD 3 clause(Mark Karpov <markkarpov@openmailbox.org> experimentalportableNone!"05L4Bad things that can happen when you use the library.9Thrown when you try to get contents of non-existing entry.Thrown when archive structure cannot be parsed%Information about archive as a whole.Comment of entire archive-Absolute offset of start of central directory Size of central directory recordSupported compression methods. Store file uncompressed Deflate  Compressed using BZip2 algorithm This record represents all information about archive entry that can be stored in a .ZIP archive. It does not mirror local file header or central directory file header, but their binary representation can be built given this date structure and actual archive contents.Version made byVersion needed to extractCompression methodLast modification date and timeCRC32 check sumSize of compressed entrySize of uncompressed entry$Absolute offset of local file header Entry commentAll extra fields found9Exception describing various troubles you can have with .)Selector cannot be created from this path{This data type serves for naming and selection of archive entries. It can be created only with help of smart constructor \, and it's the only key  that can be used to select files in archive or to name new files.The abstraction is crucial for ensuring that created archives are portable across operating systems, file systems, and different platforms. Since on some operating systems, file paths are case-insensitive, this selector is also case-insensitive. It makes sure that only relative paths are used to name files inside archive, as it's recommended in the specification. It also guarantees that forward slashes are used when the path is stored inside archive for compatibility with Unix-like operating systems (as it is recommended in the specification). On the other hand, in can be rendered as ordinary relative file path in OS-specific format, when needed.^+Path pieces of relative path inside archiveCreate  from  Path Rel File. To avoid problems with distribution of the archive, characters that some operating systems do not expect in paths are not allowed. Proper paths should pass these checks:Ubinary representation of normalized path should be not longer than 65535 bytesThis function can throw  exception.Make a relative path from . Every  produces single  Path Rel File that corresponds to it.Get entry name given 6 in from that is suitable for writing to file header.% _^ !"    _^ !" 2016 Mark Karpov BSD 3 clause(Mark Karpov <markkarpov@openmailbox.org> experimentalportableSafe!"L4 Decode a ` containing CP 437 encoded text.a)Decode single byte of CP437 encoded text.4a444a 2016 Mark Karpov BSD 3 clause(Mark Karpov <markkarpov@openmailbox.org> experimentalportableNone!"LT>bMS-DOS date-time: a pair of c, (date, time) with the following structure: DATE bit 0 - 4 5 - 8 9 - 15 value day (1 - 31) month (1 - 12) years from 1980 TIME bit 0 - 4 5 - 10 11 - 15 value seconds* minute hour *stored in two-second incrementsdFA temporary data structure to hold Zip64 extra data field information.eData descriptor representation.f0Type of file header: local or central directory.g5Origins of entries that can be streamed into archive.hVCollection of editing actions, that is, actions that modify already existing entries.iKCollection of maps describing how to produce entries in resulting archive.jNThe sum type describes all possible actions that can be performed on archive.kAdd entry given its lm9Copy an entry form another archive without re-compressionn$Change name the entry inside archiveoDelete entry from archivep%Change compression method on an entryq"Set comment for a particular entryr"Delete comment of particular entrys)Set modification time of particular entryt%Add an extra field to specified entryu(Delete an extra filed of specified entryvSet comment for entire archivew Delete comment of entire archivex: Version created by  to specify when writing archive data.yAScan central directory of an archive and return its description & as well as collection of its entries.This operation may fail with:isAlreadyInUseError9 if the file is already open and cannot be reopened;isDoesNotExistError if the file does not exist;isPermissionError< if the user does not have permission to open the file;u when specified archive is something this library cannot parse (this includes multi-disk archives, for example)._Please note that entries with invalid (non-portable) file names may be missing in list of entries. Files that are compressed with unsupported compression methods are skipped as well. Also, if several entries would collide on some operating systems (such as Windows, because of its case-insensitivity), only one of them will be available, because  is case-insensitive. These are consequences of the design decision to make it impossible to create non-portable archives with this library.zHGiven location of archive and information about specific archive entry   , return l] of its data. Actual data can be compressed or uncompressed depending on the third argument.{ Undertake all actions specified as the fourth argument of the function. This transforms given pending actions so they can be performed in one pass, and then they are performed in the most efficient way.|qDetermine what comment in new archive will look like given its original value and collection of pending actions.}eTransform map representing existing entries into collection of actions that re-create those entires.~Transform collection of js into i and hB  collection of data describing how to create resulting archive.rCopy entries from another archive and write them into file associated with given handle. This actually can throw , if there is no such entry in that archive.=Sink entry from given stream into file associated with given .Create ; to stream data there. Once streaming is finished, return e# for the streamed data. The action does not close given .YAppend central directory entries and end of central directory record to file that given  is associated with. Note that this automatically writes Zip64 end of central directory record and Zip64 end of central directory locator when necessary.]Extract number of bytes between start of file name in local header and start of actual data.7Parse central directory file headers and put them into .yParse single central directory file header. If it's a directory or file compressed with unsupported compression method,  is returned.Parse an extra-field.KGet signature. If extracted data is not equal to provided signature, fail.Parse d from its binary representation.!Produce binary representation of d.Create ` representing an extra field.Create `' representing entire central directory.Create `: representing local file header if the first argument is - and central directory file header otherwise.Create `4 representing Zip64 end of central directory record.Create `6 representing Zip64 end of central directory locator.Parse end of central directory record or Zip64 end of central directory record depending on signature binary data begins with.Create `. representing end of central directory record.oFind absolute offset of end of central directory record or, if present, Zip64 end of central directory record.Chain  monad inside  monad.Rename entry (key) in a .Like 8, but with saturation when converting to bounded types.!Determine target entry of action.Decode `. The first argument indicates whether we should treat it as UTF-8 (in case bit 11 of general-purpose bit flag is set), otherwise the function assumes CP437. Note that since not every stream of bytes constitutes valid UTF-8 text, this function can fail. In that case  is returned._Detect if the given text needs newer Unicode-aware features to be properly encoded in archive.LConvert numeric representation (as per .ZIP specification) of version into .Covert : to its numeric representation as per .ZIP specification.7Get compression method form its numeric representation.Convert : to its numeric representation as per .ZIP specification.;Check if entry with these parameters needs Zip64 extension.yDetermine version needed to extract  that should be written headers given need of Zip64 feature and compression method.Return decompressing , corresponding to given compression method.9Sink that calculates CRC32 check sum for incoming stream.Convert  to MS-DOS time format.Convert MS-DOS date-time to .WbdefghijkmnopqrstuvwxyPath to archive to scanz'Path to archive that contains the entry/Information needed to extract entry of interest#Should we stream uncompressed data?Source of uncompressed data{*Location of archive file to edit or createArchive descriptionCurrent list of entiresCollection of pending actions|},Name of archive file where entires are foundActual list of entires)Actions that recreate the archive entries~Collection of pending actionsOptimized dataOpened  of zip archive file+Path to file from which to copy the entries1 from original name to name to use in new archive)Additional info that can influence result5Info to generate central directory file headers laterOpened  of zip archive fileName of entry to add-Origin of entry (can contain additional info)Source of entry contents)Additional info that can influence result5Info to generate central directory file headers laterOpened  of zip archive fileCompression method to apply where to stream data!Opened handle of zip archive fileCommentary to entire archive7Info about already written local headers and entry data/What is read from central directory file headerActual binary representationResult.Is this for local or central directory header?Zip64 extra field's dataResulting representationType of header to generateName of entry to writeDescription of entryTotal number of entriesSize of the central directory"Offset of central directory record(Offset of Zip64 end of central directoryTotal number of entriesSize of the central directory"Offset of central directory recordZip file comment1Whether bit 11 of general-purpose bit flag is setBinary data to decodeDecoded  in case of successjkmnopqrstuvwyz{2bdefghij kmnopqrstuvwxyz{|}~1 2016 Mark Karpov BSD 3 clause(Mark Karpov <markkarpov@openmailbox.org> experimentalportableNone!"IL+"Internal state record used by the 5 monad.Absolute path to zip archiveActual collection of entriesInfo about the whole archivePending actions5Monad that provides context necessary for performing operations on archives. It's intentionally opaque and not a monad transformer to limit number of actions that can be performed in it to those provided by this module and their combinations.6Create new archive given its location and action that describes how to create content in the archive. This will silently overwrite specified file if it already exists. See 7, if you want to work with existing archive.7#Work with an existing archive. See 6, if you want to create new archive instead.This operation may fail with:isAlreadyInUseError9 if the file is already open and cannot be reopened;isDoesNotExistError if the file does not exist;isPermissionError< if the user does not have permission to open the file;u when specified archive is something this library cannot parse (this includes multi-disk archives, for example)._Please note that entries with invalid (non-portable) file names may be missing in list of entries. Files that are compressed with unsupported compression methods are skipped as well. Also, if several entries would collide on some operating systems (such as Windows, because of its case-insensitivity), only one of them will be available, because  is case-insensitive. These are consequences of the design decision to make it impossible to create non-portable archives with this library.8Retrieve description of all archive entries. This is an efficient operation that can be used for example to list all entries in archive. Do not hesitate to use the function frequently: scanning of archive happens only once anyway.Please note that returned value only reflects actual contents of archive in file system, non-committed actions cannot influence list of entries, see V for more information.9[Check whether specified entry exists in the archive. This is a simple shortcut defined as: ,doesEntryExist s = M.member s <$> getEntries:Get  < for specified entry. This is a simple shortcut defined as: *getEntryDesc s = M.lookup s <$> getEntries;1Get contents of specific archive entry as strict `~. It's not recommended to use this on big entries, because it will suck out a lot of memory. For big entries, use conduits: =.Throws: .<Get entry source.Throws: .=.Stream contents of archive entry to specified .Throws: .>9Save specific archive entry as a file in the file system.Throws: .?]Calculate CRC32 check sum and compare it with value read from archive. The function returns D when the check sums are the same  that is, data is not corrupted.Throws: .@dUnpack entire archive into specified directory. The directory will be created if it does not exist.AGet archive comment.BGet archive description record.C=Add a new entry to archive given its contents in binary form.D:Stream data from the specified source to an archive entry.ELoad entry from given file.F]Copy entry as is  from another .ZIP archive. If the entry does not exists in that archive,  will be eventually thrown.GvAdd entire directory to archive. Please note that due to design of the library, empty sub-directories won't be added.,The action can throw the same exceptions as  and .HKRename entry in archive. If the entry does not exist, nothing will happen.IEDelete entry from archive, if it does not exist, nothing will happen.JRChange compression method of an entry, if it does not exist, nothing will happen.KSet entry comment, if that entry does not exist, nothing will happen. Note that if binary representation of comment is longer than 65535 bytes, it will be truncated on writing.LKDelete entry's comment, if that entry does not exist, nothing will happen.MkSet last modification  date/time. Specified entry may be missing, in that case this action has no effect.N\Add an extra field. Specified entry may be missing, in that case this action has no effect.OqDelete an extra field by its type (tag). Specified entry may be missing, in that case this action has no effect.P,Perform an action on every entry in archive.QSet comment of entire archive.R'Delete archive comment if it's present.S'Undo changes to specific archive entry.T7Undo changes to archive as a whole (archive's comment).U.Undo all changes made in this editing session.VArchive contents are not modified instantly, but instead changes are collected as pending actions  that should be committed in order to efficiently modify archive in one pass. The actions are committed automatically when program leaves the realm of 5 monad (i.e. as part of 6 or 7), or can be forced explicitly with help of this function. Once committed, changes take place in the file system and cannot be undone./Get path of actual archive file from inside of 5 monad."Get collection of pending actions.1Modify collection of pending actions in some way..Add new action to the list of pending actions..56"Location of archive file to create#Actions that form archive's content7 Location of archive to work withActions on that archive89:;&Selector that identifies archive entryContents of the entry<=&Selector that identifies archive entry#Sink where to stream entry contents Contents of the entry (if found)>&Selector that identifies archive entryWhere to save the file?&Selector that identifies archive entryIs the entry intact?@ABCCompression method to useEntry contentsName of entry to addDCompression method to useSource of entry contentsName of entry to addECompression method to use How to get Path to file to addFPath to archive to copy from)Name of entry (in source archive) to copy+Name of entry to insert (in actual archive)GCompression method to use How to get Path to directory to addHOriginal entry nameNew entry nameIJNew compression methodName of entry to re-compressKText of the commentName of entry to comment uponLMNew modification timeName of entry to modifyN%Tag (header id) of extra field to addBody of the fieldName of entry to modifyO(Tag (header id) of extra field to deleteName of entry to modifyPAction to performQRSTUV@ 56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV@  56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV'56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd efghijklmnopqrstuvwxyz{|}~C\Jjuvjjjjuvimnqr; zip-0.1.5-Ao5Ovmcb72EKNN45J985UzCodec.Archive.Zip.TypeCodec.Archive.Zip.CP437Codec.Archive.ZipSystem.FilePath.PosixisValidSystem.FilePath.WindowsCodec.Archive.Zip.Internal ZipExceptionEntryDoesNotExist ParsingFailedArchiveDescription adComment adCDOffsetadCDSizeCompressionMethodStoreDeflateBZip2EntryDescriptionedVersionMadeByedVersionNeeded edCompression edModTimeedCRC32edCompressedSizeedUncompressedSizeedOffset edComment edExtraFieldEntrySelectorExceptionInvalidEntrySelector EntrySelectormkEntrySelectorunEntrySelector getEntryName$fExceptionZipException$fShowZipException!$fExceptionEntrySelectorException$fShowEntrySelectorException$fShowEntrySelector$fEqEntrySelector$fOrdEntrySelector$fDataEntrySelector$fGenericEntrySelector$fShowCompressionMethod$fReadCompressionMethod$fEqCompressionMethod$fOrdCompressionMethod$fEnumCompressionMethod$fBoundedCompressionMethod$fDataCompressionMethod$fEqEntryDescription$fShowArchiveDescription$fReadArchiveDescription$fEqArchiveDescription$fOrdArchiveDescription$fDataArchiveDescription decodeCP437 ZipArchive createArchive withArchive getEntriesdoesEntryExist getEntryDescgetEntrygetEntrySource sourceEntry saveEntry checkEntry unpackIntogetArchiveCommentgetArchiveDescriptionaddEntry sinkEntry loadEntry copyEntry packDirRecur renameEntry deleteEntry recompresssetEntryCommentdeleteEntryComment setModTime addExtraFielddeleteExtraField forEntriessetArchiveCommentdeleteArchiveCommentundoEntryChangesundoArchiveChangesundoAllcommit$fFunctorZipArchive$fApplicativeZipArchive$fMonadZipArchive$fMonadIOZipArchive$fMonadThrowZipArchive$fMonadCatchZipArchive$fMonadMaskZipArchiveunESbytestring-0.10.8.1Data.ByteString.Internal ByteStringdecodeByteCP437 MsDosTimebaseGHC.WordWord16Zip64ExtraFieldDataDescriptor HeaderType EntryOriginEditingActionsProducingActions PendingAction SinkEntry$conduit-1.2.8-6LjpGi2TGu31AvDM5LTOGQData.Conduit.Internal.ConduitSource CopyEntry RenameEntry DeleteEntry RecompressSetEntryCommentDeleteEntryComment SetModTime AddExtraFieldDeleteExtraFieldSetArchiveCommentDeleteArchiveComment zipVersion scanArchivepredictCommenttoRecreatingActionsoptimize copyEntriesGHC.IO.Handle.TypesHandlesinkDataSinkwriteCDgetLocalHeaderGapgetCDcontainers-0.5.7.1 Data.Map.BaseMap getCDHeaderGHC.BaseNothing getExtraField getSignatureparseZip64ExtraFieldmakeZip64ExtraField putExtraFieldputCD putHeaderghc-prim GHC.TypesFalse putZip64ECDputZip64ECDLocatorgetECDputECD locateECD>>+MaybeIO renameKeywithSaturationGHC.Real fromIntegral targetEntry decodeText needsUnicode toVersion Data.VersionVersion fromVersiontoCompressionMethodfromCompressionMethod needsZip64 getZipVersiondecompressingPipeConduit crc32Sink toMsDosTime time-1.6.0.1Data.Time.Clock.UTCUTCTime fromMsDosTime msDosDate msDosTimez64efUncompressedSizez64efCompressedSize z64efOffsetddCRC32ddCompressedSizeddUncompressedSize LocalHeaderCentralDirHeader GenericOriginBorrowed eaCompressioneaEntryCommenteaDeleteComment eaModTime eaExtraField eaDeleteField paCopyEntry paSinkEntry#text-1.2.2.1-9Yh8rJoh8fO2JMLWffT3QsData.Text.InternalTextZipState zsFilePath zsEntries zsArchive zsActionsTrue$path-io-1.2.0-F6AWZlbS2i9K03nYq6lmWPPath.IO listDirRecur getFilePath getPending modifyActions addPending unZipArchive